目次

公式 DeepSeek API を思考モードかつツール呼び出しありで使うとき、素の 400 はツール定義の誤りより、履歴の欠落を疑う場面が多いです。DeepSeek の Thinking Mode ガイドは明確です。リクエストに tools があるとき、過去ターンの reasoning_content を後続のすべてのリクエストで完全に戻さなければなりません。意図的に削る場合も、content だけ残すストア/プロキシ/シリアライザ経由で落ちる場合も、API は呼び出しを拒否します。以下は北京時間 2026 年 10 月 26 日時点の同ガイドに沿った整理です。参考情報として;当サイトではこの失敗を実測再現しておらず、修正も検証していません。 フィードバックは、フッターのサイト管理者連絡先から送れます。

症状:思考モード+ tools で 400

DeepSeek の Chat Completions では思考モードが既定で有効です。モデルはまず思考過程を出し、その後に最終回答を出します。両者はアシスタントメッセージ上の兄弟フィールド、reasoning_content と content として届きます。

あわせて tools 配列を渡すと、DeepSeek はその思考過程が会話履歴に残ることを期待します。ドキュメントによれば、コードが reasoning_content を正しく戻さないと、API は 400 エラーを返します。本ノートが扱うのはその失敗です—認証失敗でもレート制限でも、見かけるあらゆる 400 の総称でもありません。

ルール:過去の reasoning_content をすべて戻す

tools を載せたリクエストでは:

  • 過去すべてのターンの reasoning_content を戻す。
  • それらの値はモデルのコンテキストに連結される。
  • モデルがツールを呼ばなかったターンも含め、後続のすべてのリクエストで続けて戻す。

DeepSeek のサンプルでいちばん安全な既定は、SDK が返したアシスタントメッセージオブジェクトをそのまま追加することです。

python
messages.append(response.choices[0].message)

このオブジェクトにはすでに content、reasoning_content、tool_calls が入っています。明示的に書くなら次と同等です。

python
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 だけ残しても Multi-turn Conversation 節の説明どおり動きます。厳しい要件は、リクエストに tools が載った瞬間から始まります。

reasoning_content が落ちやすい場所

訪問者向けに多い剥離ポイント:

  • role と content だけ永続化するクライアント側メッセージストアが、次コール用に履歴を組み直すとき。
  • OpenAI 形のフィールドだけを許可するプロキシ/ゲートウェイが、reasoning_content のような未知キーを捨てるとき。
  • content 列はあるが思考過程用の列が無い履歴 DB/ORM。
  • 同じアシスタントターンの tool_calls はコピーするが、兄弟の reasoning_content を忘れる手書き JSON シリアライザ。

SDK の応答と次リクエストのあいだに自前レイヤがあるなら、ツール結果を足して次の completion を撃つ前後で、フィールドがラウンドトリップしているかを見てください。

これは何ではないか

境界をはっきりさせます。

  • DeepSeek からのあらゆる HTTP 400 が、欠けた reasoning_content ではない。 不正ペイロード、認証、その他の検証エラーも 400 になります。思考モードと tools が同時に絡むときの、ドキュメント上の一因として読んでください。
  • DeepSeek Harness のインストール手順ではない。 コーディング harness の導入や配線は別トピックです—DeepSeek Harness のインストール方法:Windows・Linux・CLI・プラグイン を参照。本ページは思考モード+ tools の API 履歴ルールだけを扱います。
  • 公式 DeepSeek API の範囲。 上記は公式 API の Thinking Mode ドキュメントに沿っています。第三者中継は挙動が違うことがあるので、それぞれの文書を確認してください。

関連記事

当サイト上の近い DeepSeek/harness 文脈: