「Programmatic tool calling」(プログラマティックツール呼び出し)により、Claudeは各ツール呼び出しのたびにモデルを経由するラウンドトリップを必要とせず、コード実行コンテナ内でプログラム的にツールを呼び出すコードを書くことができます。これにより、マルチツールワークフローのレイテンシが削減され、データがモデルのコンテキストウィンドウに到達する前にClaudeがフィルタリングや処理を行えるため、トークン消費量も減少します。マルチステップのWebリサーチや複雑な情報検索をテストするBrowseCompやDeepSearchQAなどのエージェント検索ベンチマークでは、基本的な検索ツールにプログラマティックツール呼び出しを追加することで、入力トークンを24%削減しながらパフォーマンスが平均11%向上しました(動的フィルタリングによるWeb検索の改善を参照)。
20人の従業員の予算遵守状況を確認する場合を考えてみましょう。従来のアプローチでは20回の個別のモデルラウンドトリップが必要で、その過程で数千件の経費明細がコンテキストに取り込まれます。プログラマティックツール呼び出しを使用すると、単一のスクリプトが20件すべての検索を実行し、結果をフィルタリングして、上限を超えた従業員のみを返すため、Claudeが推論する必要のある情報量を数百キロバイトからわずか数行にまで縮小できます。
プログラマティックツール呼び出しには code_execution_20260120 以降が必要で、以下のモデルでサポートされています。
| モデル |
|---|
| Claude Fable 5 () |
| Claude Mythos 5 () |
| Claude Opus 5 () |
| Claude Opus 4.8 () |
| Claude Opus 4.7 () |
| Claude Opus 4.6 () |
| Claude Sonnet 5 () |
| Claude Sonnet 4.6 () |
| Claude Opus 4.5 () |
| Claude Sonnet 4.5 () |
コード実行ツールの完全なバージョンマトリックスについては、コード実行ツールのモデル互換性テーブルを参照してください。プログラマティックツール呼び出しは、Claude API、Claude Platform on AWS、およびMicrosoft Foundryで利用できます。Microsoft Foundryでは、プログラマティックツール呼び出しにはHosted on Anthropicデプロイメントが必要です。現在、Amazon BedrockおよびGoogle Cloudでは利用できません。
以下は、Claudeがプログラム的にデータベースを複数回クエリし、結果を集約する例です。
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-5",
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"],
},
],
)
print(response)レスポンスは stop_reason: "tool_use"、container ID、および query_database の tool_use ブロック(その caller フィールドは呼び出し元のコード実行を識別します)で停止します。コードが完了できるように、ワークフロー例のステップ3に示すように結果を返してください。
ツールをコード実行から呼び出し可能に設定し、Claudeがそのツールを使用することを決定した場合:
tool_use ブロックを返しますこのアプローチは特に以下の場合に有用です。
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"] - Claudeはこのツールをコード実行内からのみ呼び出すようにガイドされます["direct", "code_execution_20260120"] - Claudeはこのツールを直接またはコード実行内から呼び出すことができます"code_execution_20260120" と "code_execution_20260521" はどちらも allowed_callers で受け入れられ、相互に交換可能です。どちらのコード実行ツールバージョンを使用するリクエストでも、いずれかの呼び出し元をリストしているツールを満たします。レスポンスブロックは、リクエストがどのバージョンを宣言したかに関係なく、常に呼び出し元を code_execution_20260120 としてタグ付けします。
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 は、呼び出しを行ったコード実行の server_tool_use ブロックの id であるため、各プログラマティックな tool_use をそれを生成したコード実行に対応付けることができます。
プログラマティックツール呼び出しは、コード実行と同じコンテナを使用します。
container フィールドに expires_at タイムスタンプとともに返されますexpires_at はコンテナの残り時間を示します。アイドル状態のコンテナは現在約5分後に回収され、作成から30日を超えたコンテナは再利用できません。完全なプログラマティックツール呼び出しフローの動作は以下のとおりです。
コード実行と、プログラマティック呼び出しを許可するツールを含むリクエストを送信します。プログラマティック呼び出しを有効にするには、ツール定義に allowed_callers フィールドを追加します。
リクエストの形式はクイックスタートの例と同一です。tools リストに code_execution を含め、Claudeにコードから呼び出させたいツールに allowed_callers: ["code_execution_20260120"] を追加し、ユーザーメッセージを送信します。このワークフローの残りのステップでは、ユーザーメッセージ "Query customer purchase history from the last quarter and identify our top 5 customers by revenue" を使用します。
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": "import json\n\nrows = json.loads(await query_database({'sql': '<sql>'}))\ntop_customers = sorted(rows, 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": "2026-01-20T14:30:00Z"
},
"stop_reason": "tool_use"
}完全な会話履歴とツール結果を送信します。このリクエストでは3つの詳細が重要です。
tool_result ブロックのみを含めることができます。メッセージフォーマットの制限を参照してください。container IDを渡します。保留中のプログラマティックツール呼び出しがあるのにコンテナIDがない継続リクエストは、APIによって拒否されます。tools 配列を送信します。一時停止したコードが再開するにはコード実行ツールが引き続き存在している必要があり、このリクエストで送信するツールが、そのターンの残りでClaudeと実行中のコードが使用できる定義となります。response = client.messages.create(
model="claude-opus-5",
max_tokens=4096,
container="container_xyz789", # Reuse the container
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配列
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"],
},
],
)
print(response)コードは一時停止した箇所から再開し、結果を処理します。各継続レスポンスは、さらにプログラマティックな tool_use ブロックとともに再度一時停止するか、コード実行を完了してClaudeがターンを続行できるようにします(ステップ5)。この2つを区別するには、stop_reason と各 tool_use ブロックの caller を確認してください。一時停止しているレスポンスは stop_reason: "tool_use" を持ち、caller がコード実行バージョンを示す tool_use ブロックを含みます。この場合、保留中のすべてのプログラマティック呼び出しに対する tool_result を1つのユーザーメッセージに含めてステップ3を繰り返します。
コード実行が完了すると、Claudeは最終レスポンスを提供します。
{
"content": [
{
"type": "code_execution_tool_result",
"tool_use_id": "srvtoolu_abc123",
"content": {
"type": "code_execution_result",
"stdout": "Top 5 customers: [{'customer_id': 'C1', 'revenue': 45000}, {'customer_id': 'C2', 'revenue': 38000}, {'customer_id': 'C5', 'revenue': 32000}, {'customer_id': 'C8', 'revenue': 28500}, {'customer_id': 'C3', 'revenue': 24000}]",
"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は複数のアイテムを効率的に処理するコードを書くことができます。
regions = ["West", "East", "Central", "North", "South"]
results = {}
for region in regions:
rows = json.loads(await query_database({"sql": f"<sql for {region}>"}))
results[region] = sum(row["revenue"] for row in rows)
# 結果をプログラムで処理する
top_region = max(results.items(), key=lambda x: x[1])
print(f"Top region: {top_region[0]} with ${top_region[1]:,} in revenue")このパターンは:
Claudeは成功条件が満たされ次第、処理を停止できます。
endpoints = ["us-east", "eu-west", "apac"]
for endpoint in endpoints:
status = await check_health({"endpoint": endpoint})
if status == "healthy":
print(f"Found healthy endpoint: {endpoint}")
break # Stop early, don't check remainingpath = "/tmp/example.txt"
file_info = json.loads(await get_file_info({"path": path}))
if file_info["size"] < 10000:
content = await read_full_file({"path": path})
else:
content = await read_file_summary({"path": path})
print(content)server_id = "srv-01"
log_text = await fetch_logs({"server_id": server_id})
errors = [line for line in log_text.splitlines() if "ERROR" in line]
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 | レスポンス内の code_execution_tool_result エラーブロックの error_code | コード実行ツールに無効なパラメータが渡されました | コード実行ツールのエラーを参照してください |
invalid_request_error(tool_choice に関して) | HTTP 400エラーレスポンス | tool_choice が、allowed_callers に "direct" を含まないツールを指定しています | そのツールの allowed_callers に "direct" を追加するか、tool_choice からツールを削除してClaudeにコードから呼び出させてください |
ツール結果が約4分以内に到着しない場合、保留中の呼び出しはClaudeの実行中のコード内で 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 (no response after 270s).",
"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 はプログラマティック呼び出しではサポートされていませんinput_schema に再帰的な $ref(自身を参照するスキーマなどの参照サイクル)を含むカスタムツールは、プログラマティック呼び出しを有効にできません。そのようなツールの allowed_callers にコード実行ツールバージョンを含めると、リクエストは Circular $ref detected というメッセージを含む 400 invalid_request_error で失敗します。同じスキーマは直接のツール呼び出しでは受け入れられます。
これを回避するには、以下のいずれかを行ってください。
allowed_callers を省略する(または ["direct"] に設定する)ことで、ツールを直接呼び出し専用に保ちます。同じリクエスト内の他のツールは引き続きプログラマティック呼び出しを使用できます。description でより深いネストを説明するか、再帰的なプロパティを、期待される形式を description で説明する単純な {"type": "object"} に置き換えます。以下のツールはプログラム的に呼び出すことができません。
プログラマティックツール呼び出しに応答する際には、厳格なフォーマット要件があります。
ツール結果のみのレスポンス: 結果を待っている保留中のプログラマティックツール呼び出しがある場合、レスポンスメッセージには 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}]"
}
]
}この制限は、プログラマティック(コード実行)ツール呼び出しに応答する場合にのみ適用されます。通常のクライアント側ツール呼び出しの場合は、ツール結果の後にテキストコンテンツを含めることができます。
テキストのみのツール結果コンテンツ: プログラマティック呼び出しに応答する各 tool_result の content は、文字列または text ブロックである必要があります。画像、ドキュメント、その他のコンテンツブロックタイプは拒否されます。
プログラマティックツール呼び出しは、通常のツール呼び出しと同じレート制限の対象となります。コード実行からの各ツール呼び出しは、個別の呼び出しとしてカウントされます。
プログラム的に呼び出されるユーザー定義ツールを実装する場合:
プログラマティックツール呼び出しは、3つの方法でトークン消費を削減します。
例えば、10個のツールを直接呼び出すと、プログラム的に呼び出して要約を返す場合の約10倍のトークンを使用します。
本番環境のClaudeモデルに対するAnthropicの内部評価では:
tools 配列に10〜49個のツール定義を含むリクエストは、プログラマティックツール呼び出しを有効にすると、通常20%〜40%のトークン削減が見られます。実際の削減量はワークロードの形状によって異なります。プログラマティック呼び出しを使用するタイミングを参照してください。
プログラマティックツール呼び出しは、コード実行と同じ料金体系を使用します。詳細については、コード実行の料金を参照してください。
プログラマティックツール呼び出しは、小さな固定オーバーヘッド(コンテナの起動、スクリプトの生成)と引き換えに、ツール結果のトークンとモデルのラウンドトリップを大幅に削減します。このトレードオフが有益かどうかは、ワークロードの形状によって異なります。
適している場合:
適していない場合:
不明な場合は、広く有効にする前に、トラフィックの代表的なサンプルで allowed_callers の有無による課金入力トークンを測定してください。
tool_choice 設定時の invalid_request_error
tool_choice は、allowed_callers に "direct" を含まないツールを指定できません。そのツールの allowed_callers に "direct" を追加するか、tool_choice からツールを削除してClaudeにコードから呼び出させてください。コンテナの有効期限切れ
expires_at タイムスタンプより十分前に、各プログラマティックツール呼び出しに応答してください。Claudeのコードは約4分後に結果の待機を停止し、アイドル状態のコンテナは現在約5分後に回収されます。ツール結果が正しく解析されない
caller フィールドを確認する**Claudeは大量のコードで訓練されているため、ツールを呼び出し可能なPython関数として提示することで、その強みを活用できます。
プログラマティックツール呼び出しは、独自のインフラストラクチャでも実装できる汎用的なパターンです。各アプローチの比較は以下のとおりです。
Claudeにコード実行ツールを提供し、その環境で利用可能な関数を説明します。Claudeがコードでツールを呼び出すと、アプリケーションはそれらの関数が定義されているローカルで実行します。
利点:
欠点:
使用する場合: アプリケーションが任意のコードを安全に実行でき、最小限の実装を望み、Anthropicのマネージドサービスがニーズに合わない場合。
Claudeの観点からは同じアプローチですが、コードはセキュリティ制限(例:ネットワーク送信なし)のあるサンドボックス化されたコンテナで実行されます。ツールが外部リソースを必要とする場合、サンドボックス外でツール呼び出しを実行するためのプロトコルが必要になります。
利点:
欠点:
使用する場合: セキュリティが重要で、Anthropicのマネージドソリューションが要件に合わない場合。
Anthropicのプログラマティックツール呼び出しは、Claude向けに調整された独自のPython環境を備えた、サンドボックス実行のマネージドバージョンです。Anthropicがコンテナ管理、コード実行、安全なツール呼び出し通信を処理します。
利点:
Claude API、Claude Platform on AWS、またはMicrosoft Foundryを使用している場合は、Anthropicのマネージドソリューションの使用を検討してください。Microsoft Foundryでは、プログラマティックツール呼び出しにはHosted on Anthropicデプロイメントが必要です。
プログラマティックツール呼び出しはコード実行インフラストラクチャ上に構築されており、同じサンドボックスコンテナを使用します。実行アーティファクトや出力を含むコンテナデータは、最大30日間保持されます。
すべての機能にわたるZDRの適格性については、APIとデータ保持を参照してください。
レイテンシが重要なアプリケーション向けに、サーバー側のJSONバッファリングなしでツール入力をストリーミングします。
サンドボックス化されたコンテナでPythonとbashコードを実行し、データの分析、ファイルの生成、ソリューションの反復を行います。
Claudeを外部ツールやAPIに接続します。ツールがどこで実行されるか、Claudeがいつ呼び出すか、どのツールがタスクに適しているかを確認してください。
ツールスキーマを指定し、効果的な説明を書き、Claudeがツールを呼び出すタイミングを制御します。
Was this page helpful?