ハーネスを使用する場合
モデルファミリーが独自のネイティブセッションランタイムを持ち、通常の OpenClaw プロバイダー転送が適切な抽象化ではない場合に、エージェントハーネスを登録します。- スレッドと Compaction を管理するネイティブなコーディングエージェントサーバー
- ネイティブな計画、推論、ツールイベントをストリーミングする必要があるローカル CLI またはデーモン
- OpenClaw セッショントランスクリプトに加えて独自の再開 ID が必要なモデルランタイム
コアが引き続き管理するもの
ハーネスが選択される前に、OpenClaw はすでに以下を解決しています。- プロバイダーとモデル
- ハーネスが認証ブートストラップを管理すると宣言している場合を除く、ランタイム認証状態
- 思考レベルとコンテキスト予算
- OpenClaw のトランスクリプト/セッションファイル
- ワークスペース、サンドボックス、ツールポリシー
- チャネル返信コールバックとストリーミングコールバック
- モデルのフォールバックとライブモデル切り替えポリシー
ハーネス所有の認証ブートストラップ
デフォルトでは、コアはハーネスを呼び出す前にプロバイダーの認証情報を解決します。独自のネイティブランタイムを通じて認証できる信頼済みハーネスは、静的なAgentHarness 登録で authBootstrap: "harness" を設定できます。その場合、コアは、そのハーネスが引き受けるすべての試行について、汎用プロバイダー認証情報のブートストラップと認証情報欠落エラーを省略します。
互換性があり、明示的に選択または順序付けされた OpenClaw 認証プロファイルと、そのスコープ付きストアが存在する場合、コアは引き続きそれらを転送します。ハーネスは、モデルリクエストを発行する前にそのプロファイルまたはネイティブ認証情報を解決し、シークレットを試行のスコープ内に限定し、対処可能な認証エラーを提示する必要があります。認証を一部の場合にしか管理しないハーネスでは、このケイパビリティを設定しないでください。
検証済みセットアップランタイムのアーティファクト
初回実行時のセットアップに推論を提供できるローカルハーネスは、プローブを完了した実装を証明する必要があります。params.captureRuntimeArtifact が true の場合、安定した ID とコンテンツフィンガープリントを持つ不透明な result.runtimeArtifact を返します。別のハーネスをロードしたり、無関係な Plugin をスキャンしたりせずに、そのバインディングを再確認する、対応する runtimeArtifact.validate(...) ケイパビリティを登録してください。
検証済みの OpenClaw 継続処理では、params.expectedRuntimeArtifact も渡されます。ハーネスは、それを取得した正確なネイティブプロセスと比較し、異なる場合はネイティブスレッドを開始または再開する前に失敗する必要があります。通常のエージェントターンでは両方のフィールドが省略されるため、コンテンツハッシュは通常のリクエストのホットパスに入りません。リモート/WebSocket ハーネスが参加するには、サーバー証明コントラクトが必要です。バージョン文字列だけではアーティファクトの識別情報になりません。
準備済みの試行には、OpenClaw とネイティブハーネスの間で共有し続ける必要があるランタイム判断用の OpenClaw 所有ポリシーバンドル、params.runtimePlan も含まれます。
- プロバイダー対応のツールスキーマポリシー用の
runtimePlan.tools.normalize(...)とruntimePlan.tools.logDiagnostics(...) - トランスクリプトのサニタイズとツール呼び出し修復ポリシー用の
runtimePlan.transcript.resolvePolicy(...) - 共有
NO_REPLYとメディア配信抑制用のruntimePlan.delivery.isSilentPayload(...) - モデルフォールバック分類用の
runtimePlan.outcome.classifyRunResult(...) - 解決済みのプロバイダー/モデル/ハーネスメタデータ用の
runtimePlan.observability
リクエスト転送コントラクト
supports(ctx) は、解決済みのモデル転送を ctx.modelProvider で受け取ります。プロバイダー所有のシークレットを含まない 2 つのファクトが、選択されたルートを記述します。
runtimePolicy.compatibleIdsは、その具体的なルートとの互換性をプロバイダーが宣言しているランタイム ID を列挙します。ポリシーが存在しない場合、プロバイダーがルートレベルの互換性を宣言していないことを意味します。サポートを想定してよいという許可ではありません。requestTransportOverrides: "none"は、作成済みのプロバイダー/モデルリクエストのオーバーライドを再現する必要がないことを意味します。"present"は、作成済みのヘッダー、認証転送、プロキシ、TLS、ローカルサービス、プライベートネットワークの動作、またはリクエストパラメーターが存在することを意味します。このファクトによって、それらの値が公開されることはありません。
{ supported: false, reason } を返してください。選択後に生の設定を読み取ってサポートを推測しないでください。認証準備によって複数の再試行ルートが生成される場合、ディスパッチ前に 1 つのハーネスがそのすべてをサポートする必要があります。暗黙の選択では、完全なセットを管理できる Plugin がない場合は OpenClaw を使用します。明示的または永続化された Plugin の選択は、安全側に倒して失敗します。
ハーネスを登録する
インポート:openclaw/plugin-sdk/agent-harness
authBootstrap が含まれていません。ハーネスが前述のコントラクトを満たす場合にのみ authBootstrap: "harness" を追加してください。
委任された実行
ハーネス所有者は、Codex を基盤とする会話を継続する音声転送など、既存のモデル固定セッションを実行する必要がある信頼済み Plugin の ID をdelegatedExecutionPluginIds に設定できます。これはコアの許可リストではなく、所有者による静的な同意です。対象を限定してください。
委任先に与えられるのは、作業の受け入れと組み込み実行のみです。OpenClaw では、保存済みのセッションキー、ストアパス、セッション ID が完全に一致し、modelSelectionLocked: true が指定され、さらに agentHarnessId と agentHarnessRuntimeOverride の値が一致する必要があります。その後、実行はハーネス所有者を通じてスコープ設定されます。セッションの作成、パッチ適用、リセット、削除、アーカイブ、および Gateway の変更は、引き続き所有者のみが実行できます。
選択ポリシー
OpenClaw は、プロバイダー/モデルを解決した後にハーネスを選択します。- モデルスコープのランタイムポリシーが優先されます。
- 次にプロバイダースコープのランタイムポリシーが適用されます。
autoは、解決済みの実効ルートをサポートするかどうかを登録済みハーネスに問い合わせます。プロバイダー/モデルのプレフィックスだけでハーネスが選択されることはありません。- 一致する登録済みハーネスがない場合、OpenClaw は組み込みランタイムを使用します。
auto モードでは、登録済みの Plugin ハーネスが解決済みのプロバイダー/モデルをサポートしない場合にのみ、組み込みフォールバックが適用されます。Plugin ハーネスが実行を引き受けた後、OpenClaw は同じターンを別のランタイムで再実行しません。認証/ランタイムのセマンティクスが変わったり、副作用が重複したりする可能性があるためです。
設定済みのランタイムポリシーは、目的のランタイムについて引き続き権威を持ちます。永続化されたセッション agentHarnessId は、ルート/認証の準備がまだ完了していない間も、ネイティブトランスクリプトの所有権を保持します。どちらも互換性のないルートを互換にするものではありません。準備済みのファクトが存在するようになった時点で、選択または固定されたハーネスがそれらをサポートする必要があり、サポートしない場合は安全側に倒して実行が失敗します。/status は、ポリシー、永続化された所有権、およびルートサポートから選択された実効ランタイムを表示します。準備状態は明示的です。runtimePolicy がない場合、たまたま存在する転送フィールドから推測せず、未宣言のままとします。ハーネス所有の認証によって複数の物理ルートが未解決のまま残る場合、準備済みサポートファクトは、それらの互換ランタイム ID の積集合となり、いずれかの候補にリクエストオーバーライドがある場合はそれを報告します。したがって、未宣言の候補が 1 つでもあれば、ネイティブ互換性は空になります。preparedAuth.source: "harness" は認証所有者であり、ルートサポートを推測してよいという許可ではありません。
選択されたハーネスが予想外の場合は、agents/harness デバッグログを有効にし、Gateway の構造化された agent harness selected レコードを確認してください。このレコードには、選択されたハーネス ID、選択理由、ランタイム/フォールバックポリシーが含まれ、auto モードでは、各 Plugin 候補のサポート結果も含まれます。
バンドル済み Codex Plugin は、ハーネス ID として codex を登録します。コアはこれを通常の Plugin ハーネス ID として扱います。Codex 固有のエイリアスは共有ランタイムセレクターではなく、Plugin またはオペレーター設定に属します。
プロバイダーとハーネスの組み合わせ
ほとんどのハーネスは、プロバイダーも登録する必要があります。プロバイダーによって、モデル参照、認証状態、モデルメタデータ、/model の選択が OpenClaw の他の部分から参照可能になります。その後、ハーネスは supports(...) でそのプロバイダーを引き受けます。
バンドル済み Codex Plugin は、このパターンに従います。
- 推奨されるユーザーモデル参照:
openai/gpt-5.6-sol - 互換性参照:従来の
codex/gpt-*参照も引き続き受け入れられますが、新しい設定では通常のプロバイダー/モデル参照として使用しないでください - ハーネス ID:
codex - 認証:Codex ハーネスがネイティブ Codex ログイン/セッションを管理するため、合成プロバイダー可用性を使用
- app-server リクエスト:OpenClaw はモデル ID のみを Codex に送信し、ハーネスがネイティブ app-server プロトコルと通信します
auto の場合、OpenAI が Codex を選択できるのは、プロバイダー所有のルートコントラクトが codex を互換と宣言している場合のみです。具体的には、作成済みのリクエストオーバーライドがない、正確な公式 HTTPS Platform Responses または ChatGPT Responses ルートです。openai/* プレフィックスだけで Codex が選択されることはありません。カスタムエンドポイント、Completions アダプター、作成済みのリクエスト動作は OpenClaw に残ります。公式の平文 HTTP エンドポイントは拒否されます。以前の codex/gpt-* 参照は引き続き互換性入力として扱われます。OpenAI の暗黙的エージェントランタイムを参照してください。
オペレーター向けのセットアップ、モデルプレフィックスの例、および Codex 専用設定については、Codex ハーネスを参照してください。
Codex Plugin は、Codex ハーネスに記載された最低 app-server バージョンを適用します。初期化ハンドシェイクを確認し、古いサーバーやバージョン情報のないサーバーをブロックすることで、OpenClaw がテスト済みのプロトコルサーフェスに対してのみ実行されるようにします。
ツール結果ミドルウェア
バンドル済み Plugin、およびマニフェストコントラクトが一致する明示的に有効化されたインストール済み Plugin は、マニフェストのcontracts.agentToolResultMiddleware で対象ランタイム ID を宣言している場合、api.registerAgentToolResultMiddleware(...) を通じてランタイムに依存しないツール結果ミドルウェアを追加できます。この信頼済みの接続面は、OpenClaw または Codex がツール出力をモデルに返す前に実行する必要がある、非同期のツール結果変換に使用します。
従来のバンドル済み Plugin では、Codex app-server 専用ミドルウェアに
api.registerCodexAppServerExtensionFactory(...) を引き続き使用できますが、新しい結果変換ではランタイム非依存 API を使用する必要があります。embedded runner 専用の api.registerEmbeddedExtensionFactory(...) フックは削除されました。埋め込みツール結果の変換では、ランタイム非依存ミドルウェアを使用する必要があります。
ターミナル結果の分類
独自のプロトコル投影を所有するネイティブハーネスでは、完了したターンで表示可能なアシスタントテキストが生成されなかった場合に、openclaw/plugin-sdk/agent-harness-runtime の
classifyAgentHarnessTerminalOutcome(...) を使用できます。このヘルパーは empty、reasoning-only、または
planning-only を返すため、OpenClaw のフォールバックポリシーは別のモデルで再試行するかどうかを判断できます。planning-only には、ハーネスの明示的な planText
フィールドが必要です。OpenClaw はアシスタントの文章からこれを推測しません。このヘルパーは意図的に、プロンプトエラー、進行中のターン、および NO_REPLY などの意図的な無言応答を分類対象外とします。
エージェント終了時の副作用
ネイティブハーネスは、試行の確定後にopenclaw/plugin-sdk/agent-harness-runtime の
runAgentEndSideEffects(...) を呼び出す必要があります。これは、対話型応答を遅延させることなく、移植可能な agent_end フックと OpenClaw のリサーチキャプチャをディスパッチします。これらの副作用が完了するまで試行を解決してはならない、ローカルの非対話型実行には awaitAgentEndSideEffects(...) を使用します。どちらのヘルパーも
runAgentHarnessAgentEndHook(...) と同じ { event, ctx } ペイロードを受け入れます。これらの失敗によって、完了した試行結果が変更されることはありません。
ユーザー入力とツールサーフェス
ランタイムレベルのユーザー入力要求を公開するネイティブハーネスでは、openclaw/plugin-sdk/agent-harness-runtime のユーザー入力ヘルパーを使用して、プロンプトを整形し、OpenClaw のブロッキング応答パスを介して配信し、選択式および自由記述式の回答をランタイム固有の応答形式に正規化する必要があります。このヘルパーにより、チャンネル/TUI の表示は一貫性を保ちつつ、各ハーネスは独自のプロトコル解析と保留中リクエストのライフサイクルを維持できます。
Pi のようなコンパクトなツールルーティングを必要とするネイティブハーネスでは、
openclaw/plugin-sdk/agent-harness-tool-runtime の
createAgentHarnessToolSurfaceRuntime(...) を使用する必要があります。これは、ツール検索/コードモードの制御選択、ローカルモデル向けの軽量なデフォルト、ランタイム互換のスキーマフィルタリング、非表示カタログの実行、ディレクトリのハイドレーション、およびカタログのクリーンアップを担います。ハーネスは引き続き、SDK 固有のツール変換とネイティブ実行コールバックを所有します。
ネイティブ Codex ハーネスモード
バンドル済みのcodex ハーネスは、埋め込み OpenClaw エージェントターン用のネイティブ Codex モードです。最初にバンドル済みの codex Plugin を有効にし、設定で制限的な許可リストを使用している場合は、plugins.allow に codex を含めてください。ネイティブ app-server の設定では openai/gpt-* を使用する必要があります。OpenAI エージェントターンが Codex ハーネスを選択するのは、有効なルートで Codex との互換性が宣言されている場合のみです。従来の Codex モデル参照は openclaw doctor --fix で修復する必要があります。従来の codex/*
モデル参照は、ネイティブハーネスの互換性エイリアスとして引き続き機能します。
このモードの実行時、Codex はネイティブスレッド ID、再開動作、Compaction、および app-server の実行を所有します。OpenClaw は引き続き、チャットチャンネル、表示用トランスクリプトミラー、ツールポリシー、承認、メディア配信、およびセッション選択を所有します。Codex app-server パスのみが実行を取得できることを証明する必要がある場合は、プロバイダー/モデル agentRuntime.id: "codex" を使用します。明示的な Plugin ランタイムはフェイルクローズします。Codex app-server の選択失敗およびランタイム障害は、別のランタイムを介して再試行されません。
ランタイムの厳格性
デフォルトでは、OpenClaw はauto プロバイダー/モデルのランタイムポリシーを使用します。登録済みの Plugin ハーネスは互換性のある有効なルートを取得でき、一致するものがない場合は埋め込みランタイムがターンを処理します。プロバイダー/モデルのプレフィックスだけでハーネスが選択されることはありません。ハーネスの選択漏れを埋め込みランタイムへルーティングするのではなく失敗させる必要がある場合は、agentRuntime.id: "codex" などの明示的なプロバイダー/モデル Plugin ランタイムを使用します。明示的に選択しても、互換性のないルートが互換性を持つようになるわけではありません。選択された Plugin ハーネスの障害は常に即座に失敗します。これは、明示的なプロバイダー/モデル
agentRuntime.id: "openclaw" を妨げません。
Codex 専用の埋め込み実行の場合:
ネイティブセッションとトランスクリプトミラー
ハーネスは、ネイティブセッション ID、スレッド ID、またはデーモン側の再開トークンを保持できます。その関連付けを OpenClaw セッションに明示的に紐付け、ユーザーに表示されるアシスタント/ツール出力を OpenClaw トランスクリプトに継続してミラーリングしてください。 OpenClaw トランスクリプトは、以下の互換性レイヤーであり続けます:- チャンネルに表示されるセッション履歴
- トランスクリプトの検索とインデックス作成
- 後続のターンで組み込み OpenClaw ハーネスへ切り替えること
- 汎用の
/new、/reset、およびセッション削除動作
reset(...) を実装してください。
ツールとメディアの結果
コアは OpenClaw ツールリストを構築し、準備済みの試行に渡します。ハーネスが動的なツール呼び出しを実行する場合は、チャンネルメディアを直接送信せず、ハーネスの結果形式を介してツール結果を返してください。 これにより、テキスト、画像、動画、音楽、TTS、承認、およびメッセージングツールの出力が、OpenClaw ベースの実行と同じ配信パスに保たれます。 信頼されたハーネスランタイムが自ら作成し永続化したネイティブ成果物に対してのみ、AgentHarnessAttemptResult.hostOwnedToolMediaUrls を設定してください。すべてのエントリは
toolMediaUrls にも含まれている必要があります。モデルが選択した動的ツールまたは OpenClaw ツールのメディアは決して含めないでください。message_tool_only ルートでは、この限定的な来歴情報により、ソース応答が抑制されてもネイティブランタイムの成果物を維持できます。通常の送信ポリシーと周辺ルームへの受け入れ条件は引き続き適用されます。
ターミナルツールの結果
AgentHarnessAttemptParams.observeToolTerminal は、ホストが所有するターミナル結果アキュムレーターです。OpenClaw の動的ツールまたはネイティブツールを実行するハーネスは、試行結果を確定する前に、各ツールがいずれか 1 つのターミナル結果に達した時点でこれを呼び出す必要があります。ツールを実行しないハーネスは、これを呼び出す必要はありません。
実行境界から得られる事実を報告します:
- プロトコル呼び出し ID が存在する場合はそれを、正規のツール名、および準備またはフックによる書き換え後に実際にツールへ渡された引数を渡します。
- 検証、承認、または別のガードによって、ツール実装の開始前に呼び出しが停止された場合は、
executionStarted: falseを設定します。ディスパッチされた可能性がある場合は、保守的にtrueを報告します。 outcome: "success"またはoutcome: "failure"を報告します。表示テキストから失敗を推測するのではなく、ランタイムから取得できる構造化された失敗フィールドを含めてください。- OpenClaw ツール定義を使用しないネイティブツールに対してのみ、
nativeMutationを使用します。そこでプロトコルが所有する変更およびリプレイに関する事実を指定してください。OpenClaw の変更分類器をハーネスにコピーしないでください。
lastToolError を AgentHarnessAttemptResult に引き継ぎ、並行する状態を導出するのではなく、その実行、引数、および副作用に関する事実をハーネスの投影で使用します。ホストは、無関係なツールが成功しても未解決の変更操作の失敗を保持し、一致するアクションが成功した後にのみ消去します。
このコールバックは、古い実験的ハーネスとのソース互換性のために引き続きオプションです。ただし、オプションであることは、ツールを実行するハーネスが無視してよいことを意味しません。ターミナルレポートがなければ、OpenClaw は、静かな Heartbeat の完了を含め、後続のツール呼び出しをまたいで変更ツールの失敗という事実を維持できません。
確定済みツールの最終処理
ハーネスがすべてのツール呼び出しを完了したものの、ネイティブターンがアシスタントテキストなしで終了した場合、OpenClaw は最後に表示する回答を 1 つ必要とすることがあります。ハーネスはfinalizeSettledTurn({ attempt, settledAttempt }) を実装することで、この復旧を有効にできます。
このコールバックは別個の機能であり、通常の試行をもう 1 回行うものではありません。以下の要件を満たす必要があります:
- 制限された正確なネイティブトランスクリプト、または確定済みツール結果の境界まで固定された完全なアプリケーショントランスクリプトのいずれかを使用すること。
- ツール、権限付与またはユーザー入力機能、ネイティブ実行フック、エージェント、Skills、メモリ、スケジューリング、拡張機能、リモート制御を一切公開しないこと。
- ホストが提供する最終処理プロンプトのみを送信すること。
- 選択したトランスクリプト/分離戦略でこれらの制限を適用できない場合は、フェイルクローズすること。
before_agent_run、LLM 入出力、ターミナル修正、および
agent_end フックもスキップされます。コア診断には、引き続きこのオペレーションとその失敗が記録されます。
このコールバックは通常の試行結果ではなく、AgentHarnessSettledTurnFinalizationResult を返します。公開フィールドは、完了したアシスタントメッセージ、最終処理呼び出しの使用量、トランスクリプト所有権のメタデータ、および診断トレースに限定されます。ツール、配信、メディア、スポーン、ライフサイクル、リプレイ、セッション、およびフォールバックの状態は、この結果境界を越えることができません。不明なフィールドとアシスタントによるツール呼び出しはフェイルクローズします。
内部で完全な試行エンジンを再利用するハーネスでは、返す前に
projectSettledTurnFinalizationAttemptResult(...) を呼び出すことができます。このヘルパーは、正規の失敗、ツール、配信、リプレイ、およびライフサイクルの証拠を拒否してから、限定された結果のみを投影します。これはネイティブ分離後の多層防御であり、ネイティブ機能サーフェスを削除する代わりにはなりません。
投影ベースのハーネスは、
source: "openclaw-transcript" を指定した settledAttempt.settledTurnFinalizationContext に完全なコンテキストを格納する必要があります。確定済みターンがミラーリングされた後にアクティブなブランチをキャプチャし、現在のプロンプトと現在のすべてのツール呼び出し/結果がその境界まで存在することを証明し、試行を返す前に生成されたメッセージ配列を固定する必要があります。ファイナライザーは、コンテキストが欠落している、サポートされていない、曖昧である、または大きすぎる場合に拒否する必要があります。メッセージの切り詰め、以前の履歴の削除、またはこのアプリケーショントランスクリプトを正確なネイティブ履歴として記述してはなりません。制限された 1 つのネイティブセッションを再開するハーネスには、この投影フィールドは必要ありません。
ベストエフォートの
disableTools ヒントを指定して runAttempt を呼び出すことで、このコールバックを実装しないでください。完全なネイティブ機能境界は、ハーネス所有者が適用する必要があります。OpenClaw は、任意のネイティブランタイムがこれらの制限を遵守したことを保証できないため、汎用フォールバックを提供しません。
コールバックは、実験的なサードパーティ製ハーネスとの互換性のため、引き続き任意です。選択したハーネスでコールバックが省略されている場合、OpenClaw は副作用が繰り返されるリスクを避けるため、既存の未完了ターンエラーを維持します。
現在の制限事項
- 公開インポートパスは汎用的ですが、一部の試行/結果型エイリアスには、互換性のために従来の名前がまだ残っています。
- サードパーティ製ハーネスのインストールは実験的です。ネイティブセッションランタイムが必要になるまでは、プロバイダー Plugin を優先してください。
- ターン間でのハーネスの切り替えはサポートされています。ネイティブツール、承認、アシスタントのテキスト、またはメッセージ送信が開始された後に、ターンの途中でハーネスを切り替えないでください。