minicode

Menggunakan

Config & Provider

#14 preset gateway

Gateway > hanya menampilkan [0] Label tanpa URL (minimalis, tanpa bocor endpoint).

idLabelCatatan
openaiOpenAIgpt, o-series
anthropicAnthropicClaude, streaming tool_use
openrouterOpenRouterGateway 75+ model
deepseekDeepSeekchat/reasoner
opencode-zenOpenCode ZenGateway
googleGoogle GeminiKonteks 1M, thought_signature pass-through
ollamaOllamaLokal, gratis, tanpa key
qwenQwenAlibaba Qwen3-Coder (satu-satunya dengan spec OAuth terdaftar)
groqGroqInferensi cepat
togetherTogether AIModel terbuka
fireworksFireworks AI—
mistralMistral AI—
cohereCohere—
genericOpenAI-compatible umumvLLM / LM Studio
customCustom URLPseudo-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 (18 test: 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 (o*, gpt-5/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.