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. Pada tolok ukur pencarian agentic seperti BrowseComp dan DeepSearchQA, yang menguji penelitian web multi-langkah dan pengambilan informasi kompleks, menambahkan pemanggilan alat secara terprogram di atas alat pencarian dasar adalah faktor kunci yang sepenuhnya membuka kinerja agen.
Perbedaannya berkembang pesat dalam alur kerja nyata. Pertimbangkan memeriksa kepatuhan anggaran di 20 karyawan: pendekatan tradisional memerlukan 20 putaran model terpisah, menarik ribuan item baris pengeluaran ke dalam konteks sepanjang jalan. Dengan pemanggilan alat secara terprogram, satu skrip menjalankan semua 20 pencarian, memfilter hasilnya, dan mengembalikan hanya karyawan yang melampaui batas mereka, menyusutkan apa yang perlu Claude pikirkan dari ratusan kilobyte menjadi beberapa baris.
Untuk melihat lebih dalam biaya inferensi dan konteks yang ditangani oleh pemanggilan alat secara terprogram, lihat Penggunaan alat tingkat lanjut.
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.
Pemanggilan alat secara terprogram memerlukan code_execution_20260120, yang didukung pada model berikut:
| Model |
|---|
Claude Opus 4.7 (claude-opus-4-7) |
Claude Opus 4.6 (claude-opus-4-6) |
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) |
Untuk matriks versi alat eksekusi kode lengkap, lihat tabel kompatibilitas model alat eksekusi kode. 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:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-opus-4-7",
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)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_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 ["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.
caller dalam responsSetiap blok penggunaan alat mencakup bidang caller yang menunjukkan cara ia 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_20260120",
"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 dapat 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 mencoba untuk mendeserialisasi dan memproses hasilnya dalam kode. Semakin detail yang Anda berikan tentang skema output, semakin baik Claude dapat menangani respons secara terprogram.
Bentuk permintaan identik dengan contoh Mulai cepat: sertakan code_execution dalam daftar alat Anda, tambahkan allowed_callers: ["code_execution_20260120"] ke alat apa pun yang ingin Anda panggil Claude dari kode, dan kirim pesan pengguna Anda.
Claude menulis kode yang memanggil alat Anda. API berhenti 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 ditambah hasil alat Anda:
response = client.messages.create(
model="claude-opus-4-7",
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=[...],
)
print(response)Eksekusi kode berlanjut dan memproses hasilnya. Jika panggilan alat tambahan diperlukan, ulangi Langkah 3 sampai semua panggilan 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 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 alat:
{
"type": "tool_use",
"id": "toolu_abc123",
"name": "query_database",
"input": { "sql": "<sql>" },
"caller": {
"type": "code_execution_20260120",
"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 panggilan 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 sesuai dengan skema | Validasi input_schema alat Anda |
tool_not_allowed | Alat tidak mengizinkan tipe pemanggil yang diminta | Periksa allowed_callers mencakup konteks yang tepat |
missing_beta_header | Header beta yang diperlukan tidak disediakan (Bedrock dan Vertex AI saja; pemanggilan alat terprogram adalah GA di API Claude pihak pertama) | Tambahkan header beta yang diperlukan ke permintaan Anda |
Jika alat Anda membutuhkan waktu terlalu lama untuk merespons, eksekusi kode menerima TimeoutError. Claude melihat ini di stderr dan biasanya 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:
{
"type": "tool_result",
"tool_use_id": "toolu_abc123",
"content": "Error: Query timeout - table lock exceeded 30 seconds"
}Kode Claude 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 panggilan alat terprogram, ada persyaratan pemformatan yang ketat:
Respons hanya hasil alat: Jika ada panggilan 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 panggilan 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?" }
]
}Valid - Hanya hasil alat saat merespons panggilan 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 panggilan alat terprogram (eksekusi kode). Untuk panggilan alat sisi klien biasa, Anda dapat menyertakan konten teks setelah hasil alat.
Panggilan alat terprogram tunduk pada batas laju yang sama dengan panggilan alat biasa. Setiap panggilan alat dari eksekusi kode dihitung sebagai invokasi terpisah.
Saat mengimplementasikan alat yang ditentukan pengguna yang akan dipanggil secara terprogram:
Pemanggilan alat 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 terprogram menggunakan harga yang sama dengan eksekusi kode. Lihat harga eksekusi kode untuk detail.
Penghitungan token untuk panggilan alat terprogram: Hasil alat dari invokasi 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 "Tool not allowed"
"allowed_callers": ["code_execution_20260120"]Kedaluwarsa kontainer
expires_at dalam responsHasil alat tidak diurai dengan benar
caller untuk mengkonfirmasi invokasi terprogramPelatihan Claude mencakup paparan luas terhadap kode, menjadikannya efektif dalam penalaran melalui dan pemanggilan fungsi rantai. Ketika alat 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 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 terprogram adalah pola yang dapat digeneralisasi yang dapat diimplementasikan di luar eksekusi kode terkelola 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-fungsi itu didefinisikan.
Keuntungan:
Kerugian:
Gunakan ketika: Aplikasi Anda dapat dengan aman menjalankan kode arbitrer, Anda menginginkan solusi sederhana, dan penawaran terkelola Anthropic tidak sesuai dengan kebutuhan Anda.
Pendekatan yang sama dari perspektif Claude, tetapi kode berjalan dalam kontainer sandbox dengan pembatasan keamanan (misalnya, tidak ada egress jaringan). Jika alat Anda memerlukan sumber daya eksternal, Anda akan memerlukan protokol untuk menjalankan panggilan alat di luar sandbox.
Keuntungan:
Kerugian:
Gunakan ketika: Keamanan sangat penting dan solusi terkelola Anthropic tidak sesuai dengan persyaratan Anda.
Pemanggilan alat terprogram Anthropic adalah versi terkelola dari eksekusi sandbox dengan lingkungan Python yang berpendapat disesuaikan untuk Claude. Anthropic menangani manajemen kontainer, eksekusi kode, dan komunikasi invokasi alat yang aman.
Keuntungan:
Pertimbangkan menggunakan solusi terkelola Anthropic jika Anda menggunakan Claude API.
Pemanggilan alat terprogram dibangun di atas infrastruktur eksekusi kode dan menggunakan kontainer sandbox yang sama. Data kontainer, termasuk artefak eksekusi dan output, disimpan hingga 30 hari.
Untuk kelayakan ZDR di semua fitur, lihat API dan retensi data.
Pelajari tentang kemampuan eksekusi kode yang mendasari yang mendukung pemanggilan alat terprogram.
Pahami dasar-dasar penggunaan alat dengan Claude.
Panduan langkah demi langkah untuk mendefinisikan alat.
Was this page helpful?