Was this page helpful?
Pemanggilan alat secara programatik memungkinkan Claude menulis kode yang memanggil alat Anda secara programatik dalam container eksekusi kode, daripada memerlukan perjalanan bolak-balik melalui model untuk setiap pemanggilan alat. Ini mengurangi latensi untuk alur kerja multi-alat dan mengurangi konsumsi token dengan memungkinkan Claude memfilter atau memproses data sebelum mencapai jendela konteks model. Pada benchmark pencarian agentic seperti BrowseComp dan DeepSearchQA, yang menguji penelitian web multi-langkah dan pengambilan informasi yang kompleks, menambahkan pemanggilan alat secara programatik di atas alat pencarian dasar adalah faktor kunci yang sepenuhnya membuka kinerja agen.
Perbedaannya bertambah cepat dalam alur kerja nyata. Pertimbangkan pemeriksaan kepatuhan anggaran di 20 karyawan: pendekatan tradisional memerlukan 20 perjalanan bolak-balik model yang terpisah, menarik ribuan item baris pengeluaran ke dalam konteks di sepanjang jalan. Dengan pemanggilan alat secara programatik, satu skrip menjalankan semua 20 pencarian, memfilter hasilnya, dan hanya mengembalikan karyawan yang melebihi batas mereka, menyusutkan apa yang perlu dipertimbangkan Claude dari ratusan kilobyte menjadi beberapa baris.
Untuk melihat lebih dalam biaya inferensi dan konteks yang ditangani oleh pemanggilan alat secara programatik, lihat Advanced tool use.
Fitur ini memerlukan alat eksekusi kode untuk diaktifkan.
This feature is not eligible for Zero Data Retention (ZDR). Data is retained according to the feature's standard retention policy.
Untuk detail kompatibilitas model dan versi alat, lihat Referensi alat. Pemanggilan alat secara programatik tersedia melalui Claude API dan Microsoft Foundry.
Berikut adalah contoh sederhana di mana Claude secara programatik mengkueri database beberapa kali dan mengagregasi hasilnya:
Ketika Anda mengonfigurasi alat agar dapat dipanggil dari eksekusi kode dan Claude memutuskan untuk menggunakan alat tersebut:
tool_usePendekatan ini sangat berguna untuk:
Alat kustom dikonversi menjadi fungsi Python async untuk mendukung pemanggilan alat paralel. Ketika Claude menulis kode yang memanggil alat Anda, ia menggunakan await (misalnya, result = await query_database("<sql>")) dan secara otomatis menyertakan fungsi pembungkus async yang sesuai.
Fungsi pembungkus async dihilangkan dari contoh kode dalam dokumentasi ini untuk kejelasan.
allowed_callersField allowed_callers menentukan konteks mana yang dapat memanggil alat:
{
"name": "query_database",
"description": "Execute a SQL query against the database",
"input_schema": {
// ...
},
"allowed_callers": ["code_execution_20260120"]
}Nilai yang mungkin:
["direct"] - Hanya Claude yang dapat memanggil alat ini secara langsung (default jika dihilangkan)["code_execution_20260120"] - Hanya dapat dipanggil dari dalam eksekusi kode["direct", "code_execution_20260120"] - Dapat dipanggil baik secara langsung maupun dari eksekusi kodePilih salah satu ["direct"] atau ["code_execution_20260120"] untuk setiap alat daripada mengaktifkan keduanya, karena ini memberikan panduan yang lebih jelas kepada Claude tentang cara terbaik menggunakan alat tersebut.
caller dalam responsSetiap blok penggunaan alat menyertakan field caller yang menunjukkan bagaimana alat dipanggil:
Pemanggilan langsung (penggunaan alat tradisional):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": { "type": "direct" }
}Pemanggilan programatik:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_abc123"
}
}tool_id mereferensikan alat eksekusi kode yang melakukan pemanggilan programatik.
Pemanggilan alat secara programatik menggunakan container yang sama dengan eksekusi kode:
containerKetika alat dipanggil secara programatik dan container menunggu hasil alat Anda, Anda harus merespons sebelum container kedaluwarsa. Pantau field expires_at. Jika container kedaluwarsa, Claude mungkin memperlakukan pemanggilan alat sebagai waktu habis dan mencoba lagi.
Berikut adalah cara kerja alur pemanggilan alat secara programatik yang lengkap:
Kirim permintaan dengan eksekusi kode dan alat yang memungkinkan pemanggilan programatik. Untuk mengaktifkan pemanggilan programatik, tambahkan field allowed_callers ke definisi alat Anda.
Berikan deskripsi terperinci tentang format output alat Anda dalam deskripsi alat. Jika Anda menentukan bahwa alat mengembalikan JSON, Claude mencoba melakukan deserialisasi dan memproses hasilnya dalam kode. Semakin banyak detail yang Anda berikan tentang skema output, semakin baik Claude dapat menangani respons secara programatik.
Bentuk permintaan identik dengan contoh Mulai cepat: sertakan code_execution dalam daftar alat Anda, tambahkan allowed_callers: ["code_execution_20260120"] ke alat mana pun yang ingin Anda panggil Claude dari kode, dan kirim pesan pengguna Anda.
Claude menulis kode yang memanggil alat Anda. API dijeda dan mengembalikan:
{
"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"
}Sertakan riwayat percakapan lengkap beserta hasil tool Anda:
Eksekusi kode berlanjut dan memproses hasilnya. Jika diperlukan panggilan tool tambahan, ulangi Langkah 3 hingga semua panggilan tool terpenuhi.
Setelah eksekusi kode selesai, Claude memberikan respons akhir:
{
"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 dapat menulis kode yang memproses beberapa item secara efisien:
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")
Pola ini:
Claude dapat berhenti memproses segera setelah kriteria keberhasilan terpenuhi:
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)
Ketika eksekusi kode memanggil sebuah tool:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"tool_id": "srvtoolu_xyz789"
}
}Hasil tool Anda diteruskan kembali ke kode yang sedang berjalan:
{
"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}, ...]"
}
]
}Ketika semua panggilan tool terpenuhi dan kode selesai:
{
"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": []
}
}| Error | Deskripsi | Solusi |
|---|---|---|
invalid_tool_input | Input tool tidak sesuai dengan skema | Validasi input_schema tool Anda |
tool_not_allowed | Tool tidak mengizinkan tipe caller yang diminta | Periksa allowed_callers menyertakan konteks yang tepat |
missing_beta_header | Header beta yang diperlukan tidak disediakan (hanya Bedrock dan Vertex AI; pemanggilan tool terprogram sudah GA di Claude API pihak pertama) | Tambahkan header beta yang diperlukan ke permintaan Anda |
Jika tool Anda membutuhkan waktu terlalu lama untuk merespons, eksekusi kode menerima TimeoutError. Claude melihat ini di stderr dan biasanya mencoba ulang:
{
"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": []
}
}Untuk mencegah timeout:
expires_at dalam responsJika tool Anda mengembalikan error:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Kode Claude menerima error ini dan dapat menanganinya dengan tepat.
strict: true tidak didukung dengan pemanggilan terprogramtool_choicedisable_parallel_tool_use: true tidak didukung dengan pemanggilan terprogramTool-tool berikut saat ini tidak dapat dipanggil secara terprogram, tetapi dukungan mungkin ditambahkan di rilis mendatang:
Saat merespons panggilan tool terprogram, ada persyaratan format yang ketat:
Respons hanya hasil tool: Jika ada panggilan tool terprogram yang menunggu hasil, pesan respons Anda harus berisi hanya blok tool_result. Anda tidak dapat menyertakan konten teks apa pun, bahkan setelah hasil tool.
Tidak valid - Tidak dapat menyertakan teks saat merespons panggilan tool terprogram:
{
"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?" }
]
}Valid - Hanya hasil tool saat merespons panggilan tool terprogram:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01",
"content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"
}
]
}Pembatasan ini hanya berlaku saat merespons panggilan tool terprogram (eksekusi kode). Untuk panggilan tool sisi klien biasa, Anda dapat menyertakan konten teks setelah hasil tool.
Panggilan tool terprogram tunduk pada batas rate yang sama dengan panggilan tool biasa. Setiap panggilan tool dari eksekusi kode dihitung sebagai pemanggilan terpisah.
Saat mengimplementasikan tool yang ditentukan pengguna yang akan dipanggil secara terprogram:
Pemanggilan tool terprogram dapat secara signifikan mengurangi konsumsi token:
Misalnya, memanggil 10 tool secara langsung menggunakan ~10x token dibandingkan memanggilnya secara terprogram dan mengembalikan ringkasan.
Pemanggilan tool terprogram menggunakan harga yang sama dengan eksekusi kode. Lihat harga eksekusi kode untuk detailnya.
Penghitungan token untuk panggilan tool terprogram: Hasil tool dari pemanggilan terprogram tidak dihitung terhadap penggunaan token input/output Anda. Hanya hasil eksekusi kode akhir dan respons Claude yang dihitung.
Kasus penggunaan yang baik:
Kasus penggunaan yang kurang ideal:
Error "Tool not allowed"
"allowed_callers": ["code_execution_20260120"]Kedaluwarsa container
expires_at dalam responsHasil tool tidak diurai dengan benar
caller untuk mengonfirmasi pemanggilan terprogramPelatihan Claude mencakup paparan ekstensif terhadap kode, membuatnya efektif dalam menalar dan merantai panggilan fungsi. Ketika tool disajikan sebagai fungsi yang dapat dipanggil dalam lingkungan eksekusi kode, Claude dapat memanfaatkan kekuatan ini untuk:
Pendekatan ini memungkinkan alur kerja yang tidak praktis dengan penggunaan tool tradisional (seperti memproses file lebih dari 1 juta token) dengan memungkinkan Claude bekerja dengan data secara terprogram daripada memuat semuanya ke dalam konteks percakapan.
Pemanggilan tool terprogram adalah pola yang dapat digeneralisasi yang dapat diimplementasikan di luar eksekusi kode terkelola Anthropic. Berikut adalah ikhtisar pendekatannya:
Berikan Claude tool eksekusi kode dan jelaskan fungsi apa yang tersedia di lingkungan tersebut. Ketika Claude memanggil tool dengan kode, aplikasi Anda mengeksekusinya secara lokal di mana fungsi-fungsi tersebut didefinisikan.
Keuntungan:
Kerugian:
Gunakan ketika: Aplikasi Anda dapat mengeksekusi kode arbitrer dengan aman, Anda menginginkan solusi sederhana, dan penawaran terkelola Anthropic tidak sesuai kebutuhan Anda.
Pendekatan yang sama dari perspektif Claude, tetapi kode berjalan dalam container sandbox dengan pembatasan keamanan (misalnya, tidak ada egress jaringan). Jika tool Anda memerlukan sumber daya eksternal, Anda memerlukan protokol untuk mengeksekusi panggilan tool di luar sandbox.
Keuntungan:
Kerugian:
Gunakan ketika: Keamanan sangat penting dan solusi terkelola Anthropic tidak sesuai kebutuhan Anda.
Pemanggilan tool terprogram Anthropic adalah versi terkelola dari eksekusi sandbox dengan lingkungan Python yang teropini dan disetel untuk Claude. Anthropic menangani manajemen container, eksekusi kode, dan komunikasi pemanggilan tool yang aman.
Keuntungan:
Pertimbangkan untuk menggunakan solusi terkelola Anthropic jika Anda menggunakan Claude API.
Pemanggilan tool terprogram dibangun di atas infrastruktur eksekusi kode dan menggunakan container sandbox yang sama. Data container, termasuk artefak dan output eksekusi, disimpan hingga 30 hari.
Untuk kelayakan ZDR di semua fitur, lihat retensi API dan data.
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"]
}
]
}'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