本文目錄
用官方 DeepSeek API、開著思考模式又帶工具呼叫時,光禿禿的 400 往往更像歷史丟了,而不是工具 schema 寫錯。DeepSeek《Thinking Mode》指南寫得很清楚:請求帶 tools 時,必須在後續每一次請求裡完整回傳此前各輪的 reasoning_content。故意丟掉,或經只保留 content 的儲存、代理、序列化層弄丟,API 都會拒收。下文按北京時間 2026 年 10 月 26 日該指南整理。僅供參考;本站暫時還沒有實測復現,也沒有驗證修復。 關於 DeepSeek 工具呼叫 400 的回饋,可透過網站底部站長聯絡方式提交。
症狀:思考模式 + tools 時回 400
DeepSeek 的 Chat Completions 預設開啟思考模式。模型先輸出思維鏈,再給最終答案。這兩部分作為助手訊息上的同級欄位到達:reasoning_content 與 content。
一旦同時傳入 tools 陣列,DeepSeek 就要求對話歷史裡留住這段思維鏈。文件寫明:若程式碼沒有正確回傳 reasoning_content,API 會回傳 400。本文只談這一類失敗——不是鑑權失敗、不是限流,也不是把所有 400 一鍋端。
規則:回傳歷史全部 reasoning_content
凡請求攜帶 tools:
- 回傳此前所有輪次的
reasoning_content。 - 這些值會拼進模型上下文。
- 即使某輪模型沒有發起工具呼叫,也必須在後續每一次請求裡繼續回傳。
官網範例裡最穩妥的預設寫法,是把 SDK 回傳的整條助手訊息物件直接追加:
messages.append(response.choices[0].message)該物件已包含 content、reasoning_content、tool_calls。明示寫法等價於:
messages.append({
"role": "assistant",
"content": response.choices[0].message.content,
"reasoning_content": response.choices[0].message.reasoning_content,
"tool_calls": response.choices[0].message.tool_calls,
})若自建歷史只按 role + content 重建助手訊息,就會默默丟掉 reasoning_content——下一輪帶 tools 的請求就可能直接 400。
請求不帶 tools 時
不帶 tools 時,規則反過來:
- 不必回傳
reasoning_content。 - 即便傳了,API 也會忽略,且不會拼進上下文。
因此從不掛工具的多輪對話可以只留 content,行為仍符合「多輪對話」一節。硬性要求從請求裡出現 tools 那一刻起才生效。
reasoning_content 常在哪裡被丟掉
訪客側常見剝欄位位置:
- 客戶端訊息儲存只持久化
role與content,再拼下一輪歷史。 - 代理/閘道只放行 OpenAI 形欄位,把
reasoning_content當未知鍵丟掉。 - 歷史庫/ORM 有
content欄、沒有思維鏈欄。 - 手寫 JSON 序列化抄了同輪的
tool_calls,卻漏了兄弟欄位reasoning_content。
若在 SDK 回應與下一次請求之間還有自建層,請在追加工具結果、再打下一發 completion 的前後,確認該欄位還能完整走一圈。
這不是什麼
邊界說清楚,這篇才好用:
- 不是 DeepSeek 上每一個 HTTP 400 都等於丟了
reasoning_content。 非法載荷、鑑權問題、其他校驗失敗也會 400。當思考模式與tools同時在場時,把它當成文件寫明的原因之一即可。 - 不是 DeepSeek Harness 安裝教學。 安裝或接線 coding harness 是另一篇——見 DeepSeek Harness 安裝教學:Windows、Linux、CLI 與外掛。本文只談思考模式 +
tools的 API 歷史回傳規則。 - 範圍是官方 DeepSeek API。 上文跟官方 Thinking Mode 文件;第三方中轉可能不同,請另查對方文件。
相關閱讀
站內相近的 DeepSeek/harness 上下文:
