OpenAI互換のAPIでDeepSeek V4.1 Flashの推論の強度を設定する方法
執筆:Nicho
DeepSeek V4.1 Flashは回答する前に推論します。指定しない場合、推論はhighのeffortで行われます。これはリクエストのフィールドreasoning_effortで変更できます。リクエストボディーの通常のフィールドなので、これをそのまま渡すあらゆるendpoint(当社のendpointを含む)を通じて、リクエストごとに設定できます。別のmodel IDは必要ありません。
この記事では、4つのレベル、2026年10月16日に実施したテストでの各レベルのコスト、コードや一般的なツールからこのフィールドを設定する方法、サードパーティのendpointが実際にこれを渡しているかを確認する方法を説明します。
概要
modelの隣にreasoning_effortを追加します。
curl https://api.cheapaimodel.ai/v1/chat/completions \
-H "Authorization: Bearer $CHEAPAIMODEL_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "deepseek-v4-1-flash",
"reasoning_effort": "low",
"messages": [{"role": "user", "content": "Summarize this changelog in three bullets: ..."}]
}'
| 値 | 動作 |
|---|---|
none |
推論をオフにします。モデルはすぐに回答します。 |
low |
短い推論。DeepSeekは簡単なタスクに推奨しています。 |
high |
デフォルト。DeepSeekは日常的なエージェント作業に推奨しています。 |
max |
最も長い推論。より難しい問題向けです。 |
フィールドを省略した場合、highを送信した場合と同じです。
各レベルのコスト
正解が1つだけの数学の問題をhttps://api.cheapaimodel.ai/v1に送信しました。100以下の正の整数の順序対(a, b)のうち、a² + b²が13で割り切れるものはいくつあるかという問題です。(答えは1,491です。)各レベルは8回実行しましたが、noneは3回実行しました。すべてのリクエストはnon-streamingでした。
| Effort | 平均推論token | 範囲 | 平均時間 | 正解 |
|---|---|---|---|---|
none |
0 | 0 | 14.0 s | 3回中0回 |
low |
2,348 | 925–3,719 | 17.2 s | 8回中7回 |
high |
3,081 | 2,232–3,629 | 20.4 s | 8回中8回 |
max |
3,530 | 2,700–5,803 | 23.2 s | 8回中7回 |
推論tokenは出力tokenとして課金されます。テスト実施時のV4.1 Flashの料金である出力100万tokenあたり$0.84では、平均的なリクエストのコストはlowで約$0.002、maxで約$0.003でした。
注目すべき点は次のとおりです。
- 推論をオフにすると、モデルは毎回間違えました。 2回は「数字だけを返信してください」を無視し、表示される回答の中で問題を解きました。これには推論と同じくらいの時間がかかりました。
- この問題では
highとmaxは近い結果でした。maxが明確に多く消費したのは、はるかに長く考えることを選んだ1回(5,803 tokenの実行)だけでした。 lowはhighより約4分の1少ないtokenを使用し、1回間違えました。
1つの問題はベンチマークではありません。デフォルトを選ぶ前に、自分のpromptのサンプルを2つのレベルで実行し、usage.completion_tokens_details.reasoning_tokensと回答を比較してください。
コードから設定する
OpenAI Python SDK
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
)
completion = client.chat.completions.create(
model="deepseek-v4-1-flash",
reasoning_effort="low",
messages=[{"role": "user", "content": "Explain recursion in one sentence."}],
)
print(completion.choices[0].message.content)
print(completion.usage.completion_tokens_details.reasoning_tokens)
reasoning_effortは通常の引数です。型ヒントにはopenai 2.8.0のnoneと2.45.0のmaxが含まれるため、古いバージョンでもこれらの値は送信されますが、型チェッカーは警告を出します。推論テキスト自体はcompletion.choices[0].message.reasoning_contentにあります。SDKの型には含まれていませんが、SDKは追加のフィールドを保持するため、この属性は機能します。
OpenAI TypeScript SDK
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.cheapaimodel.ai/v1",
apiKey: process.env.CHEAPAIMODEL_API_KEY,
});
const completion = await client.chat.completions.create({
model: "deepseek-v4-1-flash",
reasoning_effort: "max",
messages: [{ role: "user", content: "Explain recursion in one sentence." }],
});
'none'と'max'はopenai 6.46.0で型チェックされます。reasoning_contentもSDKの型には含まれていないため、読み取るには、メッセージをSDKのChatCompletionMessage型と{ reasoning_content?: string }の交差型にキャストします。
Responses API
Responses APIは、reasoningオブジェクト内で同じ4つの値を受け取ります。
response = client.responses.create(
model="deepseek-v4-1-flash",
reasoning={"effort": "low"},
input="Explain recursion in one sentence.",
)
print(response.output_text)
print(response.usage.output_tokens_details.reasoning_tokens)
"effort": "none"の場合、レスポンスに推論アイテムはなく、reasoning_tokensは0です。
推論をオフにする
スイッチは2つあります。reasoning_effort: "none"は移植性の高い方法です。DeepSeekには独自のthinkingオブジェクトもあり、OpenAI Python SDKはこれをextra_body経由で送信します。
completion = client.chat.completions.create(
model="deepseek-v4-1-flash",
messages=[{"role": "user", "content": "..."}],
extra_body={"thinking": {"type": "disabled"}},
)
TypeScript SDKでは、thinkingは型に含まれていません。SDKのREADMEが未記載のパラメーターについて推奨しているとおり、// @ts-expect-errorコメントを付けて追加します。リクエストごとのbodyオプションは使わないでください。フィールドを追加するのではなく、リクエストボディ全体を置き換えてしまいます。
どちらか一方のスイッチを使ってください。両方を送信したところ、thinkingがどちらの方法でも優先されました。highを指定したdisabledは推論せず、noneを指定したenabledは推論しました。
フレームワークでの設定
各ライブラリーをリクエストを記録するローカルサーバーに向け、実際に送信されたボディを確認しました。どのライブラリーもこのフィールドを送信できますが、いくつかはデフォルトでは送信しません。
LangChain(Python)
import os
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="deepseek-v4-1-flash",
base_url="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
reasoning_effort="low",
)
llm.invoke("Explain recursion in one sentence.", reasoning_effort="max") # per call
extra_body={"thinking": {...}}とともにthinkingを送信します。model_kwargsに入れるとTypeErrorが発生します。reasoning_effortの代わりにreasoning={"effort": ...}を渡すと、ChatOpenAIが暗黙的にResponses APIに切り替わります。ChatOpenAIはreasoning_contentを破棄します。トークン数はusage_metadata["output_token_details"]["reasoning"]に残ります。テキストが必要な場合は、langchain-deepseekのChatDeepSeekがadditional_kwargs["reasoning_content"]で返します。
LlamaIndex
import os
from llama_index.llms.openai_like import OpenAILike
llm = OpenAILike(
model="deepseek-v4-1-flash",
api_base="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
is_chat_model=True,
additional_kwargs={"reasoning_effort": "low"},
)
additional_kwargsを使用します。コンストラクターにはreasoning_effort=引数もありますが、これはOpenAI自身の推論モデルにしか送信されないため、V4.1 Flashでは何も起きません。また、"max"も拒否します。thinkingは1階層下になります。additional_kwargs={"extra_body": {"thinking": {...}}}。
Vercel AI SDK
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
import { generateText } from "ai";
const cheapaimodel = createOpenAICompatible({
name: "cheapaimodel",
baseURL: "https://api.cheapaimodel.ai/v1",
apiKey: process.env.CHEAPAIMODEL_API_KEY,
});
const { text, reasoningText } = await generateText({
model: cheapaimodel("deepseek-v4-1-flash"),
prompt: "Explain recursion in one sentence.",
providerOptions: { cheapaimodel: { reasoningEffort: "low" } },
});
providerOptionsの下のキーは、プロバイダーに渡したnameです。reasoningEffortはcamelCaseで記述してください。そこのreasoning_effortは暗黙的に破棄されます。- AI SDK 7には、同じフィールドを送信するトップレベルの
reasoning: "low"オプションもあります。 thinkingも同じキーの下で機能します。providerOptions: { cheapaimodel: { thinking: { type: "disabled" } } }。
LiteLLM
import os
import litellm
response = litellm.completion(
model="openai/deepseek-v4-1-flash",
api_base="https://api.cheapaimodel.ai/v1",
api_key=os.environ["CHEAPAIMODEL_API_KEY"],
reasoning_effort="low",
messages=[{"role": "user", "content": "Explain recursion in one sentence."}],
)
openai/プレフィックスを維持してください。deepseek/では、LiteLLMがeffortをDeepSeekのオン・オフスイッチに変換してレベルを破棄するため、lowとmaxはどちらも単なる「thinking on」になります。- LiteLLM Proxyでは、モデルの
litellm_paramsの下にreasoning_effortを設定します。クライアントが送信した値がそれを上書きします。
コーディングツールとアプリでの設定
ほとんどのツールは、指示しない限りこのフィールドを送信しません。ツールが何も送信しない場合、DeepSeekはhighで動作します。
| ツール | 設定場所 | 到達できるレベル |
|---|---|---|
| Codex CLI | config.tomlのmodel_reasoning_effort |
4つすべて |
| Continue | モデルのrequestOptions.extraBodyProperties |
4つすべて |
| Aider | 設定を宣言したうえで--reasoning-effort(下記) |
4つすべて |
| Open WebUI | Model → Advanced Params → Reasoning EffortをCustomに設定 | 4つすべて |
| Zed | available_modelsのモデルのreasoning_effort |
4つすべて |
| OpenClaw | モデルのcompat設定(下記) |
4つすべて |
| n8n | OpenAI Chat Model → Options → Extra Body | 4つすべて |
| Cline | OpenAI Compatible設定のReasoning Effort、または--thinking |
none、low、high |
| Dify | Thinking Mode Supportを設定したうえでReasoning effort(下記) | none、low、high |
| Cursor | カスタムBase URLでは利用できません | デフォルトのみ |
Codex CLI 0.163.0、Continue CLI 1.5.47、Aider 0.86.2、Cline CLI 3.0.71、OpenClaw 2026.10.4で検証しました。Open WebUI 0.12.2、Zed 1.24.2、Dify OpenAI-API-compatible plugin 0.0.68、n8n 2.43.6についてはソースを確認しました。
Codex CLIはカスタムプロバイダーとはResponses API経由でのみ通信するため、reasoning.effortを送信します。あわせてmodel_reasoning_summary = "none"も設定してください。設定しない場合、Codexはreasoning.summaryを追加し、cheapaimodelのV4.1 Flashはこれを400で拒否します。
model_reasoning_effort = "low"
model_reasoning_summary = "none"
model_reasoning_effortを未設定のままにすると、Codexのバナーには「reasoning effort: none」と表示されますが、実際にはeffortをまったく送信しないため、モデルはhighで動作します。
ContinueにはOpenAI互換モデル向けのeffortオプションはありませんが、リストしたbodyフィールドはすべて追加されます。
models:
- name: DeepSeek V4.1 Flash
provider: openai
model: deepseek-v4-1-flash
apiBase: https://api.cheapaimodel.ai/v1
apiKey: YOUR_API_KEY
requestOptions:
extraBodyProperties:
reasoning_effort: low
Aiderは未知のモデルでは--reasoning-effortを無視し、警告を表示します。設定は.aider.model.settings.ymlで宣言してください。
- name: openai/deepseek-v4-1-flash
accepts_settings: ["reasoning_effort"]
その後、aider --model openai/deepseek-v4-1-flash --reasoning-effort lowを実行するか、チャットで/reasoning-effort lowと入力します。フィールドをextra_paramsに直接書かないでください。Aiderはそこで破棄します。
OpenClawはカスタムBase URLをプロキシとして扱い、モデルエントリが対応可能と示していない限りeffortを送信しません。当社のOpenClawガイドにあるエントリに、次のフィールドを追加してください。
{
id: "deepseek-v4-1-flash",
// ...the rest of the entry
reasoning: true,
compat: {
supportsUsageInStreaming: true,
supportsReasoningEffort: true,
supportedReasoningEfforts: ["none", "low", "high", "max"],
},
}
次にagents.defaults.models["cheapaimodel/deepseek-v4-1-flash"].params.thinkingでデフォルトを設定します。たとえば"high"です。設定しない場合、新しいセッションはlowで開始され、OpenClawはリストにないレベルを切り下げるため、mediumはlowになります。
n8nはOpenAIのモデル名に対してのみ、組み込みのReasoning Effortオプションを表示します。代わりにExtra Bodyを使用し、ノードが使うAPIにフィールドを合わせてください。デフォルトのUse Responses APIがオンの場合は{"reasoning": {"effort": "low"}}と記述します。オフの場合は{"reasoning_effort": "low"}と記述します。
Difyは特に注意が必要です。デフォルトのThinking Mode Support、「Only Non-Thinking Mode」では、Difyはeffortを送信せず、レスポンスから推論を隠すだけです。モデルは依然としてhighで推論し、そのtoken分の料金も発生します。推論を実際にオフにするには、thinkingを含むモードを選択し、Reasoning effortをnoneに設定してください。
CursorはカスタムBase URL配下のモデルにeffortを送信しないため、それらはhighで動作します。
その他のOpenAI互換endpointについて
ここまでの内容は、OpenAI互換のBase URL配下でV4.1 Flashを提供するすべてのプロバイダーに当てはまります。異なるのは、endpointがこのフィールドをどう扱うかです。依存する前に、次の点を確認してください。
- 届いているか確認します。 同じpromptを
noneとmaxで送信します。noneを指定すると、reasoning_tokensは0になり、メッセージにreasoning_contentは含まれません。両方のリクエストが同じに見える場合、endpointがフィールドを破棄しており、デフォルト値が使われています。 - モデル一覧を確認します。 一部のgatewayは、各レベルを個別のmodel IDとして公開しています。たとえば
-maxや-noneのサフィックスが付く場合です。該当する場合は、そのIDを使用します。cheapaimodelはIDが1つだけで、deepseek-v4-1-flashであり、フィールドで決まります。 - タイプミスがどうなるか確認します。 cheapaimodelでは、
"reasoning_effort": "turbo"は"code": "InvalidParameter"とともに400を返すため、間違いは明確に失敗します。認識しない値を破棄するendpointでは、代わりにデフォルトで静かに実行されます。 none、low、high、maxに限定します。 DeepSeek自身のAPIはOpenAIのminimal、medium、xhighも受け付け、最も近いレベルにマッピングしますが、endpointによってマッピング方法は同じではありません。当社のテストでは、minimalはlowよりもhighのように動作しました。- ルールがそのまま当てはまると想定しないでください。 同じモデルを提供するプロバイダーでも、詳細は異なります。DeepSeekのドキュメントによると、そのAPIは思考モードの
tool_choice: "required"と、reasoning_contentを破棄するツール会話に対して400を返します。cheapaimodelでは、当社のテストでは両方のリクエストが成功しました。より厳しいルールでも動作するようにコードを書いてください。
つまずきやすい3つのポイント
max_tokensには推論が含まれる
reasoning_effort: "high"とmax_tokens: 100では、finish_reason: "length"と空のcontentが返りました。100トークンすべてが推論に使われました。出力を制限する場合は、その分の余裕を残してください。max_tokensを設定しない場合、DeepSeekのAPIは思考モードで64K、maxで128Kがデフォルトです。
ツール会話ではreasoning_contentを保持する
モデルがツールを呼び出すと、そのメッセージにはtool_callsとともにreasoning_contentが含まれます。DeepSeekのAPIでは、その会話の以降のすべてのリクエストで、変更せずにそのまま返送する必要があります。OpenAI Python SDKでは、返されたメッセージオブジェクトを追加するとそれが行われます。
messages.append(completion.choices[0].message)
ライブラリーによってこの動作は異なります。OpenAI SDK、openai/プレフィックス付きのLiteLLM、Vercel AI SDKは、返されたメッセージを返送するとreasoning_contentを保持します。LangChainのChatOpenAIとChatDeepSeek、LlamaIndexのOpenAILikeは、次のリクエストにそれを含めません。cheapaimodelでは、当社のテストでは省略してもエラーになりませんでしたが、DeepSeekのルールを適用するendpointでは、リクエストは400で失敗します。
ツールを使わない会話では、返送する必要はありません。DeepSeekはそれを無視します。
Temperatureは推論を制御しない
思考モードでは、temperatureは効果がなく、0.95未満のtop_pは0.95として扱われます。回答を速くしたり、より慎重にしたりするには、代わりにeffortレベルを変更してください。
cheapaimodelで確認する
コンソールでログを開き、リクエストをクリックします。reasoning_effortを送信した場合、詳細のReasoning effortに表示されます。その行がない場合、リクエストはデフォルトのhighで実行されました。
料金とコンテキスト制限は、DeepSeek V4.1 Flashのモデルページにあります。キーを取得して最初の呼び出しを行うには、クイックスタートをご覧ください。DeepSeek自身のリファレンスは、思考モードガイドです。