# MiniMax M3.1 Flash di OpenCode: konfigurasi teruji dan panggilan tool

> Menyiapkan MiniMax M3.1 Flash di OpenCode v2.2.3: JSON provider lengkap, ID model, panggilan tool nyata, dan perbaikan error key serta konteks.

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

---

[MiniMax M3.1 Flash](https://omniakey.com/id/minimax-m3-1-flash) berjalan di OpenCode v2.2.3 lewat [provider khusus yang kompatibel dengan OpenAI](https://opencode.ai/docs/providers/). Nama model persisnya di OpenCode adalah `omniakey/minimax-m3.1-flash`, Base URL-nya `https://api.omniakey.com/v1`, dan konfigurasi di bawah menyelesaikan tugas repositori sungguhan pada 12 November 2026: lima pembacaan, satu penulisan, satu `node --test`, dan 12 dari 12 tes lulus.

OpenCode berbicara dalam format OpenAI Chat Completions dengan provider khusus, dan OmniaKey menyajikan format itu di /v1. Semuanya muat dalam satu file proyek, tetapi tiga hal menentukan berhasil atau tidaknya: ID model harus sama dengan ejaan OmniaKey, key harus sampai ke proses server OpenCode, dan konfigurasi provider harus mempertahankan field penalaran antar panggilan tool.

## Yang perlu disiapkan

Gunakan OpenCode V2. Versi yang diuji adalah v2.2.3. V2 menaruh provider khusus di objek providers tingkat atas; contoh V1 memakai bentuk lain. Periksa [dokumentasi provider V2](https://opencode.ai/docs/providers/) dan `opencode --version` sebelum menyalin konfigurasi.

- OpenCode: v2.2.3, diuji 12 November 2026.
- ID model di OmniaKey: `minimax-m3.1-flash`.
- Referensi di OpenCode: `omniakey/minimax-m3.1-flash`.

Buat key OmniaKey dan simpan di `OMNIAKEY_API_KEY`. JSON di bawah hanya menyebut nama variabel dan tidak pernah memuat rahasianya. Pilih repositori kecil yang sudah punya perintah tes; pengujian memakai contoh Node dengan `src/normalize.js`, satu file tes, dan skrip tes.

API milik MiniMax memakai ID dengan huruf campur `MiniMax-M3.1-Flash`. OmniaKey memakai huruf kecil `minimax-m3.1-flash`. Di opencode.jsonc, tulis ID huruf kecil OmniaKey di kedua tempat, yaitu kunci peta models dan `modelID`; huruf besar-kecil yang berbeda tidak cocok dengan ID OmniaKey.

Jika masih memilih model, [ulasan MiniMax M3.1 Flash](https://omniakey.com/id/blog/minimax-m3-1-flash-review) memuat benchmark, informasi rilis, dan penalaran yang selalu aktif.

## Konfigurasi OpenCode V2 yang kami uji

Letakkan file ini di akar proyek sebagai opencode.jsonc. Ini bentuk publik dari konfigurasi yang dipakai saat pengujian.

```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"}
  ]
}
```

Array env memberi tahu OpenCode variabel kredensial mana yang dibaca: `OMNIAKEY_API_KEY` berasal dari lingkungan proses server. `modelID` adalah ID yang dikirim ke OmniaKey, sedangkan kunci di peta models adalah ID yang dipakai OpenCode dalam referensi provider/model. Membiarkan keduanya `minimax-m3.1-flash` menghindari pencarian yang ambigu.

Blok limit dan capabilities menggantikan [asumsi bawaan OpenCode untuk model yang tidak dikenal](https://opencode.ai/docs/models.md). Tanpa itu, OpenCode menganggap konteks 200.000 token dan input gambar. [Halaman model OmniaKey](https://omniakey.com/id/minimax-m3-1-flash) mencantumkan konteks 1M token dan tidak mencantumkan entri visi, jadi konfigurasi menetapkan batas konteks 1.000.000 dan input hanya teks. Angka 1M adalah jendela yang dipublikasikan, bukan ukuran yang dihabiskan tugas kecil ini.

Blok body memuat dua nilai yang diuji: effort penalaran medium dan batas `max_tokens` 4096. Daftar effort di capabilities adalah lima tingkat yang dijelaskan panduan MiniMax; yang dipakai dalam tes adalah medium.

Blok permissions sengaja sempit untuk repo demo. Semua ditolak lebih dulu, lalu membaca, glob, dan grep, edit `src/normalize.js`, perintah `node --test`, dan git diff diizinkan. Direktori eksternal tetap ditolak. Ganti path dan perintah dengan aturan proyek Anda. Izin edit atau shell yang luas memberi agen jauh lebih banyak akses daripada yang dibutuhkan tugas terbatas.

## Jalankan dengan key di shell server

OpenCode biasanya memulai atau menemukan server latar belakang bersama. Server itu menyimpan sesi, konfigurasi, dan eksekusi tool, serta membaca variabel env provider dari lingkungan prosesnya sendiri. Key yang di-export di terminal lain tidak sampai ke sana. [Dokumentasi CLI OpenCode](https://opencode.ai/docs/cli.md) menjelaskan server bersama dan opsi `--standalone`.

Untuk percobaan pertama yang bisa diprediksi, pakai server privat dari shell yang memiliki key:

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

Perintah models yang diuji tidak memakai argumen provider. Perintah itu menampilkan `omniakey/minimax-m3.1-flash`. Lalu jalankan satu tugas. Pengujian memakai argumen model ini dan blok prompt di bawah; ganti penanda dengan teks persisnya:

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

Opsi `--standalone` memulai server privat dari shell itu, sehingga server mewarisi key dan membaca konfigurasi proyek. Server bersama yang dimulai lebih dulu hanya melihat lingkungannya sendiri. Baris key di atas adalah penanda; file konfigurasi tetap tanpa rahasia.

Jika server bersama sudah berjalan di lingkungan yang punya OMNIAKEY\_API\_KEY, Anda boleh memakainya. Bila lingkungan itu tidak jelas, server privat adalah jalur yang bisa direproduksi.

## Periksa siklus baca, tulis, dan uji

Contoh Node kecil cukup untuk melihat apakah panggilan tool berfungsi. Contoh itu punya `src/normalize.js` dengan stub yang hanya mengurutkan, file tes berisi 12 kasus, dan skrip node --test. Sebelum perbaikan, 3 tes lulus dan 9 gagal.

Ini prompt yang dipakai saat pengujian, tanpa perubahan:

```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.
```

Pengujian menghasilkan tujuh operasi tool dalam enam permintaan HTTP, semuanya mengembalikan 200:

|Tool|Jumlah|Cakupan|
|-|-|-|
|`read`|5|Daftar repo, sumber, direktori tes, `package.json`, file tes|
|`write`|1|`src/normalize.js`|
|`shell`|1|`node --test`|

Giliran pertama mengirim dua pembacaan paralel, satu untuk daftar repositori dan satu untuk sumber. Dua giliran berikutnya membaca direktori tes, file paket, dan file tes. Penulisan mengganti sumber. Panggilan shell menjalankan tes. Total waktunya 70,172 detik.

Panggilan tes di dalam siklus melaporkan:

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

Jawaban terakhir menyebut file yang berubah dan hasil 12/12. Enam blok usage berjumlah 20.739 token input, termasuk pembacaan prefiks dari cache, dan 803 token output. Completion terpanjang 363 token, jadi batas 4096 tidak pernah tercapai.

Proses penerusan lokal mengirim body permintaan dan respons streaming ke OmniaKey tanpa perubahan. Ini satu tugas kecil: buktinya siklus baca, tulis, dan uji berjalan di repositori ini, bukan perbandingan kecepatan atau kualitas kode secara luas.

## Atur effort, konteks, dan batas output

Penalaran wajib pada M3.1 Flash. [Panduan pembuatan teks MiniMax](https://platform.minimax.io/docs/guides/text-generation.md) menyatakan model selalu berpikir, dan [referensi API kompatibel OpenAI](https://platform.minimax.io/docs/api-reference/text-openai-api.md) mengembalikan HTTP 400 jika klien mengirim `thinking: {"type": "disabled"}` atau `reasoning_effort: "none"`. Biarkan penalaran aktif dan turunkan effort saat ingin giliran lebih pendek.

|Pengaturan|Nilai teruji|Yang dikendalikan|
|-|-|-|
|`reasoning_effort`|`medium`|Seberapa banyak model berpikir sebelum menjawab|
|`max_tokens`|`4096`|Batas output klien per panggilan|
|`limit.context`|`1000000`|Jendela konteks yang dipublikasikan|

`reasoning_effort` menerima low, medium, high, xhigh, dan max; bila dihilangkan, [panduan MiniMax](https://platform.minimax.io/docs/guides/text-generation.md) menyebut defaultnya max. Medium cukup untuk tugas terbatas ini. Menurunkan effort memperpendek penalaran, tetapi tidak mematikannya.

Kontrol sampling tidak berpengaruh pada model ini. [Referensi API MiniMax](https://platform.minimax.io/docs/api-reference/text-openai-api.md) menyatakan M3.1 Flash selalu memakai 1 dan 0,95, jadi menghapus temperature dan top\_p lebih bersih daripada menyetel nilai yang diabaikan.

Konteks 1M token berasal dari [halaman model OmniaKey](https://omniakey.com/id/minimax-m3-1-flash) dan [panduan MiniMax](https://platform.minimax.io/docs/guides/text-generation.md). Batas output 4096 adalah batas pengaman sisi klien yang dipilih untuk pengujian ini, bukan maksimum yang dipublikasikan penyedia. Token penalaran ikut dihitung dalam batas itu, sehingga giliran berpikir panjang bisa berakhir dengan `finish_reason: "length"` dan teks akhir sedikit atau kosong. Turunkan effort lebih dulu, lalu naikkan batas jika tugas butuh ruang lebih.

## Perbaiki error key, ID model, dan lanjutan

Pengujian yang berhasil tidak menghasilkan error. Daftar ini mengikuti dokumentasi OpenCode dan MiniMax yang ditautkan. Base URL persisnya `https://api.omniakey.com/v1`.

|Gejala|Yang diperiksa|Perbaikan|
|-|-|-|
|`401` atau `403`|Apakah `OMNIAKEY_API_KEY` ada di lingkungan server?|Export di shell yang menjalankan OpenCode atau pakai `--standalone`; jangan taruh key di JSON.|
|`Model unavailable` atau model tidak ditemukan|Apakah kunci peta dan `modelID` sama-sama `minimax-m3.1-flash`?|Perbaiki ejaan dan huruf besar-kecil; jangan pakai ID `MiniMax-M3.1-Flash` dari penyedia; pastikan provider aktif.|
|`404` dari gateway|Apakah `settings.baseURL` persis alamat OmniaKey?|Tulis Base URL persis di atas, hapus path tambahan.|
|`400` soal adaptive thinking|Apakah klien mengirim penalaran nonaktif atau `reasoning_effort: "none"`?|Hapus dan turunkan effort.|
|Berhenti setelah panggilan tool pertama|Apakah field penalaran diatur? Apakah riwayat memuatnya?|Setel `reasoningField` ke `"reasoning_content"` dan ulangi prompt yang sama.|
|Konten kosong, `finish_reason: "length"`|Apakah penalaran menghabiskan batas output?|Turunkan effort dulu, lalu naikkan `max_tokens`.|
|Error konteks pada prompt 300K|Apakah OpenCode masih memakai default 200K?|Setel `limit.context` ke `1000000` dan pendekkan prompt.|
|Input gambar atau PDF gagal|Apakah halaman OmniaKey mencantumkan visi?|Kirim teks saja dan ubah file lebih dulu.|

Kegagalan lanjutan bisa berasal dari konfigurasi meski terlihat seperti masalah model. [Referensi API MiniMax](https://platform.minimax.io/docs/api-reference/text-openai-api.md) meminta respons assistant lengkap ditambahkan ke giliran berikutnya, termasuk `tool_calls` dan penalaran dalam `reasoning_content`. [Pengaturan reasoningField OpenCode](https://opencode.ai/docs/models.md) membaca field itu dari stream dan mengembalikannya saat mengirim riwayat.

Dalam pengujian ini, setiap permintaan lanjutan membawa field `reasoning_content` pada pesan panggilan tool assistant, keenam permintaan selesai, dan setiap hasil tool masuk ke giliran berikutnya.

## Biaya, izin, dan langkah berikutnya

OmniaKey menagih per token sesuai tarif terbaru di halaman model. Enam panggilan di sini memakai 20.739 token input, termasuk pembacaan prefiks dari cache, dan 803 token output. Untuk memperkirakan tugas serupa, pisahkan penggunaan menjadi input tanpa cache, input yang dibaca dari cache, dan output, lalu kalikan tiap bagian dengan tarif terbarunya. Total input saja tidak bisa dikalikan dengan satu tarif.

Di repositori Anda, mulai dari aturan tolak semua dan tambahkan hanya folder dan perintah yang dibutuhkan tugas. Pertahankan izin edit pada file yang diubah tugas dan izin shell pada perintah tes. Bagian inilah yang ditulis ulang per proyek; blok provider dan model bisa tetap seperti adanya.

Pola key dan Base URL yang sama berlaku untuk klien lain. [Panduan penyiapan Claude Code](https://omniakey.com/id/blog/claude-code-setup) dari OmniaKey membahas klien itu, dan [dokumentasi agen koding](https://docs.omniakey.com/en/coding) memuat langkah per tool.

## Pertanyaan umum

### Apakah konfigurasi ini cocok untuk OpenCode V1?

Versi yang diuji adalah OpenCode v2.2.3 dan konfigurasi memakai objek providers bentuk jamak dari V2. Halaman V1 memakai bentuk lain, jadi periksa versi sebelum menyalinnya ke instalasi lama.

### Apakah `opencode --standalone models` butuh filter provider?

Tidak. Perintah yang diuji persis `opencode --standalone models`, tanpa argumen provider. Perintah itu menampilkan `omniakey/minimax-m3.1-flash`.

### Bisakah saya mengirim gambar atau PDF ke model ini lewat OmniaKey?

Halaman model OmniaKey tidak mencantumkan visi dan konfigurasi yang diuji hanya menyatakan input teks. Kirim teks dan ubah gambar atau PDF lebih dulu. Model asal MiniMax menerima gambar, tetapi itu tidak menambah input gambar ke halaman model OmniaKey.

### Bisakah `max_tokens` dinaikkan di atas 4096?

Ya, batas sisi klien bisa dinaikkan. 4096 adalah nilai yang diuji dan halaman saat ini tidak menyebut maksimum tetap untuk model ini. Penalaran ikut dihitung dalam batas, jadi perhatikan potongan karena panjang atau konten kosong; turunkan effort dulu, lalu naikkan batas.

## Sumber yang diperiksa

- [OpenCode Providers](https://opencode.ai/docs/providers/) — diperiksa 12 November 2026
- [OpenCode Models](https://opencode.ai/docs/models.md) — diperiksa 12 November 2026
- [OpenCode CLI](https://opencode.ai/docs/cli.md) — diperiksa 12 November 2026
- [Panduan pembuatan teks MiniMax](https://platform.minimax.io/docs/guides/text-generation.md) — diperiksa 12 November 2026
- [Referensi API kompatibel OpenAI MiniMax](https://platform.minimax.io/docs/api-reference/text-openai-api.md) — diperiksa 12 November 2026
- [OmniaKey: MiniMax M3.1 Flash](https://omniakey.com/id/minimax-m3-1-flash) — diperiksa 12 November 2026
