ด้วย GPT-5.6 เราได้เปิดตัว Programmatic Tool Calling ทำให้ถึงเวลาที่ดีที่จะสรุปเครื่องมือสำหรับเอเจนต์และวิธีการทำให้โมเดลมีสมาธิเมื่อมีการใช้เครื่องมือมากขึ้น
ถามเจ้าหน้าที่สนับสนุนว่าทำไมคำสั่งซื้อ A-104 ถึงล่าช้า มันอาจอ่านคำสั่งซื้อ โทรหาผู้ให้บริการขนส่ง และอธิบายความล่าช้า การแลกเปลี่ยนนั้นซ่อนลูปไว้: โมเดลขอการดำเนินการ รันไทม์ดำเนินการ และผลลัพธ์จะถูกส่งกลับ เครื่องมือในตัว, MCP, ทักษะ, Tool Search และ Programmatic Tool Calling เปลี่ยนสิ่งที่โมเดลเห็นและสิ่งที่ส่งกลับมา
1. Tool Calling 101: โมเดลเป็นผู้ขอ; แอปพลิเคชันเป็นผู้ดำเนินการ
ด้วย ฟังก์ชันที่ไคลเอนต์เป็นเจ้าของ โมเดลจะไม่รันโค้ดของคุณ มันจะคืนชื่อเครื่องมือ, อาร์กิวเมนต์ JSON และ ID การเรียก แอปพลิเคชันของคุณตรวจสอบคำขอ รันฟังก์ชัน และส่งคืน function_call_output พร้อม ID เดียวกัน

ลูปเครื่องมือที่ไคลเอนต์เป็นเจ้าของ: ไม่มีการดำเนินการภายนอกใดๆ เกิดขึ้นจนกว่าแอปพลิเคชันของคุณจะดำเนินการขั้นตอนที่ 3 สร้างด้วย GPT-Image-2 ใน Codex
ใน Python การส่งคืน function_call_output จะส่งมอบการควบคุมกลับไปยังโมเดล:
1import json2from openai import OpenAI34client = OpenAI()56def get_order(order_id): return {"order_id": order_id, "promised_date": "2026-07-13"}78order_tool = {9 "type": "function", "name": "get_order", "strict": True,10 "description": "Return the promised delivery date for an order.",11 "parameters": {12 "type": "object",13 "properties": {"order_id": {"type": "string"}},14 "required": ["order_id"], "additionalProperties": False,15 },16 "output_schema": {17 "type": "object",18 "properties": {19 "order_id": {"type": "string"}, "promised_date": {"type": "string"},20 },21 "required": ["order_id", "promised_date"], "additionalProperties": False,22 },23}2425first = client.responses.create(26 model="gpt-5.6", tools=[order_tool], input="Why is order A-104 late?",27 tool_choice={"type": "function", "name": "get_order"},28)29call = next(item for item in first.output if item.type == "function_call")30result = get_order(**json.loads(call.arguments))3132final = client.responses.create(33 model="gpt-5.6",34 tools=[order_tool],35 input=[*first.output, {36 "type": "function_call_output",37 "call_id": call.call_id,38 "output": json.dumps(result),39 }],40)41print(final.output_text)
โครงสร้างรัด (harness) จะวนลูปนี้ซ้ำจนกว่าโมเดลจะส่งคืนข้อความสุดท้าย สคีมาที่เข้มงวดช่วยให้อาร์กิวเมนต์มีรูปแบบที่ดี; ตัวดำเนินการยังคงตรวจสอบสิทธิ์
2. การดำเนินการเครื่องมือสามารถทำงานในสถานที่ต่างๆ ได้
เครื่องมือในตัว รวมถึงการค้นหาเว็บ, การค้นหาไฟล์ และ hosted shell สามารถทำงานในโครงสร้างพื้นฐานของ OpenAI ได้ เซิร์ฟเวอร์ MCP ระยะไกล จะเปิดเผยและรันเครื่องมือจากระยะไกล; Responses รองรับเซิร์ฟเวอร์เหล่านี้และตัวเชื่อมต่อที่ OpenAI ดูแล โดยจะขออนุมัติตามค่าเริ่มต้นก่อนแชร์ข้อมูล
ทักษะ จะรวมคำแนะนำและไฟล์เข้าด้วยกัน แนบไปกับ hosted shell แล้วโมเดลจะสามารถทำตามขั้นตอนหรือรันสคริปต์ของมันได้ โดยจะเห็นชื่อ, คำอธิบาย และพาธของทักษะก่อน จากนั้นจะอ่าน SKILL.md เมื่อถูกเลือก
1carrier_mcp = {2 "type": "mcp",3 "server_label": "carrier",4 "server_url": "https://example.com/mcp",5 "allowed_tools": ["track_package"],6 "require_approval": "always",7}8incident_shell = {9 "type": "shell",10 "environment": {11 "type": "container_auto",12 "skills": [{"type": "skill_reference", "skill_id": "skill_..."}],13 },14}1516response = client.responses.create(17 model="gpt-5.6",18 tools=[carrier_mcp, incident_shell],19 input="Investigate why order A-104 is late using the incident skill.",20)
โครงสร้างรัดจะรวมพื้นผิวเหล่านี้เข้าด้วยกัน: MCP เปิดเผยเครื่องมือระยะไกล, ทักษะให้ขั้นตอนและไฟล์ และโครงสร้างรัดควบคุมว่าการเรียกจะทำงานที่ไหน
3. Tool Search: เมื่อบริบทกลายเป็นข้อจำกัด
ทุกคำจำกัดความของเครื่องมือที่มองเห็นได้ใช้บริบท ชื่อ, คำอธิบาย และสคีมาใช้โทเค็นอินพุต เครื่องมือที่คล้ายกันจะแยกแยะได้ยากขึ้น และแค็ตตาล็อก MCP ขนาดใหญ่ก็กลายเป็นพรอมต์ขนาดใหญ่
Tool Search ช่วยให้โมเดลที่รองรับ GPT-5.4 ขึ้นไปโหลดคำจำกัดความที่เลื่อนออกไปเมื่อจำเป็นเท่านั้น:
1shipping = {2 "type": "namespace", "name": "shipping",3 "description": "Order tracking and delivery tools.",4 "tools": [{5 "type": "function", "name": "get_delivery_eta",6 "description": "Return the ETA for an order.",7 "defer_loading": True,8 "parameters": {9 "type": "object", "required": ["order_id"],10 "properties": {"order_id": {"type": "string"}},11 "additionalProperties": False,12 },13 }],14}1516response = client.responses.create(17 model="gpt-5.6",18 input="When will order A-104 arrive?",19 tools=[shipping, {"type": "tool_search"}],20)
Hosted Tool Search เลือกจากเครื่องมือที่ประกาศในคำขอ; การค้นหาที่ดำเนินการโดยไคลเอนต์สามารถส่งคืนเครื่องมือสำหรับผู้เช่าหรือโปรเจกต์ปัจจุบัน การค้นหาเพิ่มขั้นตอน ดังนั้นแค็ตตาล็อกขนาดเล็กอาจได้ประโยชน์น้อย ฟังก์ชันที่เลื่อนออกไปยังคงเปิดเผยชื่อและคำอธิบาย ในขณะที่ namespace หรือเซิร์ฟเวอร์ MCP สามารถเริ่มต้นด้วยคำอธิบายสั้นๆ หนึ่งคำ เครื่องมือที่โหลดแล้วจะถูกต่อท้ายเพื่อรักษา cache prefix ทักษะเลื่อนคำแนะนำและไฟล์; Tool Search เลื่อนสคีมาที่เรียกได้
4. Programmatic Tool Calling สำหรับการทำงานหลายเครื่องมือที่คาดเดาได้
การเรียกโดยตรงจะส่งคืนแต่ละผลลัพธ์ให้กับโมเดล ซึ่งมีประโยชน์เมื่อผลลัพธ์เปลี่ยนการตัดสินใจครั้งต่อไป แต่การ join, filter และการค้นหาแบบขนานอย่างง่ายสามารถเติมบริบทด้วยข้อมูลที่โค้ดสามารถลดทอนได้
Programmatic Tool Calling ช่วยให้ GPT-5.6 เขียน JavaScript ที่ทำงานในรันไทม์ V8 ที่แยกออกมาใหม่ V8 รัน JavaScript ภายใน Chrome แต่นี่ไม่ใช่เบราว์เซอร์หรือ Node.js มันรองรับ top-level await, ลูป, เงื่อนไข และการเรียกแบบขนาน โดยไม่มีการติดตั้งแพ็คเกจ, การเข้าถึงเครือข่ายโดยตรง, ระบบไฟล์ทั่วไป, โปรเซสย่อย, คอนโซล หรือสถานะถาวร

