Langkau ke kandungan

Kitaran hayat penghantaran ejen

Penghantaran ialah satu larian bagi satu ejen, dalam satu perbualan, pada satu penyesuai. Segala-galanya mengenainya berlaku pada cc_server: klien menghantar mesej dan kemudian memerhati peristiwa distrim kembali. Tiada laluan penghantaran dalam mana-mana klien.

Ejen dibangunkan atas enam sebab, yang dibawa oleh larian sebagai konteks kebangkitannya supaya ejen tahu mengapa ia bangun:

Sebab kebangkitan Pencetus
userMessage Seseorang menghantar mesej dalam ruang, atau menyebut ejen
assignment Tiket ditugaskan kepada ejen
pipelineStep Langkah pipeline menghantarnya
childCompleted Tiket anak selesai
followUp Denyut susulan berjadual
recovery Laluan pemulihan menghantar semula selepas kegagalan

Konteks kebangkitan membawa id yang sepadan dengan sebab itu — tiket, ruang, mesej, larian pipeline — dan ia disuntik ke dalam persekitaran dan prompt ejen.

Prompt dibina secara berlapis, setiap satu bahagian berlabel:

  • Identiti — id, nama dan id ruang kerja ejen itu sendiri, dengan arahan jelas untuk menyerahkan UUID tepat itu kepada alat berlingkup ruang kerja. Ruang kerja intrinsik kepada ejen, jadi ia sentiasa hadir.
  • Katalog alat dan protokol sumber, kemudian susun atur ruang kerja.
  • Pengatasan prompt sistem, jika ejen mempunyai satu, kemudian persona (berparameter peranan) dan ringkasan pasukan.
  • Kemahiran — nama-nama pada ejen.
  • Kontrak dan prosedur pelaksanaan untuk modus semasa.
  • Konteks kebangkitan dan konteks sebutan: siapa yang memanggil ejen dan senarai di sekelilingnya.
  • Blok modus — dijana daripada profil kebolehan modus dan senarai alat terwujudnya, jadi prompt tidak boleh sesekali menamakan alat yang sebenarnya tiada pada larian itu.
  • Konteks memori — fakta yang diambil untuk tugasan itu.
  • Konteks perbualan — sejarah ruang terkini, dihadkan pada 50,000 aksara tetingkap verbatim tanpa mengira saiz konteks yang dikonfigurasikan pada ejen. Sejarah lama tidak dipotong: ejen mengambilnya atas permintaan dengan get_messages dan mesej lama yang berkaitan secara semantik masih muncul.

Perintah terbahagi kepada dua tempat. /todo dan /compact dipintas dalam penggubah mesej dan sengaja tidak pernah disimpan sebagai mesej atau dihantar kepada ejen — menyimpan /compact akan menolak potongan pemampatan ke belakang satu pusingan dan mencemarkan transkrip. /plan dikendalikan di kedua-dua tempat: penggubah mesej menukar modus ruang itu, yang menjadikan permukaan alat, praset guardrail dan prompt selaras untuk pusingan ini dan setiap pusingan selepasnya. /goal, /loop dan /skill:<name> dikendalikan di dalam larian itu sendiri dan hanya pada harness terbina — /goal dan /loop memulakan kerja autonomi dengan belanjawan kos, dan nama berawalan skill: dicari sebagai kemahiran yang badan SKILL.md-nya menjadi arahan pusingan itu. Ruang nama itulah yang memisahkan dua perbendaharaan kata ini: menyelesaikan nama kosong terhadap kemahiran bermakna kemahiran bernama plan atau compact sentiasa diatasi oleh yang terbina. Nama kosong bukan terbina masih diselesaikan, untuk mesej yang ditulis sebelum ruang nama wujud. Nama yang tidak dikenali hanya jatuh melalui sebagai teks biasa.

Sebelum apa-apa berjalan, perbualan mendapat akar kerjanya sendiri, dengan worktree salin-semasa-tulis terasing bagi setiap repo di bawahnya. Secara lalai, itu setiap repo yang dipautkan kepada ruang kerja; ruang PR — atau ruang yang dicipta dengan pemilihan eksplisit — menyediakan hanya yang disenaraikan-benar dan perbualan semakan PR memaku satu repo-nya pada ref kepala pull request itu sementara yang lain duduk pada cawangan lalai masing-masing. Checkout sumber tidak pernah diubah dan keseluruhan direktori perbualan diambil semula apabila ruang itu dipadam.

