# MiniMax M3.1 Flash в OpenCode: проверенная настройка и вызовы инструментов

> Настройка MiniMax M3.1 Flash в OpenCode v2.2.3: полный конфиг provider, ID модели, реальные вызовы инструментов и исправление ошибок ключа и контекста.

- Canonical HTML: https://omniakey.com/ru/blog/minimax-m3-1-flash-opencode
- Markdown: https://omniakey.com/ru/blog/minimax-m3-1-flash-opencode.md
- Published: 2026-11-12 (updated 2026-11-12)
- Author: Kiki, COO at OmniaKey
- Language: ru
- Category: API setup
- Reading time: 9 min
- All posts: https://omniakey.com/blog/llms.txt

---

[MiniMax M3.1 Flash](https://omniakey.com/ru/minimax-m3-1-flash) работает в OpenCode v2.2.3 через [собственный OpenAI-совместимый провайдер](https://opencode.ai/docs/providers/). Точное имя модели в OpenCode — `omniakey/minimax-m3.1-flash`, Base URL — `https://api.omniakey.com/v1`. С настройкой ниже 12 ноября 2026 года прошла реальная задача в репозитории: пять чтений, одна запись, один запуск `node --test` и 12 из 12 успешных тестов.

OpenCode общается с собственным провайдером в формате OpenAI Chat Completions, а OmniaKey отдаёт этот формат по адресу /v1. Вся настройка умещается в одном файле проекта, но результат решают три детали: ID модели должен совпадать с написанием OmniaKey, ключ должен быть виден процессу сервера OpenCode, а конфигурация провайдера должна сохранять поле рассуждений между вызовами инструментов.

## Что подготовить перед началом

Используйте OpenCode V2. Проверенная версия — v2.2.3. В V2 собственные провайдеры лежат в объекте providers верхнего уровня; примеры для V1 устроены иначе. Перед копированием сверьтесь с [документацией провайдеров V2](https://opencode.ai/docs/providers/) и выполните `opencode --version`.

- OpenCode: v2.2.3, проверено 12 ноября 2026 года.
- ID модели в OmniaKey: `minimax-m3.1-flash`.
- Ссылка в OpenCode: `omniakey/minimax-m3.1-flash`.

Создайте ключ OmniaKey и положите его в `OMNIAKEY_API_KEY`. В JSON ниже указано только имя переменной, самого секрета там нет. Возьмите небольшой репозиторий с готовой командой тестов; в проверке использовался пример на Node с `src/normalize.js`, файлом тестов и тестовым скриптом.

Собственный API MiniMax использует ID со смешанным регистром `MiniMax-M3.1-Flash`. OmniaKey использует строчный `minimax-m3.1-flash`. В opencode.jsonc в обоих местах, в ключе карты models и в `modelID`, пишите строчный ID OmniaKey: при другом регистре он не совпадёт с ID OmniaKey.

Если вы ещё выбираете модель, в [обзоре MiniMax M3.1 Flash](https://omniakey.com/ru/blog/minimax-m3-1-flash-review) собраны бенчмарки, данные о выпуске и постоянно включённые рассуждения.

## Проверенная конфигурация 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` берётся из окружения процесса сервера. `modelID` — это ID, который уходит в OmniaKey, а ключ в карте models — ID, который OpenCode использует в ссылках provider/model. Если оба равны `minimax-m3.1-flash`, поиск остаётся однозначным.

Блоки limit и capabilities заменяют [умолчания OpenCode для неизвестной модели](https://opencode.ai/docs/models.md). Иначе OpenCode предполагает контекст 200 000 токенов и приём изображений. [Страница модели в OmniaKey](https://omniakey.com/ru/minimax-m3-1-flash) указывает контекст 1M токенов и не упоминает зрение, поэтому в конфигурации стоит предел 1 000 000, а на входе только текст. 1M — это опубликованное окно, а не размер, который исчерпала эта небольшая задача.

В блоке body два проверенных значения: средний уровень рассуждений и предел `max_tokens` 4096. Список effort в capabilities — пять уровней из руководства MiniMax; в тесте использовался medium.

Блок permissions намеренно узкий для демонстрационного репозитория. Сначала всё запрещено, затем разрешены чтение, glob и grep, правка `src/normalize.js`, команда `node --test` и git diff. Внешние каталоги тоже запрещены. Замените путь и команды правилами своего проекта. Общее разрешение на правку или shell даёт агенту гораздо больше доступа, чем нужно ограниченной задаче.

## Запуск с ключом в оболочке сервера

Обычно OpenCode запускает общий фоновый сервер или находит уже работающий. Этот сервер хранит сессии, конфигурацию и выполнение инструментов, а переменные env провайдера читает из своего окружения. Ключ, экспортированный в другом терминале, до него не доходит. [Документация CLI OpenCode](https://opencode.ai/docs/cli.md) описывает общий сервер и флаг `--standalone`.

Для предсказуемого первого запуска поднимите приватный сервер из оболочки, где есть ключ:

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

Проверенная команда models не принимает аргумент провайдера. Она выводит `omniakey/minimax-m3.1-flash`. Затем запустите одну задачу. В проверке использовались этот аргумент модели и блок промпта ниже; замените заметный заполнитель точным текстом:

```bash
# Replace <task prompt> with the text from the prompt block below.
opencode --standalone run --model omniakey/minimax-m3.1-flash '<task prompt>'
```

Флаг `--standalone` запускает приватный сервер из этой оболочки, поэтому он наследует ключ и читает конфигурацию проекта. Общий сервер, запущенный раньше, видит только своё окружение. Строка с ключом выше — заполнитель; в файле конфигурации секрета по-прежнему нет.

Если общий сервер уже работает в окружении с OMNIAKEY\_API\_KEY, можно использовать его. Когда это окружение неясно, приватный сервер — воспроизводимый путь.

## Проверка цикла чтения, записи и теста

Небольшого примера на 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-запросах, все вернули 200:

|Инструмент|Раз|Что охватил|
|-|-|-|
|`read`|5|Список репозитория, исходник, каталог тестов, `package.json`, файл тестов|
|`write`|1|`src/normalize.js`|
|`shell`|1|`node --test`|

Первый ход отправил два чтения параллельно: список репозитория и исходник. Следующие два хода прочитали каталог тестов, файл пакета и файл тестов. Запись заменила исходник. Вызов shell запустил тесты. Весь запуск занял 70,172 секунды.

Тестовый вызов внутри цикла сообщил:

```text
ℹ tests 12
ℹ suites 0
ℹ pass 12
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 52.316459
```

Финальный ответ назвал изменённый файл и результат 12/12. Шесть блоков usage в сумме дают 20 739 входных токенов, включая чтение префикса из кеша, и 803 выходных токена. Самое длинное завершение — 363 токена, так что предел 4096 не был достигнут.

Локальный процесс пересылки отправил тело запроса и потоковый ответ в OmniaKey без изменений. Это одна небольшая задача: она показывает, что цикл чтения, записи и теста работает в этом репозитории, а не сравнивает скорость или качество кода на любых проектах.

## Как задать effort, контекст и лимит вывода

На M3.1 Flash рассуждения обязательны. [Руководство MiniMax по генерации текста](https://platform.minimax.io/docs/guides/text-generation.md) говорит, что модель думает всегда, а [справка по OpenAI-совместимому API](https://platform.minimax.io/docs/api-reference/text-openai-api.md) возвращает HTTP 400, если клиент отправляет `thinking: {"type": "disabled"}` или `reasoning_effort: "none"`. Оставляйте рассуждения включёнными и снижайте effort, когда нужен более короткий ход.

|Настройка|Проверенное значение|Что регулирует|
|-|-|-|
|`reasoning_effort`|`medium`|Сколько модель думает перед ответом|
|`max_tokens`|`4096`|Предел вывода клиента на один вызов|
|`limit.context`|`1000000`|Опубликованное окно контекста|

`reasoning_effort` принимает low, medium, high, xhigh и max; если параметр не указан, [руководство MiniMax](https://platform.minimax.io/docs/guides/text-generation.md) называет значением по умолчанию max. Для этой ограниченной задачи хватило medium. Снижение effort укорачивает рассуждения, но не выключает их.

Параметры сэмплирования на этой модели ничего не делают. [Справка API MiniMax](https://platform.minimax.io/docs/api-reference/text-openai-api.md) говорит, что M3.1 Flash всегда использует 1 и 0,95, поэтому убрать temperature и top\_p чище, чем настраивать игнорируемые значения.

Контекст 1M токенов взят со [страницы модели OmniaKey](https://omniakey.com/ru/minimax-m3-1-flash) и из [руководства MiniMax](https://platform.minimax.io/docs/guides/text-generation.md). Предел вывода 4096 — это выбранный для запуска клиентский предохранитель, а не опубликованный максимум провайдера. Токены рассуждений входят в этот предел, поэтому долгий ход может закончиться с `finish_reason: "length"` и почти без текста. Сначала снизьте effort, а предел повышайте, если задаче действительно нужно больше места.

## Исправление ошибок ключа, ID и продолжения

Успешный запуск не дал ошибок. Список ниже опирается на связанную документацию OpenCode и MiniMax. Точный Base URL — `https://api.omniakey.com/v1`.

|Симптом|Что проверить|Как исправить|
|-|-|-|
|`401` или `403`|Есть ли `OMNIAKEY_API_KEY` в окружении сервера?|Экспортируйте в оболочке, которая запускает OpenCode, или используйте `--standalone`; держите ключ вне JSON.|
|`Model unavailable` или модель не найдена|Ключ карты и `modelID` оба равны `minimax-m3.1-flash`?|Исправьте написание и регистр; не берите ID `MiniMax-M3.1-Flash` от провайдера; проверьте, что provider включён.|
|`404` от шлюза|`settings.baseURL` — это ровно адрес OmniaKey?|Впишите точный Base URL выше и уберите лишний путь.|
|`400` про adaptive thinking|Клиент отправил отключённые рассуждения или `reasoning_effort: "none"`?|Уберите это и снизьте effort.|
|Остановка после первого вызова инструмента|Задано ли поле рассуждений? Есть ли оно в истории?|Установите `reasoningField` в `"reasoning_content"` и повторите тот же промпт.|
|Пустой ответ, `finish_reason: "length"`|Съедают ли рассуждения лимит вывода?|Сначала снизьте effort, затем поднимите `max_tokens`.|
|Ошибка контекста на промпте в 300K|OpenCode всё ещё считает по умолчанию 200K?|Поставьте `limit.context` в `1000000` и сократите промпт.|
|Не проходит ввод изображения или PDF|Указано ли зрение на странице OmniaKey?|Отправляйте только текст, а файл сначала преобразуйте.|

Продолжение может сломаться из-за конфигурации, хотя выглядит как проблема модели. [Справка API MiniMax](https://platform.minimax.io/docs/api-reference/text-openai-api.md) требует добавлять полный ответ assistant в следующие ходы, включая `tool_calls` и рассуждения из `reasoning_content`. [Настройка reasoningField в OpenCode](https://opencode.ai/docs/models.md) читает это поле из потока и восстанавливает его при отправке истории.

В этом запуске каждый последующий запрос нёс поле `reasoning_content` в сообщениях assistant с вызовом инструмента, все шесть запросов завершились, и каждый результат инструмента попадал в следующий ход.

## Стоимость, права и следующие шаги

OmniaKey считает по токенам по текущим тарифам на странице модели. Шесть вызовов использовали 20 739 входных токенов, включая чтение префикса из кеша, и 803 выходных токена. Чтобы оценить похожую задачу, разделите расход на вход без кеша, вход из кеша и выход, затем умножьте каждую часть на её текущий тариф. Общий вход нельзя умножить на одну ставку.

В своём репозитории начните с запрета всего и добавьте только те папки и команды, которые нужны задаче. Оставьте право правки на файлах, которые задача меняет, а право shell — на команде тестов. Именно эту часть переписывают для каждого проекта; блоки провайдера и модели можно не трогать.

Та же схема с ключом и Base URL подходит другим клиентам. [Руководство по настройке Claude Code](https://omniakey.com/ru/blog/claude-code-setup) от OmniaKey описывает этот клиент, а [документация по агентам для кода](https://docs.omniakey.com/ru/coding) перечисляет шаги для каждого инструмента.

## Частые вопросы

### Подходит ли эта конфигурация для OpenCode V1?

Проверена версия OpenCode v2.2.3, и конфигурация использует объект providers во множественном числе из V2. В V1 другая форма, поэтому сверьте версию, прежде чем копировать её в старую установку.

### Нужен ли `opencode --standalone models` фильтр провайдера?

Нет. Проверенная команда — ровно `opencode --standalone models`, без аргумента провайдера. Она выводит `omniakey/minimax-m3.1-flash`.

### Можно ли отправлять изображения или PDF в эту модель через OmniaKey?

Страница модели OmniaKey не указывает зрение, и проверенная конфигурация объявляет только текстовый вход. Отправляйте текст, а изображения и PDF сначала преобразуйте. Исходная модель MiniMax принимает изображения, но это не добавляет ввод изображений на страницу модели в OmniaKey.

### Можно ли поднять `max_tokens` выше 4096?

Да, клиентский предел можно увеличить. 4096 — проверенное значение, и текущие страницы не называют жёсткий максимум для этой модели. Рассуждения входят в предел, поэтому следите за обрывом по длине или пустым ответом; сначала снизьте effort, затем поднимайте предел.

## Проверенные источники

- [OpenCode Providers](https://opencode.ai/docs/providers/) — проверено 12 ноября 2026 года
- [OpenCode Models](https://opencode.ai/docs/models.md) — проверено 12 ноября 2026 года
- [OpenCode CLI](https://opencode.ai/docs/cli.md) — проверено 12 ноября 2026 года
- [Руководство MiniMax по генерации текста](https://platform.minimax.io/docs/guides/text-generation.md) — проверено 12 ноября 2026 года
- [Справка MiniMax по OpenAI-совместимому API](https://platform.minimax.io/docs/api-reference/text-openai-api.md) — проверено 12 ноября 2026 года
- [OmniaKey: MiniMax M3.1 Flash](https://omniakey.com/ru/minimax-m3-1-flash) — проверено 12 ноября 2026 года
