Status
Spesifikasi implementasi draf.Tujuan
Membuat harness app-server Codex bawaan mematuhi kontrak siklus hidup context-engine OpenClaw yang sama seperti yang sudah dipatuhi oleh giliran OpenClaw tersemat. Sesi yang menggunakan provider/modelagentRuntime.id: "codex" atau model codex/* tetap harus memungkinkan Plugin context-engine yang dipilih, seperti lossless-claw, mengendalikan perakitan konteks, ingest pasca-giliran, pemeliharaan, dan kebijakan Compaction tingkat OpenClaw sejauh yang diizinkan oleh batas app-server Codex.
Bukan Tujuan
- Jangan mengimplementasikan ulang internal app-server Codex.
- Jangan membuat Compaction thread native Codex menghasilkan ringkasan lossless-claw.
- Jangan mewajibkan model non-Codex menggunakan harness Codex.
- Jangan mengubah perilaku sesi ACP/acpx. Spesifikasi ini hanya untuk jalur harness agen tersemat non-ACP.
- Jangan membuat Plugin pihak ketiga mendaftarkan factory ekstensi app-server Codex; batas kepercayaan Plugin bawaan yang ada tetap tidak berubah.
Arsitektur Saat Ini
Loop run tersemat menyelesaikan context engine yang dikonfigurasi sekali per run sebelum memilih harness level rendah konkret:src/agents/embedded-agent-runner/run.ts- menginisialisasi Plugin context-engine
- memanggil
resolveContextEngine(params.config) - meneruskan
contextEnginedancontextTokenBudgetkerunEmbeddedAttemptWithBackend(...)
runEmbeddedAttemptWithBackend(...) mendelegasikan ke harness agen yang dipilih:
src/agents/embedded-agent-runner/run/backend.tssrc/agents/harness/selection.ts
extensions/codex/index.tsextensions/codex/harness.ts
EmbeddedRunAttemptParams yang sama seperti upaya OpenClaw bawaan:
extensions/codex/src/app-server/run-attempt.ts
thread/start, thread/resume, dan turn/start, serta dapat mengamati notifikasi, tetapi tidak dapat mengubah penyimpanan thread internal Codex atau compactor native.
Kesenjangan Saat Ini
Upaya OpenClaw bawaan memanggil siklus hidup context-engine secara langsung:- bootstrap/pemeliharaan sebelum upaya
- assemble sebelum panggilan model
- afterTurn atau ingest setelah upaya
- pemeliharaan setelah giliran berhasil
- Compaction context-engine untuk engine yang memiliki Compaction
src/agents/embedded-agent-runner/run/attempt.tssrc/agents/embedded-agent-runner/run/attempt.context-engine-helpers.tssrc/agents/embedded-agent-runner/context-engine-maintenance.ts
params.contextEngine.bootstrap, params.contextEngine.assemble, params.contextEngine.afterTurn, params.contextEngine.ingestBatch, params.contextEngine.ingest, atau params.contextEngine.maintain.
Kode Codex yang relevan:
extensions/codex/src/app-server/run-attempt.tsextensions/codex/src/app-server/thread-lifecycle.tsextensions/codex/src/app-server/event-projector.tsextensions/codex/src/app-server/compact.ts
Perilaku yang Diinginkan
Untuk giliran harness Codex, OpenClaw harus mempertahankan siklus hidup ini:- Membaca transkrip sesi OpenClaw yang dicerminkan.
- Melakukan bootstrap context engine aktif saat file sesi sebelumnya ada.
- Menjalankan pemeliharaan bootstrap saat tersedia.
- Merakit konteks menggunakan context engine aktif.
- Mengonversi konteks yang dirakit menjadi input yang kompatibel dengan Codex.
- Memulai atau melanjutkan thread Codex dengan instruksi developer yang menyertakan
systemPromptAdditioncontext-engine apa pun. - Memulai giliran Codex dengan prompt yang dirakit dan terlihat oleh pengguna.
- Mencerminkan hasil Codex kembali ke transkrip OpenClaw.
- Memanggil
afterTurnjika diimplementasikan, jika tidakingestBatch/ingest, menggunakan snapshot transkrip yang dicerminkan. - Menjalankan pemeliharaan giliran setelah giliran non-aborted yang berhasil.
- Mempertahankan sinyal Compaction native Codex dan hook Compaction OpenClaw.
Batasan Desain
App-server Codex tetap kanonis untuk state thread native
Codex memiliki thread native-nya dan riwayat diperluas internal apa pun. OpenClaw tidak boleh mencoba memutasi riwayat internal app-server kecuali melalui panggilan protokol yang didukung. Cermin transkrip OpenClaw tetap menjadi sumber untuk fitur OpenClaw:- riwayat chat
- pencarian
- pembukuan
/newdan/reset - perpindahan model atau harness di masa mendatang
- state Plugin context-engine
Perakitan context engine harus diproyeksikan ke input Codex
Antarmuka context-engine mengembalikanAgentMessage[] OpenClaw, bukan patch thread Codex. turn/start app-server Codex menerima input pengguna saat ini, sementara thread/start dan thread/resume menerima instruksi developer.
Karena itu implementasi memerlukan lapisan proyeksi. Versi pertama yang aman harus menghindari pura-pura dapat mengganti riwayat internal Codex. Versi itu harus menyuntikkan konteks yang dirakit sebagai materi prompt/instruksi developer deterministik di sekitar giliran saat ini.
Stabilitas prompt-cache penting
Untuk engine seperti lossless-claw, konteks yang dirakit harus deterministik untuk input yang tidak berubah. Jangan menambahkan timestamp, id acak, atau pengurutan nondeterministik ke teks konteks yang dihasilkan.Semantik pemilihan runtime tidak berubah
Pemilihan harness tetap seperti sebelumnya:runtime: "openclaw"memilih harness OpenClaw bawaanruntime: "codex"memilih harness Codex terdaftarruntime: "auto"memungkinkan harness Plugin mengklaim provider yang didukung- run
autoyang tidak cocok menggunakan harness OpenClaw bawaan
Rencana Implementasi
1. Ekspor atau pindahkan helper upaya context-engine yang dapat digunakan ulang
Saat ini helper siklus hidup yang dapat digunakan ulang berada di bawah runner agen tersemat:src/agents/embedded-agent-runner/run/attempt.context-engine-helpers.tssrc/agents/embedded-agent-runner/run/attempt.prompt-helpers.tssrc/agents/embedded-agent-runner/context-engine-maintenance.ts
src/agents/harness/context-engine-lifecycle.ts
runAttemptContextEngineBootstrapassembleAttemptContextEnginefinalizeAttemptContextEngineTurnbuildAfterTurnRuntimeContextbuildAfterTurnRuntimeContextFromUsage- wrapper kecil di sekitar
runContextEngineMaintenance
bootstrapHarnessContextEngineassembleHarnessContextEnginefinalizeHarnessContextEngineTurnbuildHarnessContextEngineRuntimeContextrunHarnessContextEngineMaintenance
2. Tambahkan helper proyeksi konteks Codex
Tambahkan modul baru:extensions/codex/src/app-server/context-engine-projection.ts
- Menerima
AgentMessage[]yang dirakit, riwayat asli yang dicerminkan, dan prompt saat ini. - Menentukan konteks mana yang termasuk dalam instruksi developer vs input pengguna saat ini.
- Mempertahankan prompt pengguna saat ini sebagai permintaan final yang dapat ditindaklanjuti.
- Merender pesan sebelumnya dalam format stabil dan eksplisit.
- Menghindari metadata volatil.
- Masukkan
systemPromptAdditionke instruksi developer. - Masukkan konteks transkrip yang dirakit sebelum prompt saat ini dalam
promptText. - Beri label dengan jelas sebagai konteks rakitan OpenClaw.
- Pertahankan prompt saat ini di bagian terakhir.
- Kecualikan duplikat prompt pengguna saat ini jika sudah muncul di ekor.
3. Hubungkan bootstrap sebelum startup thread Codex
Diextensions/codex/src/app-server/run-attempt.ts:
- Baca riwayat sesi yang dicerminkan seperti saat ini.
- Tentukan apakah file sesi sudah ada sebelum run ini. Utamakan helper yang memeriksa
fs.stat(params.sessionFile)sebelum penulisan cermin. - Buka
SessionManageratau gunakan adapter session manager yang sempit jika helper memerlukannya. - Panggil helper bootstrap netral saat
params.contextEngineada.
sessionKey yang sama seperti bridge tool Codex dan cermin transkrip. Saat ini Codex menghitung sandboxSessionKey dari params.sessionKey atau params.sessionId; gunakan itu secara konsisten kecuali ada alasan untuk mempertahankan params.sessionKey mentah.
4. Hubungkan assemble sebelum thread/start / thread/resume dan turn/start
Di runCodexAppServerAttempt:
- Bangun dynamic tools terlebih dahulu, agar context engine melihat nama tool aktual yang tersedia.
- Baca riwayat sesi yang dicerminkan.
- Jalankan
assemble(...)context-engine saatparams.contextEngineada. - Proyeksikan hasil rakitan menjadi:
- tambahan instruksi developer
- teks prompt untuk
turn/start
- hitung instruksi developer dasar dengan
buildDeveloperInstructions(params) - terapkan perakitan/proyeksi context-engine
- jalankan
before_prompt_builddengan prompt/instruksi developer yang diproyeksikan
systemPromptAddition context-engine ke prompt sistem final setelah pipeline prompt-nya. Invarian pentingnya adalah bahwa context engine dan hook sama-sama mendapatkan urutan yang deterministik dan terdokumentasi.
Urutan yang direkomendasikan untuk implementasi pertama:
buildDeveloperInstructions(params)assemble()context-engine- tambahkan di akhir/awal
systemPromptAdditionke instruksi developer - proyeksikan pesan yang dirakit ke teks prompt
resolveAgentHarnessBeforePromptBuildResult(...)- teruskan instruksi developer final ke
startOrResumeThread(...) - teruskan teks prompt final ke
buildTurnStartParams(...)
5. Pertahankan pemformatan stabil prompt-cache
Helper proyeksi harus menghasilkan output yang stabil pada tingkat byte untuk input yang identik:- urutan pesan stabil
- label peran stabil
- tanpa timestamp yang dihasilkan
- tanpa kebocoran urutan key objek
- tanpa delimiter acak
- tanpa id per-run
6. Hubungkan pasca-giliran setelah pencerminan transkrip
CodexAppServerEventProjector milik Codex membangun messagesSnapshot lokal untuk
giliran saat ini. mirrorTranscriptBestEffort(...) menulis snapshot tersebut ke
cermin transkrip OpenClaw.
Setelah pencerminan berhasil atau gagal, panggil finalizer mesin konteks dengan
snapshot pesan terbaik yang tersedia:
- Utamakan konteks sesi penuh yang telah dicerminkan setelah penulisan, karena
afterTurnmengharapkan snapshot sesi, bukan hanya giliran saat ini. - Gunakan cadangan
historyMessages + result.messagesSnapshotjika file sesi tidak dapat dibuka kembali.
afterTurn dengan snapshot cadangan, tetapi catat
bahwa mesin konteks sedang mencerna dari data giliran cadangan.
7. Normalkan konteks runtime penggunaan dan cache prompt
Hasil Codex menyertakan penggunaan ternormalisasi dari notifikasi token server aplikasi jika tersedia. Teruskan penggunaan tersebut ke konteks runtime mesin konteks. Jika server aplikasi Codex pada akhirnya mengekspos detail baca/tulis cache, petakan detail itu keContextEnginePromptCacheInfo. Sampai saat itu, hilangkan promptCache alih-alih
mengarang nilai nol.
8. Kebijakan Compaction
Ada dua sistem Compaction:compact()mesin konteks OpenClawthread/compact/startnative server aplikasi Codex
/compact dan Compaction OpenClaw eksplisit
Ketika mesin konteks yang dipilih memiliki info.ownsCompaction === true, Compaction
OpenClaw eksplisit sebaiknya mengutamakan hasil compact() mesin konteks untuk
cermin transkrip OpenClaw dan status Plugin.
Ketika harness Codex yang dipilih memiliki pengikatan utas native, kita juga dapat
meminta Compaction native Codex untuk menjaga utas server aplikasi tetap sehat, tetapi ini
harus dilaporkan sebagai tindakan backend terpisah dalam detail.
Perilaku yang direkomendasikan:
- Jika
contextEngine.info.ownsCompaction === true:- panggil
compact()mesin konteks terlebih dahulu - lalu panggil Compaction native Codex secara upaya terbaik ketika pengikatan utas ada
- kembalikan hasil mesin konteks sebagai hasil utama
- sertakan status Compaction native Codex di
details.codexNativeCompaction
- panggil
- Jika mesin konteks aktif tidak memiliki Compaction:
- pertahankan perilaku Compaction native Codex saat ini
extensions/codex/src/app-server/compact.ts atau
membungkusnya dari jalur Compaction generik, bergantung pada tempat
maybeCompactAgentHarnessSession(...) dipanggil.
Peristiwa contextCompaction native Codex dalam giliran
Codex dapat memancarkan peristiwa itemcontextCompaction selama satu giliran. Pertahankan
pemancaran hook sebelum/sesudah Compaction saat ini di event-projector.ts, tetapi jangan perlakukan
itu sebagai Compaction mesin konteks yang selesai.
Untuk mesin yang memiliki Compaction, pancarkan diagnostik eksplisit ketika Codex tetap melakukan
Compaction native:
- nama stream/peristiwa: stream
compactionyang ada dapat diterima - detail:
{ backend: "codex-app-server", ownsCompaction: true }
9. Perilaku reset sesi dan pengikatan
reset(...) harness Codex yang ada menghapus pengikatan server aplikasi Codex dari
file sesi OpenClaw. Pertahankan perilaku itu.
Pastikan juga pembersihan status mesin konteks tetap terjadi melalui jalur
siklus hidup sesi OpenClaw yang ada. Jangan tambahkan pembersihan khusus Codex kecuali
siklus hidup mesin konteks saat ini melewatkan peristiwa reset/hapus untuk semua harness.
10. Penanganan kesalahan
Ikuti semantik bawaan OpenClaw:- kegagalan bootstrap memberi peringatan dan berlanjut
- kegagalan perakitan memberi peringatan dan kembali ke pesan/prompt pipeline yang tidak dirakit
- kegagalan
afterTurn/pencernaan memberi peringatan dan menandai finalisasi pasca-giliran tidak berhasil - pemeliharaan hanya berjalan setelah giliran yang berhasil, tidak dibatalkan, dan tidak yield
- kesalahan Compaction tidak boleh dicoba ulang sebagai prompt baru
- Jika proyeksi konteks gagal, beri peringatan dan kembali ke prompt asli.
- Jika cermin transkrip gagal, tetap coba finalisasi mesin konteks dengan pesan cadangan.
- Jika Compaction native Codex gagal setelah Compaction mesin konteks berhasil, jangan gagalkan seluruh Compaction OpenClaw ketika mesin konteks adalah yang utama.
Rencana pengujian
Pengujian unit
Tambahkan pengujian di bawahextensions/codex/src/app-server:
-
run-attempt.context-engine.test.ts- Codex memanggil
bootstrapsaat file sesi ada. - Codex memanggil
assembledengan pesan yang dicerminkan, anggaran token, nama alat, mode sitasi, id model, dan prompt. systemPromptAdditiondisertakan dalam instruksi developer.- Pesan yang dirakit diproyeksikan ke dalam prompt sebelum permintaan saat ini.
- Codex memanggil
afterTurnsetelah pencerminan transkrip. - Tanpa
afterTurn, Codex memanggilingestBatchatauingestper pesan. - Pemeliharaan giliran berjalan setelah giliran berhasil.
- Pemeliharaan giliran tidak berjalan saat terjadi kesalahan prompt, pembatalan, atau pembatalan yield.
- Codex memanggil
-
context-engine-projection.test.ts- keluaran stabil untuk masukan yang identik
- tidak ada duplikasi prompt saat ini ketika riwayat yang dirakit menyertakannya
- menangani riwayat kosong
- mempertahankan urutan peran
- menyertakan tambahan prompt sistem hanya dalam instruksi developer
-
compact.context-engine.test.ts- hasil utama mesin konteks pemilik menang
- status compaction native Codex muncul dalam detail saat juga dicoba
- kegagalan native Codex tidak menggagalkan compaction mesin konteks pemilik
- mesin konteks non-pemilik mempertahankan perilaku compaction native saat ini
Pengujian yang ada untuk diperbarui
extensions/codex/src/app-server/run-attempt.test.tsjika ada, jika tidak pengujian run server aplikasi Codex terdekat.extensions/codex/src/app-server/event-projector.test.tshanya jika detail peristiwa compaction berubah.src/agents/harness/selection.test.tsseharusnya tidak perlu perubahan kecuali perilaku konfigurasi berubah; pengujian ini harus tetap stabil.- Pengujian mesin konteks harness bawaan harus tetap lulus tanpa perubahan.
Pengujian integrasi / live
Tambahkan atau perluas pengujian smoke harness Codex live:- konfigurasikan
plugins.slots.contextEngineke mesin pengujian - konfigurasikan
agents.defaults.modelke modelcodex/* - konfigurasikan provider/model
agentRuntime.id = "codex" - pastikan mesin pengujian mengamati:
- bootstrap
- assemble
- afterTurn atau ingest
- pemeliharaan
Observabilitas
Tambahkan log debug di sekitar panggilan siklus hidup mesin konteks Codex:codex context engine bootstrap started/completed/failedcodex context engine assemble appliedcodex context engine finalize completed/failedcodex context engine maintenance skippeddengan alasancodex native compaction completed alongside context-engine compaction
sessionIdsessionKeydisunting atau dihilangkan sesuai praktik pencatatan yang adaengineIdthreadIdturnIdassembledMessageCountestimatedTokenshasSystemPromptAddition
Migrasi / kompatibilitas
Ini harus kompatibel ke belakang:- Jika tidak ada mesin konteks yang dikonfigurasi, perilaku mesin konteks legacy harus setara dengan perilaku harness Codex saat ini.
- Jika
assemblemesin konteks gagal, Codex harus melanjutkan dengan jalur prompt asli. - Binding thread Codex yang ada harus tetap valid.
- Fingerprinting alat dinamis tidak boleh menyertakan keluaran mesin konteks; jika tidak, setiap perubahan konteks dapat memaksa thread Codex baru. Hanya katalog alat yang boleh memengaruhi fingerprint alat dinamis.
Pertanyaan terbuka
-
Apakah konteks yang dirakit harus disuntikkan seluruhnya ke prompt pengguna, seluruhnya
ke instruksi developer, atau dibagi?
Rekomendasi: dibagi. Letakkan
systemPromptAdditiondalam instruksi developer; letakkan konteks transkrip yang dirakit dalam pembungkus prompt pengguna. Ini paling sesuai dengan protokol Codex saat ini tanpa mengubah riwayat thread native. - Apakah compaction native Codex harus dinonaktifkan saat mesin konteks memiliki compaction? Rekomendasi: tidak, tidak pada awalnya. Compaction native Codex mungkin masih diperlukan untuk menjaga thread server aplikasi tetap hidup. Namun itu harus dilaporkan sebagai compaction Codex native, bukan sebagai compaction mesin konteks.
-
Apakah
before_prompt_buildharus berjalan sebelum atau sesudah perakitan mesin konteks? Rekomendasi: setelah proyeksi mesin konteks untuk Codex, agar hook harness generik melihat prompt/instruksi developer aktual yang akan diterima Codex. Jika paritas harness bawaan membutuhkan kebalikannya, enkode urutan yang dipilih dalam pengujian dan dokumentasikan di sini. - Bisakah server aplikasi Codex menerima override konteks/riwayat terstruktur di masa depan? Belum diketahui. Jika bisa, ganti lapisan proyeksi teks dengan protokol tersebut dan pertahankan panggilan siklus hidup tanpa perubahan.
Kriteria penerimaan
- Giliran harness tertanam
codex/*memanggil siklus hidup assemble milik mesin konteks yang dipilih. systemPromptAdditionmesin konteks memengaruhi instruksi developer Codex.- Konteks yang dirakit memengaruhi masukan giliran Codex secara deterministik.
- Giliran Codex yang berhasil memanggil
afterTurnatau fallback ingest. - Giliran Codex yang berhasil menjalankan pemeliharaan giliran mesin konteks.
- Giliran yang gagal/dibatalkan/yield-dibatalkan tidak menjalankan pemeliharaan giliran.
- Compaction yang dimiliki mesin konteks tetap menjadi yang utama untuk status OpenClaw/Plugin.
- Compaction native Codex tetap dapat diaudit sebagai perilaku Codex native.
- Perilaku mesin konteks harness bawaan yang ada tidak berubah.
- Perilaku harness Codex yang ada tidak berubah saat tidak ada mesin konteks non-legacy yang dipilih atau saat perakitan gagal.