Endpointy

Workflow

Sestavování, spouštění, publikování a sledování workflow, rozhodování o jejich schváleních a spouštění webhooky.

Zobrazit jako Markdown

Workflow je automatizovaný proces složený z kroků: spouštěč zahájí běh a kroky za ním volají nástroje, spouštějí asistenty, větví se, opakují se ve smyčce, posílají požadavky HTTP, čekají na schválení člověkem a nastavují výsledek. API workflow umožňuje vaší aplikaci vypisovat workflow, spouštět je s živým průběhem, číst minulé běhy, rozhodovat o schváleních, upravovat a publikovat workflow a spouštět publikovaná workflow z veřejné URL webhooku.

Každé volání se provádí jménem uživatele, kterému API klíč patří, s jeho oprávněními, organizacemi a kredity. Běhy spuštěné přes API provádějí koncept workflow (aktuální definici); publikované verze spouštějí plány, webhooky a spouštěče booster záznamů.

Rozsahy a přístup

Rozsah Povoluje
ayeto.workflow Výpis a čtení workflow, jejich spouštění (i se streamováním), rušení běhů, výpis a čtení běhů, katalog, validaci, náhled plánu, historii revizí, export, schválení (výpis, počet, čtení, rozhodnutí).
ayeto.workflow.write Vytváření, úpravy a mazání workflow, mazání běhů, informace o nasazení (obsahují tajné klíče webhooků), publikování, aktivaci, přegenerování tajných klíčů webhooků, obnovení revize, import, kopírování, asistenta builderu.
* Všechno.

Rozsahy se navzájem nezahrnují: klíč, který workflow čte i upravuje, potřebuje oba. Klíč bez požadovaného rozsahu dostane 401 s API key is invalid; viz autentizace.

Kromě rozsahu kontroluje každé workflow, kdo smí co dělat:

Kdo Smí
Vlastník (tvůrce nebo člen vlastnící skupiny) Všechno.
Uživatel, se kterým je sdíleno pro zápis Číst ho, upravovat, spouštět, publikovat, exportovat, kopírovat a mazat.
Uživatel, se kterým je sdíleno pro čtení Číst ho, validovat ho, prohlížet jeho revize. Spouštět, exportovat nebo kopírovat ho jen tehdy, když sdílení uděluje oprávnění workflow.run, workflow.export nebo workflow.copy.

Workflow, které patří organizaci, běží v této organizaci (její kredity a úložiště), takže uživatel tam musí být členem s přístupem pro zápis.

Základní pojmy

Definice

Definice workflow je orientovaný acyklický graf: seznam uzlů nodes a seznam hran edges.

json
{
  "nodes": [
    {
      "id": "start",
      "type": "trigger.manual",
      "name": "Start",
      "params": {
        "input_schema": {
          "type": "object",
          "properties": {"customer": {"type": "string"}, "question": {"type": "string"}},
          "required": ["question"]
        }
      },
      "position": {"x": 0, "y": 0}
    },
    {
      "id": "answer",
      "type": "assistant.run",
      "name": "Draft an answer",
      "params": {
        "assistant_id": "3f6c1a2e-8b4d-4e7a-9c1f-2d5e6a7b8c90",
        "prompt": "Answer {{ input.customer }}: {{ input.question }}"
      },
      "position": {"x": 0, "y": 160}
    },
    {
      "id": "result",
      "type": "output",
      "name": "Result",
      "params": {"value": {"answer": "{{ steps.answer.output.text }}"}},
      "position": {"x": 0, "y": 320}
    }
  ],
  "edges": [
    {"source": "start", "target": "answer", "source_handle": null},
    {"source": "answer", "target": "result", "source_handle": null}
  ]
}
Pole Typ Popis
nodes[].id řetězec Identifikátor uzlu, jedinečný ve workflow: písmena, číslice a _, nejvýše 64 znaků, nesmí začínat číslicí. Pozdější kroky odkazují na jeho výsledek jako {{ steps.<id>.output }}.
nodes[].type řetězec Typ uzlu, viz typy uzlů.
nodes[].name řetězec Popisek zobrazený v editoru.
nodes[].params objekt Parametry typu uzlu; jejich schéma JSON je v katalogu.
nodes[].position objekt {x, y} na plátně editoru, nebo null. Na běhy nemá vliv.
edges[].source řetězec Uzel, ze kterého hrana vychází.
edges[].target řetězec Uzel, do kterého hrana vstupuje.
edges[].source_handle řetězec Výstup zdrojového uzlu, ze kterého hrana vychází: null pro výchozí výstup, pojmenovaný výstup (true / false podmínky, případ přepínače switch, item / done smyčky, approved / rejected / timeout schválení), nebo error pro pokračování, když zdrojový krok selže.

Definice má nejvýše 200 uzlů, aspoň jeden spouštěč, žádné cykly a žádné hrany vedoucí do spouštěče. Ke kontrole použijte validaci.

Řetězcové parametry jsou šablony (syntaxe Jinja, vyhodnocované v sandboxu). Mohou číst:

Proměnná Obsah
input Vstup běhu (výstup spouštěče).
steps.<id>.output Výsledek dřívějšího kroku; dále steps.<id>.success, .status, .text, .error, .file_ids.
workflow {id, name}.
run {id}.
now Čas zahájení běhu (ISO 8601, UTC).
loop Uvnitř těla smyčky: item, index, count, parent.

Parametr, který je jediným výrazem {{ expression }}, si zachová nativní typ hodnoty (objekt zůstane objektem); nedefinovaná proměnná je chybou kroku.

Typy uzlů

Úplný seznam se schématem JSON parametrů každého uzlu a nástroji, které může krok tool.call použít, poskytuje katalog. Přehled:

Typ Kategorie Co dělá
trigger.manual trigger Zahájí běh na vyžádání (aplikace, API). Volitelné input_schema popisuje vstup běhu.
trigger.schedule trigger Spouští publikované workflow podle plánu cron.
trigger.webhook trigger Spustí publikované workflow, když se zavolá jeho URL webhooku.
trigger.booster_record trigger Spustí publikované workflow, když se v databázi booster panelu vytvoří, upraví nebo smaže záznam.
tool.call action Zavolá AI nástroj se zadanými parametry.
assistant.run action Spustí úlohu na asistentovi v nové konverzaci.
http.request action Pošle požadavek HTTP na veřejnou URL.
notify action Pošle e-mail uživateli, jehož jménem běh probíhá.
file.to_text action Přečte soubory (dokumenty, obrázky, zvuk) jako text.
human.approval logic Čeká, až člověk schválí nebo zamítne, volitelně s formulářem.
condition logic Pokračuje na true nebo false podle výrazu.
switch logic Pokračuje na jednom z několika pojmenovaných výstupů, nebo na otherwise.
ai.condition logic Položí klasifikačnímu modelu otázku ano/ne; pokračuje na true nebo false.
ai.choice logic Zeptá se klasifikačního modelu, která z několika možností sedí.
loop logic Spustí kroky za svým výstupem item jednou pro každou položku seznamu, pak pokračuje na done.
transform logic Sestaví hodnotu z dřívějších výsledků.
output logic Nastaví výsledek běhu. Nemá žádné odchozí hrany.

Koncept a publikovaná verze

definition uložená u workflow je koncept. Každá jeho změna se uchovává jako revize. Běhy spuštěné přes API (i z aplikace) spouštějí koncept.

Publikování zkopíruje koncept do nové neměnné verze (1, 2, ...) a workflow aktivuje. Dokud je workflow aktivní, jeho automatické spouštěče (plán, webhook, booster záznam) spouštějí běhy publikované verze, a to jménem uživatele, který ji publikoval nebo workflow naposledy aktivoval (run_as). Pozdější úpravy konceptu nemění, co spouštěče spouštějí, dokud znovu nepublikujete.

Stavy běhu

Běh zaznamenává vstup, stav každého kroku a výsledek. Jeho status:

Stav Význam
queued Spuštěn spouštěčem, nebo pozastavený běh, jehož čekající krok dostal výsledek; čeká na worker na pozadí.
running Probíhá.
waiting Pozastaven: krok čeká na něco mimo běh (schválení člověkem). Ostatní větve doběhly. Běh pokračuje na pozadí, jakmile krok dostane výsledek.
success Dokončen.
failed Krok selhal bez hrany error, byl překročen limit, nebo se běh nepodařilo zahájit.
cancelled Zrušen ve stavu waiting nebo queued.

Kroky se spouštějí, jakmile jsou hotové všechny kroky před nimi, takže nezávislé větve běží paralelně. Krok, jehož všechny vstupní hrany jsou neaktivní (nevybraná větev), je skipped. Selhaný krok s hranou error pokračuje po ní; bez ní běh selže (kroky, které už běží, nejdřív doběhnou).

Běhy se po uplynutí doby uchování (ve výchozím nastavení 90 dní) mažou spolu s konverzacemi a soubory, které jejich kroky vytvořily. Pozastavené běhy se uchovávají, dokud neskončí.

Průběh schválení

Krok human.approval otevře schválení a běh pozastaví. Rozhodnout o něm mohou uživatel, jehož jménem běh probíhá, a členové organizace workflow jmenovaní v kroku; dostanou upozornění v aplikaci a e-mailem. Schválení zobrazuje titulek, zprávu a volitelně formulář (ploché schéma JSON s předvyplněnými hodnotami). Rozhodnutí (schválení s daty formuláře, nebo zamítnutí) se stane výstupem kroku a běh pokračuje na approved nebo rejected. Schválení, o kterém nikdo včas nerozhodne, vyprší: běh pokračuje na timeout, když je tento výstup připojený, jinak krok selže. Viz schválení.

Soubory ve vstupu běhu

Pole v input_schema ručního spouštěče deklarované jako {"type": "object", "format": "file"} obsahuje jeden soubor. Ve vstupu běhu ho pošlete buď přímo jako base64:

json
{
  "invoice": {
    "filename": "invoice-1042.pdf",
    "mime_type": "application/pdf",
    "data": "data:application/pdf;base64,JVBERi0xLjcKJcfsj6IKNSAwIG9iago8PC9MZW5ndGg..."
  }
}

nebo jako id souboru, který uživatel už má ("invoice": "7b1e2c3d-..." nebo {"file_id": "7b1e2c3d-..."}). data je prostý base64 nebo data URL; místo filename lze použít name a místo mime_type lze použít content_type. Platí limit velikosti pro nahrávání a kvóta úložiště.

V běhu se hodnota změní na metadata přílohy souboru, což je i podoba, ve které kroky vracejí soubory:

json
{
  "file_id": "7b1e2c3d-4a5b-4c6d-8e7f-9a0b1c2d3e4f",
  "filename": "invoice-1042.pdf",
  "content_type": "application/pdf",
  "file_url": "https://ayeto.ai/api/v1/public/file/read?id=7b1e2c3d-4a5b-4c6d-8e7f-9a0b1c2d3e4f&secret=...",
  "size": 48213
}

file_url soubor stáhne. Soubory poslané jako base64 patří běhu a mažou se spolu s ním; soubor uvedený svým id zůstává uživateli a s během se nemaže. Stejná podoba base64 se přijímá v polích pro soubory ve formuláři schválení a v tělech webhooků.

Limity

Níže uvedené výchozí hodnoty se mohou v jednotlivých nasazeních lišit.

Limit Výchozí
Uzly na workflow 200
Vstup běhu 200 000 znaků JSON
Kroky provedené v jednom běhu (počítá se každá položka smyčky) 500
Doba běhu (pauzy kvůli schválením se nepočítají) 1 800 sekund
Kroky prováděné současně v jednom běhu 4
Položky na smyčku 100
Uložený výstup jednoho kroku 200 000 znaků JSON (2 000 uvnitř těla smyčky)
Běhy ve frontě na workflow 50
Nejkratší interval plánu 5 minut
Doba na rozhodnutí o schválení ve výchozím nastavení 72 hodin, nejvýše 720
Doba uchování běhů 90 dní
Revize uchovávané na workflow 100

Objekt workflow

Workflow vracené endpointy pro čtení, vytvoření a úpravu. Má také společná pole (id, created, updated, permissions, ...).

Pole Typ Popis
name řetězec Název.
description řetězec Popis.
organization_id UUID Organizace, do které workflow patří, null u osobního workflow. Nastavuje se při vytvoření a nelze ji změnit.
definition objekt Definice konceptu.
sharing pole objektů Uživatelé, se kterými je sdíleno: {user_email, write, scopes}. scopes mohou sdílením pro čtení udělit {"workflow.run": true, "workflow.export": true, "workflow.copy": true}.
group_sharing pole objektů Skupiny, se kterými je sdíleno: {group_id, write, scopes}.
last_run objekt Poslední dokončený nebo pozastavený běh: {run_id, status, finished_at, credits}, nebo null. Jen pro čtení.
published_version celé číslo Poslední publikovaná verze, null, když workflow nikdy publikováno nebylo. Jen pro čtení.
published_at časové razítko Kdy bylo naposledy publikováno. Jen pro čtení.
active boolean Automatické spouštěče publikované verze jsou zapnuté. Jen pro čtení; viz aktivace.
run_as UUID Uživatel, jehož jménem probíhají automatické běhy. Jen pro čtení.

Výpis a čtení workflow

Endpointy POST /api/v3/workflow/find<br>POST /api/v3/workflow/count<br>POST /api/v3/workflow/get?entity_id=<workflow id>
Rozsah ayeto.workflow
Limit požadavků default

find vrací workflow, která uživatel vlastní nebo která jsou s ním sdílená, jako pole workflow, od nejnovějších, pokud neřadíte jinak. count vrací počet odpovídajících workflow jako celé číslo. Oba přijímají obvyklé tělo dotazu (filters, sort_key, sort_order, limit_from, limit_to); pro všechno pošlete {}. Každé workflow přichází s celou definicí, proto dlouhé seznamy stránkujte.

get vrací jedno workflow; id je parametr dotazu a tělo je prázdné.

Užitečné filtry: ["organization_id", "==", "<organization id>"], ["organization_id", "==", null] (osobní), ["active", "==", true], ["name", "regex", "invoice"].

bash
curl -X POST "https://ayeto.ai/api/v3/workflow/find" \
  -H "uni-api-key: $AYETO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filters": [["active", "==", true]], "sort_key": "updated.timestamp", "sort_order": 1, "limit_from": 0, "limit_to": 20}'
bash
curl -X POST "https://ayeto.ai/api/v3/workflow/get?entity_id=5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a" \
  -H "uni-api-key: $AYETO_API_KEY"
json
{
  "id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
  "name": "Customer question",
  "description": "Drafts an answer to a customer question",
  "organization_id": null,
  "definition": {"nodes": ["..."], "edges": ["..."]},
  "sharing": [],
  "group_sharing": [],
  "last_run": {"run_id": "c2a1b0d9-8e7f-4a6b-9c5d-4e3f2a1b0c9d", "status": "success", "finished_at": 1759401234567, "credits": 0.42},
  "published_version": 3,
  "published_at": 1759300000000,
  "active": true,
  "run_as": "0f1e2d3c-4b5a-4968-8776-655443322110",
  "created": {"timestamp": 1759000000000, "user_id": "0f1e2d3c-4b5a-4968-8776-655443322110"},
  "updated": {"timestamp": 1759400000000, "user_id": "0f1e2d3c-4b5a-4968-8776-655443322110"}
}

Workflow, které neexistuje nebo které uživatel nevidí, vrací 404.

Vytvoření workflow

Endpoint POST /api/v3/workflow/create
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
name řetězec Ano Název.
description řetězec Ne Popis.
organization_id UUID Ne Vytvořit workflow v této organizaci; uživatel v ní potřebuje přístup pro zápis. U osobního workflow vynechte.
definition objekt Ne Definice. Výchozí: jediný ruční spouštěč s id start.
sharing pole objektů Ne Sdílení s uživateli, viz objekt workflow.
group_sharing pole objektů Ne Sdílení se skupinami.

Vrací vytvořené workflow. Definice se uloží tak, jak byla zadána, i když není platná; před spuštěním ji validujte. Vytvoření workflow zaznamená také jeho první revizi a vytvoří uživateli asistenta builderu.

bash
curl -X POST "https://ayeto.ai/api/v3/workflow/create" \
  -H "uni-api-key: $AYETO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Customer question", "description": "Drafts an answer to a customer question"}'

Úprava workflow

Endpoint POST /api/v3/workflow/update
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
id UUID Ano Workflow.
name řetězec Ne Nový název.
description řetězec Ne Nový popis.
definition objekt Ne Nová definice konceptu; nahradí celou definici.
sharing pole objektů Ne Nahradí sdílení s uživateli.
group_sharing pole objektů Ne Nahradí sdílení se skupinami.

Změní se jen pole, která pošlete. Organizaci, stav publikování a poslední běh zde změnit nelze. Každá změna definice se zaznamená jako revize; publikovaná verze zůstane, jak byla, dokud workflow znovu nepublikujete. Vrací upravené workflow.

Chcete-li změnit jeden uzel, přečtěte workflow, upravte jeho definition a pošlete ji zpět. Dva klienti, kteří upravují stejné workflow současně, si navzájem přepíší definici.

Smazání workflow

Endpoint POST /api/v3/workflow/delete?entity_id=<workflow id>
Rozsah ayeto.workflow.write
Limit požadavků default

Smaže workflow se všemi jeho běhy (a konverzacemi a soubory, které vytvořily), jeho revizemi, publikovanými verzemi, spouštěči a asistenty builderu. Vrací id smazaného workflow jako řetězec JSON.

Katalog

Endpoint POST /api/v3/workflow/catalog
Rozsah ayeto.workflow
Limit požadavků default

Vrací, z čeho lze workflow sestavovat: každý typ uzlu se schématem JSON jeho parametrů a nástroje, které může volat krok tool.call. Bez těla požadavku.

Pole Typ Popis
node_types[].type řetězec Typ uzlu, např. http.request.
node_types[].title řetězec Zobrazovaný název.
node_types[].description řetězec Co uzel dělá a jak vypadá jeho výstup.
node_types[].category řetězec trigger, action nebo logic.
node_types[].is_trigger boolean Uzel zahajuje běhy.
node_types[].terminal boolean Uzel ukončuje větev (žádné odchozí hrany).
node_types[].handles pole řetězců Pojmenované výstupy; prázdné znamená jeden výchozí výstup. Každý uzel, který není spouštěč, má navíc výstup error. U switch jsou výstupy názvy jeho případů plus otherwise.
node_types[].params_schema objekt Schéma JSON pro params.
tools[].name řetězec Název nástroje pro parametr tool kroku tool.call.
tools[].display_name řetězec Zobrazovaný název.
tools[].description řetězec Popis.
tools[].category řetězec Kategorie.
tools[].icon řetězec Název ikony.
tools[].input_schema objekt Schéma JSON pro params nástroje.

Validace workflow

Endpoint POST /api/v3/workflow/validate
Rozsah ayeto.workflow
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.

Validuje koncept z pohledu volajícího uživatele (včetně toho, zda uživatel může používat asistenty a booster panely, na které koncept odkazuje).

json
{
  "valid": false,
  "issues": [
    {"severity": "error", "message": "Node 'answer' has no output 'true' (outputs: default, error)", "node_id": "answer", "edge": {"source": "answer", "target": "result", "source_handle": "true"}},
    {"severity": "warning", "message": "Node 'draft' is not reachable from any trigger and never runs", "node_id": "draft", "edge": null}
  ]
}

valid je false, když existuje aspoň jeden problém se závažností error; chyby blokují běhy i publikování, varování ne.

Spuštění workflow

Endpoint POST /api/v3/workflow/run
Rozsah ayeto.workflow
Limit požadavků default

Spustí koncept jménem volajícího uživatele a odpoví, když běh skončí nebo se pozastaví.

Požadavek

Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.
input objekt Ne Vstup běhu. U ručního spouštěče by měl odpovídat jeho input_schema; klíče uvedené v required musí být přítomny. Nejvýše 200 000 znaků jako JSON.
trigger_node_id řetězec Ne Spouštěč, od kterého se začíná. Výchozí: první trigger.manual, jinak první spouštěč libovolného typu.

Spuštění od spouštěče plánu, webhooku nebo booster záznamu spustí koncept ručně, což se hodí k testování: předejte vstup, který by spouštěč vytvořil, např. {"body": {...}, "query": {}, "headers": {}} u spouštěče webhooku.

Uživatel potřebuje k workflow přístup pro spouštění (viz rozsahy a přístup). Před zahájením běhu se koncept validuje; neplatný koncept se odmítne s 422. Chybějící povinný klíč vstupu požadavek neodmítne: běh se vytvoří a selže na kroku spouštěče (Missing input: <keys>).

Požadavek se vrátí, až běh skončí, což může trvat minuty (až do limitu doby běhu). Pro dlouhé běhy nebo živý průběh použijte streamování. Když krok čeká na schválení, odpověď se vrátí se status: "waiting"; běh dál sledujte pomocí čtení běhu.

Odpověď

200 OK s během.

Příklady

bash
curl -X POST "https://ayeto.ai/api/v3/workflow/run" \
  -H "uni-api-key: $AYETO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "workflow_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
    "input": {"customer": "Jana Novak", "question": "When will order 1042 be delivered?"}
  }'
python
import json
import os
import requests

response = requests.post(
    "https://ayeto.ai/api/v3/workflow/run",
    headers={"uni-api-key": os.environ["AYETO_API_KEY"]},
    json={
        "workflow_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
        "input": {"customer": "Jana Novak", "question": "When will order 1042 be delivered?"},
    },
    timeout=1900,
)
response.raise_for_status()
run = response.json()
if run["status"] == "success":
    print(json.loads(run["output_json"]) if run["output_json"] else None)
else:
    print(run["status"], run["error"])
javascript
const response = await fetch("https://ayeto.ai/api/v3/workflow/run", {
  method: "POST",
  headers: {
    "uni-api-key": process.env.AYETO_API_KEY,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    workflow_id: "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
    input: { customer: "Jana Novak", question: "When will order 1042 be delivered?" },
  }),
});
if (!response.ok) throw new Error((await response.json()).detail);
const run = await response.json();
const output = run.output_json ? JSON.parse(run.output_json) : null;
console.log(run.status, output ?? run.error);

Objekt běhu

Běh má společná pole a navíc:

Pole Typ Popis
workflow_id UUID Workflow.
organization_id UUID Organizace, ve které běh proběhl, nebo null.
version celé číslo Publikovaná verze, kterou běh provedl; null u běhu konceptu.
trigger_node_id řetězec Spouštěč, od kterého běh začal.
trigger_type řetězec Typ jeho uzlu, např. trigger.manual, trigger.webhook.
trigger_depth celé číslo Počet běhů spuštěných booster záznamem v řetězci před tímto během.
automatic boolean Spuštěn spouštěčem (plán, webhook, booster záznam), ne člověkem.
input_json řetězec Vstup běhu jako text JSON.
status řetězec Viz stavy běhu.
started_at časové razítko Kdy se běh začal provádět; null, dokud je ve frontě.
active_since časové razítko Začátek aktuálního provádění (po pauze obnovení).
finished_at časové razítko Kdy skončil, nebo null.
steps pole kroků Stav každého kroku, který začal nebo byl přeskočen, v pořadí provádění.
output_json řetězec Výsledek (hodnota posledního dosaženého kroku output) jako text JSON; prázdný, když žádný není.
error řetězec Proč běh selhal.
credits číslo Kredity, které běh dosud utratil.

created.user_id je uživatel, jehož jménem běh proběhl.

Objekt kroku

Pole Typ Popis
node_id řetězec Uzel.
node_type řetězec Jeho typ.
status řetězec running, waiting, success, failed nebo skipped.
started_at časové razítko Začátek, null u přeskočeného kroku.
finished_at časové razítko Konec.
handle řetězec Výstup, na kterém běh pokračoval: null (výchozí), pojmenovaný výstup, nebo error.
output_json řetězec Výstup kroku jako text JSON, omezený na 200 000 znaků (2 000 uvnitř těla smyčky).
output_truncated boolean Výstup byl na limitu oříznut; output_json pak není platný JSON.
text řetězec Výsledek nebo stavový text čitelný pro člověka.
error řetězec Proč krok selhal.
file_ids pole UUID Soubory, které krok vytvořil.
conversation_id UUID Konverzace, kterou vytvořil krok assistant.run; lze ji číst přes konverzace.
iteration pole celých čísel U kroku uvnitř těla smyčky indexy položek od nejvnější smyčky dovnitř; jinak prázdné. Krok uvnitř smyčky se objeví jednou pro každou položku.

Příklad:

json
{
  "id": "c2a1b0d9-8e7f-4a6b-9c5d-4e3f2a1b0c9d",
  "workflow_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
  "organization_id": null,
  "version": null,
  "trigger_node_id": "start",
  "trigger_type": "trigger.manual",
  "trigger_depth": 0,
  "automatic": false,
  "input_json": "{\"customer\": \"Jana Novak\", \"question\": \"When will order 1042 be delivered?\"}",
  "status": "success",
  "started_at": 1759401220011,
  "active_since": 1759401220011,
  "finished_at": 1759401234567,
  "steps": [
    {
      "node_id": "start", "node_type": "trigger.manual", "status": "success",
      "started_at": 1759401220020, "finished_at": 1759401220031, "handle": null,
      "output_json": "{\"customer\": \"Jana Novak\", \"question\": \"When will order 1042 be delivered?\"}",
      "output_truncated": false, "text": "", "error": "", "file_ids": [], "conversation_id": null, "iteration": []
    },
    {
      "node_id": "answer", "node_type": "assistant.run", "status": "success",
      "started_at": 1759401220040, "finished_at": 1759401234400, "handle": null,
      "output_json": "{\"text\": \"Dear Jana, order 1042 ships on Friday ...\", \"data\": null, \"files\": []}",
      "output_truncated": false, "text": "Dear Jana, order 1042 ships on Friday ...", "error": "",
      "file_ids": [], "conversation_id": "8e2f4a6c-1b3d-4e5f-8a7b-9c0d1e2f3a4b", "iteration": []
    },
    {
      "node_id": "result", "node_type": "output", "status": "success",
      "started_at": 1759401234410, "finished_at": 1759401234420, "handle": null,
      "output_json": "{\"answer\": \"Dear Jana, order 1042 ships on Friday ...\"}",
      "output_truncated": false, "text": "", "error": "", "file_ids": [], "conversation_id": null, "iteration": []
    }
  ],
  "output_json": "{\"answer\": \"Dear Jana, order 1042 ships on Friday ...\"}",
  "error": "",
  "credits": 0.42,
  "created": {"timestamp": 1759401220000, "user_id": "0f1e2d3c-4b5a-4968-8776-655443322110"}
}

Streamování běhu

Endpoint POST /api/v3/workflow/run/stream
Rozsah ayeto.workflow
Limit požadavků default

Stejný požadavek jako u spuštění workflow, ale odpověď streamuje události běhu tak, jak nastávají. Běh se na serveru provede až do konce, i když se klient odpojí; výsledek si potom přečtěte pomocí čtení běhu.

Chyby přístupu a validace (žádný přístup, neplatný koncept, příliš velký vstup) se vracejí jako běžná chyba HTTP ještě před zahájením streamu.

Formát přenosu

Odpověď (Content-Type: text/event-stream) je posloupnost objektů JSON zapsaných jeden za druhým bez oddělovačů (ne řádky SSE data:); viz streamování. Každý objekt je chunk:

json
{"timestamp": 1759401220012, "data": {"type": "run_start", "run_id": "c2a1b0d9-8e7f-4a6b-9c5d-4e3f2a1b0c9d", "node_id": null, "node_type": null, "status": "running", "handle": null, "text": "", "error": "", "output_json": "", "iteration": []}, "error": null}
  • data je událost běhu (níže).
  • data: "" je keep-alive chunk, posílaný zhruba každou sekundu, když se nic neděje. Ignorujte ho.
  • Chunk s nastaveným error ({"status", "text", "detail"}) hlásí chybu, která stream ukončila.

