Halaman ini membahas siklus hidup panggilan alat: membaca blok tool_use dari respons Haijun, memformat blok tool_result dalam balasan Anda, dan memberi sinyal error. Untuk abstraksi SDK yang menangani hal ini secara otomatis, lihat Tool Runner.
Note: Lebih sederhana dengan Tool Runner: Penanganan alat manual yang dijelaskan di halaman ini dikelola secara otomatis oleh Tool Runner. Gunakan halaman ini ketika Anda memerlukan kontrol kustom atas eksekusi alat.
Respons Haijun berbeda tergantung pada apakah Haijun menggunakan alat klien atau alat server.
Menangani hasil dari alat klien
Respons akan memiliki stop_reason berupa tool_use dan satu atau lebih blok konten tool_use yang mencakup:
id: Pengidentifikasi unik untuk blok penggunaan alat tertentu ini. Ini akan digunakan untuk mencocokkan hasil alat nantinya.
name: Nama alat yang digunakan.
input: Objek yang berisi input yang diteruskan ke alat, sesuai denganinput_schemaalat tersebut.
Blok tool_use untuk anggota dari toolset computer use atau browser use juga membawa field toolset_name ("computer" atau "browser"). name-nya adalah alat anggota yang dipanggil Haijun, seperti screenshot atau navigate, jadi lakukan dispatch blok-blok tersebut berdasarkan kedua field.
Contoh respons API dengan blok konten tool_use
{
"id": "msg_01Aq9w938a90dw8q",
"model": "haijun-opus-5-5",
"stop_reason": "tool_use",
"role": "assistant",
"content": [
{
"type": "text",
"text": "I'll check the current weather in San Francisco for you."
},
{
"type": "tool_use",
"id": "toolu_01A09q90qw90lq917835lq9",
"name": "get_weather",
"input": { "location": "San Francisco, CA", "unit": "celsius" }
}
]
}Ketika Anda menerima respons penggunaan alat untuk alat klien, Anda harus:
- Mengekstrak
name,id, daninputdari bloktool_use.
- Menjalankan alat yang sebenarnya di codebase Anda yang sesuai dengan nama alat tersebut, dengan meneruskan
inputalat.
- Melanjutkan percakapan dengan mengirim pesan baru dengan
roleberupauser, dan blokcontentyang berisi tipetool_resultserta informasi berikut:
tool_use_id:iddari permintaan penggunaan alat yang menjadi tujuan hasil ini.content(opsional): Hasil dari alat, sebagai string (misalnya,"content": "15 degrees"), daftar blok konten bersarang (misalnya,"content": [{"type": "text", "text": "15 degrees"}]), atau daftar blok dokumen (misalnya,"content": [{"type": "document", "source": {"type": "text", "media_type": "text/plain", "data": "15 degrees"}}]). Blok konten ini dapat menggunakan tipetext,image,document, atausearch_result.is_error(opsional): Atur ketruejika eksekusi alat menghasilkan error.
tool_result yang menjawab blok anggota computer use atau browser use juga harus menggemakan nilai toolset_name yang sama dengan blok tool_use; hasil anggota yang menghilangkannya akan ditolak. content-nya juga lebih sempit: hasil anggota hanya boleh berisi blok text dan image, dan hasil browser use dapat menambahkan satu blok browser_state (anggota manajemen tab hanya mengembalikan blok tersebut).
Note: Persyaratan pemformatan penting: * Blok hasil alat harus langsung mengikuti blok penggunaan alat yang bersesuaian dalam riwayat pesan. Anda tidak dapat menyertakan pesan apa pun di antara pesan penggunaan alat dari asisten dan pesan hasil alat dari pengguna. * Dalam pesan pengguna yang berisi hasil alat, blok tool\_result harus berada di urutan PERTAMA dalam array content. Teks apa pun harus berada SETELAH semua hasil alat. * Jika giliran asisten juga memanggil alat server yang belum memiliki blok hasil, pesan pengguna harus hanya berisi blok
tool_result. Teks setelah hasil akan mengakhiri giliran lebih awal; untuk alat server yang dipanggil Haijun secara langsung, permintaan kemudian gagal dengan error 400 yang menyebutkan alat server yang belum terselesaikan. Lihat Alasan berhenti dan fallback. Misalnya, ini akan menyebabkan error 400: ``json { "role": "user", "content": [ { "type": "text", "text": "Here are the results:" }, // ❌ Text before tool_result { "type": "tool_result", "tool_use_id": "toolu_01" /* ... / } ] }`Ini benar ketika giliran asisten hanya memanggil alat klien:`json { "role": "user", "content": [ { "type": "tool_result", "tool_use_id": "toolu_01" / ... */ }, { "type": "text", "text": "What should I do next?" } // ✅ Text after tool_result ] }`` Jika Anda menerima error seperti "tool\_use ids were found without tool\_result blocks immediately after", periksa apakah hasil alat Anda diformat dengan benar.
Warning: Hasil alat sering membawa konten dari sumber di luar kendali Anda: halaman web, email masuk, unggahan pengguna, API pihak ketiga. Perlakukan konten tersebut sebagai tidak tepercaya: penyerang yang dapat memengaruhinya mungkin menyisipkan instruksi yang mencoba mengalihkan Haijun ("indirect prompt injection" atau injeksi prompt tidak langsung). Simpan konten tidak tepercaya di dalam blok
tool_resultalih-alih promptsystematau bloktextpengguna biasa, dan lihat Memitigasi jailbreak dan injeksi prompt untuk penguatan lebih lanjut.
#### Contoh hasil alat yang berhasil
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "15 degrees"
}
]
}#### Contoh hasil alat dengan gambar
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": [
{ "type": "text", "text": "15 degrees" },
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
]
}
]
}#### Contoh hasil alat kosong
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9"
}
]
}#### Contoh hasil alat dengan dokumen
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": [
{ "type": "text", "text": "The weather is" },
{
"type": "document",
"source": {
"type": "text",
"media_type": "text/plain",
"data": "15 degrees"
}
}
]
}
]
}Setelah menerima hasil alat, Haijun akan menggunakan informasi tersebut untuk melanjutkan menghasilkan respons terhadap prompt pengguna yang asli.
Menangani hasil dari alat server
Haijun mengeksekusi alat secara internal dan menggabungkan hasilnya langsung ke dalam responsnya tanpa memerlukan interaksi pengguna tambahan.
Note: Sebuah respons dapat berisi blok
tool_useklien dan blokserver_tool_useyang tidak memiliki blok hasil. Panggilan alat server tersebut belum selesai, dan blok hasilnya tiba dalam respons berikutnya. Balas dengan pesan pengguna yang hanya berisi bloktool_resultuntuk alat klien dan pertahankan arraytoolsyang sama; untuk alat server yang dipanggil Haijun secara langsung, API menjalankannya pada permintaan tersebut dan respons berikutnya dimulai dengan blok hasilnya. Lihat Alasan berhenti dan fallback.
Tip: Perbedaan dari API lain Tidak seperti API yang memisahkan penggunaan alat atau menggunakan role khusus seperti
toolataufunction, Haijun API mengintegrasikan alat langsung ke dalam struktur pesanuserdanassistant. Pesan berisi array bloktext,image,tool_use, dantool_result. Pesanusermencakup konten klien dantool_result, sedangkan pesanassistantberisi konten yang dihasilkan AI dantool_use.
Menangani error dengan is\_error
Ada beberapa jenis error berbeda yang dapat terjadi saat menggunakan alat dengan Haijun:
#### Error eksekusi alat
Jika alat itu sendiri melempar error selama eksekusi (misalnya, error jaringan saat mengambil data cuaca), Anda dapat mengembalikan pesan error dalam content bersama dengan "is_error": true:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "ConnectionError: the weather service API is not available (HTTP 500)",
"is_error": true
}
]
}Haijun kemudian akan menggabungkan error ini ke dalam responsnya kepada pengguna. Misalnya: "Maaf, saya tidak dapat mengambil cuaca saat ini karena API layanan cuaca tidak tersedia. Silakan coba lagi nanti."
> Tip: Tulis pesan error yang instruktif. Alih-alih error generik seperti "failed", sertakan apa yang salah dan apa yang harus dicoba Haijun selanjutnya (misalnya, "Rate limit exceeded. Retry after 60 seconds."). Ini memberi Haijun konteks yang dibutuhkannya untuk pulih atau beradaptasi tanpa menebak-nebak.
#### Nama alat tidak valid
Jika upaya Haijun menggunakan alat tidak valid (misalnya, parameter wajib tidak ada), biasanya itu berarti tidak ada cukup informasi bagi Haijun untuk menggunakan alat dengan benar. Pilihan terbaik Anda selama pengembangan adalah mencoba permintaan lagi dengan nilai description yang lebih detail dalam definisi alat Anda.
Namun, Anda juga dapat melanjutkan percakapan dengan tool_result yang menunjukkan error tersebut, dan Haijun akan mencoba menggunakan alat lagi dengan informasi yang hilang telah diisi:
{
"role": "user",
"content": [
{
"type": "tool_result",
"tool_use_id": "toolu_01A09q90qw90lq917835lq9",
"content": "Error: Missing required 'location' parameter",
"is_error": true
}
]
}Jika permintaan alat tidak valid atau parameternya tidak ada, Haijun akan mencoba ulang 2-3 kali dengan koreksi sebelum meminta maaf kepada pengguna.
> Tip: Untuk menghilangkan panggilan alat yang tidak valid sepenuhnya, gunakan penggunaan alat ketat dengan strict: true pada definisi alat Anda. Ini menjamin bahwa input alat akan selalu cocok dengan skema Anda secara tepat, mencegah parameter yang hilang dan ketidakcocokan tipe.
#### Error alat server
Ketika alat server mengalami error (misalnya, masalah jaringan dengan Web Search), Haijun akan menangani error ini secara transparan dan berupaya memberikan respons alternatif atau penjelasan kepada pengguna. Tidak seperti alat klien, Anda tidak perlu menangani hasil is_error untuk alat server.
Khusus untuk pencarian web, kode error yang mungkin muncul meliputi:
too_many_requests: Batas laju terlampauiinvalid_input: Parameter kueri pencarian tidak validmax_uses_exceeded: Jumlah maksimum penggunaan alat pencarian web terlampauiquery_too_long: Kueri melebihi panjang maksimumunavailable: Terjadi error internal
Langkah selanjutnya
Tangani respons di mana Haijun memanggil beberapa alat dalam satu giliran.
Biarkan SDK mengelola loop tool_use, pemformatan hasil, dan percobaan ulang untuk Anda.
Tulis skema dan deskripsi yang mengarahkan Haijun ke alat yang tepat.