隨著 GPT-5.6 的發布,我們推出了程式化工具呼叫(Programmatic Tool Calling),現在正是回顧 Agent 工具以及如何在工具使用量增長時保持模型專注的好時機。
問客服專員為什麼訂單 A-104 延遲,他可能會查詢訂單、致電貨運公司,然後解釋延誤原因。這個過程隱藏了一個循環:模型請求一個動作,執行環境執行它,然後結果返回。內建工具、MCP、技能、工具搜尋(Tool Search)和程式化工具呼叫(Programmatic Tool Calling)改變了模型看到的內容以及返回的結果。
1. 工具呼叫 101:模型請求;應用程式執行
透過客戶自有函式,模型不會執行你的程式碼。它會返回一個工具名稱、JSON 引數和呼叫 ID。你的應用程式會檢查請求、執行函式,並使用相同的 ID 返回 function_call_output。

客戶自有工具循環:在你的應用程式執行步驟 3 之前,不會發生任何外部動作。使用 Codex 中的 GPT-Image-2 生成。
在 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)
這個框架會重複此循環,直到模型返回最終訊息。嚴格的 schema 能保持引數結構良好;執行器仍會檢查權限。
2. 工具執行可以在不同地方運行
內建工具,包括網路搜尋、檔案搜尋和託管 Shell,可以在 OpenAI 的基礎設施中運行。一個遠端 MCP 伺服器可以遠端暴露和執行工具;Responses 支援這些伺服器和 OpenAI 維護的連接器,預設情況下會在分享資料前要求批准。
一個技能捆綁了指令和檔案。將其附加到託管 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. 工具搜尋:當上下文成為限制
每個可見的工具定義都會佔用上下文。名稱、描述和 schema 會消耗輸入 token,相似的工具變得更難區分,而一個龐大的 MCP 目錄就會變成一個巨大的提示詞。
工具搜尋讓相容的 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)
託管工具搜尋會從請求中宣告的工具中選擇;客戶端執行的搜尋可以返回當前租戶或專案的相關工具。搜尋增加了一個步驟,因此小型目錄可能獲益不大。一個延遲載入的函式仍然會暴露其名稱和描述,而一個 namespace 或 MCP 伺服器則可以從一個簡短的描述開始。已載入的工具會被附加到末尾,以保留快取前綴。技能延遲了指令和檔案;工具搜尋則延遲了可呼叫的 schema。
4. 用於可預測多工具工作的程式化工具呼叫
直接呼叫會將每個結果返回給模型。當一個結果會改變下一個決策時,這很有用,但簡單的聯接、過濾和並行查詢可能會用程式碼可以減少的資料填滿上下文。
程式化工具呼叫讓 GPT-5.6 能夠編寫在一個全新的、隔離的 V8 執行環境中運行的 JavaScript。V8 在 Chrome 內部運行 JavaScript,但這不是瀏覽器或 Node.js。它支援頂層 await、迴圈、條件和並行呼叫,但無法安裝套件、直接網路存取、通用檔案系統、子程序、console 或持久狀態。

三個直接呼叫與在隔離的 V8 執行環境中三個並行呼叫的比較。使用 Codex 中的 GPT-Image-2 生成。
當一個程式到達客戶自有函式時,它會暫停,等待你的應用程式執行該呼叫;返回其 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 和程式碼直譯器,但不能呼叫網路搜尋或檔案搜尋。頂層工具搜尋必須在程式啟動前載入一個延遲工具;正在運行的程式無法搜尋工具。
當下一步需要模型判斷、批准、引用或副作用時,請保持直接呼叫。當明確的規則讓程式碼能夠返回更小的結果而不遺失證據時,請使用程式。託管執行改變了工作運行的位置,工具搜尋改變了哪些定義進入上下文,而程式化呼叫則改變了哪些結果返回。當評估顯示正確性得以保持,同時 token、延遲或成本有所改善時,可以將它們結合使用。
額外提示:在一個連線上保持長時間的工具循環
如果一個 Agent 在模型和客戶自有工具之間反覆切換,Responses WebSocket 模式可以減少連續開銷。這個 socket 將你的框架連接到 Responses;它不會讓工具運行得更快。它接受相同的 response.create 欄位,用於函式、MCP、工具搜尋和程式化工具呼叫,儘管文件並未對每種組合進行基準測試。OpenAI 觀察到,在包含 20 個或更多呼叫的部署中,執行速度最高可提升 40%,因此請衡量你的工作流程。
在你的 Agent 中試試看
將這篇文章的 Appshot 帶入,在 Codex 中打開你的 Agent 專案,然後貼上:
使用這篇文章和當前的程式碼庫來升級此 Agent 的工具路徑。將大型或不常用的工具分組,並啟用工具搜尋以延遲載入它們。找出有邊界的階段,讓程式化工具呼叫可以並行運行呼叫並返回精簡的結果。將語意決策、批准、引用和副作用保留為直接呼叫。在更改生產路由之前,比較兩條路徑的正確性、證據覆蓋率、工具成功率、token 數、延遲、重試次數和成本。





