Программа хранится
под именем
Сохраните код один раз. Передавайте другие параметры при следующем вызове. Имя позволяет обратиться к той же программе из агента, приложения или своего скрипта.
Что входит в запись
| Поле | Содержание |
|---|---|
name | Уникальное имя, например add_two_numbers_v1. |
description | Описание назначения, входа и результата на английском языке. Помогает найти программу. |
code | Исходный код программы. |
cspl | Язык или формат, который должен понимать обработчик. Для этого примера — fython. |
kwargs | Параметры по умолчанию. Значения конкретного запуска передаются отдельно, в params. |
Сохранить → прочитать → вызвать
- Сохраните код. Передайте имя, описание и язык в
/api/expert/save. - Прочитайте запись обратно. Вызовите
/api/expert/get. Сравните полеexpert_codeс исходным текстом. - Запустите с параметрами. Передайте имя и входные значения в
/api/expert/run. - Повторите запуск. Измените только
params, без повторного сохранения.
В заголовках запросов используйте один и тот же профиль и агент. Иначе запись может оказаться вне области, из которой вы её ищете.
Первый цикл из Python
Нужен Python 3.8 или новее, токен доступа, ID вашего агента и подключённого устройства. Как подготовить доступ →
Сохраните код в first_call.py и выполните python3 first_call.py в терминале. Скрипт создаёт программу с новым случайным именем в вашем аккаунте, сверяет сохранённый код и выполняет два вызова. Токен вводится скрыто; он не записывается в файл.
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, работа отложена: проверьте её состояние.
Изменение программы и версии
Не заменяйте рабочую программу вслепую. Сохраните исходный код у себя, внесите изменения под новым именем и сравните результаты на одинаковом входе. Только затем переключайте вызывающий код или агента.
Если меняется формат ответа, проверьте все программы и окна, которые его читают. Одинаковое имя не гарантирует совместимость новых результатов со старыми потребителями.
Создание приложения →