このページでは、ツール呼び出しのライフサイクルについて説明します。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を渡します。roleがuserで、tool_resultタイプを含むcontentブロックを含む新しいメッセージを送信して、会話を続けます。以下の情報を含みます:
tool_use_id: これが結果である、ツール使用リクエストのid。content: ツールの結果。文字列(例えば、"content": "15 degrees")、ネストされたコンテンツブロックのリスト(例えば、"content": [{"type": "text", "text": "15 degrees"}])、またはドキュメントブロックのリスト(例えば、)。これらのコンテンツブロックは、、またはタイプを使用できます。重要なフォーマット要件:
例えば、これは400エラーを引き起こします:
{
"role": "user",
"content": [
{ "type": "text", "text": "Here are the results:" }, // ❌ tool_resultの前のテキスト
{ "type": "tool_result", "tool_use_id": "toolu_01" /* ... */ }
]
}ツール結果を受け取った後、Claudeはその情報を使用して、元のユーザープロンプトへのレスポンス生成を続けます。
Claudeはツールを内部で実行し、追加のユーザー操作を必要とせずに、結果をレスポンスに直接組み込みます。
他のAPIとの違い
ツール使用を分離したり、toolやfunctionなどの特別なロールを使用したりするAPIとは異なり、Claude APIはツールをuserおよびassistantメッセージ構造に直接統合します。
メッセージにはtext、image、tool_use、tool_resultブロックの配列が含まれます。userメッセージはクライアントコンテンツとtool_resultを含み、assistantメッセージはAI生成コンテンツとtool_useを含みます。
Claudeでツールを使用する場合、いくつかの異なるタイプのエラーが発生する可能性があります:
Was this page helpful?
"content": [{"type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}}]textimagedocumentis_error(オプション): ツール実行がエラーで終了した場合はtrueに設定します。これは正しいです:
{
"role": "user",
"content": [
{ "type": "tool_result", "tool_use_id": "toolu_01" /* ... */ },
{ "type": "text", "text": "What should I do next?" } // ✅ tool_resultの後のテキスト
]
}「tool_use idsが見つかりましたが、その直後にtool_resultブロックがありません」というエラーが表示される場合は、ツール結果が正しくフォーマットされていることを確認してください。