概要
Agent SDK が回す実行ループの中身。メッセージのライフサイクル、ターンの数え方、上限の掛け方を扱う。CLI を動かしているのと同じループ。
仕様
ループの 1 周
| 段階 | 起きること | SDK が返すもの |
|---|---|---|
| 1. プロンプト受領 | システムプロンプト・ツール定義・会話履歴と一緒に Claude が受け取る | SystemMessage(subtype "init"、セッションメタデータ) |
| 2. 評価と応答 | テキスト、ツール呼び出し要求、またはその両方 | AssistantMessage |
| 3. ツール実行 | SDK が各ツールを実行し結果を集める。hook で実行前に介入・改変・拒否できる | — |
| 4. 反復 | 2 と 3 を繰り返す。1 周が 1 ターン | — |
| 5. 結果返却 | ツール呼び出しの無い応答が出たら終わり | AssistantMessage に続けて ResultMessage |
ResultMessage は最終テキスト・トークン使用量・コスト・セッション ID を含む。
ターンと上限
- ターン = ループ 1 周。Claude がツール呼び出しを含む出力を出し、SDK がそれを実行し、結果が Claude に戻るまで。この間、呼び出し側のコードに制御は戻らない
max_turns/maxTurnsで上限を掛ける。ツール使用のターンのみを数えるmax_budget_usd/maxBudgetUsdで支出しきい値によるターン上限を掛ける- 上限を設けない場合、Claude が自分で終わるまで走る
メッセージ型
| 型 | いつ出るか |
|---|---|
SystemMessage | セッションのライフサイクルイベント。subtype で区別する |
AssistantMessage | Claude の応答ごと(最後のテキストのみの応答を含む)。テキストブロックとツール呼び出しブロックを持つ |
UserMessage | ツール実行ごとに、Claude へ返すツール結果を伴って。ループ途中でストリームした入力にも出る |
StreamEvent | partial messages を有効にしたときのみ。生の API ストリーミングイベント |
ResultMessage | ループの終了。最終テキスト・トークン使用量・コスト・セッション ID |
SystemMessage の subtype:
| 値 | 意味 |
|---|---|
"init" | セッションメタデータ。SessionStart / Setup hook が走る場合、その hook ライフサイクルメッセージが init より先に届く |
"compact_boundary" | compaction の後に発火する |
"informational" | ループからのプレーンテキストの状態表示 |
"worker_shutting_down" | ホストの終了または Remote Control の切断により、現在のターンの後でループが終わる |
- TypeScript では
"init"以外の subtype はSDKSystemMessageの subtype ではなく、SDKMessageunion の独立した型になる
言語ごとの型判定
| 判定方法 | 注意 | |
|---|---|---|
| Python | claude_agent_sdk から import したクラスに isinstance() | — |
| TypeScript | type 文字列フィールド(message.type === "result") | AssistantMessage と UserMessage は生の API メッセージを .message に包む。コンテンツブロックは message.message.content であって message.content ではない |
制約・注意点
ResultMessageの後にも、prompt_suggestionなどの後続システムイベントが少数届きうる。 result でbreakせず、ストリームを最後まで反復することResultMessageのsubtypeを見て、タスクが成功したか上限に当たったかを判定する- 両 SDK は、ループの駆動に必須ではない observability イベント(レート制限の状態、タスク通知など)も返す
関連
facts/claude-code/agent-sdk.mdfacts/claude-code/hooks.md— ツール実行前の介入facts/claude-code/context-window.md— compactionfacts/claude-code/costs.md— 予算上限