本文へスキップ
hdknr blog
戻る

Claude Managed Agents のアーキテクチャ: Brain / Session / Hands の分離設計

前回の記事では Claude Managed Agents の概要と業界インパクトを紹介した。本記事では、Anthropic のエンジニアリングブログ「Scaling Managed Agents: Decoupling the brain from the hands」に基づき、内部アーキテクチャを掘り下げる。

全体アーキテクチャ

Claude Managed Agents は4つのコアコンセプトで構成される。

コンセプト説明
Agentモデル、システムプロンプト、ツール、MCP サーバー、スキルの定義
Environmentコンテナテンプレート(パッケージ、ネットワークアクセス、マウントファイル)
SessionAgent と Environment を参照して起動される実行インスタンス
Eventsアプリケーションとエージェント間でやり取りされるメッセージ(SSE)

これらの背後には、Brain / Session / Hands という3層の分離設計がある。

Claude Managed Agents の Brain・Session・Hands 分離アーキテクチャ図。開発者の API 呼び出しからメタハーネス内部のコンポーネント構成までを示す

設計思想: OS の抽象化パターン

Anthropic はこのアーキテクチャの設計思想を、OS がハードウェアを抽象化した歴史に重ねている。

1970年代のディスクパックでも現代の SSD でも、read() コマンドは同じように動く。ハードウェアの実装が変わっても、その上の抽象化層(プロセス、ファイル)は安定し続けた。

Managed Agents も同じパターンを採用している。Session、Harness、Sandbox というエージェントのコンポーネントを仮想化し、インターフェースは安定させたまま、内部実装を自由に交換できる構造にした。Anthropic はこれを「メタハーネス」と呼んでいる。

なぜこの設計が必要なのか。ハーネスには「モデルが自力でできないこと」に関する前提が埋め込まれるが、モデルの能力が向上するとその前提が陳腐化する。例えば Claude Sonnet 4.5 では、コンテキスト制限が近づくとタスクを早期終了する「コンテキスト不安(context anxiety)」が見られた。そこでハーネスにコンテキストリセットを追加した。しかし Claude Opus 4.5 ではこの振る舞いが消え、リセット機能は無駄な荷物になった。

Brain: ステートレスなハーネス + Claude

Brain は Agent Harness と Claude(LLM 推論)で構成される。

初期の問題: Pet になったコンテナ

インフラ運用には Pets vs Cattle(ペットと家畜)という有名な比喩がある。Pet は名前を付けて大切に管理するサーバーで、壊れたら修理・看護する。一方 Cattle は番号で管理する使い捨てのサーバーで、壊れたら新しいものに差し替えるだけだ。クラウドネイティブな設計では、個々のインスタンスに依存しない Cattle 型が望ましいとされる。

当初はすべてのコンポーネント(ハーネス、セッション、サンドボックス)を単一のコンテナに入れていた。ファイル操作が直接のシステムコールで済むなどの利点はあったが、コンテナが Pet 化した。

解決: Brain を Cattle にする

Brain をコンテナから分離し、ステートレスにした。

Brain は実行中、emitEvent(id, event) でセッションログにイベントを書き込み、耐久性のある記録を維持する。

ハーネスの役割

Agent Harness はエージェントループの実行を担い、以下の最適化を組み込んでいる:

Session: コンテキストウィンドウの外に存在する永続コンテキスト

Session は append-only のイベントログで、Claude のコンテキストウィンドウの外に永続的に存在する。

なぜ Session が必要か

長時間タスクはコンテキストウィンドウを超えることが多い。従来の対処法(コンパクション、メモリツール、トリミング)はすべて不可逆な判断を含む。将来のターンでどのトークンが必要になるかを事前に予測するのは困難だ。

getEvents() インターフェース

Session の getEvents() インターフェースにより、Brain はイベントストリームの任意の位置スライスを照会できる:

取得したイベントはハーネス内で変換してから Claude のコンテキストウィンドウに渡すことも可能だ。回復可能なコンテキスト保存は Session が担い、任意のコンテキスト管理はハーネスが担うという関心の分離がなされている。

Hands: 使い捨て可能なサンドボックス + ツール

Hands はサンドボックス(コンテナ)と各種ツールで構成される。Brain から execute(name, input) → string という統一インターフェースで呼び出される。

Cattle としてのコンテナ

Brain から分離されたことで、コンテナは Cattle(使い捨て可能な家畜)になった:

セキュリティ境界

結合設計では、Claude が生成したコードと認証情報が同じコンテナ内に存在していた。悪意あるプロンプトで LLM を操作し、環境変数を読み取らせるプロンプトインジェクションのリスクがあった。

分離設計では、認証情報がサンドボックスの中から到達不可能になっている:

リソース認証情報の扱い
Git リポジトリアクセストークンでクローン時に認証。サンドボックス内では git push/pull が透過的に動作するが、トークン自体には触れられない
MCP ツールOAuth トークンを Vault に格納。専用プロキシ経由でアクセスし、ハーネスもトークンを知らない

Many Brains, Many Hands

分離設計により、1つの Brain が複数の Hands を操作でき、逆に複数の Brain がそれぞれ独立した Hands を持つこともできる。

OpenClaw との設計思想の比較

