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.
{
"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:
{
"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:
{
"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"].
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}'
curl -X POST "https://ayeto.ai/api/v3/workflow/get?entity_id=5d4c3b2a-1f0e-4d9c-8b7a-6f5e4d3c2b1a" \
-H "uni-api-key: $AYETO_API_KEY"
{
"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.
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).
{
"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
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?"}
}'
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"])
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:
{
"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:
{"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}
dataje 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
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:
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:
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] |
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í:
{
"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í.
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:
{"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.
{
"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
datav base64 a snamenebofilenamea 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í:
{"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
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.