接続 URL
SSE 形式
各イベントは 3 行で構成され、空行で区切られます。| フィールド | 説明 |
|---|---|
id | イベント一意識別子。再接続に利用 |
event | イベントタイプ。data の構造を決定 |
data | JSON 形式のイベントペイロード |
イベントタイプ一覧
| イベントタイプ | 意味 | トリガータイミング | data 構造 |
|---|---|---|---|
user.message | ユーザーがメッセージ送信 | クライアントがイベントを POST した後 | {"content": [{"type":"text","text":"..."}]} |
user.interrupt | ユーザーが現在の実行を中断 | クライアントが中断イベントを送信 | {} |
user.define_outcome | ユーザーが期待する成果を定義 | クライアントが目標を設定 | {"outcome": "..."} |
session.status_running | Session が実行を開始 | メッセージ受信後に処理開始 | {"status": "running"} |
span.model_request_start | モデルリクエスト開始 | Agent が LLM 呼び出しを発行 | {"model": "...", "span_id": "..."} |
agent.thinking | Agent が思考中 | モデル推論プロセス中 | {"thinking": "..."} |
agent.message | Agent が返信メッセージ送信 | モデルがテキストを出力 | {"content": [{"type":"text","text":"..."}]} |
agent.tool_use | Agent が組み込みツール呼び出しを発行 | モデルが組み込みツール呼び出しを決定 | 下記「ツール呼び出し」参照 |
agent.tool_result | 組み込みツールの実行結果 | ツール実行完了後 | 下記「ツール呼び出し」参照 |
agent.custom_tool_use | Agent がクライアントサイドのカスタムツールをリクエスト | モデルがカスタムツール呼び出しを決定 | 下記「ツール呼び出し」参照 |
session.status_idle | Session がアイドル状態に入る | 1 ターンの対話が完了 | 下記「status_idle 完整スキーマ」参照 |
span.model_request_end | モデルリクエスト終了 | LLM 呼び出し完了 | {"span_id": "...", "usage": {...}} |
session.error | Session でエラー発生 | 実行時例外 | {"error": "...", "code": "..."} |
terminated | Session 終了 | Session がクローズまたはタイムアウト | {"reason": "..."} |
data JSON には、上記の固有フィールド以外に次の共通フィールドも含まれます:id、type、turn_id(user.define_outcome では省略)、session_id、created_at、processed_at、schema_version。
典型的なイベントのライフサイクル
1 ターンの完全な対話で、イベントは次の順序でトリガーされます。ツール呼び出し
組み込みツール呼び出しはagent.tool_use を使用します。呼び出しが許可されプラットフォームで実行された場合、同じ turn_id 内で対応する agent.tool_result が生成されます。
agent.tool_use の主要フィールド:
id は他のイベントと同様に evt_ 接頭辞を使用します。evaluated_permission が ask の場合、このイベントの id を user.tool_confirmation.tool_use_id として使用してください。
agent.tool_result の主要フィールド:
agent.custom_tool_use を使用し、アプリケーション側で処理します:
id を user.custom_tool_result.custom_tool_use_id として使用してください。
ソート推奨:created_at → タイプ(tool_use が tool_result より前)→ id の 3 段階ソート。id だけでソートしないでください——プラットフォーム生成の tool_result id は辞書順で tool_use id より小さい場合があります。
status_idle 完整スキーマ
session.status_idle イベントは status の他に stop_reason、usage、turn_id、session_id を含みます:
stop_reason.type は requires_action となり、event_ids にクライアントの応答が必要なイベントが示されます:
stop_reason.type の値には end_turn、cancel、max_turns、error があり、シナリオに応じて出現します。
再接続と after_id
SSE 接続を確立すると、デフォルトではすべての履歴イベントを最初から再生します。差分イベントのみが必要ならafter_id パラメータを渡します。
EventSource は再接続時に Last-Event-ID リクエストヘッダーを自動的に付与し、サーバーはそれをもとに差分イベントを返します。
接続を長時間維持する際は、最後に受信した
id をクライアントで記録し、切断時に after_id で復帰することを推奨します。delta_flush_interval_ms
クエリパラメータでagent.message の delta イベントのフラッシュ間隔を制御します。
50ms です。値を大きくするとイベント頻度を下げ、クライアントのレンダリング負荷を軽減できます。
curl の例
- 新規接続
- after_id 差分接続
JavaScript EventSource の例
クライアント実装の推奨事項
- last event id を記録 — イベント受信のたびに更新し、再接続時の復帰に使用。
- delta の連結処理 —
agent.messageはストリーミング delta で到着する場合があるため、クライアント側で完全なテキストへ連結する必要あり。 - terminated を監視 — 受信したら自発的に接続を閉じ、再接続を行わない。
- タイムアウト再試行 — 30 秒間イベントがなければ自発的に切断・再接続 (サイレントな切断を回避)。
- イベントのフィルタ — 業務上関心のあるイベントタイプのみリッスンし、span レベルのイベントは無視することで処理コストを削減。
よくある質問
Q: 接続後に大量の履歴イベントを受信したら? A:after_id パラメータを渡し、最後に処理したイベント ID を指定してください。サーバーはそれ以降のイベントのみを返します。
Q: SSE 接続は自動でクローズしますか? A: Session 終了時にサーバーは terminated イベントを送信した後、接続をクローズします。アイドルタイムアウトは Session 構成によります。
Q: WebSocket で代替できますか? A: 現在は SSE のみサポートしています。SSE は単方向プッシュシナリオに対して軽量で、自然に再接続をサポートします。
Q: delta_flush_interval_ms を大きくしすぎるとイベントが失われますか? A: 失われることはなく、バッチ集約後に送信されるだけです。最終的な内容の完全性には影響しません。
次のステップ
Session の開始
Session を作成し、ターン中にイベントを購読する。
権限ポリシー
ツール確認イベントの応答方法を理解する。
Agent ツール
agent.tool_use / agent.custom_tool_use を発行するツール構成。Outcomes の定義
user.define_outcome で成功基準を設定する。