cheapaimodel検索
すべての記事

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がこのフィールドをどう扱うかです。依存する前に、次の点を確認してください。

  1. 届いているか確認します。 同じpromptをnoneとmaxで送信します。noneを指定すると、reasoning_tokensは0になり、メッセージにreasoning_contentは含まれません。両方のリクエストが同じに見える場合、endpointがフィールドを破棄しており、デフォルト値が使われています。
  2. モデル一覧を確認します。 一部のgatewayは、各レベルを個別のmodel IDとして公開しています。たとえば-maxや-noneのサフィックスが付く場合です。該当する場合は、そのIDを使用します。cheapaimodelはIDが1つだけで、deepseek-v4-1-flashであり、フィールドで決まります。
  3. タイプミスがどうなるか確認します。 cheapaimodelでは、"reasoning_effort": "turbo"は"code": "InvalidParameter"とともに400を返すため、間違いは明確に失敗します。認識しない値を破棄するendpointでは、代わりにデフォルトで静かに実行されます。
  4. none、low、high、maxに限定します。 DeepSeek自身のAPIはOpenAIのminimal、medium、xhighも受け付け、最も近いレベルにマッピングしますが、endpointによってマッピング方法は同じではありません。当社のテストでは、minimalはlowよりもhighのように動作しました。
  5. ルールがそのまま当てはまると想定しないでください。 同じモデルを提供するプロバイダーでも、詳細は異なります。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自身のリファレンスは、思考モードガイドです。

すべての記事