Config & Provider
15 preset gateway (termasuk Custom URL)
Gateway > hanya menampilkan [0] Label tanpa URL (minimalis, tanpa bocor endpoint).
id · Label · Catatan
openai · OpenAI · gpt, o-series
anthropic · Anthropic · Claude, streaming tool_use
openrouter · OpenRouter · Gateway 75+ model
deepseek · DeepSeek · chat/reasoner
opencode-zen · OpenCode Zen · Gateway
google · Google Gemini · Konteks 1M, thought_signature pass-through
ollama · Ollama · Lokal, gratis, tanpa key
qwen · Qwen · Alibaba Qwen3-Coder (satu-satunya dengan spec OAuth terdaftar)
groq · Groq · Inferensi cepat
together · Together AI · Model terbuka
fireworks · Fireworks AI · —
mistral · Mistral AI · —
cohere · Cohere · —
generic · OpenAI-compatible umum · vLLM / LM Studio
custom · Custom URL · Pseudo-preset untuk baseUrl sendiri
Alur: wizard & /provider (add [0] OpenAI … [14] Custom URL) → API key ter-masking → auto-detect models via GET /models timeout 4 dtk → provider otomatis pindah saat pilih model beda provider (tanpa restart, via reloadProviders() setelah Gateway >2).
Dua jalur autentikasi
# 1. API key
minicode config add --baseUrl https://api.openai.com/v1 --apiKey sk-…
# 2. OAuth device-code (tanpa API key, tanpa kartu kredit) — RFC 8628
minicode auth list # provider yang mendukung
minicode auth login qwen # kode singkat → buka URL → tunggu persetujuan
minicode auth status # kredensial + kapan kedaluwarsa
minicode auth logout qwen
Token di ~/.minicode/auth.json (chmod 600), bukan config.json. Refresh otomatis margin 60 dtk. Provider OAuth yang belum login dibuang dari daftar dengan peringatan, bukan dikirim dengan header kosong.
Kejujuran: device flow teruji lengkap ke server OAuth lokal (pending/slow_down/denied/expired/clamp), tapi endpoint/clientId provider belum semua terkonfirmasi live. auth login chatgpt fail-fast di non-TTY. Jangan baca token aplikasi desktop orang lain — itu pencurian kredensial.
Keyring OS (ganti plaintext config)
minicode config set-key openrouter # pindah API key ke OS store, config tinggal referensi
minicode config delete-key openrouter # lupakan (provider nonaktif sampai di-set ulang)
Windows memakai DPAPI user-scope (hanya user ini yang bisa membuka); selain itu berkas chmod 600 dengan label jujur plain-file (bukan keyring). Referensi hilang/rusak = provider di-skip dengan peringatan (fail-closed, seperti OAuth). Matikan paksa via MINICODE_KEYSTORE_DISABLE=1.
Model & thinking effort
/model [cari] → picker provider::model, bisa difilter
Enter → pilih model (+ picker effort bila modelnya mendukung)
Esc → batal total
Effort tersimpan di ProviderEntry.reasoningEffort, berlaku sesi berikutnya, tampil badge [low|medium|high]. Default universal = omit (tanpa param thinking): default bawaan tiap model sudah di-tune vendornya. Knob hanya dikirim ke keluarga terbukti, dalam bahasa native-nya: OpenAI reasoning (o1/o3/o4, gpt-5/gpt-6 → reasoning_effort, level tervalidasi per model — pro = high saja); Claude ≤4.5 → budget 1024/2048/4096; Claude ≥4.6/5 → adaptive + output_config.effort. Selain itu tak pernah dikirimi param thinking (DeepSeek, Gemini, Groq, Ollama, free-tier, custom). Bila model menolak param (400/500), request diulang sekali tanpa param + diingat per sesi + dicatat [thinking] di stderr. Picker effort hanya muncul untuk model yang mendukung; sisanya select langsung tanpa menyentuh effort tersimpan. detectAndSave/auth login mempertahankan effort (tidak reset diam-diam). Mutasi ditulis ke file scope asal (bukan hasil merge) agar tidak duplikat/shadowing.
Model override sekali jalan:
minicode --model providerId::modelName "prompt"
minicode --provider openai "prompt"
minicode models --match gemini
MINICODE_PROVIDER_ORDER=openai,anthropic,deepseek mengurutkan provider agnostik tanpa edit config.
Pin eksplisit provider::model (kontrak)
Model berformat providerId::modelName = PIN: request hanya ke provider itu — tanpa fallback lintas provider dan tanpa substitusi diam-diam. Gagal = error jujur dari provider yang dipilih (limit/saldo/error server), user memilih model lanjutannya sendiri via /model. Alasan: fallback otomatis pernah melempar user dari model gratis ke model berbayar provider lain (tagihan tak terduga). Model bare (tanpa ::) tetap perilaku lama (first-match + substitusi + fallback rate_limit/server/network).
Build & router
Build provider terpusat di src/providers/build.ts. Router fallback untuk rate_limit/server/network (clone-error + base64 fix + retryAfter cap). Deteksi wire dari probe path /responses → hint responses; substring host hanya fallback. max_tokens 8192; stop length = peringatan eksplisit, bukan teks sunyi.
Responses API: /v1/responses, previous_response_id chaining per model, store:false default.