OpenAI DevDay 2026 API 更新後,開發者如何遷移現有 JSON Tool Calling 工作流?
先改寫回,再改模型名。目標若是 gpt-6-astra 或 gpt-6.1-sol,工具呼叫要離開 Chat Completions,改走 Responses API。只做分類或路由的那一跳,可以改到 10 月 6 日公測的 Decisions API。查單仍是 lookup_order。模型只填 JSON,宿主執行。
閱讀前速覽
| 物件 | 官方事實 | 遷移時改什麼 |
|---|---|---|
| 入口 | Astra、GPT-6.1 Sol 的工具呼叫走 Responses。Sol、Luna 僅在 reasoning_effort 為 none 時,Chat Completions 能帶函式 | 改 POST /v1/responses,或明確留下 none |
| 工具物件 | Responses 的 name 與 type 同級。省略 strict 會嘗試嚴格模式,不相容則回退並標 strict: false | 顯式寫 strict。宿主仍要校驗 |
| 回寫 | function_call 與 function_call_output 用 call_id。async: true 不把執行交給模型 | role:tool 改成 function_call_output |
| 路由 | 2026-10-06 Decisions 公測,僅 gpt-6-luna。choice 不執行工具 | 只選列舉的一跳可以搬走 |
事實截至 2026-10-08 的官方文件:Using GPT-6、Migrate to the Responses API、Decisions、Async tool calling。訂單 A-1042 是虛構的。Decisions 回覆裡的機率是示意數字。
先換寫回形狀,再換模型名
DevDay 之後要遷的是欄位,不是再講一遍 Agent。官方遷移說明集中在四條。第一,目標模型若是 gpt-6-astra 或 gpt-6.1-sol,工具呼叫改走 Responses。這兩款仍可在 Chat Completions 裡發不帶工具的請求。gpt-6-sol 與 gpt-6-luna 只有 reasoning_effort 為 none 時,才能在 Chat Completions 裡做函式呼叫。要帶著推理調工具,同樣走 Responses。第二,工具物件從外層 function 裡的 name,改成與 type 同級。第三,回寫從 tool_calls[].id 改成 call_id。第四,只做分類或路由的那一跳,可以改到 Decisions;它不執行工具。
- Astra / GPT-6.1 Sol:工具呼叫離開
/v1/chat/completions。Responses 裡這個欄位叫reasoning.effort。 - 定義攤平,strict 寫明。Chat Completions 預設非嚴格。Responses 省略
strict會嘗試嚴格模式。 - 路由與查單拆開。
choice只返回列舉。查單仍是lookup_order。
9 月 29 日發了什麼,見 DevDay 2026 釋出了什麼。Responses 和 Agents 的入口差別,見 Agents API 與 Responses API 的差別。本篇不重寫那兩篇,只寫現有 JSON Tool Calling 怎麼改欄位。
先認出現在讀的是哪一種呼叫
Chat Completions 的模型回覆裡,一次呼叫長這樣。id 在外層,name 在 function 裡。arguments 是字串。虛構訂單,不要貼真實金鑰:
{
"id": "call_3c91",
"type": "function",
"function": {
"name": "lookup_order",
"arguments": "{\"order_id\":\"A-1042\"}"
}
}
Responses 的工具定義把 name 抬到與 type 同級。strict 不要省。省略時,Responses 會嘗試嚴格模式;Schema 不相容就回退,並在返回的工具上給出 strict: false。要保持非嚴格,顯式寫 false。宿主仍要在執行前校驗 arguments:
{
"type": "function",
"name": "lookup_order",
"strict": true,
"parameters": {
"type": "object",
"properties": {
"order_id": { "type": "string", "pattern": "^[A-Z]-\\d{4}$" }
},
"required": ["order_id"],
"additionalProperties": false
}
}
回寫只認 call_id
模型給出的呼叫項是 function_call,不是 tool_calls 陣列。解析器改讀這四項:
{
"type": "function_call",
"call_id": "call_3c91",
"name": "lookup_order",
"arguments": "{\"order_id\":\"A-1042\"}"
}
宿主解析 arguments,過 Schema,執行 lookup_order,再按同一 call_id 寫回。失敗也是字串裡的物件。手寫歷史時,把上一輪的 reasoning 項和 function_call 一起送回,不要只送結果。更省事的是 previous_response_id:
{
"type": "function_call_output",
"call_id": "call_3c91",
"output": "{\"order_id\":\"A-1042\",\"status\":\"paid\"}"
}
慢工具可以在定義上加 async: true。官方寫明:模型可以繼續推理,或回答不依賴該結果的部分;對應呼叫項會帶 async: true;你稍後用原來的 call_id 提交 function_call_output。宿主仍執行。內建工具和 programmatic tool calling 不能用 async。Multi-agent 裡不要把 async 和並行工具呼叫疊在一起。文件寫的是 GPT-6 Astra 及之後的模型。
五條循環,不要合成一次升級
按現在的寫回形狀分開遷。物件名不同,就不要共用一個解析器:
| 現在的循環 | 遷到哪裡 |
|---|---|
| Chat Completions + tools,目標是 Astra 或 GPT-6.1 Sol | 改 POST /v1/responses。tool_calls[].id 改成 call_id。name 從 function 裡抬出來。 |
| Chat Completions + tools,留在 gpt-6-sol 或 gpt-6-luna | 只有 reasoning_effort 為 none 才能留下。要推理再調工具,改 Responses。 |
| 已經是 Responses 的 function_call | 循環留下。換模型 ID。Astra 與 GPT-6.1 Sol 不支援 none,用 low。推理力度不是 none 時,去掉 temperature、top_p、top_logprobs。 |
| 工具只返回 lookup / hold / escalate | 這一跳改 POST /v1/decisions,模型只 gpt-6-luna。查單仍是 function_call。 |
| Agents API 的 session | 要託管 harness 就留在 Agents。回寫仍是 turn_id,不是 function_call_output。 |
路由那一跳用 Decisions 的 choice。請求是 10 月 6 日公測文件的形狀,訂單是虛構的。不要把 9 月 30 日那篇裡自擬的答案合約原樣 POST 到 /v1/decisions:
{
"model": "gpt-6-luna",
"input": "Order A-1042 is paid. What should the host do next?",
"questions": [{
"type": "choice",
"name": "next_step",
"instructions": "Pick the next host action. Do not invent a tool name.",
"choices": [
{ "value": "lookup", "description": "Read the order. No refund." },
{ "value": "hold", "description": "Stop and wait." },
{ "value": "escalate", "description": "Hand the case to a person." }
]
}]
}
示意回覆的欄位名跟官方 choice 示例一致,機率是虛構的。宿主看到 choice 為 lookup,才發 lookup_order。hold 停止。escalate 交給人。type 為 refusal 時不呼叫工具。閾值由你定。影象必須是內聯 base64 data URL,不能用 https 圖片地址或 file_id:
{
"answers": [{
"type": "choice",
"name": "next_step",
"choice": "lookup",
"probabilities": [
{ "value": "lookup", "probability": 0.91 },
{ "value": "hold", "probability": 0.05 },
{ "value": "escalate", "probability": 0.04 }
],
"confidence": 0.88
}]
}
Ultrafast 是 gpt-6-astra 的 service_tier,值為 ultrafast。它只支援美國資料駐留和全球處理,不支援歐盟及其他區域端點,也不改工具 JSON。GPT-6.1 Sol 的 Ultrafast 在 9 月 29 日的官方回顧裡仍是即將提供,本篇不把它寫成已經。Agents API 在 9 月 29 日加上託管瀏覽器的 Computer Use,站點批准和登入仍由你的應用處理。那不構成把 Responses 的 function_call_output 換成別的形狀的理由。錯位監控可能告警或停下對話;停下時不要把同一個工具呼叫盲目重放。
六步遷完,再切換請求
不要從「先開 Ultrafast」開始。按寫回形狀寫:
- 標出當前寫回。是
role: tool加tool_call_id,是function_call_output,還是 Agents 的turn_id。三種不要共用一個解析器。 - 選定入口。Astra 與 GPT-6.1 Sol 的工具呼叫改
POST /v1/responses。Sol 與 Luna 只有reasoning_effort為none才能留在 Chat Completions。 - 攤平工具定義,strict 寫明。Schema 用了嚴格模式不接受的寫法,就設
strict: false,宿主照樣校驗。查單隻收order_id。 - 對齊 call_id,去掉取樣引數。
arguments仍是字串。Astra 與 GPT-6.1 Sol 用low代替none。推理力度不是 none 時,去掉temperature、top_p、top_logprobs。Chat Completions 再去掉logprobs。Responses 的include裡去掉message.output_text.logprobs。從 GPT-5.5 或更早遷來時,把prompt_cache_retention換成prompt_cache_options.ttl的30m。中途改推理力度用configuration_update,請求級reasoning.effort保持不動。 - 只選列舉的那一跳改 Decisions。模型用
gpt-6-luna。宿主把lookup對映到lookup_order。慢工具再加async: true,回寫仍用原來的call_id。 - Diff 兩份 JSON,再切換請求。Schema 校驗
arguments和answers[].choice。對不上就不要換模型 ID。
Schema 怎麼當門,見 Agents API + JSON Schema。為什麼這道門不能只寫在提示裡,見 AI 為什麼需要 JSON Schema。Agents 的回寫形狀,見 Agents API 的工具 JSON。
切換請求前攤開三份 JSON
一次翻車,多半是 id 沒對上、name 還套在 function 裡、或把 choice 當成了已經查完的訂單。
- 把舊的 tool call 和新的 function_call 格式化,再用 Schema 校驗 看
arguments和answers[0].choice是否落在門裡。 - 用 JSONPath 提取 抽出
$.call_id、$.name、$.answers[0].choice。 - 用 JSON Diff 對比遷移前後的載荷。先補
call_id,再改提示。 - 核對
call_3c91在呼叫和function_call_output上是不是同一個 id。 - 訂單、令牌、倉庫路徑不要貼進公共格式化站。JSONSort 在瀏覽器本地跑。
三份物件都能按 Schema 重建,才算遷完。Ultrafast 不代替這一步。
常見誤區
- 把 Decisions 當成新的 Tool Calling。它返回
choice、probability或score。要模型填工具引數,仍用 Responses 的函式呼叫。要一份自定 Schema 的物件,用 Responses 的 Structured Outputs。 - 工具定義仍套一層 function。Responses 讀不到舊的
function.name。name 與 type 同級。 - 省略 strict,以為還是非嚴格。Responses 會嘗試嚴格模式,不相容就回退並標
strict: false。要哪種行為,就寫明。宿主校驗照舊。 - 在 Astra 或 GPT-6.1 Sol 上留下 none 或 temperature。這兩款不支援
none。GPT-6.1 Sol 也不支援minimal。用low。推理力度不是 none 時,取樣引數要拿掉。 - 為了 Computer Use 把 Responses 循環整段搬進 Agents API。9 月 29 日加的是託管瀏覽器,批准仍在你的應用。Agents 的回寫是
turn_id。 - 把 async: true 理解成模型自己執行。宿主仍跑工具,並負責未完成的呼叫。稍後用原來的
call_id寫回。
FAQ
Chat Completions 必須關嗎?
帶工具、且模型是 gpt-6-astra 或 gpt-6.1-sol 時,要改走 Responses。這兩款的 Chat Completions 仍可發不帶工具的請求。gpt-6-sol 與 gpt-6-luna 只有 reasoning_effort 為 none 時,才能在 Chat Completions 裡做函式呼叫。要推理再調工具,走 Responses。
Decisions 能發出 function_call 嗎?
不能。它返回帶型別的答案:predicate 的 probability、choice、或 score。宿主把 choice 對映到已有函式。公測端點是 POST /v1/decisions,目前只有 gpt-6-luna。官方稱它比 Responses 大約快 10 倍,那是分類速度,不是查單。
strict 不寫會怎樣?
Chat Completions 預設非嚴格。Responses 省略 strict 會嘗試嚴格模式;Schema 不相容就回退,返回的工具上是 strict: false。要保持非嚴格,顯式寫 false。無論模型側是否嚴格,宿主都要再校驗 arguments。
已有的 Agents session 要不要改回寫?
不要。Agents API 仍是公測。回寫保持 turn_id。Computer Use 是託管瀏覽器上的另一張許可權,站點批准和登入由你的應用處理。要自己控每一步,繼續用 Responses 的 function_call_output。
Ultrafast 會改工具 JSON 嗎?
不會。它是 gpt-6-astra 上的 service_tier: ultrafast,只支援美國資料駐留和全球處理。工具定義、call_id 和 Schema 都不變。GPT-6.1 Sol 的 Ultrafast 不要寫成已經可用。
結論
DevDay 2026 之後的 JSON Tool Calling 遷移,是換寫回形狀。Astra 與 GPT-6.1 Sol 的工具呼叫走 Responses。name 與 type 同級。結果用 call_id 送回。只選列舉的那一跳可以改 Decisions。查單仍由宿主執行。
先寫清 A-1042 是進 lookup_order 的 arguments,還是進 Decisions 的 input。能指到 call_3c91 和 answers[0].choice,再切換請求。
延伸閱讀
- OpenAI DevDay 2026 釋出了什麼 9 月 29 日的官方清單,不是本篇的遷移步驟
- Agents API vs Responses API 兩條入口的回寫不同
- OpenAI Agents API 與 JSON Tool Calling 公測物件,本篇不重寫
- Agents API + JSON Schema 穩定、可驗證、可執行
- 為什麼 AI 需要 JSON Schema Schema 是門
- JSONSort 本地工具箱 格式化、校驗、Diff、Schema
- 全部文章 更多 JSON 與 AI 開發筆記
更新記錄: 首次釋出