Pemanggilan alat secara terprogram memungkinkan Claude menulis kode yang memanggil alat Anda secara terprogram dalam kontainer eksekusi kode, daripada memerlukan putaran 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.
Pemanggilan alat secara terprogram saat ini dalam beta publik.
Untuk menggunakan fitur ini, tambahkan header beta "advanced-tool-use-2025-11-20" ke permintaan API Anda.
Fitur ini memerlukan alat eksekusi kode untuk diaktifkan.
Pemanggilan alat secara terprogram tersedia di model berikut:
| Model | Versi Alat |
|---|---|
Claude Opus 4.5 (claude-opus-4-5-20251101) | code_execution_20250825 |
Claude Sonnet 4.5 (claude-sonnet-4-5-20250929) | code_execution_20250825 |
Pemanggilan alat secara terprogram tersedia melalui Claude API dan Microsoft Foundry.
Berikut adalah contoh sederhana di mana Claude secara terprogram menanyakan database beberapa kali dan mengagregasi hasil:
Ketika Anda mengonfigurasi alat untuk dapat dipanggil dari eksekusi kode dan Claude memutuskan untuk menggunakan alat tersebut:
tool_usePendekatan ini sangat berguna untuk:
Alat khusus dikonversi ke fungsi Python asinkron 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 asinkron yang sesuai.
Pembungkus asinkron dihilangkan dari contoh kode dalam dokumentasi ini untuk kejelasan.
allowed_callersBidang 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_20250825"]
}Nilai yang mungkin:
["direct"] - Hanya Claude yang dapat memanggil alat ini secara langsung (default jika dihilangkan)["code_execution_20250825"] - Hanya dapat dipanggil dari dalam eksekusi kode["direct", "code_execution_20250825"] - Dapat dipanggil baik secara langsung maupun dari eksekusi kodeKami merekomendasikan memilih baik ["direct"] atau ["code_execution_20250825"] untuk setiap alat daripada mengaktifkan keduanya, karena ini memberikan panduan yang lebih jelas kepada Claude tentang cara terbaik menggunakan alat.
caller dalam responsSetiap blok penggunaan alat menyertakan bidang caller yang menunjukkan cara dipanggil:
Pemanggilan langsung (penggunaan alat tradisional):
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": {"sql": "\<sql\>"},
"caller": {"type": "direct"}
}Pemanggilan terprogram:
{
"type": "tool_use",
"id": "toolu_xyz789",
"name": "query_database",
"input": {"sql": "\<sql\>"},
"caller": {
"type": "code_execution_20250825",
"tool_id": "srvtoolu_abc123"
}
}tool_id mereferensikan alat eksekusi kode yang membuat pemanggilan terprogram.
Pemanggilan alat secara terprogram menggunakan kontainer yang sama dengan eksekusi kode:
containerKetika alat dipanggil secara terprogram dan kontainer menunggu hasil alat Anda, Anda harus merespons sebelum kontainer kedaluwarsa. Pantau bidang expires_at. Jika kontainer kedaluwarsa, Claude mungkin memperlakukan pemanggilan alat sebagai waktu habis dan mencoba lagi.
Berikut adalah cara alur pemanggilan alat secara terprogram yang lengkap bekerja:
Kirim permintaan dengan eksekusi kode dan alat yang memungkinkan pemanggilan terprogram. Untuk mengaktifkan pemanggilan terprogram, tambahkan bidang 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 akan mencoba mendeserialisasi dan memproses hasilnya dalam kode. Semakin detail yang Anda berikan tentang skema output, semakin baik Claude dapat menangani respons secara terprogram.
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_20250825",
"tool_id": "srvtoolu_abc123"
}
}
],
"container": {
"id": "container_xyz789",
"expires_at": "2025-01-15T14:30:00Z"
},
"stop_reason": "tool_use"
}Sertakan riwayat percakapan lengkap ditambah hasil alat Anda:
Eksekusi kode berlanjut dan memproses hasil. Jika pemanggilan alat tambahan diperlukan, ulangi Langkah 3 hingga semua pemanggilan alat 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 wrapper omitted for clarity
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 kesuksesan terpenuhi:
# async wrapper omitted for clarity
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 wrapper omitted for clarity
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 wrapper omitted for clarity
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 alat:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": {"sql": "\<sql\>"},
"caller": {
"type": "code_execution_20250825",
"tool_id": "srvtoolu_xyz789"
}
}Hasil alat Anda dilewatkan 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 pemanggilan alat 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": []
}
}| Kesalahan | Deskripsi | Solusi |
|---|---|---|
invalid_tool_input | Input alat tidak cocok dengan skema | Validasi input_schema alat Anda |
tool_not_allowed | Alat tidak memungkinkan jenis pemanggil yang diminta | Periksa allowed_callers mencakup konteks yang tepat |
missing_beta_header | Header beta PTC tidak disediakan | Tambahkan kedua header beta ke permintaan Anda |
Jika alat Anda memakan waktu terlalu lama untuk merespons, eksekusi kode akan menerima TimeoutError. Claude melihat ini di stderr dan biasanya akan mencoba lagi:
{
"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 waktu habis:
expires_at dalam responsJika alat Anda mengembalikan kesalahan:
# Provide error information in the tool result
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Kode Claude akan menerima kesalahan ini dan dapat menanganinya dengan tepat.
strict: true tidak didukung dengan pemanggilan terprogramtool_choicedisable_parallel_tool_use: true tidak didukung dengan pemanggilan terprogramAlat berikut saat ini tidak dapat dipanggil secara terprogram, tetapi dukungan dapat ditambahkan di rilis mendatang:
Saat merespons pemanggilan alat terprogram, ada persyaratan pemformatan yang ketat:
Respons hanya hasil alat: Jika ada pemanggilan alat terprogram yang tertunda menunggu hasil, pesan respons Anda harus berisi hanya blok tool_result. Anda tidak dapat menyertakan konten teks apa pun, bahkan setelah hasil alat.
// ❌ TIDAK VALID - Tidak dapat menyertakan teks saat merespons pemanggilan alat 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?"} // This will cause an error
]
}
// ✅ VALID - Hanya hasil alat saat merespons pemanggilan alat terprogram
{
"role": "user",
"content": [
{"type": "tool_result", "tool_use_id": "toolu_01", "content": "[{\"customer_id\": \"C1\", \"revenue\": 45000}]"}
]
}Pembatasan ini hanya berlaku saat merespons pemanggilan alat terprogram (eksekusi kode). Untuk pemanggilan alat sisi klien biasa, Anda dapat menyertakan konten teks setelah hasil alat.
Pemanggilan alat secara terprogram tunduk pada batas laju yang sama dengan pemanggilan alat biasa. Setiap pemanggilan alat dari eksekusi kode dihitung sebagai pemanggilan terpisah.
Saat mengimplementasikan alat khusus yang akan dipanggil secara terprogram:
Pemanggilan alat secara terprogram dapat secara signifikan mengurangi konsumsi token:
Misalnya, memanggil 10 alat secara langsung menggunakan ~10x token dari memanggilan mereka secara terprogram dan mengembalikan ringkasan.
Pemanggilan alat secara terprogram menggunakan harga yang sama dengan eksekusi kode. Lihat harga eksekusi kode untuk detail.
Penghitungan token untuk pemanggilan alat terprogram: Hasil alat 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:
Kesalahan "Alat tidak diizinkan"
"allowed_callers": ["code_execution_20250825"]Kedaluwarsa kontainer
expires_at dalam responsMasalah header beta
"advanced-tool-use-2025-11-20"Hasil alat tidak diuraikan dengan benar
caller untuk mengkonfirmasi pemanggilan terprogramPelatihan Claude mencakup paparan ekstensif terhadap kode, menjadikannya efektif dalam penalaran melalui dan perantaian pemanggilan fungsi. Ketika alat disajikan sebagai fungsi yang dapat dipanggil dalam lingkungan eksekusi kode, Claude dapat memanfaatkan kekuatan ini untuk:
Pendekatan ini memungkinkan alur kerja yang akan tidak praktis dengan penggunaan alat tradisional—seperti memproses file lebih dari 1M token—dengan memungkinkan Claude bekerja dengan data secara terprogram daripada memuat semuanya ke dalam konteks percakapan.
Pemanggilan alat secara terprogram adalah pola yang dapat digeneralisasi yang dapat diimplementasikan di luar eksekusi kode yang dikelola Anthropic. Berikut adalah gambaran umum pendekatan:
Berikan Claude dengan alat eksekusi kode dan jelaskan fungsi apa yang tersedia di lingkungan itu. Ketika Claude memanggil alat dengan kode, aplikasi Anda menjalankannya secara lokal di mana fungsi tersebut didefinisikan.
Keuntungan:
Kerugian:
Gunakan ketika: Aplikasi Anda dapat dengan aman menjalankan kode arbitrer, Anda menginginkan solusi sederhana, dan penawaran Anthropic yang dikelola tidak sesuai dengan kebutuhan Anda.
Pendekatan yang sama dari perspektif Claude, tetapi kode berjalan dalam kontainer bersandal dengan pembatasan keamanan (misalnya, tidak ada egress jaringan). Jika alat Anda memerlukan sumber daya eksternal, Anda akan memerlukan protokol untuk menjalankan pemanggilan alat di luar sandbox.
Keuntungan:
Kerugian:
Gunakan ketika: Keamanan sangat penting dan solusi Anthropic yang dikelola tidak sesuai dengan persyaratan Anda.
Pemanggilan alat secara terprogram Anthropic adalah versi yang dikelola dari eksekusi bersandal dengan lingkungan Python yang berpandangan untuk Claude. Anthropic menangani manajemen kontainer, eksekusi kode, dan komunikasi pemanggilan alat yang aman.
Keuntungan:
Kami merekomendasikan menggunakan solusi yang dikelola Anthropic jika Anda menggunakan Claude API.
curl https://api.anthropic.com/v1/messages \
--header "x-api-key: $ANTHROPIC_API_KEY" \
--header "anthropic-version: 2023-06-01" \
--header "anthropic-beta: advanced-tool-use-2025-11-20" \
--header "content-type: application/json" \
--data '{
"model": "claude-sonnet-4-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_20250825",
"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_20250825"]
}
]
}'response = client.beta.messages.create(
model="claude-sonnet-4-5",
betas=["advanced-tool-use-2025-11-20"],
max_tokens=4096,
messages=[{
"role": "user",
"content": "Query customer purchase history from the last quarter and identify our top 5 customers by revenue"
}],
tools=[
{
"type": "code_execution_20250825",
"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": {...},
"allowed_callers": ["code_execution_20250825"]
}
]
)response = client.beta.messages.create(
model="claude-sonnet-4-5",
betas=["advanced-tool-use-2025-11-20"],
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_20250825",
"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=[...]
)Pahami dasar-dasar penggunaan alat dengan Claude.