Skip to content

エージェントシステム

エージェントシステムは、完了した会話ターンを任意のバックグラウンドタスクへ変換します。チャットセッションとユーザーへの配信を担う Main Server と、要求判定・ツール実行・タスク状態管理を担う Agent Server に分かれています。

ランタイム構成

text
Main Server                                  Agent Server (:48915)
┌──────────────────────────┐                 ┌──────────────────────────────┐
│ LLMSessionManager        │                 │ DirectTaskExecutor           │
│ cross_server.py          │  analyze queue  │  ├─ unified channel assess  │
│ MainServerAgentBridge    │ ──────────────> │  ├─ user-plugin assess      │
│                          │ <────────────── │  └─ dedupe / task tracking  │
│ pending_agent_callbacks  │  result/events  │                              │
└──────────────────────────┘                 │ channel adapters             │
                                             └──────────────────────────────┘

現在の実行器は brain/task_executor.pyDirectTaskExecutor です。旧 Planner / Processor / Analyzer パイプラインは存在しません。TaskDeduper は残っていますが、重複ディスパッチの防止用であり、実行後の Analyzer ではありません。

Agent Server は app/agent_server/__main__.py から起動されます。実装は api_runtime.pyapi_routes.pychannels/registry.pytracker.pyresults.py に分割されています。

会話からタスクまで

  1. main_logic/cross_server.pyturn end または session end でサイズ制限付きの直近メッセージを構築し、当該ターンのユーザー画像を添付できます。
  2. publish_analyze_request_reliably()event_id 付き analyze_request を送信します。Main Server は短時間 analyze_ack を待ち、タイムアウト時に一度再試行します。
  3. マスタースイッチがオフなら Agent Server は判定を行いません。以前キャンセルされたユーザーターンの除去と直近タスクの重複判定も行います。
  4. DirectTaskExecutor.analyze_and_execute() が有効なチャネルを判定します。ユーザープラグインは独立した検出・2段階エントリ選択を使い、その他は統一判定を使います。
  5. 選択されたチャネルは registry タスクを作成し、task_update を送信し、実行後に構造化 task_result を送信します。
  6. Main Server はライブ更新をブラウザへ転送し、結果を該当する LLMSessionManager にキューします。テキストセッションでは即時配信でき、音声セッションでは注入またはホットスワップ境界まで遅延する場合があります。

エージェント結果のコールバックは再解析されないため、結果配信が再帰的に別タスクを生成することはありません。

トランスポート

プロセス間ブリッジは同期 ZeroMQ socket とバックグラウンド受信スレッドを使用し、Windows Proactor イベントループにも対応します。

既定アドレスパターン方向用途
tcp://127.0.0.1:48961PUB / SUBMain → Agentセッション・ライフサイクルイベント
tcp://127.0.0.1:48963PUSH / PULLMain → Agent信頼性付き analyze_request キュー
tcp://127.0.0.1:48962PUSH / PULLAgent → MainACK、状態、タスク更新、結果

各ポートは NEKO_ZMQ_SESSION_PUB_PORTNEKO_ZMQ_ANALYZE_PUSH_PORTNEKO_ZMQ_AGENT_PUSH_PORT で上書きできます。Agent HTTP 制御は既定で 127.0.0.1:48915、組み込みユーザープラグインサービスは 127.0.0.1:48916 です。

Agent → Main の結果配信には HTTP フォールバックがありません。ZeroMQ ブリッジが利用できない場合、イベントは配信されません。

機能状態

権威ある状態は Main Server の /api/agent/* プロキシから取得します。フロントエンドは /api/agent/command で変更し、/api/agent/state で更新します。ローカルのチェックボックス状態を正として扱ってはいけません。

状態意味
analyzer_enabled / UI agent_enabled判定のマスタースイッチ
computer_use_enabled視覚ベースのデスクトップ操作
browser_use_enabledブラウザ自動操作
user_plugin_enabledインストール済みユーザープラグイン実行
openclaw_enabledOpenClaw スタンドアロンチャネル
openfang_enabledOpenFang マルチエージェントチャネル

Manager と Agent Server は構築時にすべてオフです。ただし最初の実ユーザー greeting_check 後に永続化された runtime intent を復元できるため、ページ更新のたびに設定がリセットされるわけではありません。

スイッチだけでなく API readiness とチャネル capability probe も実行可否に影響します。OpenClaw は有効化 probe 中に独立した readiness 状態を持ちます。

ルーティング規則

非プラグインチャネルでは、実行可能な最初の結果が次の順序で選ばれます。

python
_CHANNEL_PRIORITY = ["qwenpaw", "openfang", "browser_use", "computer_use"]

qwenpaw は OpenClaw アダプターに対応します。ユーザープラグインは別経路で判定され、_CHANNEL_PRIORITY には含まれません。

ユーザープラグインは最初に brain/plugin_filter.py の決定的フィルターを通り、その後 LLM がエントリを選択します。plugin_identry_id、引数は厳密に検証されます。実行タイムアウトはエントリメタデータがあればそれを使い、なければプロジェクト既定値です。

並行性・キャンセル・保持

  • 判定とディスパッチは直列化され、同時刻の turn-end が重複タスクを作るのを防ぎます。
  • Computer Use は明示的なキューを持ち、デスクトップ操作は一度に1件です。Browser とリモート Agent も独自の active-task guard を持ちます。
  • キャンセルは registry を先に cancelled にし、wrapper task を止めてから provider 固有の teardown をバックグラウンドで開始します。遅延結果は終端状態を上書きできません。
  • 完了・失敗・キャンセル済み registry は5分保持され、クリーンアップは最大でも1分に1回です。
  • ユーザープラグインは deferred: true を返せます。/api/agent/tasks/{task_id}/complete が呼ばれるか、1時間の timeout で失敗するまで running のままです。

実装マップ

関心事現在の実装
turn-end と直近コンテキストmain_logic/cross_server.py
ZeroMQ ブリッジと ACK/再試行main_logic/agent_event_bus.py
判定とルーティングbrain/task_executor.py
プラグイン候補フィルターbrain/plugin_filter.py
Agent lifecycle / HTTP APIapp/agent_server/api_runtime.pyapi_routes.py
チャネル実行app/agent_server/channels/
タスク registry と保持app/agent_server/registry.py
チャットへの結果配信main_logic/core/proactive.py

公開制御 API は Agent REST API、表示側は Task HUD System を参照してください。