Tovább a tartalomhoz

Az ügynökindítás életciklusa

Az indítás egy ügynök egyetlen futtatása, egy beszélgetésben, egy adapteren. Minden, ami vele kapcsolatos, a cc_server-en történik: a kliens elküld egy üzenetet, majd figyeli, ahogy az események visszaáramlanak. Egyetlen kliensben sincs indítási útvonal.

Az ügynököket hat okból ébresztjük fel; ezeket a futtatás ébresztési kontextusként hordozza, hogy az ügynök tudja, miért van ébren:

Az ébresztés oka Kiváltó esemény
userMessage Valaki üzenetet küldött egy térben, vagy megemlítette az ügynököt
assignment Hozzárendeltek egy jegyet az ügynökhöz
pipelineStep Egy pipeline-lépés indította el
childCompleted Egy gyermekjegy elkészült
followUp Ütemezett utókövetési szívverés
recovery A helyreállítási útvonal egy hiba után újraindította

Az ébresztési kontextus hordozza az okhoz tartozó azonosítókat — jegy, tér, üzenet, pipeline-futtatás —, és ezek bekerülnek az ügynök környezetébe és promptjába.

A prompt rétegekben épül fel, mindegyik egy címkézett szakasz:

  • Identitás — az ügynök saját azonosítója, neve és munkaterület-azonosítója, valamint egy explicit utasítás, hogy pontosan ezeket a UUID-kat adja át a munkaterület-hatókörű eszközöknek. A munkaterület az ügynök eredendő tulajdonsága, ezért mindig jelen van.
  • Eszközkatalógus és erőforrás-protokollok, majd a munkaterület elrendezése.
  • Rendszerprompt-felülírás, ha az ügynöknek van ilyen, majd a persona (szerepkör szerint paraméterezve) és a csapatösszefoglaló.
  • Készségek — az ügynökhöz rendelt nevek.
  • Végrehajtási szerződés és eljárás az aktuális módhoz.
  • Ébresztési kontextus és említési kontextus: ki hívta az ügynököt, és milyen névsor veszi körül.
  • Módblokk — a mód képességprofiljából és annak materializált eszközlistájából generálódik, így egy prompt soha nem nevezhet meg olyan eszközt, amellyel a futtatás valójában nem rendelkezik.
  • Memóriakontextus — a feladathoz előkeresett tények.
  • Beszélgetési kontextus — a tér közelmúltbeli előzményei, szó szerinti ablakként 50 000 karakterre korlátozva, függetlenül az ügynök beállított kontextusméretétől. A régebbi előzmények nem csonkulnak le: az ügynök igény szerint előkeresi őket a get_messages segítségével, és a szemantikailag releváns régebbi üzenetek továbbra is előkerülnek.

A parancsok kezelése két helyen történik. A /todo és a /compact a beviteli mezőben kerül elfogásra, és szándékosan soha nem perzisztálódnak üzenetként, illetve nem kerülnek elküldésre az ügynöknek — a /compact perzisztálása egy körrel hátrébb tolná a tömörítési határt, és beszennyezné az átiratot. A /plan mindkét helyen kezelve van: a beviteli mező átállítja a tér módját, ettől lesz összhangban az eszközfelszín, a korlát-előbeállítás és a prompt ebben a körben és minden utána következő körben. A /goal, a /loop és a /skill:<name> magában a futtatásban kerül kezelésre, és csak a beépített harness esetén — a /goal és a /loop költségkerettel autonóm munkát indít, a skill: előtaggal ellátott nevet pedig készségként keressük ki, amelynek SKILL.md törzse lesz a kör utasítása. A névtér az, ami szétválasztja a két szókincset: ha a csupasz nevet készségek ellenében oldanánk fel, akkor egy plan vagy compact nevű készséget tartósan elfedne a beépített parancs. A csupasz, nem beépített név továbbra is feloldódik, azoknak az üzeneteknek a kedvéért, amelyek a névtér megjelenése előtt íródtak. Egy ismeretlen név egyszerűen sima szövegként megy tovább.

Mielőtt bármi elindulna, a beszélgetés saját munkagyökeret kap, amely alatt repónként egy elszigetelt, copy-on-write worktree található. Alapértelmezés szerint ez a munkaterülethez kapcsolt összes repó; egy PR-tér — vagy egy explicit kijelöléssel létrehozott tér — csak az engedélyezett listán szereplőket hozza létre, és egy PR-átnézési beszélgetés az egyetlen repóját a pull request head refjére rögzíti, míg a többi az alapértelmezett ágán marad. A forrás-munkapéldány soha nem módosul, és a tér törlésekor a teljes beszélgetéskönyvtár felszabadul.

A copy-on-write az egyetlen implementáció mindenhol, ahol a rift elérhető, a csomagolt natív komponensre támaszkodva. Egy olyan fájlrendszer, amely nem tud reflinket — vagy egy másik köteten lévő adatkönyvtár, mint a repó —, inkább meghiúsítja a létrehozást, mintsem visszaesne egy tartalékra. Windows alatt a git worktree a háttérrendszer, ahol nincs mit építeni copy-on-write háttérrendszerként, és más hosztokon ez nem csendes degradáció. Egy hiányzó rift egy olyan platformon, amely szállítja, törött telepítést jelent — a szerver inkább megtagadja az indulást, mintsem csendben visszaesne egy tartalékra, mert a csendes visszaesés örökre egy lassabb útvonal mögé rejti a hibát.

Futtatásonként két identitás oldódik fel, mielőtt bármilyen folyamat elindulna.

Git szerzőség. Az ügynök által készített commitok szerzője az ügynök — <Name> (agent) <agentId@agents.control-center.local> a GIT_AUTHOR_* és a GIT_COMMITTER_* változókban egyaránt —, soha nem embernek adva ki magát. A helyi rész az ügynök UUID-ja, nem a nevének slugja. A kérő ember egy Co-Authored-By: utótaggal jelenik meg jóváíróként, amelyet a környezet hordoz, és a rendszerprompt előír. Egy explicit, hívó által beállított identitás mindig felülírja mindkettőt.

Forge-identitás. A futtatás GitHub-hitelesítő adata soha nem lehet más, mint a brókeré — egy repóra szűkített App-telepítési token vagy annak környezeti PAT-tartaléka —, soha nem a kérő tag saját tárolt tokenje. Az actingUserId korlátozza a PAT-tartalékot, így az a tag, aki nem a szerver tulajdonosa, nem örökli a szerver elérését; ugyanakkor nem is illeszt személyes tokent az ügynök környezetére.

A modellszolgáltató hitelesítő adatai rögzített sorrendben oldódnak fel, és a sorrend számít:

  1. adapterenkénti környezeti felülírás,
  2. a hívó környezete,
  3. a szerver hitelesítőadat-tára (frissítve az OAuth-tokent, ha közel a lejárata),
  4. a folyamat környezete.

Mivel az adapterenkénti felülírás az első, csendben felülírja az alkalmazásban csatlakoztatott szolgáltatói fiókot. Ha egy futtatás rossz fiókra számláz, elsőként ezt a felülírást érdemes megnézni. A szolgáltatói hitelesítő adatok hoszt-szintűek — a telepítés minden munkaterülete között megosztottak.

A futtatás GitHub-tokenje a hitelesítőadat-brókertől származik: csak olvasásra jogosult, a worktree repójára korlátozott token. A push az ügynökfuttatási átjárón megy át, amely a továbbítás előtt megkérdezi a Küldés távoli tárolóra szabályt, jegykezelő kulcs pedig nem kerül injektálásra. Lásd: Homokozó és biztonság.

A futtatás a worktree-jét használva munkakönyvtárként indul, és — a Claude Code esetében — egy generált MCP-konfigurációval, hogy az ügynök elérje a Control Center eszközfelszínét. Az ACP és a harness bash tisztított környezetet kap; a Claude Code a NoSandboxAdapter-en keresztül a hoszt környezetét örökli.

A futtatás egy típusos eseménysorozatot streamel vissza, amelyet a streamfeldolgozó üzenetdeltákként perzisztál, átiratszegmensekké fűz össze, és üzenetküldési eseményekké alakít:

Esemény Mit hordoz
thinking Gondolkodási kimenet, beágyazva megjelenítve
text Látható kimenet
toolCall Egy eszközhívás, annak azonosítójával és strukturált argumentumaival
toolResult A hozzá tartozó eredmény, megjelölve, ha hibázott, vagy ha részleges stream
usage Tokenek száma és költség egy mérési ablakra
error Egy hiba, az adapter strukturált kódjával, ha az jelentett ilyet
sandboxViolation Az operációs rendszer megtagadott egy rendszerhívást. Csak ott kerül kibocsátásra, ahol egy homokozó ténylegesen körülveszi a folyamatot — lásd a fenti megjegyzést
debug Futásidejű diagnosztika (indítási jelölők, korlát-döntések, szerződésemlékeztetők)
done A futtatás befejeződött

