实测 DeepSeek V4 Pro:为什么它不适合直接接入 Codex,却可以通过 Claude Code 跑起来?
最近很多人会把一个问题问得很简单:
DeepSeek V4 Pro 能写代码,那它能不能直接作为 Codex 的后端模型?
如果只看“模型会不会写代码”,答案很容易被误判。真正决定 Codex / Claude Code 这类 coding agent 能不能稳定工作的,不只是模型能力,而是客户端和后端之间的协议合同。
我在 2026-07-05 对deepseek-v4-pro做了一轮实际 API 测试。结论是:
deepseek-v4-pro可以作为 OpenAI-compatible chat 模型使用;- 它在本轮测试中没有跑通 Codex 更依赖的
/v1/responses; - 它可以通过 Claude Messages 兼容层给 Claude Code 使用;
- 所以问题不是“DeepSeek V4 Pro 不会写代码”,而是“它当前更适合 chat completions,不适合被直接当作 Codex Responses 模型”。
本文会按工程排查方式展开,而不是只给一句结论。
1. 测试环境
测试时间:2026-07-05
Base URL:https://cn.crazyrouter.com/v1
测试模型:deepseek-v4-pro
测试覆盖了三个入口:
GET /v1/models POST /v1/chat/completions POST /v1/responses POST /v1/messages这三个 endpoint 是理解本文的关键:
| Endpoint | 主要面向 | 可以简单理解为 |
|---|---|---|
/v1/chat/completions | 普通 OpenAI-compatible 应用 | 发 messages,拿 assistant 回复 |
/v1/responses | Codex / OpenAI agent workflow | 发 input items,拿 response items / tool events |
/v1/messages | Claude Code / Anthropic SDK | 发 Claude Messages,拿 content blocks / tool_use |
很多“模型兼容性问题”的根源,就在于把这三条路径混成了一条。
2./v1/models里能看到 DeepSeek V4 Pro,但这不等于 Codex 可用
先看模型列表。GET /v1/models返回 HTTP 200,其中deepseek-v4-pro的关键信息如下:
{"id":"deepseek-v4-pro","object":"model","owned_by":"custom","supported_endpoint_types":["openai"],"public_endpoint_types":["openai"]}这里最值得注意的是:
supported_endpoint_types: ["openai"] public_endpoint_types: ["openai"]这通常表示它可以作为 OpenAI-compatible 模型使用,尤其是/v1/chat/completions这一类接口。
但不能从这里直接推导出:
它完整支持 /v1/responses 它适合作为 Codex agent runtime 后端 它能稳定处理 Codex 的工具调用和续写状态这是很多接入问题的第一个误区:模型列表里出现了,不等于所有 agent 协议都支持。
3. 实测结果:chat completions 可用,responses 失败,messages 可跑工具闭环
本轮结果如下:
| 测试项 | Endpoint | HTTP | 结果 |
|---|---|---|---|
| 模型列表 | GET /v1/models | 200 | 能看到deepseek-v4-pro,endpoint type 为openai |
| 普通聊天,小 token 预算 | POST /v1/chat/completions | 200 | 只返回DS,finish_reason=length |
| 普通聊天,正常 token 预算 | POST /v1/chat/completions | 200 | 返回DS_V4_PRO_CHAT_OK |
| Codex-style Responses | POST /v1/responses | 400 | 返回convert_request_failed |
| Claude Messages 文本 | POST /v1/messages | 200 | 返回 Claude 风格 text content block |
| Claude Messages 工具调用 | POST /v1/messages | 200 | 返回tool_use get_city_timezone({"city":"Beijing"}) |
| Claude 工具结果续写 | POST /v1/messages | 200 | 接受tool_result并返回最终文本 |
这个结果很清楚:
DeepSeek V4 Pro 在线 DeepSeek V4 Pro chat completions 可用 DeepSeek V4 Pro responses 本轮不可用 DeepSeek V4 Pro messages 兼容层可用如果只看第一行和第二行,很容易得出“它能用于 Codex”的错误结论。真正关键的是第三行:/v1/responses失败。
4. 一个容易被忽略的细节:reasoning tokens 会吃掉可见输出预算
我第一次跑 chat completions 时,设置了很小的输出预算:
{"model":"deepseek-v4-pro","messages":[{"role":"user","content":"Return exactly: DS_V4_PRO_CHAT_OK"}],"max_tokens":30}结果 HTTP 200,但可见内容只有:
DS响应里显示:
finish_reason: length completion_tokens: 30 reasoning_tokens: 28也就是说,30 个 completion tokens 里,有 28 个被 reasoning 消耗了,可见正文空间几乎没剩下。
把max_tokens提高到 128 后,返回正常:
DS_V4_PRO_CHAT_OK finish_reason: stop这说明在接入 DeepSeek V4 Pro 时,不能只判断 HTTP 200,还要记录:
finish_reasonmessage.contentusage.completion_tokensusage.completion_tokens_details.reasoning_tokens- 可见输出是否为空或被截断
在 coding agent 场景里,这个问题会更明显。因为 agent 需要输出工具调用、解释、patch 或下一步计划,如果 token 预算太小,表面上请求成功,实际可见输出已经不可用。
5. 为什么 Codex 不能直接按 chat completions 来理解?
Codex 不是一个普通聊天客户端。
普通聊天客户端大概是:
用户问题 -> 模型回复文本 -> 展示给用户Codex 的工作方式更接近:
用户任务 -> 规划 -> 读文件 -> 生成工具调用 -> 执行命令或编辑文件 -> 接收工具结果 -> 继续推理 -> 再调用工具 -> 形成最终修改和总结也就是说,Codex 需要的是一个agent loop。这个 loop 里,模型输出不能只是普通文本,还要包含客户端能理解的结构化事件。
一个 Codex custom provider 可能会这样配置:
model_provider = "custom" model = "deepseek-v4-pro" [model_providers.custom] base_url = "https://your-router.example/v1" wire_api = "responses"重点是:
wire_api = "responses"这意味着 Codex 会按 Responses API 语义请求后端,而不是普通 chat completions 语义。
在 Responses 语义里,客户端可能期待这些东西:
| Codex 需要的能力 | 为什么重要 |
|---|---|
| response output items | 区分文本、工具调用、reasoning 等输出片段 |
| function/tool call item | 让客户端知道该调用哪个工具、参数是什么 |
| tool result continuation | 工具执行完后,把结果接回同一轮 agent loop |
| reasoning state | 多轮任务中延续推理状态 |
| streaming events | 客户端按事件顺序更新状态 |
| 非空最终输出 | 避免 HTTP 200 但没有可用答案 |
如果后端只会返回 chat completion:
{"choices":[{"message":{"role":"assistant","content":"..."}}]}那它不一定能满足 Codex 需要的 Responses item 结构。
这就是为什么“DeepSeek V4 Pro 能写代码”和“DeepSeek V4 Pro 适合直接作为 Codex 后端”是两件事。
6. 本轮/v1/responses为什么能说明问题?
本轮 Responses 测试请求类似:
{"model":"deepseek-v4-pro","input":"Return exactly: DS_V4_PRO_RESPONSES_OK","max_output_tokens":128}返回结果:
HTTP: 400 Error code: convert_request_failed Error type: new_api_error Message: Invalid request.这个结果不能证明 DeepSeek V4 Pro “能力差”,但可以证明一件事:
在本轮测试窗口里,deepseek-v4-pro 不能被当作可直接工作的 /v1/responses 模型。所以如果你把它直接配置给 Codex,并且 Codex 使用wire_api = "responses",就很可能遇到协议转换失败、工具调用异常、流式事件不匹配等问题。
7. 为什么 Claude Code 反而可以跑起来?
Claude Code 的入口通常不是/v1/responses,而是 Claude Messages 形态:
POST /v1/messagesClaude Messages 的核心结构是 content blocks,例如:
{"role":"assistant","content":[{"type":"text","text":"hello"}]}工具调用也是 content block:
{"type":"tool_use","id":"call_xxx","name":"get_city_timezone","input":{"city":"Beijing"}}如果中转网关支持 Claude Messages 兼容层,它可以做这样的转换:
Claude Code -> POST /v1/messages -> 网关把 Claude Messages 转成 OpenAI-compatible chat request -> DeepSeek V4 Pro 输出文本或 tool_calls -> 网关把结果转回 Claude content blocks -> Claude Code 接收 text / tool_use / tool_result本轮实测里,这条路径是跑通的。
文本测试返回:
DS_V4_PRO_MESSAGES_OK工具调用测试返回:
{"type":"tool_use","id":"call_00_85VnDZJN9knCdt3l4aX67165","name":"get_city_timezone","input":{"city":"Beijing"}}随后把工具结果传回:
{"type":"tool_result","tool_use_id":"call_00_85VnDZJN9knCdt3l4aX67165","content":"Asia/Shanghai"}模型继续返回:
The timezone for Beijing is Asia/Shanghai.这说明 Claude Code 兼容层至少完成了一个基础工具闭环。
8. 但这不代表 Claude Code 原生支持 DeepSeek
这里要避免另一个误区:
Claude Code 能跑 DeepSeek V4 Pro不等于:
Claude Code 原生支持 DeepSeek V4 Pro更准确的说法是:
网关把 Claude Code 的 /v1/messages 请求转换成 DeepSeek V4 Pro 能处理的 OpenAI-compatible chat 请求, 再把 DeepSeek 的输出转换回 Claude Code 能理解的 content blocks。这个兼容层需要处理很多细节:
| Claude Code 需要 | DeepSeek / OpenAI-compatible 侧可能返回 | 网关要做的事 |
|---|---|---|
textblock | message.content | 转成 Claude text block |
tool_useblock | tool_calls | 映射工具名、参数、tool id |
tool_resultblock | tool role message | 还原成下一轮 chat 上下文 |
stop_reason | finish_reason | 映射end_turn/tool_use/max_tokens |
| usage | token usage | 转成 Claude Code 可记录字段 |
| streaming events | delta chunks | 转成 Claude SSE event |
所以 Claude Code 能跑,依赖的是网关适配质量。只测一句hello没意义,至少要测工具调用和工具结果续写。
9. 三种接入方式应该怎么选?
方式一:普通 API 调用
推荐路径:
POST /v1/chat/completions model: deepseek-v4-pro适合:
- 代码解释;
- 单文件重构建议;
- SQL / shell / regex 辅助;
- API 文档问答;
- 普通聊天应用。
注意:给足max_tokens,不要用太小的输出预算。
方式二:Claude Code 兼容层
推荐路径:
Claude Code -> /v1/messages -> gateway -> /v1/chat/completions -> deepseek-v4-pro适合:
- 轻量代码 agent;
- 工具调用可控的任务;
- 有日志、fallback、重试机制的环境;
- 想用 Claude Code 客户端,但后端测试 DeepSeek 的场景。
上线前至少验证:
- 文本输出非空;
tool_use能正确产生;tool_result能正确续写;- 长上下文不会丢工具状态;
- usage / cache 字段记录正常;
- 超时重试不会打乱 tool id。
方式三:直接接 Codex
不建议直接这样做:
Codex -> /v1/responses -> deepseek-v4-pro除非你已经完整验证:
/v1/responses 可用 response output items 格式正确 tool call item 格式正确 tool result continuation 可用 streaming events 顺序正确 reasoning state 能延续 多轮仓库任务能完成本轮实测里,/v1/responses返回 400,所以不应直接把它当成 Codex Responses 模型。
10. 如果你已经接入失败,应该怎么排查?
建议按下面顺序排查。
第一步:先查模型列表
curlhttps://cn.crazyrouter.com/v1/models\-H"Authorization: Bearer YOUR_API_KEY"看两个字段:
supported_endpoint_types public_endpoint_types如果只看到openai,不要默认它支持/v1/responses。
第二步:单独测 chat completions
curlhttps://cn.crazyrouter.com/v1/chat/completions\-H"Authorization: Bearer YOUR_API_KEY"\-H"Content-Type: application/json"\-d'{ "model": "deepseek-v4-pro", "messages": [ { "role": "user", "content": "Return exactly: DS_V4_PRO_CHAT_OK" } ], "max_tokens": 128 }'不要只看 HTTP 状态,要看:
choices[0].message.content choices[0].finish_reason usage第三步:单独测 responses
curlhttps://cn.crazyrouter.com/v1/responses\-H"Authorization: Bearer YOUR_API_KEY"\-H"Content-Type: application/json"\-d'{ "model": "deepseek-v4-pro", "input": "Return exactly: DS_V4_PRO_RESPONSES_OK", "max_output_tokens": 128 }'如果这里失败,就不要直接上 Codex。
第四步:单独测 Claude Messages
如果你走 Claude Code 兼容层,要测:
文本请求 tool_use 请求 tool_result 续写只测文本不够。Claude Code 的核心价值就是工具闭环,不测工具就无法证明兼容层可用。
11. 最容易踩的 6 个坑
| 坑 | 典型表现 | 正确处理 |
|---|---|---|
| 把 OpenAI-compatible 当成 Responses-compatible | chat 可用,Codex 失败 | 分别测试/chat/completions和/responses |
| 只看 HTTP 200 | 请求成功但正文为空 | 检查 content、finish_reason、usage |
max_tokens太小 | 只返回几个字符 | 给 reasoning 模型留足输出预算 |
| 没测工具续写 | 工具调用后断掉 | 跑tool_use -> tool_result -> final answer |
| 混淆 Claude Code 和 Claude 模型 | 以为 Claude Code 原生支持 DeepSeek | 明确中间有网关转换 |
| 没有 fallback | 长任务中途失败 | 做 retry、fallback、空输出检测 |
12. 最终结论
本轮测试支持一个比较明确的工程结论:
DeepSeek V4 Pro 可以用作 OpenAI-compatible chat 模型。 DeepSeek V4 Pro 可以通过 Claude Messages 兼容层给 Claude Code 使用。 DeepSeek V4 Pro 不适合在当前状态下直接作为 Codex Responses 模型。核心原因不是模型不会写代码,而是协议层不匹配。
Codex 需要的是/v1/responses语义下的 agent loop,包括 output items、工具调用、工具结果续写、reasoning state 和流式事件。DeepSeek V4 Pro 在本轮实测中没有跑通/v1/responses。
Claude Code 能跑,是因为网关可以把/v1/messages转换成 OpenAI-compatible chat,再把结果转回 Claude content blocks。本轮测试里,文本、tool_use、tool_result续写都成功,因此这条路径有实用价值。
如果你要在生产环境里接入,建议按下面的优先级:
普通 API:优先走 /v1/chat/completions Claude Code:走 /v1/messages 兼容层,并测试工具闭环 Codex:不要直接接,除非 /v1/responses 完整验证通过原始长文和测试记录:
https://crazyrouter.com/blog/deepseek-v4-pro-codex-claude-code-compatibility-2026?utm_source=csdn&utm_medium=article&utm_campaign=deepseek_v4_pro_codex_claude_code_20260705&utm_content=csdn_deepseek-v4-pro-codex-claude-code_20260705__canonical&utm_term=DeepSeek%20V4%20Pro%20Codex%20Claude%20Code