コンテンツへスキップ
ガイド

OpenClawのコンテキストエンジン

アセンブリの4つのライフサイクルポイント、デフォルトのlegacy、commitTurnとトランスクリプトのセマンティクスを使ったプラグインエンジンの書き方、受け付けるホストパラメーター、ホストの機能要件、障害の分離、そしてownsCompactionの本当の意味

8分で読めます

モデルが目にするものはすべて、何かによって組み立てられています。OpenClawでは、その何かがコンテキストエンジンで、差し替えが可能です。組み込みのエンジンは元の挙動を保っていますが、その下にあるインターフェースこそ、検索重視や要約重視の戦略を差し込む場所です。以下では、ライフサイクルポイント、プラグインが守るべき契約、そして不具合のあるエンジンがエージェントを沈黙させないための2つの障害時の挙動を説明します。

4つのライフサイクルポイント

  • ingestは新しいメッセージがセッションに加わったときに呼ばれ、エンジンがそれを保存したりインデックス化したりできます。assembleは各モデル実行の前に呼ばれ、トークン予算に収まる、順序付きのメッセージ群と任意のシステムプロンプトへの追加分を返します。compactはウィンドウがいっぱいになったとき、またはユーザーが要求したときに呼ばれます。そしてafter-turnフックでは、エンジンが状態を永続化したり、バックグラウンドのコンパクションを開始したり、インデックスを更新したりできます。
  • 任意のmaintainメソッドは、bootstrap、成功したターン、またはコンパクションの後に、安全な書き換えヘルパーを使ってトランスクリプトのメンテナンスを行います。返信をブロックしないよう、バックグラウンド処理として宣言することもできます。バックグラウンドのメンテナンスを受け入れる、キューに入った予算コンパクションは、メンテナンス、再実行、破棄が終わるまで準備済みのランタイムを生かしておくため、受け入れられたからといってクリーンアップが完了したわけではありません。
  • 2つの任意のサブエージェント用フックは、子の実行が始まる前に共有状態を準備し、終わったときに後片付けをします。準備用フックは、親と子のセッションキー、コンテキストモード、利用可能なトランスクリプトの識別子、任意の有効期間を受け取り、ロールバックハンドルを返すことができます。その後に起動が失敗した場合、OpenClawはそのハンドルを呼び出します。
  • 組み込みのlegacyエンジンは意図的に薄く作られています。セッションマネージャーがメッセージを永続化するのでingestは何もせず、assembleは既存のサニタイズ、検証、制限のパイプラインにそのまま渡し、compactは組み込みの要約処理に委ね、after-turnフックは何もしません。ツールは登録せず、システムプロンプトにも何も追加しません。
ownsCompaction: falseは、OpenClawが自動的にlegacyエンジンのコンパクション経路にフォールバックすることを意味しません。

エンジンを書く

プラグインは、ID、名前、コンパクションを担うかどうか、受け付けるホストパラメーターを指定してエンジンを登録します。OpenClawはその宣言と各ライフサイクルメソッドで利用可能なフィールドの共通部分をとるため、宣言されていないキーや未知のキーが注入されることはありません。宣言を省略したエンジンは、現在のホストフィールドをすべて受け取ります。受け入れられたターンを永続的に記録するには、エンジンは両方のトランスクリプトのセマンティクスを宣言し、進行キーをキーとする1回のアトミックでべき等な書き込みとしてcommitメソッドを実装します。最初の書き込みにはcommittedステータスを、ホストの再試行が同じキーを提示した場合にはduplicateステータスを返します。ペイロードは、受け入れられたユーザーエントリーから受理された終端エントリーまでの範囲だけを含み、それ以前の履歴はトランスクリプトのカーソルを通じて読み取ります。完全な宣言とメソッドがない場合、OpenClawは再試行を含むその論理ターン全体でlegacyの経路を使い、設定済みのスロットは変更せず、次のターンで再びそのエンジンを試します。assembleの結果には、メッセージ、推定トークン数、任意のシステムプロンプトへの追加分、オーバーフローの事前チェックでどちらの推定値を使うかを決めるプロンプト権限フラグ、そして永続的なバックエンドスレッドを持つホスト向けの任意のプロジェクションライフサイクルが含まれます。

要件と障害

  • エンジンはホストの機能要件を宣言できます。たとえば、assembleを通じて実際のプロンプトを制御しなければならない、というものです。ネイティブおよび組み込みのエージェント実行はこの機能を満たしますが、汎用のコマンドラインバックエンドは満たしません。そのため、この機能を必要とするエンジンはプロセスの開始前に拒否され、説明的なメッセージとともにフェイルクローズします。
  • legacy以外のエンジンが見つからない、契約の検証に失敗する、作成時に例外を投げる、またはライフサイクルメソッドから例外を投げる場合、OpenClawは現在のgatewayプロセスの間そのエンジンを隔離し、返信が続くようにコンテキスト処理をlegacyに格下げし、失敗した操作とともにエラーをログに記録します。これにより、運用者はプラグインを修復、更新、または無効化できます。
  • コンパクションを担うと、その実行では組み込みの試行内自動コンパクションと汎用のプロンプト前オーバーフロー事前チェックが無効になり、手動コンパクション、オーバーフローからの回復、あらゆる先回りの処理がエンジンの責任になります。担わない場合は、組み込みの自動コンパクションは利用可能なままですが、手動コンパクションとオーバーフローからの回復は引き続きエンジンに回されます。何もしないcompactメソッドが危険なのはこのためです。

legacyエンジンが処理を委ねる挙動についてはOpenClawのコンパクションで、組み立てられる対象そのものについてはOpenClawのコンテキストの解説で説明しています。

選択と選択解除

スロットは実行時には排他的です。ある実行やコンパクションに対して解決される登録済みエンジンは1つだけですが、有効になっている他のエンジンプラグインも読み込まれ、その登録コードは実行されます。現在スロットで選択されているプラグインをアンインストールすると、スロットはデフォルトにリセットされます。同じリセットはメモリのスロットにも適用されるため、手動で設定を編集する必要はありません。エンジンを切り替えても既存のセッションは書き換えられず、それらは現在の履歴のまま続き、新しいエンジンが今後の実行を引き継ぎます。メモリプラグインは検索と取得を提供する別のスロットで、エンジンはそのレイアウトに直接手を入れるのではなく、ドキュメント化されたヘルパーを通じて、アセンブリ中にそれらを利用できます。プラグインシステムについてはOpenClawのプラグインで、取得の側面についてはOpenClawのメモリ検索で説明しています。

Dialiでは

Dialiでは、ランタイムの設定がダッシュボードから生成され、リリースのたびに置き換えられるため、コンテキストエンジンの選択は、顧客が手で編集するファイルではなく、その生成された設定の一部になります。ホスト型アシスタントについてはDialiのマネージドOpenClawホスティングで、各ランタイムを囲む境界についてはDialiのセキュリティで説明しています。

  • ingest、assemble、compact、after turn:4つのポイントに、1つの契約。
  • 壊れたエンジンは隔離され、legacyがエージェントの応答を続けさせます。
  • トランスクリプトのセマンティクスを宣言しないと、そのターンは黙ってlegacyを使います。
今すぐ始める

読むだけでなく、作ってみましょう

エージェントを設定してチャネルを選べば、いつも開いているアプリの中でエージェントが働き始めます。