Události

Každá událost má pole type, run_id, node_id, node_type, status, handle, text, error, output_json a iteration; která z nich nesou hodnotu, závisí na typu.

type Význam Pole s hodnotami
run_start Běh začal. status: "running"
step_start Krok začal. node_id, node_type, status: "running", iteration
step_progress Text průběhu běžícího kroku (pracuje nástroj nebo asistent). node_id, node_type, text, iteration
step_waiting Krok čeká (schválení). Ostatní větve pokračují. node_id, node_type, status: "waiting", text, output_json (u schválení {approval_id, expires_at, assignees})
step_end Krok skončil nebo byl přeskočen. node_id, node_type, status (success, failed, skipped), handle, text, error, output_json, iteration
run_waiting Běh se pozastavil; stream skončí bez run_end. status: "waiting", text (id čekajících kroků oddělená čárkou)
run_end Běh skončil; poslední událost. status (success, failed), error, output_json

Události paralelních větví a položek smyček se prolínají; k jejich rozlišení použijte node_id a iteration.

Příklady

bash
curl -N -X POST "https://ayeto.ai/api/v3/workflow/run/stream" \
  -H "uni-api-key: $AYETO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"workflow_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a", "input": {"question": "When will order 1042 be delivered?"}}'

Python, rozdělení streamu na objekty JSON pomocí raw_decode:

python
import json
import os
import requests

decoder = json.JSONDecoder()

def events(response):
    """Yield the run events of a streamed response."""
    buffer = ""
    for piece in response.iter_content(chunk_size=None, decode_unicode=True):
        buffer += piece
        while True:
            buffer = buffer.lstrip()
            if not buffer:
                break
            try:
                chunk, end = decoder.raw_decode(buffer)
            except json.JSONDecodeError:
                break  # incomplete object, wait for more data
            buffer = buffer[end:]
            if chunk.get("error"):
                raise RuntimeError(chunk["error"]["detail"])
            if chunk.get("data"):
                yield chunk["data"]

with requests.post(
    "https://ayeto.ai/api/v3/workflow/run/stream",
    headers={"uni-api-key": os.environ["AYETO_API_KEY"]},
    json={"workflow_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a", "input": {"question": "When will order 1042 be delivered?"}},
    stream=True,
    timeout=(10, 120),
) as response:
    response.raise_for_status()
    response.encoding = "utf-8"
    for event in events(response):
        if event["type"] == "step_end":
            print(f"{event['node_id']}: {event['status']} {event['error']}")
        elif event["type"] == "run_waiting":
            print("paused, waiting for:", event["text"])
        elif event["type"] == "run_end":
            print("run", event["status"], event["output_json"] or event["error"])

JavaScript, rozdělení streamu sledováním složených závorek mimo řetězce:

javascript
async function* runEvents(response) {
  const reader = response.body.pipeThrough(new TextDecoderStream()).getReader();
  let buffer = "";
  while (true) {
    const { value, done } = await reader.read();
    if (done) return;
    buffer += value;
    let depth = 0, inString = false, escaped = false, start = -1, consumed = 0;
    for (let i = 0; i < buffer.length; i++) {
      const c = buffer[i];
      if (inString) {
        if (escaped) escaped = false;
        else if (c === "\\") escaped = true;
        else if (c === '"') inString = false;
      } else if (c === '"') inString = true;
      else if (c === "{") { if (depth++ === 0) start = i; }
      else if (c === "}" && --depth === 0) {
        const chunk = JSON.parse(buffer.slice(start, i + 1));
        consumed = i + 1;
        if (chunk.error) throw new Error(chunk.error.detail);
        if (chunk.data) yield chunk.data;
      }
    }
    buffer = buffer.slice(consumed);
  }
}

const response = await fetch("https://ayeto.ai/api/v3/workflow/run/stream", {
  method: "POST",
  headers: { "uni-api-key": process.env.AYETO_API_KEY, "Content-Type": "application/json" },
  body: JSON.stringify({
    workflow_id: "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
    input: { question: "When will order 1042 be delivered?" },
  }),
});
if (!response.ok) throw new Error((await response.json()).detail);
for await (const event of runEvents(response)) {
  if (event.type === "step_start") console.log("running", event.node_id);
  if (event.type === "step_end") console.log(event.node_id, event.status, event.error);
  if (event.type === "run_waiting") console.log("paused, waiting for", event.text);
  if (event.type === "run_end") console.log("done", event.status, event.output_json || event.error);
}

Zrušení běhu

Endpoint POST /api/v3/workflow/run/cancel
Rozsah ayeto.workflow
Limit požadavků default
Pole Typ Povinné Popis
run_id UUID Ano Běh.

Zruší běh, který je ve stavu waiting nebo queued. Jeho čekající kroky selžou a jejich otevřená schválení se zruší. Zrušit ho může uživatel, jehož jménem běh probíhal, a uživatelé s přístupem pro zápis k workflow. Běh ve stavu running zrušit nelze (422); skončí sám nebo na limitu doby běhu. Vrací zrušený běh.

Běhy

Endpointy POST /api/v3/workflow/runs/find<br>POST /api/v3/workflow/runs/count<br>POST /api/v3/workflow/runs/get?entity_id=<run id>
Rozsah ayeto.workflow
Limit požadavků default
Endpoint POST /api/v3/workflow/runs/delete?entity_id=<run id>
Rozsah ayeto.workflow.write
Limit požadavků default

Tyto endpointy vidí běhy, které proběhly jménem uživatele API klíče: běhy, které uživatel spustil, a automatické běhy workflow, která uživatel publikoval nebo aktivoval. Běhy jiných uživatelů se hlásí jako nenalezené.

find vrací pole běhů a count celé číslo; oba přijímají tělo dotazu. Běhy obsahují všechny své kroky a výstupy, proto vždy stránkujte. get vrací jeden běh (prázdné tělo). delete smaže běh spolu s konverzacemi a soubory, které jeho kroky vytvořily, a s jeho schváleními a vrátí jeho id; smazání pozastaveného běhu ho ukončí.

Užitečné filtry:

Cíl Filtr
Běhy jednoho workflow ["workflow_id", "==", "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a"]
Pozastavené běhy ["status", "==", "waiting"]
Selhané běhy ["status", "==", "failed"]
Běhy z webhooku ["trigger_type", "==", "trigger.webhook"]
Jen běhy publikované verze ["version", "!=", null]
Spuštěné od určitého okamžiku ["created.timestamp", ">=", 1759363200000]
bash
curl -X POST "https://ayeto.ai/api/v3/workflow/runs/find" \
  -H "uni-api-key: $AYETO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"filters": [["workflow_id", "==", "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a"]], "sort_key": "created.timestamp", "sort_order": 1, "limit_from": 0, "limit_to": 10}'

Chcete-li sledovat pozastavený běh nebo běh ve frontě, dotazujte se opakovaně na get, dokud jeho status nebude success, failed nebo cancelled.

Schválení

Endpointy schválení slouží lidem, kteří rozhodují: může je používat každý uživatel jmenovaný v kroku schválení, bez dalších oprávnění k workflow. API klíč přesto potřebuje rozsah ayeto.workflow.

Endpointy POST /api/v3/workflow/approval/find<br>POST /api/v3/workflow/approval/get<br>POST /api/v3/workflow/approval/decide
Rozsah ayeto.workflow
Limit požadavků default
Endpoint POST /api/v3/workflow/approval/count
Rozsah ayeto.workflow
Limit požadavků high

Objekt schválení

Společná pole a navíc:

Pole Typ Popis
workflow_id UUID Workflow.
workflow_name řetězec Jeho název v okamžiku otevření schválení.
run_id UUID Pozastavený běh.
node_id řetězec Krok schválení.
organization_id UUID Organizace workflow, nebo null.
status řetězec pending, approved, rejected, expired (nikdo nerozhodl včas) nebo cancelled (běh skončil dřív).
title řetězec O čem se rozhoduje.
message řetězec Podrobnosti (Markdown).
form_schema objekt Schéma JSON formuláře ({"type": "object", "properties": {...}, "required": [...]}) s plochými poli typu string, number, integer, boolean nebo souborem ({"type": "object", "format": "file"}); null, když formulář není.
form_values objekt Předvyplněné hodnoty podle názvu pole.
allow_reject boolean Schválení lze zamítnout. Když je false, krok jen sbírá formulář.
assignee_user_ids pole UUID Uživatelé, kteří smějí rozhodnout.
expires_at časové razítko Termín.
timeout_continues boolean Po vypršení běh pokračuje na timeout; jinak krok selže.
decision_data objekt Data formuláře z rozhodnutí.
comment řetězec Komentář k rozhodnutí.
decided_by objekt {id, email, name} osoby, která rozhodla, nebo null.
decided_at časové razítko Kdy bylo rozhodnuto nebo kdy schválení vypršelo.

Výpis schválení

Požadavek:

Pole Typ Povinné Popis
status řetězec Ne Jen schválení s tímto stavem, např. pending.
limit_from celé číslo Ne Index první položky. Výchozí 0.
limit_to celé číslo Ne Index za poslední položkou, 1 až 200. Výchozí 50.

Vrací {"items": [<approval>, ...], "total": <number>} se schváleními, o kterých uživatel smí rozhodnout (nebo o kterých rozhodl), od nejnovějších. total je počet všech odpovídajících schválení.

Počet čekajících schválení

Bez těla požadavku. Vrací {"pending": 3}, počet schválení, která čekají na rozhodnutí uživatele. Vhodné pro pravidelné dotazování kvůli odznaku (badge).

Čtení schválení

Pole Typ Povinné Popis
approval_id UUID Ano Schválení.

Vrací schválení. Získat ho mohou uživatelé, kteří o něm smějí rozhodnout, a uživatelé, kteří mohou číst jeho workflow.

Rozhodnutí o schválení

Pole Typ Povinné Popis
approval_id UUID Ano Schválení.
decision řetězec Ano approve nebo reject.
data objekt Ne Data formuláře (jen při schválení). Pole, která nepošlete, si ponechají předvyplněné hodnoty; pole, která ve formuláři nejsou, se zahodí. Nejvýše 20 000 znaků jako JSON. Pole pro soubory přijímají podobu base64 popsanou v části soubory ve vstupu běhu.
comment řetězec Ne Komentář, nejvýše 2 000 znaků.

Rozhodnout smějí jen uživatelé v assignee_user_ids, a to jen dokud je schválení pending a před expires_at. Data formuláře se validují proti form_schema. Rozhodnutí se stane výstupem kroku schválení:

json
{
  "decision": "approved",
  "data": {"amount": 1200, "note": "OK for this quarter"},
  "comment": "Approved",
  "decided_by": {"id": "0f1e2d3c-4b5a-4968-8776-655443322110", "email": "jana@example.com", "name": "Jana Novak"},
  "decided_at": 1759405000000,
  "approval_id": "e4d3c2b1-a0f9-4e8d-9c7b-6a5f4e3d2c1b"
}

Běh pokračuje na pozadí jménem uživatele, jehož jménem probíhal (ne jménem toho, kdo rozhodl); jeho stav se změní z waiting na queued a potom na running. Vrací rozhodnuté schválení.

bash
curl -X POST "https://ayeto.ai/api/v3/workflow/approval/decide" \
  -H "uni-api-key: $AYETO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "approval_id": "e4d3c2b1-a0f9-4e8d-9c7b-6a5f4e3d2c1b",
    "decision": "approve",
    "data": {"amount": 1200, "note": "OK for this quarter"},
    "comment": "Approved"
  }'

Publikování a spouštěče

Tyto endpointy potřebují k workflow přístup pro zápis.

Informace o nasazení

Endpoint POST /api/v3/workflow/deployment
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.

Vrací stav publikování. Obsahuje URL webhooků i s jejich tajnými klíči, a proto vyžaduje rozsah pro zápis.

Pole Typ Popis
published_version celé číslo Poslední publikovaná verze, nebo null.
published_at časové razítko Kdy byla publikována.
active boolean Automatické spouštěče jsou zapnuté.
run_as UUID Uživatel, jehož jménem probíhají automatické běhy.
draft_changed boolean Koncept se liší od publikované verze (pozice uzlů se nepočítají); vždy true, když není nic publikováno.
triggers pole objektů Automatické spouštěče publikované verze, viz níže.
signing_secret řetězec Klíč, kterým se podepisují požadavky kroků http.request se sign: true; prázdný, když žádný krok nepodepisuje.

Pole spouštěče:

Pole Typ Popis
node_id řetězec Uzel spouštěče.
type řetězec trigger.schedule, trigger.webhook nebo trigger.booster_record.
active boolean Spouštěč se spouští.
next_run_at časové razítko Příští naplánovaný čas (spouštěče plánu).
last_fired_at časové razítko Kdy naposledy zahájil běh.
url řetězec URL webhooku včetně tajného klíče (spouštěče webhooku).
panel_id UUID Booster panel (spouštěče booster záznamu).
collection řetězec Sledovaná kolekce, * pro všechny (spouštěče booster záznamu).

Podepsaný http.request posílá hlavičku X-Ayeto-Signature: sha256=<hex HMAC-SHA256 of the request body> vypočtenou pomocí signing_secret, aby ji přijímající služba mohla ověřit.

Publikování workflow

Endpoint POST /api/v3/workflow/publish
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.
note řetězec Ne Poznámka k verzi, nejvýše 500 znaků.

Validuje koncept z pohledu volajícího, uloží ho jako další verzi, workflow aktivuje a z volajícího udělá uživatele run_as pro automatické běhy. URL webhooků uzlů spouštěčů, které existovaly už dříve, zůstávají stejné. Vrací informace o nasazení. Neplatný koncept se odmítne s 422.

Aktivace a deaktivace

Endpoint POST /api/v3/workflow/activate
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.
active boolean Ano true automatické spouštěče zapne, false vypne.

Aktivace validuje publikovanou verzi z pohledu volajícího a z volajícího udělá uživatele run_as. Dokud je workflow neaktivní, volání webhooků vracejí 404 a plány se nespouštějí. Vrací informace o nasazení. Když není nic publikováno, selže s 422.

Přegenerování tajného klíče webhooku

Endpoint POST /api/v3/workflow/trigger/regenerate
Rozsah ayeto.workflow.write
Limit požadavků low
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.
node_id řetězec Ano Uzel spouštěče webhooku v publikované verzi.

Dá webhooku nový tajný klíč; stará URL okamžitě přestane fungovat. Vrací informace o nasazení s novou URL.

Náhled plánu

Endpoint POST /api/v3/workflow/schedule/preview
Rozsah ayeto.workflow
Limit požadavků high
Pole Typ Povinné Popis
cron řetězec Ano Výraz cron s pěti poli: minuta, hodina, den v měsíci, měsíc, den v týdnu (např. 0 8 * * 1-5). Nejvýše 200 znaků.
timezone řetězec Ne Časové pásmo IANA, např. Europe/Prague. Výchozí UTC.

Zkontroluje plán pro uzel trigger.schedule a vypíše jeho příští časy:

json
{"valid": true, "error": "", "next_runs": [1759471200000, 1759730400000, 1759816800000, 1759903200000, 1759989600000]}

Neplatný plán vrací 200 s valid: false a důvodem v error (chybný počet polí, neznámé časové pásmo, spouštění častěji, než dovoluje nejkratší povolený interval).

Asistent builderu

Endpoint POST /api/v3/workflow/assistant
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.

Každý uživatel s přístupem pro zápis má k workflow vlastního asistenta builderu: asistenta, který v konverzaci workflow čte, upravuje, testovací spouští a vysvětluje. Tento endpoint vrací buildera volajícího (pokud chybí, vytvoří ho) jako asistenta. Mluvte s ním přes chat s jeho id jako asistentem; k tomu je potřeba klíč s rozsahem pro chat. Jeho úpravy se zaznamenávají jako revize s původem builder.

Revize

Každá změna definice je revize. Změny, které jen přesouvají uzly a provede je stejný uživatel během tří minut, se slučují do poslední revize. Uchovávají se nejnovější revize (ve výchozím nastavení 100).

Výpis revizí

Endpoint POST /api/v3/workflow/revisions
Rozsah ayeto.workflow
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.

Vrací až 100 revizí, od nejnovějších, bez jejich definic:

Pole Typ Popis
id UUID Revize.
created_at časové razítko Kdy vznikla.
user_id UUID Kdo ji vytvořil.
origin řetězec created, editor (editor v aplikaci nebo toto API), builder (asistent builderu) nebo restore.
changes objekt {added_nodes, removed_nodes, changed_nodes, added_edges, removed_edges}: seznamy id uzlů a počty hran oproti předchozí revizi.
restored_from UUID U obnovení revize, která byla vrácena.
nodes celé číslo Počet uzlů.
edges celé číslo Počet hran.

Čtení revize

Endpoint POST /api/v3/workflow/revision/get
Rozsah ayeto.workflow
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.
revision_id UUID Ano Revize.

Vrací revizi s její úplnou definicí: společná pole a navíc workflow_id, definition, origin, changes a restored_from.

Obnovení revize

Endpoint POST /api/v3/workflow/revision/restore
Rozsah ayeto.workflow.write
Limit požadavků default

Stejný požadavek jako u čtení revize. Vrátí definici revize jako koncept; obnovení se zaznamená jako nová revize (původ restore), takže ho lze vrátit zpět. Publikovaná verze se nemění. Vrací upravené workflow.

Export a import

Export je dokument JSON s definicí konceptu, názvem a popisem. Běhy, revize, publikované verze, stav spouštěčů (tajné klíče webhooků), podpisový klíč, organizace a sdílení se neexportují. Asistenti, na které kroky odkazují, se exportují jen jako id.

Export workflow

Endpoint POST /api/v3/workflow/export
Rozsah ayeto.workflow
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow.
strip_secrets boolean Ne V tomto API se ignoruje: přístupové údaje se vždy odstraní.

Přes API klíč se hodnoty hlaviček kroků http.request, jejichž název vypadá jako přístupový údaj (obsahuje auth, token, secret, key, password, cookie, signature nebo session), vždy vyprázdní; názvy hlaviček zůstanou. Vyprázdněné cesty jsou uvedeny v secret_keys. Uživatel potřebuje přístup pro zápis, nebo sdílení pro čtení s oprávněním workflow.export.

json
{
  "version": "1.0",
  "exported_at": 1759405000000,
  "workflow": {
    "name": "Customer question",
    "description": "Drafts an answer to a customer question",
    "definition": {"nodes": ["..."], "edges": ["..."]},
    "from_id": "5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a",
    "secret_keys": ["notify_crm.headers.Authorization"]
  }
}

Import workflow

Endpoint POST /api/v3/workflow/import
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
data objekt Ano Exportní dokument, jak ho vrací export.
new_name řetězec Ne Název nového workflow, nejvýše 200 znaků. Výchozí: exportovaný název.
organization_id UUID Ne Vytvořit workflow v této organizaci (je potřeba přístup pro zápis). Výchozí: osobní.

Vytvoří nové, nepublikované workflow volajícího a zvaliduje ho. Kroky, které odkazují na něco, co volající nemůže používat (asistent z jiného účtu, vyprázdněné přístupové údaje), import neblokují; jsou nahlášeny, aby je bylo možné opravit.

Pole Typ Popis
workflow objekt Nové workflow.
issues pole objektů Problémy validace z pohledu volajícího, stejně jako u validace.
secret_keys pole řetězců Hodnoty hlaviček k doplnění (<node id>.headers.<name>).

Formát exportu musí mít stejnou hlavní verzi (1) a definice nejvýše 200 uzlů.

Kopírování workflow

Endpoint POST /api/v3/workflow/copy
Rozsah ayeto.workflow.write
Limit požadavků default
Pole Typ Povinné Popis
workflow_id UUID Ano Workflow, které se má zkopírovat.
new_name řetězec Ne Název kopie. Výchozí: původní název.
organization_id UUID Ne Organizace kopie. Výchozí: osobní.

V jednom volání exportuje koncept a importuje ho jako nové workflow volajícího; odpověď je stejná jako u importu. Uživatel potřebuje přístup pro zápis, nebo sdílení pro čtení s oprávněním workflow.copy. Uživatel s přístupem pro zápis k originálu si přístupové údaje kroků HTTP ponechá; kopie vytvořená díky oprávnění workflow.copy je vynechá.

Webhooky

Endpoint POST /api/v3/workflow/hook/{trigger_id}/{secret}
Rozsah žádný: volání autorizuje tajný klíč v URL
Limit požadavků webhook na IP adresu a navíc limit na spouštěč (níže)

Uzel trigger.webhook publikovaného, aktivního workflow má veřejnou URL. Získáte ji z triggers[].url v informacích o nasazení:

https://ayeto.ai/api/v3/workflow/hook/9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d/Xq3v...secret...

Zacházejte s URL jako s tajným údajem; kdokoli, kdo ji má, může spouštět běhy, které čerpají kredity uživatele run_as. Pokud unikne, přegenerujte ji.

Požadavek

Pošlete POST s tělem JSON a Content-Type: application/json. Tělo jiného typu obsahu se předá jako text (nebo se zparsuje, pokud je to JSON). API klíč není potřeba.

Vstup běhu (výstup spouštěče, dostupný krokům jako {{ input }}) je:

Pole Typ Popis
body libovolný Tělo požadavku; {}, když je prázdné.
query objekt Parametry dotazu (query string) v URL.
headers objekt Jen tyto hlavičky požadavku, pokud jsou přítomny: content-type, user-agent, x-github-event, x-request-id.

Kroky ho čtou jako {{ input.body.order_id }}, {{ input.query.source }} a tak dále. Vstup je omezen na 200 000 znaků JSON.

Soubory v těle

Soubory lze posílat uvnitř těla, v libovolné hloubce (až 32 úrovní):

  • objekt s data v base64 a s name nebo filename a bez jiných klíčů než name, filename, content_type, mime_type, data, size;
  • řetězec data URL data:<type>;base64,....

Každý soubor se uloží jako soubor běhu (vlastní ho uživatel run_as, podléhá limitu velikosti pro nahrávání a kvótě úložiště) a v těle se nahradí metadaty přílohy ({file_id, filename, content_type, file_url, size}). Nejvýše 10 souborů na volání.

Odpověď

200 OK, jakmile je běh zařazen do fronty; běh se provádí na pozadí:

json
{"run_id": "b7c6d5e4-f3a2-4b1c-9d8e-7f6a5b4c3d2e", "status": "queued"}

Běh provádí publikovanou verzi jménem uživatele run_as, který ho vidí přes běhy (trigger_type je trigger.webhook, automatic je true). Jeho vstupu se nedůvěřuje: krok čte soubory uživatele jen tehdy, když je jmenuje sám krok, nikdy proto, že je jmenuje tělo webhooku.

Omezení počtu požadavků

Každý spouštěč přijme nejvýše 60 volání za minutu, 2 000 za hodinu a 20 000 za den, od libovolného počtu odesílatelů. Navíc platí limit proti zahlcení na IP adresu. Workflow také odmítá nové běhy, dokud má ve frontě 50 běhů (ve výchozím nastavení). Obojí odpovídá 429; odpověď limitu požadavků nese Retry-After (sekundy).

Příklad

bash
curl -X POST "https://ayeto.ai/api/v3/workflow/hook/9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d/$WEBHOOK_SECRET?source=shop" \
  -H "Content-Type: application/json" \
  -d '{
    "order_id": 1042,
    "customer": {"name": "Jana Novak", "email": "jana@example.com"},
    "invoice": {"filename": "invoice-1042.pdf", "content_type": "application/pdf", "data": "JVBERi0xLjcKJcfsj6IK..."}
  }'

Chyby

Chyby mají tělo JSON {"detail": "..."}. Chyby autentizace, limitů požadavků a serveru jsou popsány v konvencích.

Stav Význam
401 API klíč chybí, je neplatný nebo mu chybí požadovaný rozsah (API key is invalid).
403 Uživatel nemá k workflow přístup, nebo mu chybí oprávnění či členství v organizaci, které operace potřebuje.
404 Workflow, běh, revize, schválení nebo webhook neexistuje nebo ho uživatel nevidí.
422 Požadavek je neplatný, nebo operace není v aktuálním stavu možná (detail říká proč).
423 Workflow nebo běh právě mění jiný požadavek; zkuste to za chvíli znovu.
429 Příliš mnoho požadavků (s Retry-After), nebo příliš mnoho běhů ve frontě.
500 Chyba serveru.

Chyby specifické pro workflow:

Stav detail Příčina
403 permission denied Účet uživatele nemá povoleno číst nebo zapisovat workflow nebo běhy.
403 You do not have access to this workflow Uživatel není vlastník a workflow s ním není sdílené (nebo je sdílené pro čtení tam, kde je potřeba zápis).
403 This workflow is shared with you without the 'workflow.run' permission Sdílení pro čtení bez oprávnění ke spouštění (obdobně workflow.export, workflow.copy).
403 User is not a member of the organization Workflow patří organizaci, ve které uživatel není.
403 User does not have write permissions in the organization Uživatel nemůže pracovat v organizaci workflow.
404 Workflow not found Workflow neexistuje (nebo bylo odstraněno).
404 entity not found CRUD get, update, delete workflow nebo běhu, který neexistuje nebo nepatří uživateli.
404 Workflow run not found Neznámý běh, nebo běh, který uživatel nesmí zrušit.
404 Revision not found Revize neexistuje nebo patří jinému workflow.
404 Approval not found Neznámé schválení, nebo ho uživatel nesmí vidět či o něm rozhodnout.
404 The file of the input '<key>' was not found or is not accessible Pole pro soubor uvádí soubor, který uživatel nevlastní.
404 The published workflow has no such webhook trigger Přegenerování s uzlem, který není spouštěčem webhooku v publikované verzi.
404 Webhook not found Neznámé id spouštěče nebo chybný tajný klíč.
404 The workflow of this webhook is not active Workflow je deaktivované nebo nepublikované, případně bylo odstraněno.
422 The workflow is not valid: <errors> Spuštění, publikování nebo aktivace definice s chybami validace.
422 '<id>' is not a trigger of the workflow trigger_node_id není spouštěč.
422 The workflow has no trigger Není spouštěč, od kterého by se dalo začít.
422 The run input is too large (at most 200000 characters of JSON) Vstup běhu nebo vstup webhooku přesahuje limit.
422 The input '<key>' must be one file Pole pro soubor obsahuje několik souborů nebo něco jiného.
422 The file is not valid base64 data Soubor vložený přímo s neplatným base64.
422 Too many files (at most 10) Příliš mnoho souborů v těle webhooku.
422 A <status> run can not be cancelled Zrušení běhu, který není ve stavu waiting ani queued.
422 Publish the workflow first Aktivace bez publikované verze.
422 Unsupported workflow export format <version> Import exportu s jinou hlavní verzí.
422 The workflow has too many steps (<n>, at most 200) Import definice nad limitem uzlů.
422 The approval is <status> already Rozhodnutí o schválení, které už nečeká na rozhodnutí.
422 The time to decide the approval is over Rozhodnutí po expires_at.
422 The approval can not be rejected reject, když je allow_reject false.
422 Step '<node id>' of the run does not wait Běh přestal čekat (zrušen, selhal) dřív, než padlo rozhodnutí.
422 The form data is too large (at most 20000 characters of JSON) Data rozhodnutí přesahují limit.
429 Too many requests Limit požadavků, včetně limitu webhooku na spouštěč; viz Retry-After.
429 The workflow already has <n> runs waiting Volání webhooku v době, kdy je fronta workflow plná.

Selhání kroku není chybou HTTP: běh se vrátí se status: "failed" a důvodem v error a v error selhaného kroku.