MiniMax M3.1 FlashをOpenCodeで使う:設定とツール呼び出し
OpenCode v2.2.3でMiniMax M3.1 Flashを動かした実測記録です。Provider設定の全文、実際のツール呼び出し、つまずきやすいエラーの直し方をまとめました。
このページの内容
MiniMax M3.1 Flash は OpenCode v2.2.3 で OpenAI 互換のカスタム Provider として動きます。OpenCode 側のモデル指定は omniakey/minimax-m3.1-flash、Base URL は https://api.omniakey.com/v1 です。2026年11月12日、下の設定で実在するリポジトリの課題を1件通しました。内訳は読み取り5回、書き込み1回、node --test 1回で、テストは12件すべて成功しています。
OpenCode のカスタム Provider は OpenAI Chat Completions 形式で通信し、OmniaKey は /v1 でその形式を受け付けます。設定ファイルはプロジェクトに1つ置くだけですが、動くかどうかを決めるのは3点です。モデルIDを OmniaKey の表記と一字一句合わせること、Key を OpenCode の server プロセスから読めるようにすること、ツール呼び出しをまたいで思考フィールドを残すことです。
始める前にそろえるもの
OpenCode は V2 を使ってください。実測したのは v2.2.3 です。V2 ではカスタム Provider を最上位の providers オブジェクトに書きます。V1 の設定例は形が違うので、コピーする前に V2 の Provider ドキュメント と opencode --version で確認してください。
- OpenCode:v2.2.3(2026年11月12日に実測)
- OmniaKey のモデルID:
minimax-m3.1-flash - OpenCode での参照名:
omniakey/minimax-m3.1-flash
OmniaKey で Key を作り、OMNIAKEY_API_KEY に入れます。下の JSON は変数名だけを書き、Key そのものは含みません。テストコマンドがすでにある小さめのリポジトリを用意してください。実測では src/normalize.js、テストファイル1つ、テストスクリプトを持つ Node のサンプルを使いました。
MiniMax 公式 API のモデルIDは MiniMax-M3.1-Flash と大文字小文字が混ざります。OmniaKey はすべて小文字の minimax-m3.1-flash です。opencode.jsonc では、models のキーと modelID の両方に OmniaKey の小文字IDを書いてください。大文字小文字が違うと OmniaKey 側のIDに一致しません。
モデル選びの途中なら、MiniMax M3.1 Flash のレビュー にベンチマーク、公開時の情報、常時オンになる思考の仕組みをまとめてあります。
実測した OpenCode V2 の設定
プロジェクト直下に opencode.jsonc として置きます。実行に使った設定をそのまま公開できる形にしたものです。
{
"$schema": "https://opencode.ai/config.json",
"model": "omniakey/minimax-m3.1-flash",
"share": "disabled",
"update": "disable",
"warming": false,
"snapshots": false,
"enabled_providers": ["omniakey"],
"providers": {
"omniakey": {
"name": "OmniaKey",
"env": ["OMNIAKEY_API_KEY"],
"package": "@opencode/ai/providers/openai-compatible",
"settings": {
"baseURL": "https://api.omniakey.com/v1"
},
"models": {
"minimax-m3.1-flash": {
"modelID": "minimax-m3.1-flash",
"name": "MiniMax M3.1 Flash",
"body": {
"reasoning_effort": "medium",
"max_tokens": 4096,
"stream_options": {"include_usage": true}
},
"limit": {
"context": 1000000,
"output": 4096
},
"capabilities": {
"tools": true,
"input": ["text"],
"output": ["text"],
"freeform": [],
"reasoning": {
"supported": true,
"effort": ["low", "medium", "high", "xhigh", "max"]
}
},
"compatibility": {
"reasoningField": "reasoning_content",
"requireReasoning": true,
"maxTokensField": "max_tokens"
}
}
}
}
},
"permissions": [
{"action": "*", "resource": "*", "effect": "deny"},
{"action": "read", "resource": "*", "effect": "allow"},
{"action": "glob", "resource": "*", "effect": "allow"},
{"action": "grep", "resource": "*", "effect": "allow"},
{"action": "edit", "resource": "src/normalize.js", "effect": "allow"},
{"action": "shell", "resource": "node --test", "effect": "allow"},
{"action": "shell", "resource": "git diff *", "effect": "allow"},
{"action": "external_directory", "resource": "*", "effect": "deny"}
]
}
env は、OpenCode がどの環境変数を資格情報として読むかを指定します。OMNIAKEY_API_KEY は server プロセスの環境から渡します。modelID は OmniaKey に送るID、models のキーは OpenCode が provider/model の参照に使うIDです。どちらも minimax-m3.1-flash にしておくと、名前の解決で迷いません。
limit と capabilities は、未知のモデルに対する OpenCode の既定値 を上書きします。既定ではコンテキスト20万トークン、画像入力ありとみなされます。OmniaKey のモデルページ にはコンテキスト1Mトークンとあり、視覚入力の記載はありません。そこでコンテキスト上限を 1000000 にし、入力はテキストのみにしています。1M は公開されているウィンドウの大きさで、今回の小さな課題では使い切っていません。
body には今回試した2つの値、medium の思考と max_tokens 4096 を入れています。capabilities の effort 一覧は MiniMax のガイドにある5段階で、テストで使ったのは medium です。
permissions はデモ用リポジトリに合わせて狭くしてあります。まず全拒否にし、読み取り・glob・grep、src/normalize.js への編集、node --test と git diff だけを許可します。外部ディレクトリは拒否のままです。自分のプロジェクトに移すときは、パスとコマンドを置き換えてください。リポジトリ全体の編集や任意のシェル実行を許すと、この規模の課題には権限が大きすぎます。
Key は server を起動するシェルに置く
OpenCode は通常、共有のバックグラウンド server を起動するか、すでに動いているものを使います。セッション、設定、ツール実行はこの server が持ち、Provider の env も server 自身の環境から読みます。別のターミナルで export した Key は届きません。共有 server と --standalone の動きは OpenCode CLI ドキュメント に書かれています。
最初の1回は、Key のあるシェルから専用 server を起動すると結果が読みやすくなります。
export OMNIAKEY_API_KEY="your-omniakey-api-key"
opencode --standalone models
実測した models コマンドは provider 名を取りません。一覧に omniakey/minimax-m3.1-flash が出れば設定は読めています。続いて課題を1つ実行します。実測で使ったモデル指定と、下のプロンプトブロックの組み合わせです。山かっこのプレースホルダーをプロンプト全文に置き換えてください。
# Replace <task prompt> with the text from the prompt block below.
opencode --standalone run --model omniakey/minimax-m3.1-flash '<task prompt>'
--standalone はそのシェルから専用 server を起動するので、server は Key を引き継ぎ、プロジェクト設定も読みます。先に起動していた共有 server は自分の環境しか見ません。上の Key の行はプレースホルダーで、設定ファイルに秘密は入りません。
すでに OMNIAKEY_API_KEY のある環境で共有 server を動かしているなら、それを使っても構いません。環境がはっきりしないときは、専用 server のほうが再現しやすい道です。
読み取り・書き込み・テストの一周を確認する
ツール呼び出しが動くかは、小さな Node のサンプルで十分に分かります。用意したのは、並べ替えだけのスタブを持つ src/normalize.js、12ケースのテストファイル、node --test のスクリプトです。修正前は3件が通り、9件が落ちていました。
実行に使ったプロンプトは次のとおりです。
Fix src/normalize.js in this small JavaScript repository. Read the source and existing tests, then implement normalizeIntervals: accept valid half-open numeric intervals [start,end], drop empty intervals, sort them, and merge overlapping or touching ranges. Return fresh arrays without mutating the input. Do not change tests or configuration. Run `node --test` and summarize the result. Work only in this repository; do not read any credentials, network resources or files outside it. Use at most 8 tool calls.
実行では HTTP リクエストが6回、すべて 200 で返り、ツール操作は7回でした。
| ツール | 回数 | 内容 |
|---|---|---|
read | 5 | リポジトリ一覧、ソース、テスト用ディレクトリ、package.json、テストファイル |
write | 1 | src/normalize.js |
shell | 1 | node --test |
最初のターンでリポジトリ一覧とソースを並行して読み、次の2ターンでテスト用ディレクトリ、package.json、テストファイルを読みました。書き込みでソースを置き換え、最後の shell でテストを実行しています。所要時間は70.172秒でした。
ループ内のテスト出力は次のとおりです。
ℹ tests 12
ℹ suites 0
ℹ pass 12
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 52.316459
最後の回答は変更したファイルと12/12の結果を示しました。6回分の usage を合計すると、キャッシュで読んだ前半を含めて入力20,739トークン、出力803トークンです。1回の出力は最大363トークンで、4096の上限には届いていません。
リクエストはローカルの転送プロセスが本文もストリーム応答も変えずに OmniaKey へ送りました。1つの小さな課題の記録であり、このリポジトリで読み取り・書き込み・テストの一周が通ったことの確認です。速度やコード品質を広く比べた測定ではありません。
effort・コンテキスト・出力上限の決め方
M3.1 Flash では思考を切れません。MiniMax のテキスト生成ガイド は常に思考すると明記し、thinking: {"type": "disabled"} や reasoning_effort: "none" を送ると OpenAI 互換 API リファレンス は HTTP 400 を返します。ターンを短くしたいときは、思考を止めずに effort を下げてください。
| 設定 | 実測値 | 役割 |
|---|---|---|
reasoning_effort | medium | 答える前の思考量 |
max_tokens | 4096 | 1回あたりのクライアント出力上限 |
limit.context | 1000000 | 公開されているコンテキスト窓 |
reasoning_effort は low、medium、high、xhigh、max を受け付け、省略時は MiniMax のガイド によると max です。今回の課題は範囲が限られていたので medium で足りました。effort を下げると思考は短くなりますが、思考そのものは残ります。
temperature と top_p はこのモデルでは効きません。MiniMax の API リファレンス によると M3.1 Flash は常に 1 と 0.95 を使うため、無視される値を調整するより、2つのフィールドを消すほうが素直です。
1M トークンのコンテキストは OmniaKey のモデルページ と MiniMax のガイド の記載です。4096 はこの実行のために決めたクライアント側の上限で、提供元が公表した最大出力ではありません。思考トークンもこの上限に数えられるので、長い思考のあと finish_reason: "length" で終わり、本文がほとんど残らないことがあります。まず effort を下げ、それでも足りないときに上限を上げてください。
Key・モデルID・継続エラーの直し方
成功した実行ではエラーが出ていません。次の表は、リンクした OpenCode と MiniMax のドキュメントに沿った確認項目です。Base URL は https://api.omniakey.com/v1 が完全な形です。
| 症状 | 確認すること | 直し方 |
|---|---|---|
401 または 403 | server の環境に OMNIAKEY_API_KEY はあるか | OpenCode を起動するシェルで export するか --standalone を使う。Key は JSON に書かない |
Model unavailable、モデルが見つからない | models のキーと modelID がどちらも minimax-m3.1-flash か | 綴りと大文字小文字を直す。上流の MiniMax-M3.1-Flash は使わない。provider が有効かも確認する |
ゲートウェイから 404 | settings.baseURL が OmniaKey のアドレスそのものか | 上に書いた Base URL をそのまま入れ、余分なパスを消す |
adaptive thinking に関する 400 | 思考の無効化や reasoning_effort: "none" を送っていないか | その指定を消し、effort を下げる |
| 最初のツール呼び出しで止まる | reasoning フィールドを設定したか。履歴に含めているか | reasoningField を "reasoning_content" にし、同じプロンプトで再実行する |
本文が空で finish_reason が length | 思考が出力上限を食っていないか | 先に effort を下げ、それから max_tokens を上げる |
| 30万トークンのプロンプトでコンテキストエラー | OpenCode が20万の既定値のままか | limit.context を 1000000 にしてプロンプトを削る |
| 画像や PDF の入力が失敗する | OmniaKey のモデルページに視覚入力があるか | テキストだけを送り、ファイルは先に文字へ変換する |
継続の失敗は、モデルの不調に見えても設定が原因のことがあります。MiniMax の API リファレンス は、assistant の応答を tool_calls と reasoning_content の思考まで含めて次のターンに積むよう求めています。OpenCode の reasoningField 設定 はそのフィールドをストリームから読み、履歴を送るときに戻します。
今回の実行では、2回目以降のリクエストすべてで assistant のツール呼び出しメッセージに reasoning_content が付き、6回とも完了しました。各ツールの結果は次のターンに渡っています。
費用・権限・次の一歩
OmniaKey はトークン単位で課金し、単価はモデルページの現行レートです。今回の6回で入力20,739トークン(キャッシュで読んだ前半を含む)、出力803トークンでした。同じくらいの課題を見積もるときは、未キャッシュの入力、キャッシュ読み取りの入力、出力に分け、それぞれ現行の単価を掛けます。入力の合計に1つの単価を掛ける計算にはなりません。
自分のリポジトリでは、全拒否から始めて、課題に必要なフォルダとコマンドだけを足してください。編集の許可は課題で変えるファイルに、shell の許可はテストコマンドに残します。プロジェクトごとに書き換えるのはこの部分で、Provider とモデルのブロックはそのまま使えます。
同じ Key と Base URL の組み方は他のクライアントにも当てはまります。OmniaKey の Claude Code 設定ガイド は Claude Code の手順を、コーディングエージェントのドキュメント はツール別の手順をまとめています。
よくある質問
この設定は OpenCode V1 でも使えますか
実測したのは OpenCode v2.2.3 で、設定は V2 の複数形 providers オブジェクトを使います。V1 は形が違うので、古い環境へコピーする前にバージョンを確認してください。
opencode --standalone models に provider 名は要りますか
不要です。実測したコマンドは opencode --standalone models で、位置引数はありません。一覧に omniakey/minimax-m3.1-flash が出ます。
画像や PDF を OmniaKey 経由で送れますか
OmniaKey のモデルページに視覚入力の記載はなく、実測した設定もテキスト入力だけを宣言しています。テキストを送り、画像や PDF は先に文字へ変換してください。MiniMax の上流モデルは画像を受け付けますが、その事実が OmniaKey のモデルページに画像入力を追加するわけではありません。
max_tokens は 4096 より大きくできますか
クライアント側の上限は上げられます。4096 は実測値で、現在のページにこのモデルの固い最大値は書かれていません。思考もこの上限に数えられるので、長さでの打ち切りや空の本文に注意し、まず effort を下げてから上限を上げてください。
確認した出典
- OpenCode Providers — 2026年11月12日確認
- OpenCode Models — 2026年11月12日確認
- OpenCode CLI — 2026年11月12日確認
- MiniMax テキスト生成ガイド — 2026年11月12日確認
- MiniMax OpenAI 互換 API リファレンス — 2026年11月12日確認
- OmniaKey:MiniMax M3.1 Flash — 2026年11月12日確認
この記事で紹介しているモデル
関連記事
MiniMax M3.1 Flash 評価:ベンチマーク、速度、M3 との比較
トークン単価は M3 の半額、指数スコアは上。代わりに毎回必ず思考します。5 つの課題を並べて走らせ、待ち時間と費用まで比べました。
2026年のコーディングエージェントに最適なLLM:Claude・GPT・Gemini
2026年のコーディングエージェント向けLLMを比較。Claude、GPT、Geminiのツール利用、コンテキスト、コストを見比べ、1モデル固定よりルーティングが有効な理由を説明します。
Claude CodeをOmniaKey APIで使う方法
Claude Code を OmniaKey の Anthropic ネイティブ エンドポイントにポイントします。2 つの環境変数、サイレントにスワップされることのないクロード モデル、月額プランなしでトークンごとに課金されます。