このページでは、ツール呼び出しのライフサイクルについて説明します。具体的には、Claudeのレスポンスからtool_useブロックを読み取る方法、返信でtool_resultブロックをフォーマットする方法、エラーを通知する方法を扱います。これを自動的に処理するSDKの抽象化については、Tool Runnerを参照してください。
Tool Runnerでより簡単に:このページで説明する手動のツール処理は、Tool Runnerによって自動的に管理されます。ツール実行をカスタム制御する必要がある場合にこのページを使用してください。
Claudeのレスポンスは、クライアントツールとサーバーツールのどちらを使用するかによって異なります。
レスポンスにはtool_useのstop_reasonと、以下を含む1つ以上のtool_useコンテンツブロックが含まれます。
id:この特定のツール使用ブロックの一意の識別子。これは後でツール結果を照合するために使用されます。name:使用されているツールの名前。input:ツールに渡される入力を含むオブジェクト。ツールのinput_schemaに準拠しています。クライアントツールのツール使用レスポンスを受け取った場合、以下を行う必要があります。
tool_useブロックからname、id、inputを抽出します。inputを渡します。userのroleと、tool_resultタイプおよび以下の情報を含むcontentブロックを持つ新しいメッセージを送信して、会話を続けます。
tool_use_id:この結果が対応するツール使用リクエストのid。content(オプション):ツールの結果。文字列(例:"content": "15 degrees")、ネストされたコンテンツブロックのリスト(例:"content": [{"type": "text", "text": "15 degrees"}])、またはドキュメントブロックのリスト(例:"content": [{"type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}}])として指定します。これらのコンテンツブロックには、text、image、document、またはsearch_resultタイプを使用できます。is_error(オプション):ツール実行がエラーになった場合はtrueに設定します。重要なフォーマット要件:
tool_resultブロックのみを含める必要があります。結果の後にテキストがあるとターンが早期に終了します。Claudeが直接呼び出したサーバーツールの場合、リクエストは未解決のサーバーツール名を示す400エラーで失敗します。停止理由とフォールバックを参照してください。例えば、以下は400エラーを引き起こします。
{
"role": "user",
"content": [
{ "type": "text", "text": "Here are the results:" }, // ❌ Text before tool_result
{ "type": "tool_result", "tool_use_id": "toolu_01" /* ... */ }
]
}アシスタントのターンがクライアントツールのみを呼び出す場合、以下が正しい形式です。
{
"role": "user",
"content": [
{ "type": "tool_result", "tool_use_id": "toolu_01" /* ... */ },
{ "type": "text", "text": "What should I do next?" } // ✅ Text after tool_result
]
}「tool_use ids were found without tool_result blocks immediately after」のようなエラーが表示された場合は、ツール結果が正しくフォーマットされているか確認してください。
ツール結果には、Webページ、受信メール、ユーザーアップロード、サードパーティAPIなど、制御外のソースからのコンテンツが含まれることがよくあります。そのコンテンツは信頼できないものとして扱ってください。それに影響を与えることができる攻撃者は、Claudeをリダイレクトしようとする指示を埋め込む可能性があります(間接的なプロンプトインジェクション)。信頼できないコンテンツは、systemプロンプトやプレーンなユーザーtextブロックではなく、tool_resultブロック内に保持してください。さらなる強化については、ジェイルブレイクとプロンプトインジェクションの軽減を参照してください。
ツール結果を受け取った後、Claudeはその情報を使用して、元のユーザープロンプトへのレスポンスの生成を続けます。
Claudeはツールを内部で実行し、追加のユーザー操作を必要とせずに結果を直接レスポンスに組み込みます。
レスポンスには、クライアントのtool_useブロックと、まだ結果ブロックがないserver_tool_useブロックの両方が含まれる場合があります。そのサーバーツール呼び出しはまだ完了しておらず、その結果ブロックは後のレスポンスで届きます。クライアントツールのtool_resultブロックのみを含むユーザーメッセージで返信し、同じtools配列を維持してください。Claudeが直接呼び出したサーバーツールの場合、APIはそのリクエストでツールを実行し、次のレスポンスはその結果ブロックから始まります。停止理由とフォールバックを参照してください。
他のAPIとの違い
ツール使用を分離したり、toolやfunctionのような特別なロールを使用したりするAPIとは異なり、Claude APIはツールをuserおよびassistantメッセージ構造に直接統合します。
メッセージにはtext、image、tool_use、tool_resultブロックの配列が含まれます。userメッセージにはクライアントコンテンツとtool_resultが含まれ、assistantメッセージにはAI生成コンテンツとtool_useが含まれます。
Claudeでツールを使用する際に発生する可能性のあるエラーには、いくつかの種類があります。
Claudeが1つのターンで複数のツールを呼び出すレスポンスを処理します。
SDKにtool_useループ、結果のフォーマット、再試行を管理させます。
Claudeを適切なツールに導くスキーマと説明を記述します。
Was this page helpful?