Qoder Cloud Agents は Server-Sent Events (SSE) プロトコルを使用して、Agent のリアルタイム実行状態をクライアントへプッシュします。ポーリングは不要で、一度接続を確立すれば継続的にすべてのイベントを受信できます。Documentation Index
Fetch the complete documentation index at: https://docs.qoder.com/llms.txt
Use this file to discover all available pages before exploring further.
接続 URL
SSE 形式
各イベントは 3 行で構成され、空行で区切られます。| フィールド | 説明 |
|---|---|
id | イベント一意識別子。再接続に利用 |
event | イベントタイプ。data の構造を決定 |
data | JSON 形式のイベントペイロード |
イベントタイプ一覧
| イベントタイプ | 意味 | トリガータイミング | data 構造 |
|---|---|---|---|
user.message | ユーザーがメッセージ送信 | クライアントがイベントを POST した後 | {"content": "..."} |
user.interrupt | ユーザーが現在の実行を中断 | クライアントが中断イベントを送信 | {} |
user.define_outcome | ユーザーが期待する成果を定義 | クライアントが目標を設定 | {"outcome": "..."} |
session.status_running | Session が実行を開始 | メッセージ受信後に処理開始 | {"status": "running"} |
span.model_request_start | モデルリクエスト開始 | Agent が LLM 呼び出しを発行 | {"model": "...", "span_id": "..."} |
agent.thinking | Agent が思考中 | モデル推論プロセス中 | {"content": "..."} |
agent.message | Agent が返信メッセージ送信 | モデルがテキストを出力 | {"content": [{"type":"text","text":"..."}]} |
agent.tool_use | Agent が発行したツール呼び出し(Bash/Read/Write/Edit/Glob/Grep/WebFetch/WebSearch) | モデルがツール呼び出しを決定 | 下記「ツール呼び出しペア」参照 |
agent.tool_result | ツール実行結果、tool_use_id で tool_use とペアリング | ツール実行完了後 | 下記「ツール呼び出しペア」参照 |
session.status_idle | Session がアイドル状態に入る | 1 ターンの対話が完了 | 下記「status_idle 完整スキーマ」参照 |
span.model_request_end | モデルリクエスト終了 | LLM 呼び出し完了 | {"span_id": "...", "usage": {...}} |
session.error | Session でエラー発生 | 実行時例外 | {"error": "...", "code": "..."} |
terminated | Session 終了 | Session がクローズまたはタイムアウト | {"reason": "..."} |
典型的なイベントのライフサイクル
1 ターンの完全な対話で、イベントは次の順序でトリガーされます。ツール呼び出しペア(pair)
各agent.tool_use には同じ turn_id の agent.tool_result が必ずペアとなり、tool_use_id で関連付けられます。
agent.tool_use の主要フィールド:
id は evt_ プレフィックスではなく、外部モデル形式 toolu_bdrk_<24> です。name は先頭大文字です。
agent.tool_result の主要フィールド:
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 の現在の観測値は 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: 失われることはなく、バッチ集約後に送信されるだけです。最終的な内容の完全性には影響しません。