Claude Managed Agentsとの通信はイベントベースです。エージェントにユーザーイベントを送信し、エージェントイベントとセッションイベントを受信してステータスを追跡します。
すべてのManaged Agents APIリクエストには、managed-agents-2026-04-01ベータヘッダーが必要です。SDKはベータヘッダーを自動的に設定します。
イベントは2つの方向に流れます。
user.*イベントはセッションを開始し、進行に応じてセッションを誘導します。system.messageはターン間でエージェントのシステムプロンプトを更新します。セッション、スパン、エージェント、ユーザー、システムのイベントタイプ文字列は、{domain}.{action}という命名規則に従います。ストリーム専用のデルタプレビューイベント(event_start、event_delta)は例外です。完全な一覧については、リファレンスのイベントタイプを参照してください。
永続化されたすべてのイベントには、イベントがサーバー側で記録された時刻を示すprocessed_atタイムスタンプが含まれます。processed_atがnullの場合、そのイベントはハーネスによってキューに入れられており、先行するイベントの処理が完了した後に処理されることを意味します。
デフォルトでは、エージェントのレスポンステキストはバッファリングされたagent.messageイベントとしてストリームに到達し、それぞれはそれを生成したモデルリクエストが完了した後にのみ発行されます。イベントデルタを使用すると、モデルがまだ生成中の間に、そのテキストをライブプレビューとして段階的にレンダリングできます。プレビューはレスポンスそのものではありません。プレビューはベストエフォートの表示補助であり、バッファリングされたagent.messageが常に正式な記録です。プレビューを無視するクライアントでも、完全で正確なストリームを受信します。
プレビューはストリーム接続ごとにオプトインします。GET /v1/sessions/{session_id}/events/streamにevent_deltas[]クエリパラメータを追加し、プレビューしたいイベントタイプごとに1回ずつ繰り返します。受け入れられる値はagent.messageとagent.thinkingです。それ以外の値は400エラーを返します。このパラメータをサポートするのはセッションレベルのイベントストリームのみです。セッションスレッドのイベントストリームはこれを拒否します。
プレビュー対象のイベントが開始されると、ストリームは今後のイベントのタイプとidを含むevent_startを発行します。
{
"type": "event_start",
"event": {
"type": "agent.message",
"id": "sevt_01abc..."
}
}agent.messageの場合、開始の後に段階的なテキストを含むevent_deltaイベントが続きます。各デルタは、拡張するイベントをevent_idで、拡張するコンテンツブロックをdelta.indexで指定します。
{
"type": "event_delta",
"event_id": "sevt_01abc...",
"delta": {
"type": "content_delta",
"index": 0,
"content": {
"type": "text",
"text": "Here is the summary"
}
}
}agent.thinkingイベントがプレビューされる場合、event_startのみが発行されます。event_deltaイベントは続かず、コンテンツは通常どおりバッファリングされたagent.thinkingイベントで到着します。
永続化されたイベントとは異なり、event_startとevent_deltaには独自のidやprocessed_atがありません。これらが持つ唯一の識別子は、プレビューしているイベントのidです。
イベントデルタはストリーミングメッセージとは異なるワイヤーフォーマットを使用しており、この違いは意図的なものです。プレビューされたagent.messageは、単一のevent_startの後にevent_deltaイベントのみが続きます。コンテンツブロックごとの開始イベントや停止イベントはなく、プレビューされたイベント自体の停止イベントもありません。デルタタイプはcontent_block_deltaではなくcontent_deltaです。Messages API用に書かれたアキュムレータコードはそのまま流用できません。
Python、TypeScript、Go SDKには、イベントのidでプレビューをキー付けし、indexの管理を代行するアキュムレータヘルパーが含まれています。手動パターンはすべての言語で機能します。他のSDKでは、生成されたイベントタイプにこれを適用してください。
手動パターンでは、プレビューをスクラッチバッファとして扱い、バッファリングされたイベントを記録として扱います。バッファは(event_id, index)でキー付けします。モデルリクエストごとに照合します。ターンは単一のsession.status_runningイベントで開始され、正常に完了するターンでは、各モデルリクエストが順にspan.model_request_start、event_start、event_deltaイベント、バッファリングされたagent.message、最後にspan.model_request_end(スパンイベントタブ内)を生成します。各イベントが到着するたびに処理します。
event_startで、通知されたidを記録します。識別子は常に一致します。event_start.event.id、すべてのevent_delta.event_id、バッファリングされたagent.messageのidは同じ値です。event_deltaで、delta.content.textを(event_id, delta.index)のエントリに追加し、実行中のテキストをレンダリングします。あるindexの最初のデルタがそのエントリを作成します。agent.messageが到着したら、idで照合し、蓄積されたプレビューを破棄して、代わりにメッセージのコンテンツをレンダリングします。span.model_request_endで、バッファリングされたイベントによって照合されていないプレビューをすべて閉じます。それ以上のデルタは届きません。ターンがエラーになったり中断されたりした場合、バッファリングされたイベントは届かない可能性がありますが、span.model_request_endは届きます。# イベントIDをキーとするプレビュースナップショット。accumulate_managed_agents_event は各
# event_start / event_delta を agent.message スナップショットに畳み込みます。バッファされた
# agent.message がそれを置き換えます。
previews: dict[str, BetaManagedAgentsAgentMessageEvent] = {}
# この接続で agent.message プレビューをオプトインします
with client.beta.sessions.events.stream(
session.id, event_deltas=["agent.message"]
) as stream:
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.message",
"content": [{"type": "text", "text": "Describe the repo in one sentence."}],
},
],
)
for event in stream:
match event.type:
case "event_start":
snapshot = accumulate_managed_agents_event(None, event)
if snapshot is not None:
previews[event.event.id] = snapshot
print(f"event_start {event.event.type} {event.event.id}")
case "event_delta":
preview = accumulate_managed_agents_event(previews.get(event.event_id), event)
if preview is not None:
previews[event.event_id] = preview
text = "".join(block.text for block in preview.content)
print(f"event_delta preview: {text!r}")
case "agent.message":
# バッファされたイベントが正式な記録です。プレビューを置き換えて閉じます
preview = accumulate_managed_agents_event(previews.pop(event.id, None), event)
text = "".join(block.text for block in preview.content)
print(f"agent.message {event.id} {text!r}")
case "span.model_request_end":
# これ以上デルタは来ません。バッファされたイベントが
# 届かなかったプレビューをすべて閉じます。
for event_id in previews:
print(f"span.model_request_end closing preview for {event_id}")
previews.clear()
case "session.status_idle":
breakプレビューは応答性を重視して調整されています。以下の制約を前提に構築してください。
agent.messageは完全な形で届きます。蓄積されたプレビューを最終的なものとして扱わないでください。agent.messageを含む)が含まれます。見逃したデルタを再リクエストする方法はありません。agent.thinking: agent.thinkingプレビューは、思考ブロックが開始されたことを示すシグナルとしてevent_startのみを発行します。event_deltaイベントは続きません。event_startとevent_deltaはライブストリーム上にのみ存在します。セッションのイベント履歴(GET /v1/sessions/{session_id}/events)には表示されません。エージェントがカスタムツールを呼び出すとき:
agent.custom_tool_useイベントを発行します。stop_reason: requires_actionを含むsession.status_idleイベントで一時停止します。ブロックしているイベントIDはstop_reason.event_ids配列にあります。user.custom_tool_resultイベントを送信します。custom_tool_use_idパラメータにイベントIDを、結果コンテンツとともに渡します。runningに戻ります。with client.beta.sessions.events.stream(session.id) as stream:
for event in stream:
if event.type == "session.status_idle" and (stop_reason := event.stop_reason):
match stop_reason.type:
case "requires_action":
for event_id in stop_reason.event_ids:
# カスタムツール使用イベントを検索して実行
tool_event = events_by_id[event_id]
result = call_tool(tool_event.name, tool_event.input)
# 結果を送り返す
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.custom_tool_result",
"custom_tool_use_id": event_id,
"content": [{"type": "text", "text": result}],
},
],
)
case "end_turn":
break権限ポリシーがツール実行前に確認を要求する場合:
agent.tool_useまたはagent.mcp_tool_useイベントを発行します。stop_reason: requires_actionを含むsession.status_idleイベントで一時停止します。ブロックしているイベントIDはstop_reason.event_ids配列にあります。user.tool_confirmationイベントを送信し、tool_use_idパラメータにイベントIDを渡します。resultを"allow"または"deny"に設定します。拒否の理由を説明するにはdeny_messageを使用します。runningに戻ります。with client.beta.sessions.events.stream(session.id) as stream:
for event in stream:
if event.type == "session.status_idle" and (stop_reason := event.stop_reason):
match stop_reason.type:
case "requires_action":
for event_id in stop_reason.event_ids:
# 保留中のツール呼び出しを承認
client.beta.sessions.events.send(
session.id,
events=[
{
"type": "user.tool_confirmation",
"tool_use_id": event_id,
"result": "allow",
},
],
)
case "end_turn":
breakセッションはインタラクション間で永続化されます。セッションが明示的に削除されない限り、会話履歴は保持されます。セッションがアイドル状態になると、そのサンドボックスはチェックポイントされ、ファイルシステム、インストールされたパッケージ、エージェントが作成したファイルを含むサンドボックスの完全な状態が保持されます。これにより、非アクティブ状態からクリーンに再開できます。
セッション履歴は削除されるまで永続化されますが、チェックポイントはセッションの最終アクティビティから30日間のみ保持されます。ワークフローで完全なサンドボックス状態(ファイル、インストールされたツールなど)を30日を超えて保持する必要がある場合は、チェックポイントが期限切れになる前に定期的にuser.messageイベントを送信して非アクティブタイマーをリセットしてください。
セッションを再開するには、通常どおりuser.messageイベントを送信します。
# 本番環境では、再開したいセッションの保存済み ID を渡してください。
ant beta:sessions:events send --session-id "$SESSION_ID" <<'YAML'
events:
- type: user.message
content:
- type: text
text: Now run the tests against the changes you made earlier.
YAMLsystem.messageは現在、Claude Opus 4.8でのみサポートされています。エージェントに設定されたモデルのいずれかが会話途中のシステム注入をサポートしていない場合、イベントはmodel_does_not_support_mid_conversation_system検証エラーで拒否されます。
ターン間でエージェントのシステムプロンプトを更新するには、system.messageイベントを送信します。エージェント定義のsystemフィールド(セッション作成時に固定される)とは異なり、system.messageはセッションの進行に応じてシステムプロンプトを変更できます。セッション途中でエージェントに更新されたシステムレベルのガイダンス(異なるペルソナ、改訂された制約、または今後のモデルの動作を形成すべき実行時に取得されたコンテキスト)が必要な場合に使用します。
ant beta:sessions:events send --session-id "$SESSION_ID" <<'YAML'
events:
- type: system.message
content:
- type: text
text: "The user's current timezone is America/New_York."
YAMLsystem.messageは、セッションがstop_reason: requires_actionでアイドル状態の間は送信できません。contentは1〜1000個のテキストアイテムを受け入れます。
セッションオブジェクトには、累積トークン統計を含むusageフィールドが含まれています。セッションがアイドル状態になった後にセッションを取得して最新の合計を読み取り、コストの追跡、予算の適用、または消費量の監視に使用します。
{
"id": "sesn_01...",
"status": "idle",
"usage": {
"input_tokens": 5000,
"output_tokens": 3200,
"cache_creation_input_tokens": 2000,
"cache_read_input_tokens": 20000
}
}input_tokensはキャッシュされていない入力トークンを報告し、output_tokensはセッション内のすべてのモデル呼び出しにわたる合計出力トークンを報告します。cache_creation_input_tokensおよびcache_read_input_tokensフィールドは、プロンプトキャッシングのアクティビティを反映します。キャッシュエントリは5分のTTLを使用するため、そのウィンドウ内の連続したターンはキャッシュ読み取りの恩恵を受け、トークンあたりのコストが削減されます。
Consoleは、エージェントセッションの視覚的なタイムラインビューを提供します。ConsoleのClaude Managed Agentsセクションに移動すると、以下が表示されます。
session.errorイベントを通じて伝達されますWas this page helpful?