Status
Entwurf der Implementierungsspezifikation.Ziel
Der gebündelte Codex-App-Server-Harness soll denselben OpenClaw-Context-Engine- Lifecycle-Vertrag einhalten, den eingebettete OpenClaw-Turns bereits einhalten. Eine Sitzung mit Provider/ModellagentRuntime.id: "codex" oder einem codex/*-Modell
soll dem ausgewählten Context-Engine-Plugin, wie etwa
lossless-claw, weiterhin ermöglichen, Context-Assembly, Post-Turn-Ingest, Wartung und
OpenClaw-weite Compaction-Richtlinien zu steuern, soweit die Codex-App-Server-Grenze dies zulässt.
Nicht-Ziele
- Codex-App-Server-Interna nicht neu implementieren.
- Die native Codex-Thread-Compaction nicht dazu bringen, eine lossless-claw-Zusammenfassung zu erzeugen.
- Nicht verlangen, dass Nicht-Codex-Modelle den Codex-Harness verwenden.
- Das Verhalten von ACP/acpx-Sitzungen nicht ändern. Diese Spezifikation gilt nur für den Nicht-ACP-Pfad des eingebetteten Agent-Harness.
- Drittanbieter-Plugins nicht dazu bringen, Codex-App-Server-Erweiterungs-Factorys zu registrieren; die bestehende Vertrauensgrenze für gebündelte Plugins bleibt unverändert.
Aktuelle Architektur
Die eingebettete Run-Loop löst die konfigurierte Context Engine einmal pro Run auf, bevor ein konkreter Low-Level-Harness ausgewählt wird:src/agents/embedded-agent-runner/run.ts- initialisiert Context-Engine-Plugins
- ruft
resolveContextEngine(params.config)auf - übergibt
contextEngineundcontextTokenBudgetanrunEmbeddedAttemptWithBackend(...)
runEmbeddedAttemptWithBackend(...) delegiert an den ausgewählten Agent-Harness:
src/agents/embedded-agent-runner/run/backend.tssrc/agents/harness/selection.ts
extensions/codex/index.tsextensions/codex/harness.ts
EmbeddedRunAttemptParams
wie eingebaute OpenClaw-Attempts:
extensions/codex/src/app-server/run-attempt.ts
thread/start, thread/resume und turn/start sendet, und kann
Benachrichtigungen beobachten, aber es kann Codex’ internen Thread-Speicher oder nativen
Compactor nicht ändern.
Aktuelle Lücke
Eingebaute OpenClaw-Attempts rufen den Context-Engine-Lifecycle direkt auf:- Bootstrap/Wartung vor dem Attempt
- Assembly vor dem Modellaufruf
- afterTurn oder Ingest nach dem Attempt
- Wartung nach einem erfolgreichen Turn
- Context-Engine-Compaction für Engines, die Compaction besitzen
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 oder
params.contextEngine.maintain auf.
Relevanter Codex-Code:
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
Gewünschtes Verhalten
Für Codex-Harness-Turns soll OpenClaw diesen Lifecycle beibehalten:- Das gespiegelte OpenClaw-Sitzungstranskript lesen.
- Die aktive Context Engine bootstrappen, wenn eine vorherige Sitzungsdatei existiert.
- Bootstrap-Wartung ausführen, wenn verfügbar.
- Kontext mit der aktiven Context Engine assemblieren.
- Den assemblierten Kontext in Codex-kompatible Eingaben umwandeln.
- Den Codex-Thread mit Developer-Anweisungen starten oder fortsetzen, die jede
Context-Engine-
systemPromptAdditionenthalten. - Den Codex-Turn mit dem assemblierten benutzerseitigen Prompt starten.
- Das Codex-Ergebnis zurück in das OpenClaw-Transkript spiegeln.
afterTurnaufrufen, falls implementiert, andernfallsingestBatch/ingest, unter Verwendung des gespiegelten Transkript-Snapshots.- Turn-Wartung nach erfolgreichen, nicht abgebrochenen Turns ausführen.
- Native Codex-Compaction-Signale und OpenClaw-Compaction-Hooks beibehalten.
Design-Einschränkungen
Codex-App-Server bleibt kanonisch für nativen Thread-Zustand
Codex besitzt seinen nativen Thread und jede interne erweiterte Historie. OpenClaw soll nicht versuchen, die interne Historie des App-Servers zu verändern, außer über unterstützte Protokollaufrufe. OpenClaws Transkriptspiegel bleibt die Quelle für OpenClaw-Funktionen:- Chatverlauf
- Suche
- Buchhaltung für
/newund/reset - zukünftiger Modell- oder Harness-Wechsel
- Zustand des Context-Engine-Plugins
Context-Engine-Assembly muss in Codex-Eingaben projiziert werden
Die Context-Engine-Schnittstelle gibt OpenClaw-AgentMessage[] zurück, keinen Codex-
Thread-Patch. Codex-App-Server-turn/start akzeptiert eine aktuelle Benutzereingabe, während
thread/start und thread/resume Developer-Anweisungen akzeptieren.
Daher benötigt die Implementierung eine Projektionsschicht. Die sichere erste Version
sollte nicht so tun, als könne sie die interne Codex-Historie ersetzen. Sie sollte
assemblierten Kontext als deterministisches Prompt-/Developer-Anweisungsmaterial um
den aktuellen Turn herum injizieren.
Prompt-Cache-Stabilität ist wichtig
Für Engines wie lossless-claw sollte der assemblierte Kontext bei unveränderten Eingaben deterministisch sein. Fügen Sie generiertem Kontexttext keine Zeitstempel, zufälligen IDs oder nichtdeterministische Sortierung hinzu.Runtime-Auswahlsemantik ändert sich nicht
Die Harness-Auswahl bleibt wie bisher:runtime: "openclaw"wählt den eingebauten OpenClaw-Harness ausruntime: "codex"wählt den registrierten Codex-Harness ausruntime: "auto"lässt Plugin-Harnesses unterstützte Provider beanspruchen- nicht passende
auto-Runs verwenden den eingebauten OpenClaw-Harness
Implementierungsplan
1. Wiederverwendbare Context-Engine-Attempt-Helfer exportieren oder verlagern
Heute liegen die wiederverwendbaren Lifecycle-Helfer unter dem eingebetteten Agent-Runner: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- einen kleinen Wrapper um
runContextEngineMaintenance
bootstrapHarnessContextEngineassembleHarnessContextEnginefinalizeHarnessContextEngineTurnbuildHarnessContextEngineRuntimeContextrunHarnessContextEngineMaintenance
2. Einen Codex-Kontext-Projektionshelfer hinzufügen
Fügen Sie ein neues Modul hinzu:extensions/codex/src/app-server/context-engine-projection.ts
- Die assemblierten
AgentMessage[], die ursprüngliche gespiegelte Historie und den aktuellen Prompt entgegennehmen. - Bestimmen, welcher Kontext in Developer-Anweisungen und welcher in die aktuelle Benutzereingabe gehört.
- Den aktuellen Benutzer-Prompt als letzte ausführbare Anfrage beibehalten.
- Frühere Nachrichten in einem stabilen, expliziten Format rendern.
- Flüchtige Metadaten vermeiden.
systemPromptAdditionin Developer-Anweisungen einfügen.- Den assemblierten Transkriptkontext vor dem aktuellen Prompt in
promptTexteinfügen. - Ihn klar als von OpenClaw assemblierten Kontext kennzeichnen.
- Aktuellen Prompt zuletzt halten.
- Doppelte aktuelle Benutzer-Prompts ausschließen, wenn sie bereits am Ende erscheinen.
3. Bootstrap vor Codex-Thread-Start verdrahten
Inextensions/codex/src/app-server/run-attempt.ts:
- Gespiegelte Sitzungshistorie wie bisher lesen.
- Bestimmen, ob die Sitzungsdatei vor diesem Run existierte. Bevorzugen Sie einen Helfer,
der
fs.stat(params.sessionFile)vor Spiegel-Schreibvorgängen prüft. - Einen
SessionManageröffnen oder einen schmalen Session-Manager-Adapter verwenden, wenn der Helfer dies erfordert. - Den neutralen Bootstrap-Helfer aufrufen, wenn
params.contextEngineexistiert.
sessionKey-Konvention wie die Codex-Tool-Bridge und der Transkriptspiegel.
Heute berechnet Codex sandboxSessionKey aus params.sessionKey oder
params.sessionId; verwenden Sie dies konsistent, sofern es keinen Grund gibt, den rohen
params.sessionKey beizubehalten.
4. Assembly vor thread/start / thread/resume und turn/start verdrahten
In runCodexAppServerAttempt:
- Zuerst dynamische Tools bauen, damit die Context Engine die tatsächlich verfügbaren Tool-Namen sieht.
- Gespiegelte Sitzungshistorie lesen.
- Context-Engine-
assemble(...)ausführen, wennparams.contextEngineexistiert. - Das assemblierte Ergebnis projizieren in:
- Ergänzung der Developer-Anweisungen
- Prompt-Text für
turn/start
- Basis-Developer-Anweisungen mit
buildDeveloperInstructions(params)berechnen - Context-Engine-Assembly/Projektion anwenden
before_prompt_buildmit dem projizierten Prompt/den projizierten Developer-Anweisungen ausführen
systemPromptAddition nach seiner Prompt-Pipeline auf den finalen System-Prompt anwendet. Die
wichtige Invariante ist, dass sowohl Context Engine als auch Hooks eine deterministische,
dokumentierte Reihenfolge erhalten.
Empfohlene Reihenfolge für die erste Implementierung:
buildDeveloperInstructions(params)- Context-Engine-
assemble() systemPromptAdditionan Developer-Anweisungen anhängen/voranstellen- Assemblierte Nachrichten in Prompt-Text projizieren
resolveAgentHarnessBeforePromptBuildResult(...)- Finale Developer-Anweisungen an
startOrResumeThread(...)übergeben - Finalen Prompt-Text an
buildTurnStartParams(...)übergeben
5. Prompt-Cache-stabile Formatierung beibehalten
Der Projektionshelfer muss für identische Eingaben byte-stabile Ausgabe erzeugen:- stabile Nachrichtenreihenfolge
- stabile Rollenlabels
- keine generierten Zeitstempel
- kein Durchsickern der Objekt-Schlüsselreihenfolge
- keine zufälligen Trennzeichen
- keine IDs pro Run
6. Post-Turn nach Transkriptspiegelung verdrahten
Codex’CodexAppServerEventProjector erstellt ein lokales messagesSnapshot für den
aktuellen Turn. mirrorTranscriptBestEffort(...) schreibt diesen Snapshot in den
OpenClaw-Transkriptspiegel.
Nachdem die Spiegelung erfolgreich war oder fehlgeschlagen ist, rufen Sie den Finalizer der Kontext-Engine mit dem
besten verfügbaren Nachrichten-Snapshot auf:
- Bevorzugen Sie nach dem Schreibvorgang den vollständig gespiegelten Sitzungskontext, weil
afterTurnden Sitzungs-Snapshot erwartet, nicht nur den aktuellen Turn. - Fallen Sie auf
historyMessages + result.messagesSnapshotzurück, wenn die Sitzungsdatei nicht erneut geöffnet werden kann.
afterTurn trotzdem mit dem Fallback-Snapshot auf, protokollieren Sie aber,
dass die Kontext-Engine Turn-Daten aus dem Fallback übernimmt.
7. Usage- und Prompt-Cache-Laufzeitkontext normalisieren
Codex-Ergebnisse enthalten normalisierte Usage aus App-Server-Tokenbenachrichtigungen, sofern verfügbar. Übergeben Sie diese Usage an den Laufzeitkontext der Kontext-Engine. Falls der Codex-App-Server künftig Cache-Lese-/Schreibdetails bereitstellt, ordnen Sie dieseContextEnginePromptCacheInfo zu. Bis dahin lassen Sie promptCache weg, statt
Nullwerte zu erfinden.
8. Compaction-Richtlinie
Es gibt zwei Compaction-Systeme:- OpenClaw-Kontext-Engine
compact() - Native Codex-App-Server-Compaction
thread/compact/start
/compact und explizite OpenClaw-Compaction
Wenn die ausgewählte Kontext-Engine info.ownsCompaction === true hat, sollte die explizite
OpenClaw-Compaction das Ergebnis von compact() der Kontext-Engine für den
OpenClaw-Transkriptspiegel und den Plugin-Zustand bevorzugen.
Wenn der ausgewählte Codex-Harness eine native Thread-Bindung hat, können wir zusätzlich
native Codex-Compaction anfordern, um den App-Server-Thread stabil zu halten, aber dies
muss in den Details als separate Backend-Aktion gemeldet werden.
Empfohlenes Verhalten:
- Wenn
contextEngine.info.ownsCompaction === true:- zuerst
compact()der Kontext-Engine aufrufen - danach Best-Effort-Aufruf der nativen Codex-Compaction, wenn eine Thread-Bindung vorhanden ist
- das Ergebnis der Kontext-Engine als primäres Ergebnis zurückgeben
- den Status der nativen Codex-Compaction in
details.codexNativeCompactionaufnehmen
- zuerst
- Wenn die aktive Kontext-Engine Compaction nicht besitzt:
- das aktuelle Verhalten der nativen Codex-Compaction beibehalten
extensions/codex/src/app-server/compact.ts oder
einen Wrapper aus dem generischen Compaction-Pfad, je nachdem, wo
maybeCompactAgentHarnessSession(...) aufgerufen wird.
Native Codex-contextCompaction-Ereignisse während eines Turns
Codex kann während eines Turns contextCompaction-Item-Ereignisse ausgeben. Behalten Sie die aktuelle
Ausgabe der Before-/After-Compaction-Hooks in event-projector.ts bei, behandeln Sie
dies aber nicht als abgeschlossene Kontext-Engine-Compaction.
Für Engines, die Compaction besitzen, geben Sie eine explizite Diagnose aus, wenn Codex trotzdem
native Compaction ausführt:
- Stream-/Ereignisname: der vorhandene
compaction-Stream ist akzeptabel - Details:
{ backend: "codex-app-server", ownsCompaction: true }
9. Sitzungsreset und Bindungsverhalten
Der vorhandene Codex-Harnessreset(...) entfernt die Codex-App-Server-Bindung aus
der OpenClaw-Sitzungsdatei. Behalten Sie dieses Verhalten bei.
Stellen Sie außerdem sicher, dass die Bereinigung des Kontext-Engine-Zustands weiterhin über die vorhandenen
OpenClaw-Sitzungslebenszykluspfade erfolgt. Fügen Sie keine Codex-spezifische Bereinigung hinzu, es sei denn, der
Kontext-Engine-Lebenszyklus verpasst derzeit Reset-/Löschereignisse für alle Harnesses.
10. Fehlerbehandlung
Befolgen Sie die integrierten OpenClaw-Semantiken:- Bootstrap-Fehler warnen und fahren fort
- Assemble-Fehler warnen und fallen auf nicht assemblierte Pipeline-Nachrichten/-Prompts zurück
afterTurn-/Ingest-Fehler warnen und markieren die Post-Turn-Finalisierung als erfolglos- Wartung läuft nur nach erfolgreichen, nicht abgebrochenen Turns ohne Yield-Abbruch
- Compaction-Fehler sollten nicht als neue Prompts erneut versucht werden
- Wenn die Kontextprojektion fehlschlägt, warnen und auf den ursprünglichen Prompt zurückfallen.
- Wenn der Transkriptspiegel fehlschlägt, trotzdem die Finalisierung der Kontext-Engine mit Fallback-Nachrichten versuchen.
- Wenn native Codex-Compaction fehlschlägt, nachdem die Kontext-Engine-Compaction erfolgreich war, nicht die gesamte OpenClaw-Compaction fehlschlagen lassen, wenn die Kontext-Engine primär ist.
Testplan
Unit-Tests
Fügen Sie Tests unterextensions/codex/src/app-server hinzu:
-
run-attempt.context-engine.test.ts- Codex ruft
bootstrapauf, wenn eine Sitzungsdatei vorhanden ist. - Codex ruft
assemblemit gespiegelten Nachrichten, Token-Budget, Tool-Namen, Zitationsmodus, Modell-ID und Prompt auf. systemPromptAdditionwird in Entwickleranweisungen aufgenommen.- Assemblierte Nachrichten werden vor der aktuellen Anfrage in den Prompt projiziert.
- Codex ruft
afterTurnnach der Transkriptspiegelung auf. - Ohne
afterTurnruft CodexingestBatchoderingestpro Nachricht auf. - Turn-Wartung läuft nach erfolgreichen Turns.
- Turn-Wartung läuft nicht bei Prompt-Fehler, Abbruch oder Yield-Abbruch.
- Codex ruft
-
context-engine-projection.test.ts- stabile Ausgabe für identische Eingaben
- kein doppelter aktueller Prompt, wenn die assemblierte Historie ihn enthält
- verarbeitet leere Historie
- erhält Rollenreihenfolge
- enthält System-Prompt-Ergänzung nur in Entwickleranweisungen
-
compact.context-engine.test.ts- primäres Ergebnis der besitzenden Kontext-Engine gewinnt
- Status der nativen Codex-Compaction erscheint in den Details, wenn sie ebenfalls versucht wurde
- nativer Codex-Fehler lässt die Compaction der besitzenden Kontext-Engine nicht fehlschlagen
- nicht besitzende Kontext-Engine behält aktuelles Verhalten der nativen Compaction bei
Zu aktualisierende vorhandene Tests
extensions/codex/src/app-server/run-attempt.test.ts, falls vorhanden, andernfalls die nächstgelegenen Codex-App-Server-Run-Tests.extensions/codex/src/app-server/event-projector.test.tsnur, wenn sich Compaction- Ereignisdetails ändern.src/agents/harness/selection.test.tssollte keine Änderungen benötigen, es sei denn, sich das Konfigurationsverhalten ändert; er sollte stabil bleiben.- Integrierte Harness-Kontext-Engine-Tests sollten unverändert weiter bestehen.
Integrations-/Live-Tests
Fügen Sie Live-Smoke-Tests für den Codex-Harness hinzu oder erweitern Sie sie:plugins.slots.contextEngineauf eine Test-Engine konfigurierenagents.defaults.modelauf eincodex/*-Modell konfigurieren- Provider/Modell
agentRuntime.id = "codex"konfigurieren - bestätigen, dass die Test-Engine Folgendes beobachtet hat:
- Bootstrap
- Assemble
afterTurnoder Ingest- Wartung
Beobachtbarkeit
Fügen Sie Debug-Logs rund um Codex-Kontext-Engine-Lebenszyklusaufrufe hinzu:codex context engine bootstrap started/completed/failedcodex context engine assemble appliedcodex context engine finalize completed/failedcodex context engine maintenance skippedmit Grundcodex native compaction completed alongside context-engine compaction
sessionIdsessionKey, gemäß vorhandener Logging-Praxis redigiert oder weggelassenengineIdthreadIdturnIdassembledMessageCountestimatedTokenshasSystemPromptAddition
Migration / Kompatibilität
Dies sollte rückwärtskompatibel sein:- Wenn keine Kontext-Engine konfiguriert ist, sollte das Legacy-Kontext-Engine-Verhalten dem heutigen Verhalten des Codex-Harness entsprechen.
- Wenn
assembleder Kontext-Engine fehlschlägt, sollte Codex mit dem ursprünglichen Prompt-Pfad fortfahren. - Vorhandene Codex-Thread-Bindungen sollten gültig bleiben.
- Dynamisches Tool-Fingerprinting sollte die Kontext-Engine-Ausgabe nicht einschließen; andernfalls könnte jede Kontextänderung einen neuen Codex-Thread erzwingen. Nur der Tool-Katalog sollte das dynamische Tool-Fingerprint beeinflussen.
Offene Fragen
-
Sollte assemblierter Kontext vollständig in den Benutzer-Prompt, vollständig
in Entwickleranweisungen oder aufgeteilt injiziert werden?
Empfehlung: aufteilen.
systemPromptAdditionin Entwickleranweisungen platzieren; assemblierten Transkriptkontext in den Benutzer-Prompt-Wrapper platzieren. Dies passt am besten zum aktuellen Codex-Protokoll, ohne die native Thread-Historie zu verändern. - Sollte native Codex-Compaction deaktiviert werden, wenn eine Kontext-Engine Compaction besitzt? Empfehlung: nein, anfangs nicht. Native Codex-Compaction kann weiterhin notwendig sein, um den App-Server-Thread am Leben zu halten. Sie muss aber als native Codex-Compaction gemeldet werden, nicht als Kontext-Engine-Compaction.
-
Sollte
before_prompt_buildvor oder nach der Kontext-Engine-Assemblierung laufen? Empfehlung: nach der Kontext-Engine-Projektion für Codex, sodass generische Harness- Hooks den tatsächlichen Prompt/die tatsächlichen Entwickleranweisungen sehen, die Codex erhalten wird. Wenn Parität mit integrierten Harnesses die umgekehrte Reihenfolge erfordert, kodieren Sie die gewählte Reihenfolge in Tests und dokumentieren Sie sie hier. - Kann der Codex-App-Server künftig einen strukturierten Kontext-/Historien-Override akzeptieren? Unbekannt. Falls ja, ersetzen Sie die Textprojektionsschicht durch dieses Protokoll und lassen Sie die Lebenszyklusaufrufe unverändert.
Akzeptanzkriterien
- Ein eingebetteter
codex/*-Harness-Turn ruft den Assemble-Lebenszyklus der ausgewählten Kontext-Engine auf. - Ein Kontext-Engine-
systemPromptAdditionbeeinflusst Codex-Entwickleranweisungen. - Assemblierter Kontext beeinflusst die Codex-Turn-Eingabe deterministisch.
- Erfolgreiche Codex-Turns rufen
afterTurnoder den Ingest-Fallback auf. - Erfolgreiche Codex-Turns führen die Kontext-Engine-Turn-Wartung aus.
- Fehlgeschlagene/abgebrochene/Yield-abgebrochene Turns führen keine Turn-Wartung aus.
- Kontext-Engine-eigene Compaction bleibt primär für OpenClaw-/Plugin-Zustand.
- Native Codex-Compaction bleibt als natives Codex-Verhalten prüfbar.
- Vorhandenes integriertes Harness-Kontext-Engine-Verhalten bleibt unverändert.
- Vorhandenes Codex-Harness-Verhalten bleibt unverändert, wenn keine Nicht-Legacy-Kontext-Engine ausgewählt ist oder wenn die Assemblierung fehlschlägt.