GPT-Image 2.6 Flare と Sunburst が登場1 枚 $0.025 から

MiniMax M3.1 FlashをOpenCodeで使う:設定とツール呼び出し

OpenCode v2.2.3でMiniMax M3.1 Flashを動かした実測記録です。Provider設定の全文、実際のツール呼び出し、つまずきやすいエラーの直し方をまとめました。

Kiki, OmniaKey COO読了目安 9分
このページの内容

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 として置きます。実行に使った設定をそのまま公開できる形にしたものです。

json
{
  "$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 を起動すると結果が読みやすくなります。

bash
export OMNIAKEY_API_KEY="your-omniakey-api-key"
opencode --standalone models

実測した models コマンドは provider 名を取りません。一覧に omniakey/minimax-m3.1-flash が出れば設定は読めています。続いて課題を1つ実行します。実測で使ったモデル指定と、下のプロンプトブロックの組み合わせです。山かっこのプレースホルダーをプロンプト全文に置き換えてください。

bash
# 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件が落ちていました。

実行に使ったプロンプトは次のとおりです。

prompt
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回でした。

ツール回数内容
read5リポジトリ一覧、ソース、テスト用ディレクトリ、package.json、テストファイル
write1src/normalize.js
shell1node --test

最初のターンでリポジトリ一覧とソースを並行して読み、次の2ターンでテスト用ディレクトリ、package.json、テストファイルを読みました。書き込みでソースを置き換え、最後の shell でテストを実行しています。所要時間は70.172秒でした。

ループ内のテスト出力は次のとおりです。

text
ℹ 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_effortmedium答える前の思考量
max_tokens40961回あたりのクライアント出力上限
limit.context1000000公開されているコンテキスト窓

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 または 403server の環境に OMNIAKEY_API_KEY はあるかOpenCode を起動するシェルで export するか --standalone を使う。Key は JSON に書かない
Model unavailable、モデルが見つからないmodels のキーと modelID がどちらも minimax-m3.1-flash か綴りと大文字小文字を直す。上流の MiniMax-M3.1-Flash は使わない。provider が有効かも確認する
ゲートウェイから 404settings.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 を下げてから上限を上げてください。

確認した出典

この記事で紹介しているモデル

MiniMax M3.1 FlashOpenCodeコーディングエージェントツール呼び出しOmniaKey

関連記事

最近の記事

人気のガイド