0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DeepSeek V4 Pro を Codex に直接接続して失敗した理由:Claude Code では動くのに Codex では推奨できない

0
Posted at

DeepSeek V4 Pro を Codex に直接接続して失敗した理由:Claude Code では動くのに Codex では推奨できない

AI API gateway

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 が完全か

API routing

検証 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_usetool_result、stop reasons、SSE events、usage を処理します。

違いを表にすると

Crazyrouter API

観点 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 構造です。

自分で検証する順番

  1. /v1/models を確認し、supported_endpoint_types を見る。
  2. /v1/chat/completions を確認し、content、finish reason、usage、reasoning tokens を見る。
  3. /v1/responses を確認する。ここが失敗するなら Codex に直接接続しない。
  4. Claude Code では text、tool_usetool_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 の実測で互換性を判断するべきです。

元記事とテスト記録:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?