Agent API
API agenta umožňuje vašim skriptům, úlohám CI a nástrojům komunikovat s agentem přes HTTP. Ověříte se osobním API tokenem, pošlete zprávu a odpověď dostanete buď po dokončení běhu, nebo průběžně streamovanou. Vše, co spuštění provede, je běžný běh konverzace: stejné nástroje, oprávnění, Projekty a účtování spotřeby jako u zprávy napsané ve webové aplikaci.
Příklady používají https://elowen.example.com; nahraďte ji adresou, na které Elowen otevíráte. Všechny cesty vedou přes stejného hostitele pod /api.
Osobní API tokeny
Token jedná za vás. Má přesně takový přístup, jaký má váš účet, včetně práv administrátora, takže s ním zacházejte jako s heslem.
Vytvořte token
- Otevřete Účet → API tokeny.
- Vyberte Nový token, zadejte název, který později poznáte, a případně zvolte poslední den, kdy má token fungovat. Necháte-li datum prázdné, token funguje, dokud jej neodstraníte. Přestane fungovat na konci zvoleného dne v UTC.
- Zkopírujte token z okna, které se otevře. Zobrazí se jen jednou. Elowen ukládá jeho otisk, ne token samotný, takže jej už nikdo nemůže zobrazit. Pokud jej ztratíte, vyberte v řádku tokenu Kopírovat a v dialogu potvrďte Vytvořit novou hodnotu. Token dostane zcela novou hodnotu, která se zobrazí jednou a uloží se do schránky. Vše, co dál používá starou hodnotu, okamžitě přestane fungovat; název, limity a zaznamenané využití zůstanou.
Každý token začíná na elw_, takže uniklý token snadno poznáte v protokolu nebo ve vloženém textu. Účty chatbotů tokeny mít nemohou.
Řádek Volání agenta pod kartou tokenů zkopíruje hotový příklad curl pro endpoint spuštění, s už vyplněnou adresou vaší instance Elowen.
Využití a limity
Tokeny najdete v jedné kartě, každý na vlastním řádku, s posledním použitím, platností a prefixem a s tlačítky Kopírovat, Limity a Odstranit. Otevřením řádku zobrazíte běhy tokenu, zodpovězené i nezdařené běhy a náklady za den, a také limity, podle kterých token běží. Náklady se počítají pro období, které zvolíte vedle grafu; zvolené období pak platí pro všechny tokeny. Dny se počítají v UTC.
Výběrem Limity dáte tokenu strop. Každý limit je nepovinný a každý má vlastní přepínač Bez omezení:
| Limit | Co se stane při dosažení |
|---|---|
| Náklady za den | Další spuštění se odmítnou až do dalšího dne v UTC. |
| Náklady za měsíc | Další spuštění se odmítnou až do dalšího kalendářního měsíce v UTC. |
| Požadavků za minutu | Každý požadavek s tímto tokenem se odmítne až do konce minuty. |
| Souběžné běhy | Nové spuštění se odmítne, dokud tolik běhů stále probíhá. |
Pokud běh spotřeboval tokeny a nic je neocenilo — poskytovatel nehlásil žádnou částku a Elowen neměl pro model cenu (žádný záznam v katalogu ani nastavenou cenu pro daný model) — jsou náklady toho dne neznámé. Elowen nikdy nepovažuje neznámé za nulu: token ukazuje Cena neznámá a token s denním limitem nákladů se odmítá do konce toho dne v UTC, token s měsíčním limitem do konce toho měsíce v UTC. Limit nákladů počítá, co běhy už spotřebovaly, takže běhy, které stále probíhají, když se spouští nový, mohou den nebo měsíc mírně překročit.
Pokud se Elowen restartuje během spuštění, toto spuštění se počítá jako nezdařené a jeho útratu už nelze tokenu připsat. Den, kdy začalo, a den restartu se pak počítají jako neznámé náklady, takže token s denním limitem nákladů se odmítá do konce těchto dnů v UTC a token s měsíčním limitem do konce měsíců, do kterých tyto dny patří.
Odstraňte token
V řádku tokenu vyberte Odstranit. Vše, co jej používá, okamžitě přestane fungovat a zaznamenané využití se smaže. Smazáním účtu se smažou i všechny vaše tokeny.
Co token neumí
Token se nemůže odhlásit, změnit vaše heslo, vydávat se za jiný účet ani vytvářet, upravovat, obnovovat či odstraňovat tokeny, včetně sebe sama. To vyžaduje vaše přihlášení ve webové aplikaci a API na takové požadavky odpovídá 403.
Ověřování
Token posílejte v hlavičce Authorization u každého požadavku:
export ELOWEN_URL=https://elowen.example.com
export ELOWEN_TOKEN=elw_… # the token you copied
curl -sS "$ELOWEN_URL/api/auth/me" -H "Authorization: Bearer $ELOWEN_TOKEN"
Chybějící, neznámý, smazaný nebo propadlý token dostane 401 {"error":"unauthorized"}. Totéž se stane poté, co tokenu vytvoříte novou hodnotu: stará hodnota je od té chvíle mrtvá.
Spusťte agenta
POST /api/v1/agent/runs pošle jednu zprávu a spustí jeden běh agenta.
| Pole | Typ | Význam |
|---|---|---|
message |
string, povinné | Co má agent udělat. |
conversationId |
string, nepovinné | Pokračovat v této konverzaci. Bez něj spuštění začne novou. |
model |
string, nepovinné | Běží na tomto modelu. Viz Modely. |
stream |
boolean, nepovinné | true streamuje průběh jako server-sent events. |
Počkejte na odpověď
curl -sS "$ELOWEN_URL/api/v1/agent/runs" \
-H "Authorization: Bearer $ELOWEN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Summarise the failed builds from yesterday"}'
{ "conversationId": "brain-12-…", "reply": "Two builds failed…", "usage": { "tokens": 1840, "costUsd": 0.012 } }
usage.costUsd je null, když spuštění nic neocenilo: poskytovatel nehlásil žádnou částku a Elowen neměl pro model cenu, ani cenu z katalogu, ani cenu pro daný model. Cena, kterou Elowen pro model má, je odhad, a částka, kterou hlásí sám poskytovatel, má přednost, včetně hlášené $0.
Volání čeká až dvě minuty. Pokud běh trvá déle, dostanete 202 s { "conversationId": "…", "reply": null, "usage": null }. Běh pokračuje dál a jeho odpověď přistane v této konverzaci; u dlouhé práce raději streamujte.
Streamujte běh
curl -sSN "$ELOWEN_URL/api/v1/agent/runs" \
-H "Authorization: Bearer $ELOWEN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Check the open pull requests","stream":true}'
Odpověď má typ text/event-stream. Každá událost má název a řádek data s JSON:
event: start
data: {"conversationId":"brain-12-…"}
event: tool
data: {"phase":"start","id":"t1","name":"Bash","detail":"gh pr list"}
event: tool
data: {"phase":"end","id":"t1","ok":true}
event: delta
data: {"text":"There are three open"}
event: delta
data: {"text":" pull requests…"}
event: final
data: {"conversationId":"brain-12-…","reply":"There are three open pull requests…","usage":{"tokens":2210,"costUsd":0.019}}
| Událost | Data |
|---|---|
start |
{ conversationId }, vždy první. |
delta |
{ text }, další část odpovědi. |
tool |
{ phase: "start", id?, name, detail? }, když se nástroj spustí, { phase: "end", id?, ok }, když skončí. |
error |
{ message }, když běh selže. Stream pak skončí bez final. |
final |
{ conversationId, reply, usage }, když je běh hotový. |
Pokud se odpojíte, běh pokračuje dál a jeho odpověď přistane v konverzaci.
Konverzace
Každé spuštění v odpovědi uvádí conversationId, které použilo. Pošlete jej zpět a budete pokračovat ve stejné konverzaci, s její historií a kontextem:
curl -sS "$ELOWEN_URL/api/v1/agent/runs" \
-H "Authorization: Bearer $ELOWEN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Open an issue for the second one","conversationId":"brain-12-…"}'
- Bez
conversationIdkaždé spuštění začne novou konverzaci. - Můžete pokračovat v kterékoli své konverzaci, včetně těch, které jste začali ve webové aplikaci. Konverzace jiného účtu nebo neexistující identifikátor dostane
404 {"error":"unknown conversation"}. - Konverzace zpracovává vždy jeden běh. Spuštění do konverzace, která už pracuje — ať na jiném spuštění, nebo na zprávě napsané ve webové aplikaci — se odmítne s
409 {"error":"conversation_busy"}a nic se nezapočítá. Počkejte, až druhý běh skončí, a pošlete požadavek znovu, nebo začněte novou konverzaci. - Spuštění přes API nikdy nemění, kterou konverzaci vaše webová aplikace nebo CLI otevře.
- Konverzace z API se v historii konverzací zobrazují jako každá jiná.
Modely
Vypište modely, které můžete použít
curl -sS "$ELOWEN_URL/api/brain/models" -H "Authorization: Bearer $ELOWEN_TOKEN"
[
{ "provider": "anthropic", "providerLabel": "Anthropic", "model": "claude-sonnet-4-5", "exec": "anthropic/claude-sonnet-4-5", "contextWindow": 200000, "…": "…" }
]
Seznam obsahuje jen modely, které váš účet smí používat. Hodnota exec, <provider>/<model>, je to, co předáte při výběru modelu.
Vyberte model pro jedno spuštění
Přidejte do spuštění model. Konverzace se na tento model přepne před začátkem běhu a zůstane na něm i pro další spuštění:
curl -sS "$ELOWEN_URL/api/v1/agent/runs" \
-H "Authorization: Bearer $ELOWEN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"Review this diff","model":"anthropic/claude-sonnet-4-5"}'
Přepněte model konverzace
POST /api/brain/model přepne existující konverzaci stejně jako výběr modelu ve webové aplikaci. Konverzaci vždy předávejte jako session; bez něj se přepnutí použije na konverzaci, kterou má webová aplikace otevřenou.
curl -sS "$ELOWEN_URL/api/brain/model" \
-H "Authorization: Bearer $ELOWEN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"model":"anthropic/claude-sonnet-4-5","session":"brain-12-…"}'
{ "model": "claude-sonnet-4-5" }
Obě cesty se řídí stejnými pravidly jako webová aplikace. Model, který nesmíte používat, nebo ten, který nemůže tuto konverzaci převzít, dostane 409 se stejnou chybovou zprávou, jakou ukazuje webová aplikace, a žádný běh neproběhne.
Chyby
Každé tělo chyby je JSON s polem error.
| Stav | Kdy | Tělo |
|---|---|---|
400 |
Tělo požadavku není platný JSON, některé pole má špatný typ nebo obsahuje pole, které endpoint nepřijímá. | { "error": "…" } s popisem pole |
401 |
Token chybí, je neznámý, smazaný nebo propadlý, případně byla jeho hodnota nahrazena. | { "error": "unauthorized" } |
402 |
Váš účet dosáhl měsíčního limitu útraty nebo se používá model bez známé ceny, zatímco účet má limit útraty. Jde o limit účtu, ne tokenu. | { "error": "spend_limit", "reason": "monthly_limit" or "unpriced_model", "resetsAt": "…" }, kde resetsAt je začátek dalšího měsíce v UTC |
403 |
Endpoint vyžaduje přihlášenou relaci v prohlížeči (viz Co token neumí) nebo jej váš účet nesmí používat. | { "error": "forbidden" } |
404 |
conversationId není jedna z vašich konverzací. |
{ "error": "unknown conversation" } |
409 |
Konverzace už zpracovává běh. | { "error": "conversation_busy" } |
409 |
Požadovaný model byl odmítnut. | { "error": "…" }, stejná zpráva, jakou ukazuje webová aplikace |
429 |
Byl dosažen limit tokenu. | { "error": "…", "reason": "…" } a hlavička Retry-After |
500 |
Běh selhal, nemohl se spustit nebo se nepodařilo přepnout na požadovaný model. S "stream": true běh, který se nemohl spustit, odpoví tímto stavem místo streamu. |
{ "error": "…", "conversationId": "…" } |
503 |
Agent na tomto serveru není dostupný. Vrací se i tehdy, když se nepodařilo zaznamenat využití účtu, což blokuje jeho placené požadavky, dokud administrátor využití nesrovná a služba se restartuje. | { "error": "brain unavailable" }, případně zpráva o využití |
Odmítnutí limitem
429 vždy nese Retry-After, počet sekund, které je třeba počkat, a reason, se kterým může skript pracovat:
error |
reason |
Význam | Retry-After |
|---|---|---|---|
limit_exhausted |
requests_per_minute |
Příliš mnoho požadavků v této minutě. | Sekundy do konce minuty. |
limit_exhausted |
monthly_cost |
Limit nákladů na tento měsíc je dosažen. | Sekundy do dalšího měsíce v UTC. |
limit_unverifiable |
monthly_cost_unverifiable |
Některý běh v tomto měsíci nehlásil náklady, takže limit nákladů nelze ověřit. | Sekundy do dalšího měsíce v UTC. |
limit_exhausted |
daily_cost |
Limit nákladů na dnešní den je dosažen. | Sekundy do dalšího dne v UTC. |
limit_unverifiable |
daily_cost_unverifiable |
Některý běh dnes nehlásil náklady, takže limit nákladů nelze ověřit. | Sekundy do dalšího dne v UTC. |
limit_exhausted |
concurrent_turns |
Příliš mnoho spuštění stále probíhá. | 1 |
Když je najednou dosaženo více limitů nákladů, odpověď uvádí širší okno: měsíc před dnem, takže Retry-After je čas, kdy spuštění skutečně může uspět.
curl -sS -D - "$ELOWEN_URL/api/v1/agent/runs" \
-H "Authorization: Bearer $ELOWEN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"message":"One more"}'
HTTP/1.1 429 Too Many Requests
Retry-After: 52380
Content-Type: application/json
{"error":"limit_exhausted","reason":"daily_cost"}
Spuštění odmítnuté limitem nic nevytvoří: žádnou konverzaci, žádný běh, a nic se nezapočítá do běhů tokenu. Ani spuštění odmítnuté jako conversation_busy, kvůli neznámé konverzaci či modelu nebo proto, že jeho běh nemohl začít, se nepočítá.