この記事は AIHubMix が作成しました。数値はすべて AIHubMix が2026年10月19日に自社ゲートウェイ経由で計測したもので、第三者による再現はまだありません。
TL;DR
- MiniMax M3.1 Flash の思考は常にオンで、effort(思考の深さ)は low / medium / high / xhigh / max の5段階です。指定しないと max になります。
- 同じバグ修正タスクを各設定で3回ずつ実行したところ、全実行が215件の隠しテストにすべて合格しました。
- 未指定(= max)は平均6,364思考トークン・56秒・1回あたり $0.0045、low は平均591思考トークン・9.5秒・$0.0006 でした。未指定は low の約7倍のコストです。
- effort は必ず明示し、まず low から始めて、失敗したタスクだけ上げるのがおすすめです。
なぜ問題になるのか
M3.1 Flash は常に思考します。リクエストに effort がない場合について、MiniMax の テキスト生成ガイド には次のように書かれています。
defaults to
maxwhen omitted
(指定しない場合は max がデフォルトになります)
MiniMax M2.x には effort の設定がなかったため、M2.x 向けに書いたコードは effort を指定していません。そのまま M3.1 Flash に移すと、すべてのリクエストが最もコストの高い設定で動きます。
検証環境
- モデル:AIHubMix の
minimax-m3.1-flash(上流が返すモデル名はMiniMax-M3.1-Flash) - エンドポイント:
POST https://aihubmix.com/v1/chat/completions、max_tokens: 32768 - API キー:環境変数
AIHUBMIX_API_KEY(取得方法は AIHubMix クイックスタート) - 実施日:2026年10月19日、各設定3回
- 価格(AIHubMix、100万トークンあたり):入力 $0.165、出力 $0.66、キャッシュ入力 $0.0165。思考トークンは出力として課金されます。
タスクは、2つのバグを含む課金関数の修正です。1つは、一時停止期間が請求期間の終わりをまたぐと1日分を二重に数えるバグ、もう1つは、重なった一時停止期間を二重に差し引くバグです。プロンプトでは両方の症状を伝え、修正済みの関数を1つのコードブロックで返すよう指示しました。手元のテストハーネスで、手書きの境界ケース15件と、総当たりの参照実装と照合するランダムケース200件、計215件を実行します。元のバグ入り関数は138件に合格します。
プロトコルごとのフィールド名
| プロトコル | フィールド | 値 | デフォルト |
|---|---|---|---|
| OpenAI Chat Completions | reasoning_effort | low, medium, high, xhigh, max | max |
| Anthropic Messages | output_config.effort | low, medium, high, xhigh, max | max |
| OpenAI Responses | reasoning.effort | low, medium, high, xhigh, max | max |
AIHubMix では、このモデルを3つのプロトコルすべてで呼び出せます。思考をオフにすることはできません。MiniMax の Messages API リファレンス によると、thinking: {"type": "disabled"} や effort none を送ると HTTP 400 になり、次のメッセージが返ります。
model "MiniMax-M3.1-Flash" requires adaptive thinking
(モデル「MiniMax-M3.1-Flash」には adaptive thinking(適応型の思考)が必要です)
MiniMax の旧モデルは effort フィールドを無視します。
計測スクリプト
採点部分を除いた計測の流れです。
import os, time
from openai import OpenAI
client = OpenAI(base_url="https://aihubmix.com/v1", api_key=os.environ["AIHUBMIX_API_KEY"])
prompt = open("bugfix_prompt.md").read()
for effort in [None, "low", "medium", "high", "xhigh", "max"]:
for run in range(3):
extra = {"reasoning_effort": effort} if effort else {}
t0 = time.time()
r = client.chat.completions.create(
model="minimax-m3.1-flash", max_tokens=32768,
messages=[{"role": "user", "content": prompt}], **extra)
u = r.usage
print(effort or "omitted", run, round(time.time() - t0, 1),
u.completion_tokens, u.completion_tokens_details.reasoning_tokens)
結果
| effort | 平均思考トークン | 範囲(3回) | 平均時間 | 修正1回の平均コスト | テスト |
|---|---|---|---|---|---|
| low | 591 | 344–812 | 9.5秒 | $0.0006 | 215/215 ×3 |
| medium | 1,522 | 970–2,488 | 21.7秒 | $0.0013 | 215/215 ×3 |
| high | 2,863 | 2,194–3,673 | 27.1秒 | $0.0022 | 215/215 ×3 |
| xhigh | 1,949 | 1,019–2,562 | 19.2秒 | $0.0015 | 215/215 ×3 |
| max | 4,699 | 2,612–6,246 | 40.4秒 | $0.0034 | 215/215 ×3 |
| 未指定 | 6,364 | 4,284–9,376 | 56.3秒 | $0.0045 | 215/215 ×3 |
「未指定」の行のコスト計算は次のとおりです。プロンプト464トークン(うち約192がキャッシュ)と出力6,673トークンで、(272 × $0.165 + 192 × $0.0165 + 6,673 × $0.66) ÷ 100万 ≈ $0.0045 になります。
表からわかることは次のとおりです。
- 品質に差はありませんでした。 Chat での18回の実行がすべて完全に正解でした。範囲のはっきりしたこのバグでは、low を超える思考に測定できる効果はありませんでした。
- low から medium ははっきり増えます。 思考トークンは約2.6倍、時間は2倍以上です。
- medium より上は、3回では順位がつきません。 xhigh の平均は high より低く、max は両方と範囲が重なっています。
- 未指定は max とほぼ同じです。 ドキュメントのとおりです。未指定の平均のほうが高いものの、ばらつきの範囲内です。
- 時間はトークン数に比例します。 Flash の全24回(Chat と Messages)でスループットは毎秒約112出力トークンと安定しており、6,000トークン考えると1分近く待つことになります。
短いプロンプトでは様子が違います。サポートチケット5件を4つのラベルに分類するタスクでは、low の思考トークンは0、デフォルトでも平均6で、ラベルはすべて正解でした。「17 × 23 は?」を low で聞くと、思考なしで出力2トークンでした。思考の深さはプロンプトに合わせて変わるため、分類のような短い呼び出しでは、オフにできないことのコストはほとんどありません。
ハマりどころ
回答が途中で切れて finish_reason が length になる
思考トークンも max_tokens に含まれます。デフォルトのある実行では、関数1つの修正に9,376思考トークンを使いました。M2.x 時代の 4K や 8K の上限のままだと、finish_reason: "length" で回答が途中で切れることがあります。max_tokens を引き上げ(MiniMax の推奨は131,072、上限は524,288)、finish_reason を確認してください。
同じ low なのに1分近くかかることがある
Anthropic Messages エンドポイントで同じプロンプトを low で3回実行したところ、思考トークンは511、1,861、6,060で、最後の1回は56秒かかりました。effort が決めるのは平均的な深さで、上限ではありません。high 以上ではクライアントやプロキシのタイムアウトを120秒以上にし、low の平均値だけでタイムアウトを決めないようにしてください。
reasoning_effort に none を渡しても思考が止まらない
AIHubMix 経由では、reasoning_effort に none、minimal、auto を渡すと HTTP 200 が返りますが、モデルは思考を続けます。ある API ゲートウェイプロジェクトの検証(sub2api issue #8025)によると、MiniMax 本家のエンドポイントは未定義の値を拒否します。ドキュメントにある5つの値だけを使ってください。AIHubMix が各社の推論パラメータをどう対応付けているかは 統一推論パラメータ にまとまっています。
OpenCode で effort を切り替えられない
OpenCode はこのモデルの effort のバリアントを1つも認識しません。そのため effort の切り替えが効きません。また、「思考オフ」を送るフレームワークでは400エラーになります。実際に送られているリクエストボディを確認してください。
複数モデルを混ぜると effort が効かない
M3 と M2.x は effort フィールドを無視します。複数モデルにルーティングしている場合、Flash で節約できる effort 設定も、ほかのモデルには効きません。
設定が届いているか確かめる
usage を見ます。Chat は completion_tokens_details.reasoning_tokens、Messages は output_tokens_details.thinking_tokens、Responses は output_tokens_details.reasoning_tokens です。effort を変えてもこの値が変わらなければ、設定はモデルに届いていません。
AIHubMix 経由で Messages と Responses に effort を設定する例です。
import os
import anthropic
from openai import OpenAI
ant = anthropic.Anthropic(base_url="https://aihubmix.com", api_key=os.environ["AIHUBMIX_API_KEY"])
msg = ant.messages.create(
model="minimax-m3.1-flash", max_tokens=32768,
messages=[{"role": "user", "content": "Write a function that merges overlapping date ranges."}],
extra_body={"output_config": {"effort": "medium"}},
)
print(msg.usage)
oai = OpenAI(base_url="https://aihubmix.com/v1", api_key=os.environ["AIHUBMIX_API_KEY"])
resp = oai.responses.create(
model="minimax-m3.1-flash", reasoning={"effort": "low"}, max_output_tokens=32768,
input="Write a function that merges overlapping date ranges.",
)
print(resp.usage)
最初に試す設定
上の計測で裏付けがあるのは最初の2行だけです。残りは推奨値なので、自分のリトライ率で確かめてください。
| ワークロード | 最初の設定 | 上げる目安 |
|---|---|---|
| 分類・抽出・ルーティング | low | 難しいケースでラベルを誤る |
| 関数1つの修正・小さなレビュー | low | 修正が2回続けてテストに落ちる |
| 複数ファイルの変更・リファクタリング | medium | 依存ファイルの修正漏れが出る |
| ツール呼び出しの多いエージェント | low か medium | 同じ手順を繰り返す・止まる |
| 難しいデバッグ・設計の相談 | high | 回答が表面的なまま |
| 人が待っている対話 | low | ここで max をデフォルトにしない |
検証できていないこと
- どこから上位の effort が元を取るか。 今回のタスクはすべての effort で解けました。MiniMax は effort ごとのトークン数、レイテンシ、精度を公開しておらず、範囲のはっきりした1つのタスクでは、high・xhigh・max がどこで効くかはわかりません。
- medium より上の順位。 各3回では high・xhigh・max を区別できません。
- ほかのタスクやプロンプト長。 数値はすべて、短いコーディング用プロンプト1つと分類用プロンプト1つから得たもので、AIHubMix が2026年10月19日に計測しました。
まとめ
- M3.1 Flash は effort を指定しないと max で思考します。
- 今回のバグ修正では全設定が正解し、未指定は low の約7倍のコスト、約6倍の時間がかかりました。
- low から始め、失敗するタスクだけ上げてください。
max_tokensとタイムアウトにも余裕を持たせましょう。 -
noneやminimalでは思考は止まりません。
AIHubMix なら、1つの API キーで minimax-m3.1-flash を Chat Completions・Messages・Responses のどれからでも呼び出せます。まずは自分のタスクで low と未指定の usage を比べてみてください。
あわせて読みたい:MiniMax M3.1 Flash シリーズ
- この設定の背景を知りたい方へ。Space Bunny としての登場から、M2.7・M3 との価格差までまとめています:MiniMax M3.1 Flash(Space Bunny)を API で使う:M2.7・M3 との違いと実測コスト
- M2.5/M2.7 のコードを移すときに変わるのは effort だけではありません。400エラーなどの移行の落とし穴はこちら:MiniMax M2.7 から M3.1 Flash への移行:「requires adaptive thinking」(2013) エラーの直し方
- low にすると、Flash は同じバグ修正で3モデル中最も安くなりました。デフォルト同士で DeepSeek・Haiku と比べた結果はこちら:MiniMax M3.1 Flash vs DeepSeek V4.1 Flash vs Claude Haiku 5.5:同じバグ修正で速度とコストを比較
参考
- Model Invocation (text generation guide)(MiniMax)
- Messages API reference(MiniMax)
- MiniMax M3.1 Flash(AIHubMix)
- 統一推論パラメータ(AIHubMix)
- sub2api issue #8025: MiniMax M3 / M3.1 Flash effort support(GitHub)