Salin-semasa-tulis ialah satu-satunya pelaksanaan di mana sahaja rift dihantar, disokong oleh natif yang dibundelkan. Sistem fail yang tidak boleh reflink — atau dir data pada volum berbeza daripada repo — menggagalkan penyediaan itu dan bukannya kembali ke asal. git worktree ialah bahagian belakang pada Windows, di mana tiada bahagian belakang salin-semasa-tulis untuk dibina, dan ia bukan degradasi senyap pada hos lain. rift yang hilang pada platform yang menghantarnya ialah pemasangan rosak — pelayan enggan boot dan bukannya kembali secara senyap, kerana sandaran senyap menyembunyikan kerosakan itu di sebalik laluan yang lebih perlahan selama-lamanya.

Dua identiti diselesaikan bagi setiap larian, sebelum mana-mana proses dilancarkan.

Pengarangan Git. Commit yang dibuat oleh ejen dikarang sebagai ejen — <Name> (agent) <agentId@agents.control-center.local> dalam kedua-dua GIT_AUTHOR_* dan GIT_COMMITTER_* — tidak pernah menyamar sebagai manusia. Bahagian setempat ialah UUID ejen, bukan slug namanya. Manusia yang membuat permintaan diberi kredit melalui treler Co-Authored-By:, dibawa dalam persekitaran dan diarahkan dalam prompt sistem. Identiti eksplisit yang ditetapkan pemanggil sentiasa mengatasi kedua-duanya.

Identiti forge. Kelayakan GitHub larian itu sentiasa hanya milik broker — token pemasangan App berlingkup repo, atau sandaran PAT persekitarannya — tidak pernah token tersimpan ahli yang membuat permintaan sendiri. actingUserId membatasi sandaran PAT supaya ahli yang bukan pemilik pelayan tidak mewarisi jangkauan pelayan; ia tidak melapisi token peribadi ke atas persekitaran ejen.

Kelayakan penyedia model diselesaikan dalam susunan tetap dan susunan itu penting:

  1. pengatasan persekitaran per-penyesuai,
  2. persekitaran pemanggil,
  3. stor kelayakan pelayan (menyegarkan token OAuth jika hampir tamat tempoh),
  4. persekitaran proses.

Kerana pengatasan per-penyesuai datang dahulu, ia secara senyap mengalahkan akaun penyedia yang disambungkan dalam apl. Jika sesuatu larian dibilkan ke akaun yang salah, pengatasan itu tempat pertama untuk dilihat. Kelayakan penyedia adalah global hos — dikongsi merentas setiap ruang kerja pada pemasangan itu.

Token GitHub larian datang daripada broker kelayakan: token baca sahaja yang berskop repo worktree. Push melalui gerbang larian ejen, yang bertanya kepada peraturan Push ke remote sebelum memajukannya, dan tiada kunci penetikan disuntik. Lihat Kotak pasir dan keselamatan.

Larian dilancarkan dengan worktree-nya sebagai direktori kerja dan — untuk Claude Code — konfigurasi MCP yang dijana supaya ejen boleh mencapai permukaan alat Control Center. ACP dan bash harness mendapat persekitaran yang disanitasi; Claude Code melalui NoSandboxAdapter mewarisi persekitaran hos.

Larian menstrim jujukan peristiwa bertaip kembali, yang diproses oleh pemproses strim dan disimpan sebagai delta mesej, dilipat menjadi segmen transkrip dan dijadikan peristiwa pemesejan:

Peristiwa Apa yang dibawanya
thinking Output penaakulan, dipaparkan secara sebaris
text Output yang kelihatan
toolCall Satu penggunaan alat, dengan id dan hujah berstrukturnya
toolResult Hasil yang sepadan, ditandakan apabila ia ralat atau strim separa
usage Kiraan token dan kos untuk tetingkap pengukuran
error Ralat, dengan kod berstruktur penyesuai apabila ia melaporkannya
sandboxViolation OS menafikan panggilan sistem. Hanya dikeluarkan di mana kotak pasir benar-benar membalut proses — lihat nota di atas
debug Diagnostik masa jalan (penanda pelancaran, keputusan pengawal, teguran kontrak)
done Larian tamat