OpenClaw のアーキテクチャと比較すると、同じ「AIエージェント基盤」でも設計思想が大きく異なる。

OpenClaw のローカル自律型設計と Claude Managed Agents のマネージドサービス設計を比較した図

共通点

両者とも「チャットボットを超えたエージェント基盤」を目指しており、以下の点は共通している:

根本的な違い

観点OpenClawClaude Managed Agents
実行場所ユーザーのデバイス(ローカル)Anthropic のクラウド
常駐性Gateway デーモンが常駐。Heartbeat で自律判断セッション単位のオンデマンド起動
入力ソース22+ チャネル / Heartbeat / Cron / WebhookAPI 経由のイベント送信
障害分離単一デーモン(Gateway + Runtime が結合)Brain / Session / Hands が独立して障害・交換可能
スケーリング単一デバイスMany Brains, Many Hands でクラウドスケール
人格・記憶SOUL.md / MEMORY.md でローカル管理Agent 定義 + Session ログ
ワークフローLobster YAML(決定論的パイプライン)ハーネス内でのタスク実行(LLM 自律)
エコシステムClawHub(13,000+ スキル)MCP サーバー + 組み込みツール

使い分け

両者は競合というより補完的な関係にある。OpenClaw がエッジ側の自律エージェント、Managed Agents がクラウド側のスケーラブルなタスク実行基盤という棲み分けだ。

API の基本フロー

Managed Agents の利用フローは5ステップで構成される:

# 1. Agent を作成(モデル、プロンプト、ツールを定義)
POST /v1/agents

# 2. Environment を作成(コンテナテンプレート)
POST /v1/environments

# 3. Session を開始(Agent + Environment を参照)
POST /v1/sessions

# 4. イベントを送信
POST /v1/sessions/{id}/events

# 5. SSE でレスポンスをストリーム
GET /v1/sessions/{id}/stream

すべてのエンドポイントにベータヘッダー managed-agents-2026-04-01 が必要だ。SDK を使えばヘッダーは自動設定される。

SSE(Server-Sent Events)とは

ステップ5で使われている SSE(Server-Sent Events)は、HTTP 上でサーバーからクライアントへ一方向にリアルタイムデータを配信する W3C 標準の仕組みだ。Content-Type: text/event-stream で接続を維持し、イベントを逐次送信する。

WebSocket との違いは以下の通り:

項目SSEWebSocket
通信方向サーバー → クライアント(単方向)双方向
プロトコル標準 HTTP独自プロトコル (ws://)
再接続自動手動実装が必要
インフラ互換性プロキシ / LB と相性良好対応が必要な場合あり

Managed Agents ではエージェントへの指示は REST APIPOST /v1/sessions/{id}/events)で送り、結果の受信は SSEGET /v1/sessions/{id}/stream)で行う。エージェント実行の監視は本質的にサーバーからの単方向配信であり、双方向通信は不要なため、インフラの複雑さを増さない SSE が合理的な選択となっている。

実際の利用フロー: チャットボットとの連携例

CMA 自体にはチャット UI やチャネル監視の機能はない。開発者が自前のアプリケーション(チャットボット、Web UI など)を構築し、そのアプリが CMA の API を仲介する形になる。

ユーザーのメッセージが開発者アプリを経由して CMA の Session に送信され、Brain がオーケストレーションを実行し、SSE で結果を返す一連のイベントフロー図

  1. ユーザーがチャットでメッセージを送信 — チャットボットや Web UI がメッセージを受け取る
  2. アプリが API でイベントを送信POST /v1/sessions/{id}/events で Session にイベントを書き込む
  3. Brain がイベントを取得getEvents() で Session のイベントログを読み取る
  4. Brain がオーケストレーション実行 — Agent Harness が Claude に推論させ、必要に応じて Hands(Sandbox / Tools)を execute() で呼び出す
  5. Brain が結果を記録emitEvent() で Session にイベントを書き込む
  6. SSE でアプリに結果をストリームGET /v1/sessions/{id}/stream でアプリがリアルタイムに結果を受信
  7. アプリがユーザーに応答を表示

つまり、OpenClaw のように Gateway が直接チャットチャネルを監視するのとは異なり、CMA では開発者のアプリケーションがイベントの入出力を仲介する設計になっている。これにより、どのようなフロントエンド(Slack ボット、Web アプリ、モバイルアプリなど)とも柔軟に統合できる。

まとめ

Claude Managed Agents のアーキテクチャは「ハーネスに埋め込まれた前提は陳腐化する」という課題に対する構造的な解答だ。Brain / Session / Hands を分離し、それぞれを Cattle として扱えるようにすることで、障害分離、スケーラビリティ、セキュリティを同時に達成している。

OS が「まだ考えられていないプログラム」のためにハードウェアを抽象化したように、Managed Agents は「まだ考えられていないハーネス」のためにエージェントのコンポーネントを抽象化する。モデルの能力が向上するたびにハーネスの前提が変わっても、インターフェースは安定し続ける。この設計判断が、今後のエージェント基盤の進化にどれだけ寄与するかが注目される。

参考



前の記事
Exbrain — Claude Code × Obsidian で「外付けAI脳」を構築する
次の記事
Claude Managed Agents: Anthropicが本番運用可能なエージェント基盤をパブリックベータで公開