Technical reference
会話履歴の整理
OpenClaw は実行前(モデルコンテキストの構築時)に、トランスクリプトへプロバイダー固有の修正を適用します。これらの多くは、厳格なプロバイダー要件を満たすために使われるインメモリ調整です。別個のセッションファイル修復パスが、セッションの読み込み前に保存済み JSONL を書き換えることもありますが、対象は不正な形式の行、または永続レコードとして無効な保存済みターンに限られます。配信済みのアシスタント返信はディスク上で保持されます。プロバイダー固有の assistant-prefill 除去は、送信ペイロードの構築中にのみ行われます。修復が発生すると、元のファイルはセッションファイルの横にバックアップされます。
対象範囲は次のとおりです。
- ランタイム専用のプロンプトコンテキストをユーザーに見えるトランスクリプトターンに含めないこと
- ツール呼び出し ID のサニタイズ
- ツール呼び出し入力の検証
- ツール結果のペアリング修復
- ターンの検証 / 順序付け
- 思考署名のクリーンアップ
- Thinking 署名のクリーンアップ
- 画像ペイロードのサニタイズ
- プロバイダー再生前の空のテキストブロックのクリーンアップ
- ユーザー入力の出所タグ付け(セッション間でルーティングされたプロンプト用)
- Bedrock Converse 再生用の空の assistant エラーターン修復
トランスクリプト保存の詳細が必要な場合は、次を参照してください。
グローバルルール: ランタイムコンテキストはユーザートランスクリプトではない
ランタイム / システムコンテキストは、あるターンのモデルプロンプトに追加できますが、 エンドユーザーが作成したコンテンツではありません。OpenClaw は、Gateway 返信、キューに入れられたフォローアップ、ACP、CLI、埋め込み Pi 実行向けに、トランスクリプト用の プロンプト本文を別に保持します。保存される可視のユーザーターンは、ランタイムで拡張されたプロンプトではなく、そのトランスクリプト本文を使います。
ランタイムラッパーがすでに永続化されているレガシーセッションでは、Gateway 履歴 サーフェスが WebChat、 TUI、REST、または SSE クライアントへメッセージを返す前に表示用の投影を適用します。
これが実行される場所
すべてのトランスクリプト衛生処理は、埋め込みランナーに集約されています。
- ポリシー選択:
src/agents/transcript-policy.ts - サニタイズ / 修復の適用:
src/agents/pi-embedded-runner/replay-history.tsのsanitizeSessionHistory
このポリシーは、provider、modelApi、modelId を使って適用内容を決定します。
トランスクリプト衛生処理とは別に、セッションファイルは読み込み前に(必要な場合)修復されます。
src/agents/session-file-repair.tsのrepairSessionFileIfNeededrun/attempt.tsとcompact.ts(埋め込みランナー)から呼び出されます
グローバルルール: 画像のサニタイズ
画像ペイロードは、サイズ 制限によるプロバイダー側の拒否を防ぐため、常にサニタイズされます(過大な base64 画像を縮小 / 再圧縮します)。
これは、ビジョン対応モデルで画像起因のトークン負荷を制御するのにも役立ちます。 最大寸法を小さくすると一般的にトークン使用量が減り、大きくすると詳細が保持されます。
実装:
src/agents/pi-embedded-helpers/images.tsのsanitizeSessionMessagesImagessrc/agents/tool-images.tsのsanitizeContentBlocksImages- 画像の最大辺は
agents.defaults.imageMaxDimensionPxで設定できます(デフォルト:1200)。 - このパスが再生コンテンツを走査する間に、空のテキストブロックは削除されます。空になったアシスタント ターンは再生コピーから削除されます。空になったユーザーおよびツール結果 ターンには、空でない省略コンテンツのプレースホルダーが付与されます。
グローバルルール: 不正な形式のツール呼び出し
input と arguments の両方が欠落しているアシスタントのツール呼び出しブロックは、モデルコンテキストが構築される前に削除されます。これにより、部分的に
永続化されたツール呼び出し(たとえば、レート制限の失敗後)によるプロバイダー拒否を防ぎます。
実装:
src/agents/session-transcript-repair.tsのsanitizeToolCallInputssrc/agents/pi-embedded-runner/replay-history.tsのsanitizeSessionHistoryで適用されます
グローバルルール: セッション間入力の出所
エージェントが sessions_send を介して別のセッションへプロンプトを送る場合(エージェント間の reply/announce ステップを含む)、OpenClaw は作成されたユーザーターンを次の内容で永続化します。
message.provenance.kind = "inter_session"
OpenClaw はまた、ルーティングされたプロンプトテキストの前に、同じターン内の [Inter-session message ... isUser=false]
マーカーを付けるため、アクティブなモデル呼び出しは外部セッション出力を外部エンドユーザー指示と区別できます。このマーカーには、利用可能な場合、送信元セッション、チャンネル、ツールが含まれます。プロバイダー互換性のため、トランスクリプトは引き続き
role: "user" を使いますが、可視テキストと出所
メタデータの両方が、そのターンをセッション間データとして示します。
コンテキスト再構築中、OpenClaw は、出所メタデータのみを持つ古い永続化済み セッション間ユーザーターンにも同じマーカーを適用します。
プロバイダーマトリックス(現在の動作)
OpenAI / OpenAI Codex
- 画像のサニタイズのみ。
- OpenAI Responses/Codex トランスクリプトでは、孤立した reasoning 署名(後続のコンテンツブロックを持たないスタンドアロンの reasoning 項目)を削除し、モデルルート切り替え後には再生可能な OpenAI reasoning を削除します。
- 暗号化された空サマリー項目を含め、再生可能な OpenAI Responses reasoning 項目ペイロードを保持するため、手動 / WebSocket 再生では必要な
rs_*状態がアシスタント出力項目と対応付けられたままになります。 - ネイティブ ChatGPT Codex Responses は、セッションの
prompt_cache_keyを保持しつつ、事前の項目 ID なしで過去の Responses reasoning/message/function ペイロードを再生することで Codex ワイヤ互換に従います。 - ツール呼び出し ID のサニタイズはありません。
- ツール結果のペアリング修復では、実際に一致した出力を移動し、欠落したツール呼び出しに対して Codex スタイルの
aborted出力を合成する場合があります。 - ターンの検証や並べ替えはありません。
- 欠落している OpenAI Responses ファミリーのツール出力は、Codex 再生正規化に合わせて
abortedとして合成されます。 - 思考署名の除去はありません。
OpenAI 互換 Gemma 4
- 過去のアシスタント thinking/reasoning ブロックは、ローカルの OpenAI 互換 Gemma 4 サーバーが前ターンの reasoning コンテンツを受け取らないよう、再生前に除去されます。
- 現在の同一ターンのツール呼び出し継続では、ツール結果が再生されるまで、アシスタント reasoning ブロックを ツール呼び出しに付けたままにします。
Google(Generative AI / Gemini CLI / Antigravity)
- ツール呼び出し ID のサニタイズ: 厳格な英数字。
- ツール結果のペアリング修復と合成ツール結果。
- ターンの検証(Gemini スタイルのターン交替)。
- Google ターン順序の修正(履歴がアシスタントで始まる場合、小さなユーザー bootstrap を先頭に追加)。
- Antigravity Claude: thinking 署名を正規化し、署名されていない thinking ブロックを削除します。
Anthropic / Minimax(Anthropic 互換)
- ツール結果のペアリング修復と合成ツール結果。
- ターンの検証(厳格な交替を満たすため、連続するユーザーターンをマージ)。
- thinking が有効な場合、Cloudflare AI Gateway ルートを含め、末尾のアシスタント prefill ターンは送信される Anthropic Messages ペイロードから除去されます。
- 欠落、空、または空白の再生署名を持つ thinking ブロックは、プロバイダー変換前に除去されます。それによりアシスタントターンが空になる場合、OpenClaw は 空でない省略 reasoning テキストでターン形状を保持します。
- 除去が必要な古い thinking のみのアシスタントターンは、プロバイダーアダプターが再生 ターンを削除しないよう、空でない省略 reasoning テキストに置き換えられます。
Amazon Bedrock(Converse API)
- 空のアシスタントストリームエラーターンは、再生前に空でないフォールバックテキストブロックへ修復されます。Bedrock Converse は
content: []を持つアシスタントメッセージを拒否するため、stopReason: "error"と空のコンテンツを持つ永続化済みアシスタントターンも、読み込み前にディスク上で修復されます。 - 空白のテキストブロックのみを含むアシスタントストリームエラーターンは、無効な空白ブロックを再生するのではなく、 インメモリ再生コピーから削除されます。
- 欠落、空、または空白の再生署名を持つ Claude thinking ブロックは、 Converse 再生前に除去されます。それによりアシスタントターンが空になる場合、OpenClaw は 空でない省略 reasoning テキストでターン形状を保持します。
- 除去が必要な古い thinking のみのアシスタントターンは、Converse 再生が厳格なターン形状を維持するよう、空でない省略 reasoning テキストに置き換えられます。
- 再生では、OpenClaw の delivery-mirror と gateway-injected のアシスタントターンがフィルターされます。
- 画像のサニタイズはグローバルルールを通じて適用されます。
Mistral(model-id ベースの検出を含む)
- ツール呼び出し ID のサニタイズ: strict9(英数字、長さ 9)。
OpenRouter Gemini
- 思考署名のクリーンアップ: base64 ではない
thought_signature値を除去します(base64 は保持)。
OpenRouter Anthropic
- reasoning が有効な場合、検証済みの OpenRouter OpenAI 互換 Anthropic モデルペイロードから末尾のアシスタント prefill ターンを除去し、直接の Anthropic および Cloudflare Anthropic 再生動作に合わせます。
その他すべて
- 画像のサニタイズのみ。
過去の動作(2026.1.22 より前)
2026.1.22 リリース以前、OpenClaw は複数層のトランスクリプト衛生処理を適用していました。
- transcript-sanitize extension がすべてのコンテキスト構築時に実行され、次のことができました。
- ツール use/result のペアリングを修復。
- ツール呼び出し ID をサニタイズ(
_/-を保持する非厳格モードを含む)。
- ランナーもプロバイダー固有のサニタイズを実行しており、処理が重複していました。
- プロバイダーポリシーの外側でも、次のような追加の変更が発生していました。
- 永続化前にアシスタントテキストから
<final>タグを除去。 - 空のアシスタントエラーターンを削除。
- ツール呼び出し後のアシスタントコンテンツをトリミング。
- 永続化前にアシスタントテキストから
この複雑さにより、プロバイダー間の回帰(特に openai-responses
の call_id|fc_id ペアリング)が発生しました。2026.1.22 のクリーンアップでは extension を削除し、ロジックをランナーに集約し、OpenAI は画像のサニタイズを除いて変更なしにしました。