Secara sengaja tiada siling pusingan di mana-mana. Kiraan lelaran keras membunuh kerja panjang yang sah (migrasi, pembersihan fan-out) dan tidak menangkap apa-apa yang pengawal di bawah tangkap lebih awal. Larian tamat apabila:

  • model berhenti dengan sendirinya;
  • manusia menghentikannya, atau mengambil alih perbualan (yang menjeda harness terbina pada sempadan pusingan bersih seterusnya — larian Claude Code, yang tiada sempadan selamat, dihentikan sebaliknya);
  • pengawas senyap tercetus. Tiada output untuk tempoh ambang dan sesi itu ditamatkan dengan kegagalan silentRun. Lalai ialah 15 minit, turun kepada 10 dalam modus yang banyak membaca (semakan dan pelan); ejen boleh mengatasinya antara 1 dan 240 minit. Pengawas itu bersedia apabila proses anak melaporkan PID-nya, jadi ia meliputi CLI Claude Code — bukan harness terbina, yang tidak melahirkan apa-apa;
  • had kos tercetus — tetapi hanya untuk perintah autonomi.

Pengawal gelung malapetaka bukan penamat: tiga panggilan alat yang sama berturut-turut dan gelung itu mengemudi ejen untuk menukar pendekatan.

Secara keseluruhannya, pusingan interaktif biasa pada harness terbina tiada siling pusingan, tiada had kos dan tiada pengawas senyap. Ia tamat apabila model berhenti atau apabila anda menghentikannya. Itu pertukaran yang disengajakan — semua alternatif membunuh kerja panjang yang sah — tetapi ia memang bermakna larian interaktif tanpa pengawasan hanya dibatasi oleh pertimbangan model itu sendiri.

Semasa larian, mesej yang dihantar kepada ejen yang sedang berjalan dibariskan sebagai pemanduan dan dialirkan keluar pada sempadan pusingan seterusnya, jadi anda boleh menggesa larian tanpa membunuhnya. Pemanduan, penjedaan, subejen dan kontrak penyiapan ialah ciri harness terbina; Claude Code tiada satu pun daripadanya.

Setiap penghantaran menulis AgentRunLog: masa mula dan tamat, ringkasan, kiraan token dan kos anggaran (termasuk kos yang dihimpun daripada subejen), penyesuai dan model, id proses dan laluan log, perbualan serta mana-mana tiket atau larian pipeline yang ia miliki, beserta dua medan pengelasan yang membawa sebahagian besar kebenaran.

  • Status bersifat kasar: pending, running, completed, error.
  • Keaktifan ialah bacaan yang lebih halus: alive, productive, completed, blocked, empty, looping, failed, stalled, dead.
  • Keluarga ralat mengelaskan kegagalan secara berguna: transientUpstream, sandboxInfrastructure, budgetExceeded, processLost, silentRun, unknown.

Menutup larian menerbitkan AgentRunCompleted dan banyak yang bergantung padanya: penghimpunan kos pipeline, menyambung semula langkah pipeline yang menunggu larian, menyempurnakan tiket penyokong, memetakan orkestrasi kepada keadaan terminal, keputusan terus-atau-berhenti penyelia matlamat, peranan penyemak dan penilaian belanjawan selepas larian. Senarai kehadiran menyusul secara berasingan, dengan memerhati log larian terkini dan bukannya peristiwa itu. Pemberitahuan “ejen selesai” tiada dalam senarai itu: peristiwa tersebut dicetuskan apabila aliran proses tamat, sebelum balasan ditulis, jadi pemberitahuannya ialah MessageReceived giliran itu, yang diterbitkan sebaik sahaja mesej disimpan.

Penguatkuasaan belanjawan ialah reaksi, bukan gerbang. Apabila larian selesai, penilai membandingkan perbelanjaan bulan semasa ejen dengan siling berkesannya (polisi belanjawan berpaut jika ada, jika tidak angka bulanan ejen itu sendiri; sifar bermakna tanpa had). Melangkaui ambang lembut merekodkan insiden amaran; menghabiskan belanjawan merekodkan insiden keras dan menukar status kitaran hayat ejen kepada paused pada carta organisasi. Penghantaran masih menerima kerja daripada ejen itu. Pencetus pipeline BudgetThresholdCrossed boleh memulakan kerja susulan daripada peristiwa yang sama.

Setiap log larian boleh membawa salasilah cuba semula — id larian induk, pembilang percubaan dan ringkasan sambungan. Pokok larian perbualan memaparkan nombor percubaan apabila ia bukan sifar. “Cuba lagi” daripada sembang ialah penghantaran baharu dengan log larian yang baharu.

  • Model ejen: apa yang boleh dan tidak boleh dikuatkuasakan oleh penyesuai
  • Modus: dari mana permukaan alat dan kontrak penyiapan datang
  • Guardrail: polisi kelas kesan yang dilalui setiap panggilan berpagar
  • Kotak pasir dan keselamatan: kisah pengasingan sepenuhnya
  • Multipemain: pemanduan, pengambilalihan dan dail autonomi
  • Acara domain: apa yang dicetuskan oleh AgentRunCompleted