CCA · Foundations

tool_choice: auto, any, และ forced

แนวคิด

พารามิเตอร์ tool_choice ควบคุมว่าโมเดลจะเรียก tool หรือไม่ และเรียกตัวไหน มีสี่ค่า ค่าแรกคือ auto โมเดลตัดสินเองว่าจะเรียก tool ไหมในแต่ละเทิร์น เป็นค่าเริ่มต้นเมื่อมี tools ค่าที่สองคือ any โมเดลต้องเรียก tool สักตัว แต่เลือกเองว่าตัวไหน ค่าที่สามคือ forced เขียนเป็น {"type": "tool", "name": "..."} บังคับให้เรียก tool ที่ระบุเสมอ ค่าที่สี่คือ none ห้ามเรียก tool ใด ๆ เป็นค่าเริ่มต้นเมื่อไม่มี tools

จุดที่ต้องรู้คือ เมื่อ tool_choice เป็น any หรือ forced API จะ prefill ข้อความของ assistant เพื่อบังคับให้เกิด tool use แปลว่าโมเดลจะไม่พิมพ์ข้อความธรรมชาติหรือคำอธิบายก่อน tool_use block แม้เราจะสั่งให้อธิบาย ถ้าอยากได้ทั้งคำอธิบายและการเรียก tool เจาะจง ให้ใช้ auto แล้วสั่งใน user message แทน เช่น "ใช้ tool get_weather ในคำตอบ"

ทำไมสำคัญ

any มีประโยชน์เมื่อเรารับประกันว่าต้องมีการเรียก tool ไม่ใช่ข้อความสนทนา เช่น pipeline ที่ผลลัพธ์ต้องมาจาก tool เสมอ ส่วน forced มีประโยชน์เมื่อเราต้องการให้ tool ตัวใดตัวหนึ่งถูกเรียกก่อน exam guide ยกตัวอย่างการบังคับให้ extract_metadata ทำงานก่อน enrichment tool อื่น ๆ แล้วประมวลผลขั้นต่อไปในเทิร์นถัดไป รูปแบบนี้ทำให้ลำดับที่จำเป็นเกิดขึ้นแน่นอน แทนที่จะหวังให้โมเดลเลือกลำดับเอง

การบังคับ tool ตัวแรกด้วย forced ต่างจากการใช้ programmatic prerequisite ที่บล็อกการเรียกจนกว่าเงื่อนไขจะครบ tool_choice จัดการที่ระดับ "รอบนี้เรียกอะไร" ส่วน prerequisite จัดการที่ระดับ "ห้ามเรียกจนกว่า..." ทั้งสองเป็นกลไกคนละชั้น เลือกใช้ตามว่าต้องการควบคุมจุดไหน

มีข้อจำกัดที่ควรจำจากเอกสาร เมื่อใช้ extended thinking ร่วมกับ tool use ค่า any และ forced ไม่รองรับและจะ error รองรับเฉพาะ auto (ค่าเริ่มต้น) กับ none นอกจากนี้การเปลี่ยน tool_choice จะทำให้ cache ของ message block ใช้ไม่ได้ แม้ tool definition กับ system prompt จะยัง cache อยู่ก็ตาม

ตัวอย่าง

// auto — โมเดลตัดสินเอง (ค่าเริ่มต้นเมื่อมี tools)
{ "tool_choice": {"type": "auto"} }

// any — ต้องเรียก tool สักตัว แต่เลือกเอง
{ "tool_choice": {"type": "any"} }

// forced — บังคับ tool ตัวนี้ก่อน (เช่น extract_metadata ก่อน enrichment)
{ "tool_choice": {"type": "tool", "name": "extract_metadata"} }

// none — ห้ามเรียก tool
{ "tool_choice": {"type": "none"} }

mustCallTool: false

mayReturnText: true

toolCalled:

tool_choice: {type: "auto"} — Claude ตัดสินใจเองว่าจะเรียก tool หรือไม่ อาจตอบเป็นข้อความล้วนก็ได้

เช็คความเข้าใจ

tool_choice สี่ค่าคืออะไร และแต่ละค่าทำอะไร

เมื่อใช้ any หรือ forced พฤติกรรมของโมเดลต่างไปอย่างไร และมีข้อจำกัดกับ extended thinking อย่างไร

อ่านต่อ