Was this page helpful?
プログラマティックツール呼び出しにより、Claudeはコード実行コンテナ内でツールをプログラマティックに呼び出すコードを記述できます。これにより、ツール呼び出しのたびにモデルを経由するラウンドトリップが不要になります。マルチツールワークフローのレイテンシが低減され、Claudeがデータをフィルタリングまたは処理してからモデルのコンテキストウィンドウに到達させることで、トークン消費が削減されます。BrowseCompやDeepSearchQAなどのエージェント検索ベンチマーク(マルチステップのウェブ研究と複雑な情報検索をテストする)では、基本的な検索ツールの上にプログラマティックツール呼び出しを追加することが、エージェントパフォーマンスを完全に引き出すための重要な要因でした。
この差は実際のワークフローでは急速に複合します。20人の従業員の予算コンプライアンスをチェックする場合を考えてみてください。従来のアプローチでは20回の個別のモデルラウンドトリップが必要で、その過程で数千の経費行項目をコンテキストに引き込みます。プログラマティックツール呼び出しを使用すると、単一のスクリプトが20回のすべてのルックアップを実行し、結果をフィルタリングし、制限を超えた従業員のみを返します。これにより、Claudeが推論する必要があるものが数百キロバイトから数行に縮小されます。
プログラマティックツール呼び出しが対処する推論とコンテキストコストについてさらに詳しく知りたい場合は、高度なツール使用を参照してください。
この機能にはコード実行ツールが有効になっている必要があります。
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
モデル互換性とツールバージョンの詳細については、ツールリファレンスを参照してください。プログラマティックツール呼び出しはClaude APIおよびMicrosoft Foundryを通じて利用可能です。
Claudeがデータベースを複数回プログラマティックにクエリし、結果を集約する簡単な例を以下に示します。
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "content-type: application/json" \
--data '{
"model": "claude-opus-4-6",
"max_tokens": 4096,
"messages": [
{
"role": "user",
"content": "Query sales data for the West, East, and Central regions, then tell me which region had the highest revenue"
}
],
"tools": [
{
"type": "code_execution_20260120",
"name": "code_execution"
},
{
"name": "query_database",
"description": "Execute a SQL query against the sales database. Returns a list of rows as JSON objects.",
"input_schema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SQL query to execute"
}
},
"required": ["sql"]
},
"allowed_callers": ["code_execution_20260120"]
}
]
}'コード実行から呼び出し可能なツールを設定し、Claudeがそのツールを使用することを決定した場合:
tool_useブロックを返しますこのアプローチは特に以下に役立ちます:
カスタムツールは並列ツール呼び出しをサポートするために非同期Python関数に変換されます。Claudeがコードを記述してツールを呼び出すとき、awaitを使用します(例:result = await query_database("<sql>"))。適切な非同期ラッパー関数が自動的に含まれます。
非同期ラッパーはこのドキュメントのコード例から明確にするために省略されています。
allowed_callersフィールドallowed_callersフィールドは、どのコンテキストがツールを呼び出すことができるかを指定します:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {
// ...
},
"allowed_callers": ["code_execution_20260120"]
}可能な値:
["direct"] - Claudeのみがこのツールを直接呼び出すことができます(省略された場合のデフォルト)["code_execution_20260120"] - コード実行内からのみ呼び出し可能["direct", "code_execution_20260120"] - 直接呼び出しとコード実行の両方から呼び出し可能各ツールに対して["direct"]または["code_execution_20260120"]のいずれかを選択し、両方を有効にするのではなく、これはClaudeにツールの最適な使用方法についてより明確なガイダンスを提供します。
callerフィールドすべてのツール使用ブロックには、それがどのように呼び出されたかを示すcallerフィールドが含まれます:
直接呼び出し(従来のツール使用):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "\<sql\>" },
"caller": { "type": "direct" }
}プログラマティック呼び出し:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": { "sql": "\<sql\>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}tool_idはプログラマティック呼び出しを行ったコード実行ツールを参照します。
プログラマティックツール呼び出しはコード実行と同じコンテナを使用します:
containerフィールドを介して返されますツールがプログラマティックに呼び出され、コンテナがツール結果を待機している場合、コンテナの有効期限が切れる前に応答する必要があります。expires_atフィールドを監視してください。コンテナの有効期限が切れた場合、Claudeはツール呼び出しがタイムアウトしたと判断し、再試行する可能性があります。
完全なプログラマティックツール呼び出しフローがどのように機能するかを以下に示します:
コード実行とプログラマティック呼び出しを許可するツールを含むリクエストを送信します。プログラマティック呼び出しを有効にするには、ツール定義にallowed_callersフィールドを追加します。
ツールの出力形式の詳細な説明をツール説明に提供してください。ツールがJSONを返すことを指定した場合、Claudeは結果を逆シリアル化してコードで処理しようとします。出力スキーマについて提供する詳細が多いほど、Claudeはレスポンスをプログラマティックに処理できます。
リクエスト形状はクイックスタート例と同じです。ツールリストにcode_executionを含め、Claudeがコードから呼び出すようにしたいツールにallowed_callers: ["code_execution_20260120"]を追加し、ユーザーメッセージを送信します。
Claudeはツールを呼び出すコードを記述します。APIは一時停止して以下を返します:
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll query the purchase history and analyze the results."
},
{
"type": "server_tool_use",
"id": "srvtoolu_abc123",
"name": "code_execution",
"input": {
"code": "results = await query_database('<sql>')\ntop_customers = sorted(results, key=lambda x: x['revenue'], reverse=True)[:5]\nprint(f'Top 5 customers: {top_customers}')"
}
},
{
"type": "tool_use",
"id": "toolu_def456",
"name": "query_database",
"input": { "sql": "\<sql\>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}
],
"container": {
"id": "container_xyz789",
"expires_at": "2025-01-15T14:30:00Z"
},
"stop_reason": "tool_use"
}完全な会話履歴とツール結果を含めます:
コード実行が続行され、結果が処理されます。追加のツール呼び出しが必要な場合は、すべてのツール呼び出しが満たされるまでステップ3を繰り返します。
コード実行が完了すると、Claudeは最終応答を提供します:
{
"content": [
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "Top 5 customers by revenue:\n1. Customer C1: $45,000\n2. Customer C2: $38,000\n3. Customer C5: $32,000\n4. Customer C8: $28,500\n5. Customer C3: $24,000",
"stderr": "",
"return_code": 0,
"content": []
}
},
{
"type": "text",
"text": "I've analyzed the purchase history from last quarter. Your top 5 customers generated $167,500 in total revenue, with Customer C1 leading at $45,000."
}
],
"stop_reason": "end_turn"
}Claudeは複数のアイテムを効率的に処理するコードを記述できます:
async def _claude_code():
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
data = await query_database(f"<sql for {region}>")
results[region] = sum(row["revenue"] for row in data)
# Process results programmatically
top_region = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")
このパターンは:
Claudeは成功基準が満たされるとすぐに処理を停止できます:
async def _claude_code():
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health(endpoint)
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remaining
async def _claude_code():
file_info = await get_file_info(path)
if file_info["size"] < 10000:
content = await read_full_file(path)
else:
content = await read_file_summary(path)
print(content)
async def _claude_code():
logs = await fetch_logs(server_id)
errors = [log for log in logs if "ERROR" in log]
print(f"Found {len(errors)} errors")
for error in errors[-10:]: # Only return last 10 errors
print(error)
コード実行がツールを呼び出すとき:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_xyz789"
}
}ツール結果は実行中のコードに返されます:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000, \"orders\": 23}, {\"customer_id\": \"C2\", \"revenue\": 38000, \"orders\": 18}, ...]"
}
]
}すべてのツール呼び出しが満たされ、コードが完了したとき:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_xyz789",
"content": {
"type": "code_execution_result",
"stdout": "Analysis complete. Top 5 customers identified from 847 total records.",
"stderr": "",
"return_code": 0,
"content": []
}
}| エラー | 説明 | 解決策 |
|---|---|---|
invalid_tool_input | ツール入力がスキーマと一致しない | ツールのinput_schemaを検証してください |
tool_not_allowed | ツールが要求された呼び出し元タイプを許可していない | allowed_callersに正しいコンテキストが含まれていることを確認してください |
missing_beta_header | 必要なベータヘッダーが提供されていない(BedrockおよびVertex AIのみ。プログラマティックツール呼び出しはファーストパーティClaudeAPIではGAです) | 要求に必要なベータヘッダーを追加してください |
ツールの応答に時間がかかりすぎる場合、コード実行はTimeoutErrorを受け取ります。Claudeはこれをstderrで見て、通常は再試行します:
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "",
"stderr": "TimeoutError: Calling tool ['query_database'] timed out.",
"return_code": 0,
"content": []
}
}タイムアウトを防ぐには:
expires_atフィールドを監視してくださいツールがエラーを返す場合:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Claudeのコードはこのエラーを受け取り、適切に処理できます。
strict: trueのツールはプログラマティック呼び出しではサポートされていませんtool_choiceを介して特定のツールのプログラマティック呼び出しを強制することはできませんdisable_parallel_tool_use: trueはプログラマティック呼び出しではサポートされていません以下のツールは現在プログラマティックに呼び出すことができませんが、将来のリリースでサポートが追加される可能性があります:
プログラマティックツール呼び出しに応答する場合、厳密なフォーマット要件があります:
ツール結果のみの応答: 結果を待つプログラマティックツール呼び出しが保留中の場合、応答メッセージにはのみ tool_resultブロックが含まれている必要があります。ツール結果の後でも、テキストコンテンツを含めることはできません。
無効 - プログラマティックツール呼び出しに応答するときはテキストを含めることはできません:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
},
{ "type": "text", "text": "What should I do next?" }
]
}有効 - プログラマティックツール呼び出しに応答するときはツール結果のみ:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}この制限は、プログラマティック(コード実行)ツール呼び出しに応答する場合にのみ適用されます。通常のクライアント側ツール呼び出しの場合、ツール結果の後にテキストコンテンツを含めることができます。
プログラマティックツール呼び出しは、通常のツール呼び出しと同じレート制限の対象です。コード実行からのツール呼び出しはそれぞれ個別の呼び出しとしてカウントされます。
プログラマティックに呼び出されるユーザー定義ツールを実装する場合:
プログラマティックツール呼び出しはトークン消費を大幅に削減できます:
たとえば、10個のツールを直接呼び出すと、プログラマティックに呼び出して概要を返すのと比べて約10倍のトークンを使用します。
プログラマティックツール呼び出しはコード実行と同じプライシングを使用します。詳細については、コード実行プライシングを参照してください。
プログラマティックツール呼び出しのトークンカウント: プログラマティック呼び出しからのツール結果は、入力/出力トークン使用量にカウントされません。最終的なコード実行結果とClaudeの応答のみがカウントされます。
良いユースケース:
理想的でないユースケース:
「ツールが許可されていない」エラー
"allowed_callers": ["code_execution_20260120"]が含まれていることを確認してくださいコンテナ有効期限
expires_atフィールドを監視してくださいツール結果が正しく解析されない
callerフィールドを確認して プログラマティック呼び出しを確認してくださいClaudeのトレーニングにはコードへの広範な露出が含まれており、関数呼び出しの推論と連鎖に効果的です。ツールがコード実行環境内で呼び出し可能な関数として提示されると、Claudeはこの強みを活用して:
このアプローチにより、Claudeがデータをプログラマティックに処理できるようにすることで、すべてを会話コンテキストに読み込むのではなく、従来のツール使用では実用的でないワークフロー(1M以上のトークンを超えるファイルの処理など)が可能になります。
プログラマティックツール呼び出しは、Anthropicの管理されたコード実行の外で実装できる一般化可能なパターンです。以下はアプローチの概要です:
Claudeにコード実行ツールを提供し、その環境で利用可能な関数について説明してください。Claudeがコードでツールを呼び出すと、アプリケーションはそれらの関数が定義されているローカルで実行します。
利点:
欠点:
使用する場合: アプリケーションが安全に任意のコードを実行できる場合、シンプルなソリューションが必要な場合、およびAnthropicの管理されたオファリングがニーズに合わない場合。
Claudeの観点からは同じアプローチですが、コードはセキュリティ制限(ネットワーク出力なしなど)を備えたサンドボックスコンテナで実行されます。ツールが外部リソースを必要とする場合、サンドボックスの外でツール呼び出しを実行するためのプロトコルが必要です。
利点:
欠点:
使用する場合: セキュリティが重要で、Anthropicの管理されたソリューションがニーズに合わない場合。
Anthropicのプログラマティックツール呼び出しは、サンドボックス実行の管理されたバージョンで、Claudeに合わせて調整されたPython環境を備えています。Anthropicはコンテナ管理、コード実行、およびセキュアなツール呼び出し通信を処理します。
利点:
Claude APIを使用している場合は、Anthropicの管理されたソリューションの使用を検討してください。
プログラマティックツール呼び出しはコード実行インフラストラクチャ上に構築され、同じサンドボックスコンテナを使用します。実行アーティファクトと出力を含むコンテナデータは最大30日間保持されます。
すべての機能にわたるZDR適格性については、APIとデータ保持を参照してください。
ant messages create <<'YAML'
model: claude-opus-4-6
max_tokens: 4096
container: container_xyz789
messages:
- role: user
content: >-
Query customer purchase history from the last quarter and identify our
top 5 customers by revenue
- role: assistant
content:
- type: text
text: I'll query the purchase history and analyze the results.
- type: server_tool_use
id: srvtoolu_abc123
name: code_execution
input:
code: "..."
- type: tool_use
id: toolu_def456
name: query_database
input:
sql: "<sql>"
caller:
type: code_execution_20260120
tool_id: srvtoolu_abc123
- role: user
content:
- type: tool_result
tool_use_id: toolu_def456
content: >-
[{"customer_id": "C1", "revenue": 45000}, {"customer_id": "C2",
"revenue": 38000}, ...]
tools: [...]
YAMLツール定義のステップバイステップガイド。