DeepSeek V4 Pro を Codex に直接接続して失敗した理由:Claude Code では動くのに Codex では推奨できない
Codex、Claude Code、DeepSeek V4 Pro を試していると、次のような一見矛盾した現象に出会うことがあります。
同じ deepseek-v4-pro なのに:
通常の API 呼び出しでは返答する;
Claude Code でも動く;
しかし Codex に直接つなぐと不安定、またはエラーになる。
これはモデル性能の問題に見えます。
DeepSeek V4 Pro はコードが苦手なのか?
モデルが弱いのか?
Codex はサードパーティモデルを拒否しているのか?
実際に検証した結果、原因はそこではありませんでした。Codex、Claude Code、通常の OpenAI-compatible API は、同じプロトコル層ではありません。
DeepSeek V4 Pro がコードの質問に答えられることと、Codex が期待する Responses API の agent loop を直接満たせることは別問題です。
結論
2026-07-05 の実測結果は次の通りです。
deepseek-v4-pro は /v1/models に存在する;
/v1/chat/completions は動作する;
/v1/responses は HTTP 400 convert_request_failed を返す;
/v1/messages は動作し、tool_use -> tool_result -> final answer の流れも通った。
現時点での推奨は次の通りです。
| 用途 | 推奨 |
|---|---|
| 通常のコード Q&A |
/v1/chat/completions を使う |
| Claude Code |
/v1/messages 互換レイヤー経由でテストする |
| Codex |
/v1/responses モデルとして直接使わない |
これは DeepSeek V4 Pro がコードを書けないという意味ではありません。Codex native Responses モデルとして扱うべきではない、という意味です。
なぜ誤解しやすいのか
多くの開発者は "OpenAI-compatible" を次のように理解しがちです。
OpenAI 風 API をサポートしているなら、すべての OpenAI クライアントで使える。
しかし実際には違います。
少なくとも次の 3 つは分けて考える必要があります。
1. /v1/chat/completions
2. /v1/responses
3. /v1/messages
どれも「メッセージを送って返答をもらう」ように見えますが、契約が違います。
| Endpoint | 主なクライアント | 中心となる構造 | 適配難度 |
|---|---|---|---|
/v1/chat/completions |
通常のチャット、OpenAI SDK アプリ | messages / choices | 低 |
/v1/responses |
Codex / OpenAI agent workflow | input items / output items / tool events | 高 |
/v1/messages |
Claude Code / Anthropic SDK | content blocks / tool_use / tool_result | 中 |
モデルが openai endpoint だけを宣言している場合、多くは OpenAI-compatible chat が使えるという意味です。Responses API の完全対応を意味するわけではありません。
検証 1:モデル一覧にはあるが、openai endpoint だけを宣言
確認した API:
GET https://cn.crazyrouter.com/v1/models
deepseek-v4-pro の返却例:
{
"id": "deepseek-v4-pro",
"object": "model",
"owned_by": "custom",
"supported_endpoint_types": ["openai"],
"public_endpoint_types": ["openai"]
}
重要なのは:
supported_endpoint_types: ["openai"]
これはモデルがオンラインで、OpenAI-compatible モデルとして公開されていることを示します。
ただし、次を証明するものではありません。
/v1/responses のサポート
Codex tool call item のサポート
Responses streaming events のサポート
reasoning continuation のサポート
Codex の複数ターン tool_result 継続
最初の判断基準はこれです。
/v1/modelsに出ていることは「見える」ことを示すだけで、すべての agent クライアントに適していることを示さない。
検証 2:chat completions は動くが、token budget に注意
通常の OpenAI-compatible chat を試します。
curl https://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: 200
Visible content: DS_V4_PRO_CHAT_OK
finish_reason: stop
つまり、chat モデルとしては動作します。
しかし max_tokens: 30 にすると、見える出力はこれだけでした。
DS
usage には次のように出ていました。
finish_reason: length
completion_tokens: 30
reasoning_tokens: 28
DeepSeek V4 Pro は reasoning tokens を消費します。出力予算が小さすぎると、HTTP 200 でも実用的な結果になりません。
coding agent では必ず次を確認します。
finish_reason
visible content
completion_tokens
reasoning_tokens
tool_calls が完全か
検証 3:Responses API が失敗する。これが Codex のブロッカー
Codex で重要になる Responses API を試します。
curl https://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
}'
結果:
HTTP: 400
Error code: convert_request_failed
Error type: new_api_error
Message: Invalid request.
これが核心です。
Codex の provider 設定が次のような場合:
[model_providers.custom]
wire_api = "responses"
base_url = "https://your-router.example/v1"
Codex は /v1/responses の意味論でリクエストします。バックエンドは Responses の input/output、tool events、multi-turn continuation を理解する必要があります。
今回のテストでは DeepSeek V4 Pro は /v1/responses を通りませんでした。したがって、Codex の Responses モデルとして直接扱うべきではありません。
Codex が実際に必要とするもの
Codex は単に prompt を送ってテキストを待つだけではありません。
実際のタスクは次のような流れになります。
リポジトリのコンテキストを読む
-> 変更を計画する
-> ファイル読み取りツールを呼ぶ
-> ツール結果を受け取る
-> 推論を続ける
-> 編集ツールを呼ぶ
-> テストを実行する
-> テスト結果に応じて修正する
-> 最終まとめを出す
このためには安定した構造化イベントが必要です。
| 必要な能力 | 欠けると起きること |
|---|---|
| Responses input/output items | クライアントが出力ステップを分類できない |
| tool call item | ツール呼び出しが普通のテキストになる |
| tool result continuation | ツール実行後にタスクを継続できない |
| reasoning state | 長いタスクで文脈が途切れる |
| streaming event order | クライアントが待ち続ける |
| 非空の最終出力 | HTTP 200 でも使える答えがない |
chat completions が成功しても、Codex workflow が成功するとは限りません。
検証 4:なぜ Claude Code は動くのか
Claude Code は通常 Anthropic Messages 形式を使います。
POST /v1/messages
今回、deepseek-v4-pro は /v1/messages で次の 3 ステップを通りました。
1. テキストリクエスト成功
2. tool_use 成功
3. tool_result 後の継続成功
tool call は次のように返りました。
{
"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 互換ルートでは、基本的な tool loop が通っています。
Claude Code で動くことは、DeepSeek がネイティブ Claude になることではない
正しい経路は次の通りです。
Claude Code
-> /v1/messages
-> gateway が Claude Messages を OpenAI-compatible chat に変換
-> DeepSeek V4 Pro がテキストまたは tool calls を生成
-> gateway が Claude content blocks に戻す
-> Claude Code が結果を受け取る
互換レイヤーは text blocks、tool_use、tool_result、stop reasons、SSE events、usage を処理します。
違いを表にすると
| 観点 | Codex | Claude Code 互換レイヤー |
|---|---|---|
| 入口 | /v1/responses |
/v1/messages |
| 中心プロトコル | OpenAI Responses | Anthropic Messages |
| モデルへの要求 | Responses agent item semantics | Claude content blocks に変換可能 |
| DeepSeek V4 Pro の結果 | 400 convert_request_failed
|
テキストと tool loop は成功 |
| 推奨 | 直接接続しない | gateway 経由でテスト可能 |
Codex が必要とするのは Responses agent runtime です。Claude Code 互換レイヤーが必要とするのは、変換可能な Messages / tool_use 構造です。
自分で検証する順番
-
/v1/modelsを確認し、supported_endpoint_typesを見る。 -
/v1/chat/completionsを確認し、content、finish reason、usage、reasoning tokens を見る。 -
/v1/responsesを確認する。ここが失敗するなら Codex に直接接続しない。 - Claude Code では text、
tool_use、tool_result、final answer を確認する。
本番環境での推奨
通常のコード Q&A:
/v1/chat/completions を使う
Claude Code:
/v1/messages 互換を使う
本物のリポジトリ作業の前に tool_use -> tool_result を確認する
Codex:
まず /v1/responses を検証する
次に tool calls、tool results、streaming events、reasoning state を確認する
最後に実リポジトリで使う
FAQ
DeepSeek V4 Pro は Codex で絶対に使えないのか?
絶対ではありません。ただし今回のテストでは /v1/responses モデルとして動きませんでした。専用の Responses adapter がある場合は別途検証できますが、tools、streaming、continuation の確認が必要です。
Claude Code は動くのに Codex が動かない理由は?
Claude Code は /v1/messages を通り、gateway が Claude content blocks と OpenAI-compatible chat の間を変換できます。Codex は /v1/responses を使い、別の agent item semantics を期待します。
HTTP 200 なら成功か?
違います。小さい token budget のテストでは HTTP 200 でしたが、visible content は DS だけでした。reasoning tokens が出力予算を消費したためです。
まとめ
問題はコード能力ではなく、プロトコル適配です。
deepseek-v4-pro は見える;
/v1/chat/completions は動く;
/v1/responses は 400 convert_request_failed;
/v1/messages は text と tool-loop continuation が動く。
したがって:
通常 API:利用可能
Claude Code:Messages compatibility 経由でテスト
Codex:Responses model として直接接続しない
coding agent では、モデル名ではなく endpoint の挙動と tool-loop の実測で互換性を判断するべきです。
元記事とテスト記録:


