Magdagdag ng custom OpenAI-compatible provider sa OpenCode.
Updated 2026-07-29
Binabasa ng OpenCode ang mga custom provider diretso mula sa opencode.json. Magdeklara ng provider block gamit ang @ai-sdk/openai-compatible package, ituro ang options.baseURL sa https://api.apisrouter.com/v1, at ang bawat model na ilista mo ay magiging mapipili sa /models picker sa ilalim ng isang key.
Mabilisang sagot: isang provider block sa opencode.json.
Native na sinusuportahan ng OpenCode ang mga custom OpenAI-compatible provider. Magdagdag ng provider entry sa opencode.json na may npm na naka-set sa "@ai-sdk/openai-compatible", itakda ang options.baseURL sa https://api.apisrouter.com/v1, basahin ang key mula sa environment variable gamit ang {env:...} template, at ilista ang mga model id na gusto mo sa ilalim ng models. Pagkatapos itakda ang top-level na model field sa "apisrouter/<model-id>" at iruruta ng OpenCode ang buong agent loop sa pamamagitan ng gateway. Ito ang naka-document na custom-provider na path sa mga dokumento ng OpenCode, hindi isang wrapper o fork. Ang config file ay nasa root ng iyong proyekto (opencode.json) o global sa ~/.config/opencode/opencode.json, at pinagsasama ang dalawa, kaya maaaring ideklara nang isang beses ang provider block at gamitin nang paulit-ulit sa bawat repo.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"apisrouter": {
"npm": "@ai-sdk/openai-compatible",
"name": "APIsRouter",
"options": {
"baseURL": "https://api.apisrouter.com/v1",
"apiKey": "{env:APISROUTER_API_KEY}"
},
"models": {
"claude-sonnet-4-6": { "name": "Claude Sonnet 4.6" }
}
}
},
"model": "apisrouter/claude-sonnet-4-6"
}Paano nilulutas ng OpenCode ang mga provider at model.
Ang OpenCode (anomalyco sa GitHub, isa sa mga pinaka-bituin na terminal coding agent na may humigit-kumulang 186K stars) ay itinatayo ang provider layer nito sa Vercel AI SDK. Pinapangalanan ng npm field sa isang provider block kung aling SDK package ang ilo-load ng OpenCode para makipag-usap sa provider na iyon: nagsasalita ang "@ai-sdk/openai-compatible" sa standard na /v1/chat/completions na protocol, habang nagsasalita ang "@ai-sdk/openai" sa /v1/responses na protocol ng OpenAI. Nagse-serve ang isang multi-vendor na gateway ng chat completions, kaya ang tamang package ay openai-compatible; ang pagpili ng "@ai-sdk/openai" laban sa isang chat-completions na endpoint ang pinaka-karaniwang paraan kung paano nasisira ang setup na ito. Tinutugunan ang mga model bilang provider/model pairs. Ang provider id ay kung anong key ang pinili mo sa provider block ("apisrouter" sa itaas), at ang model id ay ang key sa loob ng models map, kaya ang default na model ay nagiging "apisrouter/claude-sonnet-4-6". Lumilitaw ang lahat ng idinideklara mo sa /models picker sa loob ng TUI, mapapalitan kalagitnaan ng session. Isang gawi na dapat maunawaan: para sa mga custom provider, ang models map ay isang allowlist. Nagdadala ang mga built-in na provider ng kilalang katalogo, ngunit hindi kayang i-enumerate ng OpenCode ang mga model ng isang custom endpoint nang mag-isa, kaya ang mga id lamang na tahasan mong idineklara ang maa-address. Kapag ang endpoint sa likod ng baseURL ay nagse-serve ng mga id ng Claude, GPT, DeepSeek, at Kimi magkatabi, ginagawang cross-vendor na switchboard sa likod ng isang key ang pagdedeklara ng isang entry bawat model.
Buong setup: global config, project config, per-model limits.
Ang malinis na ayos ay ideklara ang provider nang isang beses sa global config sa ~/.config/opencode/opencode.json at panatilihin lamang ang per-repo na mga pili (aling model, aling agents) sa opencode.json ng bawat proyekto. Pinagsasama ng OpenCode ang mga config file sa halip na palitan ang mga ito, kaya nananatiling maliit ang project file at hindi kailanman nadoble ang provider block. Nalulutas ang {env:APISROUTER_API_KEY} template sa oras ng pag-load mula sa environment, na pinapanatili ang key sa labas ng anumang file na maaaring ma-commit. I-export ito mula sa iyong shell profile para makita ito ng bawat terminal session na naglulunsad ng OpenCode. Tumatanggap din ang bawat model entry ng limit object na may context at output token na langit. Mahalaga ang pagdedeklara nito higit sa mukhang ganoon lamang: ginagamit ng OpenCode ang figure ng context para magpasya kung kailan kailangan ng summarization ang isang session, kaya ang isang long-context na model na idineklara nang walang limits ay tinatrato nang mas konserbatibo kaysa dapat. Itakda ang limit.context sa talagang suportado ng model at ang mahahabang session ay kumpakta nang mas huli sa halip na mas maaga.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"apisrouter": {
"npm": "@ai-sdk/openai-compatible",
"name": "APIsRouter",
"options": {
"baseURL": "https://api.apisrouter.com/v1",
"apiKey": "{env:APISROUTER_API_KEY}"
},
"models": {
"claude-opus-4-7": { "name": "Claude Opus 4.7", "limit": { "context": 200000, "output": 32000 } },
"claude-sonnet-4-6": { "name": "Claude Sonnet 4.6", "limit": { "context": 200000, "output": 64000 } },
"gpt-5.5": { "name": "GPT-5.5" },
"gpt-5.6-sol": { "name": "GPT-5.6 Sol" },
"kimi-k2.7-code": { "name": "Kimi K2.7 Code" }
}
}
},
"model": "apisrouter/claude-sonnet-4-6",
"small_model": "apisrouter/kimi-k2.7-code"
}Pagpili ng model at small_model.
Ang praktikal na workflow ay panatilihin ang main slot sa model na pinagkakatiwalaan mo para sa mga edit at i-rotate ang mga kandidato sa tunay na session sa halip na mga benchmark: mas maraming sinasabi sa iyo ang isang hapon ng tunay na diffs laban sa sarili mong codebase kaysa sa isang leaderboard. Ang pag-route sa pamamagitan ng isang endpoint ay ginagawang isang one-line na pagbabago ang bawat kandidato, at ipinapakita ng per-key na usage view kung magkano talaga ang gastos ng bawat eksperimento.
- Dinadala ng model ang pangunahing agent loop: pagbabasa ng mga file, pagpaplano ng mga edit, pagsulat ng diff, pagpapatakbo ng mga tool. Nakikita ng slot na ito ang pinakamahabang context at ginagawa ang tunay na engineering, kaya rito nabibilang ang isang frontier na coding model (claude-sonnet-4-6, claude-opus-4-7, gpt-5.5).
- Hinahawakan ng small_model ang mga magaan na gawain tulad ng session title generation. Madalas itong tumatakbo pero hindi kailanman nagdadala ng coding work, kaya isang mabilis, mababang-presyo na id ang tamang hugis; walang dahilan para gastusin ang frontier tokens sa mga titulo.
- Sulit idekralara ang mga coding-tuned na id tulad ng gpt-5.6-sol at kimi-k2.7-code kahit hindi sila iyong default: ang paglipat sa mga ito para sa isang session na puno ng refactor ay isang /models na pagpili lamang, hindi config edit.
- Dahil parehong slot ay tumatanggap ng provider/model na mga string laban sa parehong provider block, ang main at small slot ay maaaring galing sa magkaibang vendor sa parehong session, isang bagay na hindi pinahihintulutan ng anumang single-vendor na key.
Pay-as-you-go · mas mababa sa opisyal na presyo
Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.
| Model | Opisyal na Presyo | Aming Presyo |
|---|---|---|
| Claude Sonnet 4.6 | $3.00 / $15.00 per M | $2.40 / $12.00 per M |
| Claude Opus 4.7 | $5.00 / $25.00 per M | $4.00 / $20.00 per M |
| GPT-5.5 | $5.00 / $30.00 per M | $4.00 / $24.00 per M |
| GPT-5.6 Sol | $5.00 / $30.00 per M | $4.00 / $24.00 per M |
| Kimi K2.7 Code | $0.95 / $4.00 per M | $1.00 / $4.00 per M |
Ang mga failure mode na specific sa mga custom provider ng OpenCode.
Maling SDK package. Nagpo-post ang "@ai-sdk/openai" sa /v1/responses; sinasagot ito ng error ng isang chat-completions na gateway. Kung nabigo ang unang request mo sa isang error na hugis-protocol o hugis-route sa halip na authentication error, suriin kung sinasabi ng npm field nang eksakto ang "@ai-sdk/openai-compatible". Nawawala ang model sa picker. Umiiral lamang ang mga model ng custom provider kung idineklara; ang isang typo sa key ng models, o isang id na inaakala mo pero hindi mo talaga idinagdag, ay hindi lang lumilitaw sa /models. Ang mga id ay eksaktong string kasama ang mga version suffix, at ang listahan ng /v1/models ng gateway ang totoong pagmumulan na kokopyahin. Hindi nalulutas ang {env:...}. Nalulutas ang template mula sa environment ng process na naglunsad ng OpenCode. Ang key na na-export sa isang terminal ay hindi naaabot ng isang instance ng OpenCode na inilunsad mula sa ibang terminal o mula sa desktop launcher na hindi kailanman sinource ang profile mo. Ilagay ang export sa shell profile, hindi sa isang beses lang na session. Mga sorpresa sa pagsasanib ng config. Dahil pinagsasama ang global at project config, ang isang opencode.json ng proyekto na nagtatakda ng model sa ibang provider ay tahimik na sumasagabal sa iyong global default, at maaaring magbayubay ang isang naiwang provider block sa isang lumang proyekto sa mga inaasahan. Kapag mali ang tila ruta, basahin ang parehong file bago isipin na nagkamali ang gateway. Ang baseURL nang walang /v1. Idinaragdag ng SDK ang mga route path tulad ng /chat/completions sa kahit anong base na ibinigay mo, kaya tama ang https://api.apisrouter.com/v1 at hindi ang bare host. Ang isang koneksyon o 404-shaped na pagkabigo sa kung tuwid naman ang config ay halos palaging ito.
Sino ang nagru-route ng OpenCode sa pamamagitan ng isang gateway.
- Mga developer na nabubuhay sa TUI buong araw at gustong makita ang Claude, GPT, at Kimi sa isang /models picker sa halip na magpanatili ng hiwalay na credentials bawat vendor.
- Mga engineer na nagkukumpara ng coding models sa tunay na trabaho. Bawat kandidato ay isang idinedeklarang entry at isang picker selection; walang bagong account na kailangan para sa paghahambing bawat session.
- Mga team na nagsa-standardize sa isang secret. Isang APISROUTER_API_KEY sa onboarding docs ang pumapalit sa checklist ng vendor key bawat isa, at ipinapakita ng per-key usage kung sino ang gumagastos ng ano.
- Mga user na nagpapares ng frontier na main model kasama ang mababang-presyo na small_model mula sa ibang vendor, na hindi kayang ipahayag ng mga single-vendor na config.
- Mga developer na walang access sa billing ng isang partikular na vendor. Inaalis ng top-up based na access na walang kailangang card ang sign-up dependency bawat provider.
I-verify ang endpoint at i-debug ang unang session.
Bago magsimula ng session, ilista kung ano ang si-serve ng gateway. Ang mga id na ibinabalik ng /v1/models ay eksaktong mga string na dapat tumugma sa mga key ng models map mo. Consistent ang mga pagkabigo sa unang session. Ang 401 ay nangangahulugang hindi nakikita ng OpenCode process ang APISROUTER_API_KEY; i-echo ang variable sa parehong terminal kung saan ka naglulunsad. Ang model-not-found na error mula sa gateway ay nangangahulugang hindi tumutugma ang idinedeklarang key sa isang na-serve na id, kasama ang mga version suffix. Kung hindi lumitaw ang provider nang buo, i-validate ang JSON, dahil ang isang trailing comma o maling-lagay na brace ay ginagawang hindi mabasa ang buong file at nagba-fallback ang OpenCode sa defaults. Kapag dumadaloy na ang mga request, ipinapakita ng APIsRouter console ang per-request na model, token counts, at gastos. Ang mga coding agent ay long-context, maraming-turn na workload, at ang pagkita kung aling mga session at aling mga model ang gumagastos ng tokens ang paraan mo para magpasya kung kumikita ba ang main slot sa presyo nito.
curl -s https://api.apisrouter.com/v1/models \
-H "Authorization: Bearer $APISROUTER_API_KEY" | head -50Mga madalas itanong
Maaari bang gamitin ng OpenCode ang mga model ng Claude, GPT, at Kimi sa pamamagitan ng isang custom provider?
Oo. Ang isang custom provider ay isang baseURL lamang kasama ang isang models allowlist. Kapag nagse-serve ang endpoint ng maraming vendor, magdeklara ng isang entry bawat id at lumilitaw ang bawat idinedeklarang model sa /models picker sa ilalim ng parehong provider at key, mapapalitan kalagitnaan ng session.
Saan pumupunta ang API key sa opencode.json?
Sa options.apiKey gamit ang environment template, halimbawa "{env:APISROUTER_API_KEY}". Nalulutas ang template sa oras ng pag-load kaya hindi kailanman nakaupo ang literal na key sa config file. I-export ang variable mula sa shell profile mo para mana ito ng bawat terminal na naglulunsad ng OpenCode.
Dapat bang nasa global o sa project config ang provider block?
Global, sa ~/.config/opencode/opencode.json. Pinagsasama ng OpenCode ang mga config file, kaya ang pagdedeklara ng provider nang isang beses sa global at pagtatakda lamang ng pagpili ng model bawat proyekto ay pinananatiling walang credentials plumbing ang mga repo at iniiwasan ang paglihis ng magkadobleng blocks.
Bakit hindi lumilitaw ang aking model sa /models picker?
Dapat tahasang idineklara ang mga model ng custom provider; hindi kayang i-enumerate ng OpenCode ang isang custom endpoint. Suriin kung nasa models map ang eksaktong id string, kasama ang mga version suffix, at kopyahin ang mga id mula sa /v1/models na tugon ng gateway sa halip na i-type mula sa alaala.
Ano ang pagkakaiba ng @ai-sdk/openai-compatible at @ai-sdk/openai dito?
Nagsasalita ang @ai-sdk/openai-compatible sa /v1/chat/completions, ang protocol na si-serve ng mga multi-vendor na gateway. Nagsasalita ang @ai-sdk/openai sa /v1/responses na protocol ng OpenAI. Para sa APIsRouter, gamitin ang @ai-sdk/openai-compatible; magpo-post ang ibang package sa isang route na hindi si-serve ng gateway para sa layuning ito.
Mahalaga ba talaga ang idinedeklarang context limits?
Oo. Ginagamit ng OpenCode ang limit.context para magpasya kung kailan kailangan ng compaction ang isang session. Ang hindi pagdedeklara ng limits sa isang long-context na model ay nangangahulugang mas maagang na-summarize ang mga session kaysa kinakailangan, kaya itakda ang limit.context at limit.output sa talagang suportado ng model.