Integrasi AgentRouter sebagai custom provider di OpenCode, lengkap dengan plugin injeksi header untuk mem-bypass client-whitelist AgentRouter dan bug drop-apiKey pada pipeline AISDK.
Sekali jalan (./setup.sh) kamu langsung bisa pakai model apa pun yang di-grant untuk API key kamu (mis. claude-opus-4-8, glm-5.2, gpt-5.5) di dalam OpenCode — baik mode TUI maupun opencode run.
- Kenapa butuh ini?
- Prasyarat
- Instalasi Cepat
- Mode Non-Interaktif
- Cara Pakai
- Extended Thinking / Reasoning
- Menambah / Mengganti Model
- Cara Kerja (Arsitektur)
- Struktur File
- Troubleshooting
- Uninstall
- FAQ
AgentRouter menyediakan akses ke model-model premium lewat endpoint yang kompatibel dengan Anthropic/OpenAI. Tapi ada dua hambatan kalau langsung dipasang di OpenCode:
- Client-whitelist. AgentRouter menolak request yang tidak membawa header khas klien resmi (
X-Stainless-*,User-Agent: RooCode/..., dll.). Konfigurasi provider biasa tidak mengirim header ini. - Bug drop-apiKey. Saat
@ai-sdk/anthropicdipakai denganbaseURLcustom, pipeline AISDK OpenCode kadang tidak meneruskanapiKeyke request → model membalas kosong /Type validation failed: Value: null.
Skrip ini menyelesaikan keduanya lewat plugin chat.headers yang menyuntik header (termasuk x-api-key) langsung di layer HTTP.
| Butuh | Keterangan |
|---|---|
node |
Untuk merge JSON konfigurasi secara aman (wajib). |
opencode |
Kalau belum ada, skrip menawarkan install via npm i -g opencode-ai. |
curl |
Opsional, untuk validasi key. |
| API key AgentRouter | Format sk-.... |
cd agentrouter-opencode-setup
chmod +x setup.sh
./setup.shSkrip akan menuntun kamu:
- API Key — tempel key
sk-...(input tersembunyi). - Base URL — enter untuk default
https://agentrouter.org/v1. - Model — ketik daftar model dipisah koma, mis:
claude-opus-4-8, glm-5.2, gpt-5.5⚠️ Hanya isi model yang memang di-grant untuk key kamu. Key yang cuma punya akses Opus tidak bisa memanggilglm-5.2/gpt-5.5(akan error "无权访问模型" / no access). - Model default — pilih salah satu.
- Validasi + Test — skrip cek
/modelslalu menjalankanopencode runpercobaan.
Selesai. Kalau muncul balasan model saat test, setup berhasil. 🎉
Cocok untuk otomasi / provisioning. Semua input lewat environment variable:
AR_API_KEY="sk-xxxxxxxx" \
AR_MODELS="claude-opus-4-8,glm-5.2,gpt-5.5" \
AR_DEFAULT="claude-opus-4-8" \
./setup.sh <<< $'\n' # auto-jawab prompt test| Variabel | Fungsi | Default |
|---|---|---|
AR_API_KEY |
API key AgentRouter | (wajib) |
AR_BASE_URL |
Base URL endpoint | https://agentrouter.org/v1 |
AR_MODELS |
Daftar model, dipisah koma | (wajib) |
AR_DEFAULT |
Model default | model pertama di AR_MODELS |
# Masuk TUI (pakai model default)
opencode
# One-shot ke model tertentu
opencode run "Jelaskan apa itu closure di JS" -m "agentrouter/claude-opus-4-8"
opencode run "Refactor fungsi ini" -m "agentrouter/glm-5.2"Di dalam TUI, ganti model lewat command palette (/models atau Ctrl/Cmd-sesuai keybind OpenCode). Semua model di bawah provider agentrouter akan muncul.
Model Claude di AgentRouter mendukung extended thinking. Setup ini otomatis mengaktifkannya untuk tiap model lewat options.thinking plus dua variant:
"claude-opus-4-8": {
"name": "claude-opus-4-8",
"options": { "thinking": { "type": "enabled", "budgetTokens": 16000 } },
"variants": {
"high": { "thinking": { "type": "enabled", "budgetTokens": 16000 } },
"max": { "thinking": { "type": "enabled", "budgetTokens": 32000 } }
}
}budgetTokens= jumlah token yang dialokasikan untuk proses berpikir sebelum menjawab.- Variant
high(16k) danmax(32k) bisa di-cycle di TUI lewat keybindvariant_cycle. - Di TUI, blok thinking tampil sebagai bagian reasoning yang bisa di-expand.
- Verifikasi: response akan memuat token
reasoning(cek via--print-logs), dan AgentRouter mengembalikan blokthinking(sudah dites viacurllangsung ke/v1/messages).
Menyesuaikan budget: edit angka budgetTokens di ~/.config/opencode/opencode.json. Pastikan budgetTokens selalu lebih kecil dari max_tokens model.
Model tanpa dukungan thinking: kalau menambah model yang tidak mendukung thinking (mis. beberapa varian GPT via format Anthropic), hapus blok options.thinking dan variants untuk model tersebut agar tidak error.
Cukup jalankan ulang:
./setup.shIsi ulang daftar model dengan set terbaru. Skrip merge konfigurasi—MCP server dan provider lain tidak akan hilang. Provider agentrouter ditulis ulang sesuai input baru.
Alternatif manual: edit blok provider.agentrouter.models di ~/.config/opencode/opencode.json.
┌─────────────┐ request LLM ┌──────────────────────┐ HTTP + header ┌──────────────┐
│ OpenCode │ ───────────────▶ │ plugin chat.headers │ ─────────────────▶ │ AgentRouter │
│ (@ai-sdk/ │ │ suntik: │ x-api-key + │ /v1/messages│
│ anthropic) │ │ • x-api-key │ spoof headers │ │
│ baseURL = │ │ • anthropic-version │ └──────────────┘
│ agentrouter │ │ • X-Stainless-* │
└─────────────┘ │ • User-Agent RooCode│
└──────────────────────┘
- Provider
@ai-sdk/anthropic— memformat body request dalam format Anthropic Messages API (yang didukung native oleh AgentRouter).baseURLdiarahkan ke AgentRouter. - Plugin
chat.headers— dipanggil tiap request, menimpa/menambah header di layer HTTP. Ini titik kunci:x-api-keydisuntik ulang di sini sehingga bug drop-apiKey tidak berpengaruh, dan spoof header membuat AgentRouter menerima request. auth.json— menyimpan credential sebagai fallback (agentrouter+anthropic).
agentrouter-opencode-setup/
├── setup.sh # skrip auto-setup interaktif & non-interaktif
├── README.md # dokumen ini
├── lib/
│ └── json-edit.js # merge/hapus provider & credential (aman, non-destruktif)
└── templates/
└── agentrouter.plugin.js # template plugin (API_KEY di-inject saat install)
File yang dihasilkan di sistem:
| Path | Isi |
|---|---|
~/.config/opencode/opencode.json |
Provider agentrouter + model + default. |
~/.local/share/opencode/auth.json |
Credential API key. |
~/.opencode/plugin/agentrouter.js |
Plugin injeksi header (hasil render template). |
Type validation failed: Value: null
Plugin tidak termuat / apiKey tidak tersuntik. Pastikan ~/.opencode/plugin/agentrouter.js ada dan berisi key kamu (bukan __API_KEY__). Jalankan ulang ./setup.sh.
无权访问模型 <model> / "no access to model"
API key kamu tidak punya akses ke model itu. Hapus model tsb dari daftar, isi hanya yang di-grant.
Balasan kosong / model diam
Biasanya spoof header tertolak. Cek plugin masih memuat User-Agent: RooCode/3.53.0 dan X-Stainless-*. Test manual:
curl -s https://agentrouter.org/v1/models \
-H "Authorization: Bearer sk-..." \
-H "User-Agent: RooCode/3.53.0"Harus mengembalikan "success":true.
'node' tidak ditemукan
Install Node.js dulu—skrip memakainya untuk merge JSON dengan aman.
Provider tidak muncul di TUI
Pastikan menulis ke config global (~/.config/opencode/opencode.json) dan restart OpenCode.
./setup.sh --uninstallMenghapus: plugin, provider agentrouter dari config, dan credential dari auth.json. Konfigurasi lain (MCP, provider lain) tetap utuh.
Apakah bekerja di TUI dan opencode run?
Ya. Config + plugin bersifat global, dipakai oleh semua mode.
Amankah key saya?
Key disimpan lokal di auth.json dan di-embed ke plugin lokal. Jangan commit file-file tersebut ke repo publik.
Bisa pakai model non-Claude (GLM/GPT)?
Bisa, selama API key kamu punya akses. Body tetap diformat via Anthropic Messages API; AgentRouter menerjemahkan ke model target. Kalau ada model yang butuh endpoint OpenAI murni dan bermasalah, laporkan—bisa dibuat varian provider @ai-sdk/openai-compatible.
Kenapa header-nya menyamar jadi RooCode? AgentRouter membatasi akses ke klien tertentu. Header ini membuat request diterima. Gunakan sesuai ketentuan layanan AgentRouter.
Dibuat untuk mempermudah pemakaian AgentRouter di OpenCode. Jalankan ulang ./setup.sh kapan pun untuk memperbarui daftar model.