การเรียกโดยตรงสามครั้งเปรียบเทียบกับการเรียกแบบขนานสามครั้งในรันไทม์ V8 ที่แยกออกมา สร้างด้วย GPT-Image-2 ใน Codex
เมื่อโปรแกรมเข้าถึงฟังก์ชันที่ไคลเอนต์เป็นเจ้าของ มันจะหยุดชั่วคราวในขณะที่แอปพลิเคชันของคุณรันการเรียก; การส่งคืน call_id และ caller ของมันจะดำเนินการต่อ carrier_mcp สามารถหยุดเพื่อขออนุมัติได้เช่นกัน และ output_schema จะบอก JavaScript ว่าสามารถตรวจสอบฟิลด์ใดได้บ้าง
1for tool in (order_tool, carrier_mcp):2 tool["allowed_callers"] = ["programmatic"]34response = client.responses.create(5 model="gpt-5.6",6 tools=[7 order_tool,8 carrier_mcp,9 {"type": "programmatic_tool_calling"},10 ],11 input="Compare order A-104 with carrier status and return delay evidence.",12)
โปรแกรมสามารถเรียกฟังก์ชันและเครื่องมือที่กำหนดเอง, MCP, apply_patch, shell และ code interpreter แต่ไม่สามารถเรียกการค้นหาเว็บหรือการค้นหาไฟล์ได้ Tool Search ระดับบนสุดต้องโหลดเครื่องมือที่เลื่อนออกไปก่อนที่โปรแกรมจะเริ่ม; โปรแกรมที่กำลังทำงานอยู่ไม่สามารถค้นหาเครื่องมือได้
ให้ใช้การเรียกโดยตรงเมื่อขั้นตอนถัดไปต้องการการตัดสินใจของโมเดล, การอนุมัติ, การอ้างอิง หรือผลข้างเคียง ใช้โปรแกรมเมื่อกฎที่ชัดเจนช่วยให้โค้ดส่งคืนผลลัพธ์ที่เล็กลงโดยไม่สูญเสียหลักฐาน การดำเนินการที่โฮสต์จะเปลี่ยนตำแหน่งที่ทำงาน, Tool Search เปลี่ยนคำจำกัดความที่เข้าสู่บริบท และการเรียกแบบโปรแกรมเปลี่ยนผลลัพธ์ที่ส่งคืน รวมเข้าด้วยกันเมื่อการประเมินแสดงให้เห็นว่าความถูกต้องยังคงอยู่ ในขณะที่โทเค็น, เวลาแฝง หรือต้นทุนดีขึ้น
โบนัส: ทำให้ลูปเครื่องมือยาวๆ อยู่ในการเชื่อมต่อเดียว
หากเอเจนต์สลับไปมาระหว่างโมเดลและเครื่องมือที่ไคลเอนต์เป็นเจ้าของซ้ำๆ โหมด WebSocket ของ Responses สามารถลดค่าใช้จ่ายในการดำเนินการต่อได้ ซ็อกเก็ตเชื่อมต่อโครงสร้างรัดของคุณกับ Responses; มันไม่ได้ทำให้เครื่องมือทำงานเร็วขึ้น มันยอมรับฟิลด์ response.create เดียวกันสำหรับฟังก์ชัน, MCP, Tool Search และ Programmatic Tool Calling แม้ว่าเอกสารจะไม่ได้วัดประสิทธิภาพทุกชุดค่าผสมก็ตาม OpenAI สังเกตเห็นการดำเนินการที่เร็วขึ้นถึง 40% ในการเปิดตัวที่มีการเรียก 20 ครั้งขึ้นไป ดังนั้นให้วัดปริมาณงานของคุณ
ลองใช้กับเอเจนต์ของคุณ
นำ Appshot ของบทความนี้ เปิดโปรเจกต์เอเจนต์ของคุณใน Codex แล้ววาง:
ใช้บทความนี้และโค้ดเบสปัจจุบันเพื่ออัปเกรดเส้นทางเครื่องมือของเอเจนต์นี้ จัดกลุ่มเครื่องมือขนาดใหญ่หรือที่ใช้งานไม่บ่อย และเปิดใช้งาน Tool Search เพื่อเลื่อนการโหลด ค้นหาขั้นตอนที่มีขอบเขตจำกัดซึ่ง Programmatic Tool Calling สามารถรันการเรียกแบบขนานและส่งคืนผลลัพธ์ที่กระชับ ให้คงการตัดสินใจเชิงความหมาย การอนุมัติ การอ้างอิง และผลข้างเคียงไว้เป็นการเรียกโดยตรง เปรียบเทียบทั้งสองเส้นทางในแง่ของความถูกต้อง ความครอบคลุมของหลักฐาน ความสำเร็จของเครื่องมือ โทเค็น เวลาแฝง การลองใหม่ และต้นทุน ก่อนที่จะเปลี่ยนเส้นทางการผลิต





