Документация

Программа хранится
под именем

Сохраните код один раз. Передавайте другие параметры при следующем вызове. Имя позволяет обратиться к той же программе из агента, приложения или своего скрипта.

Что входит в запись

ПолеСодержание
nameУникальное имя, например add_two_numbers_v1.
descriptionОписание назначения, входа и результата на английском языке. Помогает найти программу.
codeИсходный код программы.
csplЯзык или формат, который должен понимать обработчик. Для этого примера — fython.
kwargsПараметры по умолчанию. Значения конкретного запуска передаются отдельно, в params.

Сохранить → прочитать → вызвать

  1. Сохраните код. Передайте имя, описание и язык в /api/expert/save.
  2. Прочитайте запись обратно. Вызовите /api/expert/get. Сравните поле expert_code с исходным текстом.
  3. Запустите с параметрами. Передайте имя и входные значения в /api/expert/run.
  4. Повторите запуск. Измените только params, без повторного сохранения.

В заголовках запросов используйте один и тот же профиль и агент. Иначе запись может оказаться вне области, из которой вы её ищете.

Первый цикл из Python

Нужен Python 3.8 или новее, токен доступа, ID вашего агента и подключённого устройства. Как подготовить доступ →

Сохраните код в first_call.py и выполните python3 first_call.py в терминале. Скрипт создаёт программу с новым случайным именем в вашем аккаунте, сверяет сохранённый код и выполняет два вызова. Токен вводится скрыто; он не записывается в файл.

Python · стандартная библиотека
import getpass
import json
import urllib.error
import urllib.request
import uuid

BASE = "https://api.extella.ai"
token = getpass.getpass("Extella API token: ")
agent = input("Agent ID: ").strip()
device = input("Device ID: ").strip()
profile = input("Profile ID [default]: ").strip() or "default"
if not token or not agent or not device:
    raise SystemExit("Token, agent and device are required")

headers = {"X-Auth-Token": token, "X-Profile-Id": profile,
           "X-Agent-Id": agent, "Content-Type": "application/json"}

def call(endpoint, body):
    request = urllib.request.Request(
        BASE + endpoint, data=json.dumps(body).encode(), headers=headers)
    try:
        with urllib.request.urlopen(request, timeout=150) as response:
            answer = json.load(response)
    except urllib.error.HTTPError as error:
        raise SystemExit("HTTP " + str(error.code)) from None
    if answer.get("status") in ("error", "failed"):
        raise SystemExit("API reported an error; inspect the call in Extella")
    return answer

name = "add_two_numbers_" + uuid.uuid4().hex[:12]
source = ("def " + name + "(a: float = 0, b: float = 0) -> dict:\n"
          "    return {\"total\": a + b}\n")
call("/api/expert/save", {
    "name": name, "description": "Add two numbers a and b; return total.",
    "code": source, "cspl": "fython", "kwargs": {}, "global": False})
saved = call("/api/expert/get", {"name": name})
if saved.get("expert_code", "").strip() != source.strip():
    raise SystemExit("Saved code does not match; nothing was run")
print("Saved:", name)
for params in ({"a": 5, "b": 7}, {"a": 2, "b": 3}):
    answer = call("/api/expert/run", {
        "expert_name": name, "params": params, "targets": [device]})
    print(json.dumps(answer, ensure_ascii=False, indent=2))
    if answer.get("task_id"):
        print("Deferred task; check its status before another call")
        break

Ищите total в результате выполнения: сначала 12, затем 5. Если вернулся task_id, работа отложена: проверьте её состояние.

Изменение программы и версии

Не заменяйте рабочую программу вслепую. Сохраните исходный код у себя, внесите изменения под новым именем и сравните результаты на одинаковом входе. Только затем переключайте вызывающий код или агента.

Если меняется формат ответа, проверьте все программы и окна, которые его читают. Одинаковое имя не гарантирует совместимость новых результатов со старыми потребителями.

Создание приложения →