DeepSeek V4-Flash-0731:thinking 關閉不生效怎麼查?

截至 2026 年 8 月 2 日,官方 Chat Completions 參考頁仍將 thinking 的預設值列為 enabled。因此,獲勝方案是核對最終出站 JSON,而不是相信設定檔或呼叫函式裡的開關;使用 OpenAI SDK 時,thinking 必須放在 extra_body。若官方端點直連已經顯示 disabled,但生產環境仍出現推理內容,就要繼續追查 SDK 序列化、共享閘道覆寫,以及 AI Agent 的隱藏子請求。
(最後更新於 2026 年 8 月 2 日;資料核實自官方更新紀錄、Thinking Mode 指南、Chat Completions API 參考與官方定價頁。)
這篇適合三類讀者:
- 使用 OpenAI SDK 或相容框架呼叫 DeepSeek V4-Flash-0731,卻仍收到
reasoning_content的應用開發者。 - 維護模型閘道、代理層或統一 SDK,需要找出 thinking 參數在哪一層被覆蓋的平台工程師。
- 執行多步驟 AI Agent,主請求已關閉 thinking,但總用量、延遲或回應欄位仍然異常的團隊。
先分清楚:服務端仍在推理,還是舊資料造成錯覺
最常見的錯誤判斷是:設定檔中已寫入 disabled,前端仍看到 reasoning_content,於是直接認定新模型沒有遵守設定。這個結論不夠可靠。
DeepSeek 官方文件明確列出,OpenAI 格式的 thinking 控制物件為:
{
"thinking": {
"type": "disabled"
}
}
如果請求沒有明確傳入這個物件,不能把「程式碼內部的布林值」視為服務端已關閉。API 參考頁同時列出 enabled 與 disabled,並將預設值標示為 enabled。(api-docs.deepseek.com)
先對同一筆呼叫比對四個欄位:
- 請求 ID 或追蹤 ID。
- 最終出站請求中的
model。 - 回應中的
model、reasoning_content與content。 - 該次呼叫的開始時間、結束時間與 usage。
只有這四組資料能對上,才算是在分析同一筆請求。前端畫面殘留的推理文字、資料庫保存的歷史 assistant 欄位,以及串流解析器尚未清空的緩衝區,都不能直接證明目前這次請求仍處於 thinking 模式。
截至官方遷移資訊,舊有 deepseek-chat 與 deepseek-reasoner 已在 2026 年 7 月 24 日 15:59 UTC 後退役;目前 API 應使用 deepseek-v4-flash 或 deepseek-v4-pro 這類 model ID。主題中的 DeepSeek V4-Flash-0731 可作為版本識別,但不能把版本顯示名稱誤當成必然可接受的請求 model ID。(api-docs.deepseek.com)
為什麼已關閉 thinking 後仍有 reasoning_content?
先不要從 UI 或歷史紀錄推測。把當前請求的 request ID、出站 JSON 與原始回應放在同一筆 trace 中,再判斷該欄位是現行回應產生,還是應用層重新拼接出來。
OpenAI SDK:設定位置正確,才算真的傳出
OpenAI SDK 的主要陷阱,不是 disabled 拼字,而是參數層級。官方 Thinking Mode 指南要求在 Chat Completions 中,將 thinking 放進 extra_body;只把它放在應用自訂設定、環境變數,或 SDK 不支援的頂層欄位,並不會自動進入 HTTP body。(api-docs.deepseek.com)
最小化檢查樣本可以保留到這個程度:
response = client.chat.completions.create(
model="deepseek-v4-flash",
messages=[{"role": "user", "content": "health check"}],
extra_body={"thinking": {"type": "disabled"}},
)
這段不是完整接入教學,而是用來確認參數是否位於正確位置。真正要記錄的是脫敏後的最終出站 JSON,例如:
{
"model": "deepseek-v4-flash",
"thinking": {
"type": "disabled"
},
"messages": "[已脫敏]"
}
不要只截取呼叫函式的輸入參數。很多問題發生在 HTTP client、序列化器或相容層之後;程式碼畫面顯示有 extra_body,不等於線上封包也有同樣內容。
直連、SDK 封裝與生產閘道的差異
排障時應把同一個固定輸入分成三條路徑,不要一次修改所有元件:
| 檢查路徑 | 應確認的內容 | 能排除的問題 | 仍需追查的風險 |
|---|---|---|---|
| 官方端點直連 | model、thinking.type、原始回應欄位 |
API 端點與基本參數格式 | SDK 或閘道問題 |
| 現有 OpenAI SDK | SDK 輸入與序列化後 JSON | extra_body 是否被保留 |
二次封裝、代理層 |
| 生產閘道 | 入站 JSON、改寫後 JSON、實際路由 model | 租戶、別名、環境變數覆寫 | Agent 子請求與重試 |
封裝層丟欄位:介面有開關,封包沒有內容
許多團隊會在共用 SDK 中建立白名單,例如只保留 model、messages、temperature、stream。當 extra_body 不在白名單內,整個物件可能在序列化前被移除;另一種情況是 extra_body 被保留,但內層的 thinking 被過濾。
應在三個位置各留一份短紀錄:
- 應用程式傳入的參數。
- 二次封裝或適配器輸出的參數。
- 網路層實際送出的 JSON。
三者中,第一次缺少 thinking 的位置,就是優先修復點。框架介面顯示「關閉」只能作為操作線索,不能作為證據。
共享閘道覆寫:不要靠改 model 名稱碰運氣
統一閘道可能依照模型別名、租戶、任務標籤或流量策略注入預設值。例如應用送出 disabled,閘道卻在路由階段重新補上:
{
"thinking": {
"type": "enabled"
}
}
也有閘道沒有改寫 thinking,但將請求導向另一個模型別名,導致團隊只看名稱,沒有確認實際路由結果。
OpenAI SDK 呼叫 DeepSeek V4 時,thinking 參數應該放在哪裡?
放在 extra_body 內的 thinking 物件。驗收時同時確認 model 與 thinking.type,不能只看 SDK 呼叫端的設定檔。官方文件也指出,Chat Completions 的 model ID 應為 deepseek-v4-flash 或 deepseek-v4-pro。(api-docs.deepseek.com)
主請求關閉,不代表 Agent 子請求也關閉
AI Agent 通常不只發出一次模型請求。至少要拆開觀察:
- 使用者可見的主請求。
- 任務規劃請求。
- 工具呼叫前後的推理回合。
- 工具失敗後的重試。
- 背景摘要、記憶整理或網路搜尋摘要請求。
官方工具呼叫範例顯示,thinking 模式下,工具回合可能產生多次子請求,並需要在後續請求傳回 reasoning_content。因此,入口函式加上 disabled,不會自動保證 Agent 框架建立的每一個隱藏請求都繼承相同設定。(api-docs.deepseek.com)
如何確認 AI Agent 的隱藏子請求也關閉了 thinking?
為每一層請求加上 trace 標籤,至少記錄 parent_id、請求類型、model、thinking.type、是否出現 reasoning_content、usage 與回應時間。最後用呼叫樹找出仍然產生推理內容或額外用量的節點,而不是把整筆 Agent 用量歸因到主請求。
以下清單適合放進回歸測試或上線前驗收:
- [ ] 固定一組已脫敏輸入,為每次回放建立唯一 request ID。
- [ ] 直接連線官方端點,確認 model 為
deepseek-v4-flash。 - [ ] 在最終出站 JSON 中確認
thinking.type明確為disabled。 - [ ] 分別保存 SDK 輸入、適配器輸出與網路層封包。
- [ ] 比對測試閘道與生產閘道,找出欄位首次出現差異的位置。
- [ ] 將主請求、規劃、工具呼叫與重試請求分開統計。
- [ ] 檢查當前回應,而非歷史訊息或前端快取,是否仍有
reasoning_content。 - [ ] 以同一輸入完成直連、SDK 與生產回放後,再決定修復是否生效。
提醒: 不要用「延遲變短」或「帳單看起來下降」單獨判定 thinking 已關閉。延遲會受排隊、重試、頻寬與閘道路由影響;必須先確認最終請求體與當前回應欄位,再分析 usage 和費用。
用隔離回放確認成本問題,而不是預設降幅
「關閉 thinking 後成本仍然很高」通常有三種可能:
disabled根本沒有送到服務端。- 主請求已關閉,但 Agent 子請求仍使用預設模式。
- thinking 已關閉,異常其實來自重試、長輸入、工具回合或歷史訊息拼接。
官方文件把 thinking 預設值列為 enabled,並說明推理內容會以 reasoning_content 欄位回傳;費用則應依官方定價頁與實際 token usage 核對,不能先假設關閉後一定會下降固定比例。(api-docs.deepseek.com)
建議使用同一份脫敏輸入做三次回放:
- 官方端點直連。
- 現有 SDK 與應用封裝。
- 生產閘道及完整 Agent 鏈路。
每次都保存:
- 最終
model。 thinking.type。- 是否出現當前回應的
reasoning_content。 - 請求數量、重試數量與 usage。
- 每個子請求的 trace 關聯。
如果直連與 SDK 都是 disabled,只有生產閘道變成 enabled,修復方向就是閘道規則或環境設定;如果三條路徑都顯示 disabled,但總用量仍高,應轉向檢查 Agent 是否重複呼叫、工具失敗重試或輸入資料膨脹。這樣才能把「thinking 關閉不生效」與一般成本歸因問題分開。
目前環境與雲端 Mac 回放環境的取捨
在本機或共用 CI 環境中排查,常見缺點是 SDK 版本、閘道設定與 Agent 執行環境不容易固定;同一份程式在開發機、測試機與生產伺服器上,可能經過不同的環境變數與代理規則。若直接在共用環境修改,還會把修復前後的封包混在一起,難以還原問題。
較穩妥的做法,是先建立獨立測試環境,再把直連、SDK 封裝和生產閘道逐層回放。若需要固定 macOS 軟體版本、隔離測試資料與保存多組回放紀錄,可先閱讀 ProxyMac 使用說明,再按測試週期查看 ProxyMac 方案與租賃選項。
這類環境不適合長期承載穩定的大量生產負載,也不適合必須直接接觸實體裝置的測試。它的價值在於短期隔離:讓 SDK、閘道、Agent 版本與出站請求可以被固定,方便確認是哪一層重新開啟 thinking。
若目前方案是共用本機或一般 CI,版本漂移、背景程序干擾與環境變數殘留會讓問題反覆出現;若改用 ProxyMac 的租賃 Mac 作為獨立回放節點,則更適合需要臨時算力、短期相容性驗證或多版本並行測試的情境。對於已經確認要長期穩定運行的重負載服務,自購 Mac 或固定的生產基礎設施通常更容易控制;對於只想驗證 disabled 是否一路傳到最終子請求,先租用隔離環境往往比改動現有生產鏈路更安全。