DeepSeek V4 踩坑:模型名换代 + 思考模式不再是独立模型
接入 DeepSeek 对话接口时,很多人的第一直觉是:普通对话用 deepseek-chat,需要推理就换 deepseek-reasoner。这套模型名心智在 V3 时代完全成立——两个名字对应两套能力,选模型就等于选模式。
结果 2026 年 V4 发布,DeepSeek 把这个设计翻了个底朝天:「是否思考」从模型名降维成了请求体参数,旧的两个模型名也设了弃用期限。如果代码里硬编码了 deepseek-reasoner / deepseek-chat,会在弃用截止日当天无声断掉,连错误提示都不一定足够清晰。
现象
按旧姿势调 /v1/chat/completions,model 字段写 deepseek-reasoner,接口当前还能正常返回(弃用期内兼容映射在跑)。但升级到 V4 后无法感知思考深度,也无从控制 reasoning_effort;一旦过了 2026-07-24 23:59(北京时间) 弃用截止,旧模型名直接失效。
根因
V4 把推理能力从「选不同模型」改成「同一模型 + 开关参数」。新模型只剩两个:
| 旧名 | V4 对应 | 默认思考状态 |
|------|---------|------------|
| deepseek-chat | deepseek-v4-flash | 非思考 |
| deepseek-reasoner | deepseek-v4-flash(+thinking) | 思考 |
| —— | deepseek-v4-pro | 思考(强) |
思考模式由请求体顶层的 thinking 字段控制,与 model 字段正交。同一个 deepseek-v4-flash 既可以快速非推理响应,也可以开启思考链——取决于你传不传 thinking: { type: "enabled" }。
V4 之后,选 deepseek-reasoner ≠ 开启推理。推理能力由 thinking.type 参数决定,模型名只决定「快 / 强」。继续用旧模型名不会立刻报错,但弃用截止后代码直接失效,且无法精细控制 reasoning_effort。
另一个容易踩的细节:思考态下不能传 temperature / top_p / presence_penalty / frequency_penalty,一起传会被拒绝或静默忽略。非思考态才传 temperature。
正解
把 model 字段换成 V4 新名字,思考开关移到请求体:
// 把「快档 / 深档」两个用户可选档位映射成 (model, thinking) 两根轴
const isPro = tier === 'deep' // deep = v4-pro 思考;fast = v4-flash 非思考
const body = {
model: isPro ? 'deepseek-v4-pro' : 'deepseek-v4-flash',
messages,
stream: true,
thinking: { type: isPro ? 'enabled' : 'disabled' },
// 思考态不传 temperature;非思考态按需传
...(isPro ? { reasoning_effort: 'high' } : temperature != null ? { temperature } : {}),
}流式响应里,思考链走 delta.reasoning_content,最终答案走 delta.content——两个字段分开,累加时别混在一起:
if (delta.reasoning_content) thinkingBuf += delta.reasoning_content
if (delta.content) answerBuf += delta.content产品层建议把「模型名 + thinking 两根轴」收敛成用户能看懂的一个档位选择(「快速 / 深度推理」),不要把 thinking 开关直接暴露给用户。
换成 deepseek-v4-flash / deepseek-v4-pro,思考开关用 thinking: { type: "enabled" | "disabled" } + reasoning_effort 控制;思考态下去掉 temperature 系参数;流式里 delta.reasoning_content 和 delta.content 分开累加。
一句话外卖
DeepSeek V4 起,「开推理」不是换模型名,而是在请求体里加
thinking参数——旧模型名有弃用截止日,提前把硬编码换掉。