プログラマティックツール呼び出しにより、Claudeは各ツール呼び出しごとにモデルとの往復を必要とせず、コード実行コンテナ内でツールをプログラム的に呼び出すコードを記述できます。これにより、複数ツールを使うワークフローの「latency」(レイテンシ)が削減され、データがモデルの「context window」(コンテキストウィンドウ)に到達する前にClaudeがフィルタリングや処理を行えるため、トークン消費量も減少します。多段階のウェブリサーチや複雑な情報検索をテストするBrowseCompやDeepSearchQAなどのエージェント型検索ベンチマークでは、基本的な検索ツールにプログラマティックツール呼び出しを追加することで、入力トークンを24%削減しながらパフォーマンスが平均11%向上しました(Improved web search with dynamic filteringを参照)。
20人の従業員の予算遵守状況を確認する例を考えてみましょう。従来のアプローチでは20回の個別のモデル往復が必要で、その過程で数千件の経費明細項目がコンテキストに取り込まれます。プログラマティックツール呼び出しを使えば、単一のスクリプトが20件すべての検索を実行し、結果をフィルタリングして、上限を超えた従業員のみを返します。これにより、Claudeが推論する必要のあるデータが数百キロバイトからわずか数行にまで縮小されます。
プログラマティックツール呼び出しが対処する推論コストとコンテキストコストについて詳しくは、Advanced tool useを参照してください。
この機能を使用するには、コード実行ツールを有効にする必要があります。
この機能はZero Data Retention (ZDR)の対象外です。データは、この機能の標準的な保持ポリシーに従って保持されます。
プログラマティックツール呼び出しにはcode_execution_20260120以降が必要で、以下のモデルでサポートされています。
| モデル |
|---|
| Claude Fable 5(claude-fable-5) |
| Claude Mythos 5(claude-mythos-5) |
| Claude Opus 4.8(claude-opus-4-8) |
| Claude Opus 4.7(claude-opus-4-7) |
| Claude Opus 4.6(claude-opus-4-6) |
| Claude Sonnet 5(claude-sonnet-5) |
| Claude Sonnet 4.6(claude-sonnet-4-6) |
| Claude Opus 4.5(claude-opus-4-5-20251101) |
| Claude Sonnet 4.5(claude-sonnet-4-5-20250929) |
コード実行ツールのバージョンマトリックス全体については、コード実行ツールのモデル互換性表を参照してください。プログラマティックツール呼び出しは、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-4-8",
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ブロックを返しますこのアプローチは特に以下の場合に有用です。
コード実行呼び出し元を許可するツールは、非同期Python関数としてClaudeのコードに公開されるため、Claudeはasyncio.gatherでそれらを並列実行できます。各関数は引数の単一のdictを受け取り、文字列(返送するtool_resultのテキスト)を返します。Claudeのコードはこれらの関数をトップレベルのawaitで待機し、構造化データとして必要な結果を解析します。例:rows = json.loads(await query_database({"sql": "<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"] - Claudeはこのツールをコード実行内からのみ呼び出すように誘導されます["direct", "code_execution_20260120"] - Claudeはこのツールを直接またはコード実行内から呼び出すことができますallowed_callersでは"code_execution_20260120"と"code_execution_20260521"の両方が受け入れられ、互換性があります。どちらかのコード実行ツールバージョンを使用するリクエストは、どちらかの呼び出し元をリストするツールの条件を満たします。レスポンスブロックは、リクエストで宣言されたバージョンに関係なく、常に呼び出し元をcode_execution_20260120としてタグ付けします。
各ツールに対して両方を有効にするのではなく、["direct"]または["code_execution_20260120"]のいずれかを選択してください。これにより、ツールの最適な使用方法についてClaudeにより明確なガイダンスが提供されます。
allowed_callersは、ツールがClaudeにどのように提示されるかを制御し、tool_choiceに対して検証されますが、直接呼び出しに対するAPIレベルの厳格なブロックではありません。Claudeはこれを尊重するように強く誘導されますが、クライアントは定義したすべてのツールに対する直接のtool_useを処理できるように準備しておく必要があります。allowed_callersをセキュリティ境界として依存しないでください。
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日を超えたコンテナは再利用できません。Claudeのコードがプログラマティックツール結果を待機している間、保留中の呼び出しは約4分後にタイムアウトし、コード内でTimeoutErrorが発生します。一時停止したレスポンスのexpires_atタイムスタンプよりも十分前に各ツール結果を返してください。ツール呼び出し中のコンテナ有効期限切れを参照してください。
完全なプログラマティックツール呼び出しフローの動作は以下のとおりです。
コード実行と、プログラマティック呼び出しを許可するツールを含むリクエストを送信します。プログラマティック呼び出しを有効にするには、ツール定義にallowed_callersフィールドを追加します。
ツールの出力形式の詳細な説明をツールの説明に記載してください。ツールがJSONを返すと指定すると、Claudeはコード内で結果をデシリアライズして処理しようとします。出力スキーマについて詳細を提供するほど、Claudeはレスポンスをプログラム的により適切に処理できます。
リクエストの形式はクイックスタートの例と同じです。ツールリストに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-4-8",
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%のトークン削減が見られます。実際の削減量はワークロードの形状によって異なります。プログラマティック呼び出しを使用すべき場合を参照してください。
プログラマティックツール呼び出しは、コード実行と同じ料金体系を使用します。詳細については、コード実行の料金を参照してください。
プログラマティックツール呼び出しのトークンカウント:プログラマティック呼び出しからのツール結果は、入力/出力トークン使用量にカウントされません。最終的なコード実行結果とClaudeのレスポンスのみがカウントされます。
プログラマティックツール呼び出しは、小さな固定オーバーヘッド(コンテナ起動、スクリプト生成)と引き換えに、ツール結果トークンとモデル往復を大幅に削減します。このトレードオフが有効かどうかはワークロードの形状によります。
適している場合:
適していない場合:
判断がつかない場合は、広く有効にする前に、代表的なトラフィックサンプルで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?