Szándékosan nincs sehol körplafon. Egy kemény iterációszám megölne legitim, hosszú munkákat (migrációk, fan-out takarítás), és semmit nem kapna el korábban, mint az alábbi őrök. Egy futtatás akkor ér véget, amikor:

  • a modell magától megáll;
  • egy ember leállítja, vagy átveszi a beszélgetést (ez a beépített harness-t a következő tiszta körhatárán szünetelteti — egy Claude Code futtatás, amelynek nincs biztonságos határa, inkább leállításra kerül);
  • a csendfigyelő riaszt. Ha a küszöbértékig nincs kimenet, a munkamenet silentRun hibával lezárul. Az alapérték 15 perc, amely a nagyrészt olvasásra épülő módokban (átnézési és tervmód) 10 percre csökken; az ügynök 1 és 240 perc között felülírhatja. A csendfigyelő akkor élesedik, amikor egy gyermekfolyamat jelenti a PID-jét, így lefedi a Claude Code CLI-t — nem fedi le viszont a beépített harness-t, amely semmit nem indít;
  • egy költségkorlát életbe lép — de csak az autonóm parancsoknál.

A végzetes hurok elleni őr nem lezáró: három egymás utáni azonos eszközhívás esetén a hurok más irányba tereli az ügynököt, hogy változtasson a megközelítésén.

Összevetve: egy közönséges interaktív kör a beépített harness-en nem rendelkezik körplafonnal, költségkorláttal és csendfigyelővel sem. Akkor ér véget, amikor a modell megáll, vagy amikor te leállítod. Ez szándékos kompromisszum — az alternatívák mind megölnék a legitim, hosszú munkát —, azt viszont jelenti, hogy egy felügyelet nélküli interaktív futtatást semmi más nem korlátoz, csak a modell saját megítélése.

Futtatás közben a futó ügynöknek küldött üzenet irányításként sorba áll, és a következő körhatáron ürül ki, így anélkül terelheted a futtatást, hogy megölnéd. Az irányítás, a szüneteltetés, az alügynökök és a befejezési szerződés a beépített harness funkciói; a Claude Code egyikkel sem rendelkezik.

Minden indítás ír egy AgentRunLog-ot: kezdési és befejezési idő, összefoglaló, tokenek száma és becsült költség (beleértve az alügynököktől összesített költséget), adapter és modell, folyamatazonosító és naplóútvonal, a beszélgetés, valamint minden jegy vagy pipeline-futtatás, amelyhez tartozik, továbbá két osztályozási mező, amelyek az igazság nagy részét hordozzák.

  • Az állapot durva: pending, running, completed, error.
  • Az elevenség a finomabb kép: alive, productive, completed, blocked, empty, looping, failed, stalled, dead.
  • A hibatípus hasznosan csoportosítja a hibákat: transientUpstream, sandboxInfrastructure, budgetExceeded, processLost, silentRun, unknown.

A futtatás lezárása közzéteszi az AgentRunCompleted eseményt, amelyre sok minden épül: a pipeline-költségek összesítése, egy futtatásra váró pipeline-lépés folytatása, a mögöttes jegy lezárása, egy orchestráció terminális állapotra képezése, a célfelügyelő folytatás-vagy-leállás döntése, az ellenőrző szerepkör és a futtatás utáni költségkeret-kiértékelés. A jelenléti névsor külön következik, a közelmúltbeli futtatási naplók figyelésével, nem az esemény alapján. Az „ügynök befejezte” értesítés nem szerepel ezen a listán: az esemény akkor sül el, amikor a folyamat adatfolyama véget ér, még a válasz kiírása előtt, ezért az értesítés a kör MessageReceived eseménye, amely az üzenet tárolása után jelenik meg.

A költségkeret érvényesítése reakció, nem kapu. Amikor egy futtatás befejeződik, a kiértékelő összehasonlítja az ügynök hónap eleje óta tartó költését annak tényleges felső korlátjával (egy csatolt költségkeret-szabályzattal, ha van ilyen, egyébként az ügynök saját havi értékével; a nulla korlátlant jelent). A lágy küszöb átlépése figyelmeztető incidenst rögzít; a költségkeret kimerítése kemény incidenst rögzít, és a szervezeti ábrán az ügynök életciklus-állapotát paused-ra billenti. Az indítás továbbra is elfogad munkát attól az ügynöktől. Egy BudgetThresholdCrossed pipeline-eseményindító ugyanabból az eseményből utókövetési munkát indíthat.

Újrapróbálkozások leszármazási vonala

Szekció neve “Újrapróbálkozások leszármazási vonala”

Minden futtatási napló hordozhat újrapróbálkozási leszármazást — egy szülő futtatásazonosítót, egy kísérletszámlálót és egy folytatási összefoglalót. A beszélgetés futtatásfája akkor jeleníti meg a kísérlet számát, ha az nem nulla. Egy „próbáld újra” a csevegésből egy új indítás, friss futtatási naplóval.