Voeg een aangepaste OpenAI-compatibele provider toe aan OpenCode.

Updated 2026-07-29

OpenCode leest aangepaste providers rechtstreeks uit opencode.json. Declareer een providerblok met het package @ai-sdk/openai-compatible, wijs options.baseURL naar https://api.apisrouter.com/v1, en elk model dat je vermeldt, wordt selecteerbaar in de /models-kiezer onder één sleutel.

Snel antwoord: één providerblok in opencode.json.

OpenCode ondersteunt native aangepaste OpenAI-compatibele providers. Voeg een providervermelding toe aan opencode.json met npm ingesteld op "@ai-sdk/openai-compatible", stel options.baseURL in op https://api.apisrouter.com/v1, lees de sleutel uit een omgevingsvariabele met de sjabloon {env:...}, en vermeld de model-ID's die je wilt onder models. Stel vervolgens het topniveauveld model in op "apisrouter/<model-id>" en OpenCode routeert de hele agentlus via de gateway. Dit is het gedocumenteerde pad voor aangepaste providers in de OpenCode-documentatie, geen wrapper of fork. Het configuratiebestand staat ofwel in de root van je project (opencode.json) of globaal op ~/.config/opencode/opencode.json, en de twee worden samengevoegd, zodat het providerblok één keer gedeclareerd en in elke repo hergebruikt kan worden.

{
  "$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"
}

Hoe OpenCode providers en modellen oplost.

OpenCode (anomalyco op GitHub, een van de terminal-coderingsagenten met de meeste sterren, met ruim 186K) bouwt zijn providerlaag op de Vercel AI SDK. Het veld npm in een providerblok bepaalt welk SDK-package OpenCode laadt om met die provider te praten: "@ai-sdk/openai-compatible" spreekt het standaard /v1/chat/completions-protocol, terwijl "@ai-sdk/openai" het /v1/responses-protocol van OpenAI spreekt. Een gateway met meerdere leveranciers bedient chat completions, dus openai-compatible is het juiste package; kiezen voor "@ai-sdk/openai" tegen een chat-completions-endpoint is de meest voorkomende manier waarop deze instelling faalt. Modellen worden aangesproken als provider/model-paren. Het provider-ID is welke sleutel je ook koos in het providerblok ("apisrouter" hierboven), en het model-ID is de sleutel binnen de models-map, dus het standaardmodel wordt "apisrouter/claude-sonnet-4-6". Alles wat je declareert, verschijnt in de /models-kiezer binnen de TUI, wisselbaar midden in een sessie. Eén gedrag dat het waard is om je eigen te maken: bij aangepaste providers is de models-map een allowlist. Ingebouwde providers komen met een bekende catalogus, maar OpenCode kan de modellen van een aangepast endpoint niet zelf inventariseren, dus alleen ID's die je expliciet declareert, zijn aanspreekbaar. Wanneer het endpoint achter baseURL Claude-, GPT-, DeepSeek- en Kimi-ID's naast elkaar bedient, maakt het declareren van één vermelding per model van de kiezer een schakelbord tussen leveranciers achter één sleutel.

Volledige instelling: globale config, projectconfig, limieten per model.

De schone opzet is om de provider één keer te declareren in de globale config op ~/.config/opencode/opencode.json en alleen keuzes per repo (welk model, welke agents) in de opencode.json van elk project te houden. OpenCode voegt configuratiebestanden samen in plaats van ze te vervangen, dus het projectbestand blijft klein en het providerblok wordt nooit gedupliceerd. De sjabloon {env:APISROUTER_API_KEY} lost bij het laden op vanuit de omgeving, wat de sleutel buiten elk bestand houdt dat gecommit zou kunnen worden. Exporteer hem vanuit je shellprofiel zodat elke terminalsessie die OpenCode start, hem kan zien. Elke modelvermelding accepteert ook een limit-object met plafonds voor context- en outputtokens. Ze declareren is belangrijker dan het lijkt: OpenCode gebruikt het contextgetal om te bepalen wanneer een sessie samenvatting nodig heeft, dus een langecontextmodel dat zonder limieten is gedeclareerd, wordt conservatiever behandeld dan het zou moeten. Stel limit.context in op wat het model daadwerkelijk ondersteunt, en lange sessies worden later gecomprimeerd in plaats van eerder.

{
  "$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"
}

model en small_model kiezen.

De praktische workflow is om het main-slot vast te houden op het model dat je vertrouwt voor wijzigingen, en kandidaten te roteren door echte sessies in plaats van benchmarks: een middag echte diffs tegen je eigen codebase vertelt je meer dan een ranglijst. Routeren via één endpoint maakt van elke kandidaat een wijziging van één regel, en de gebruiksweergave per sleutel toont wat elk experiment daadwerkelijk heeft gekost.

  • model stuurt de hoofdagentlus aan: bestanden lezen, wijzigingen plannen, diffs schrijven, tools draaien. Dit slot ziet de langste contexten en doet het daadwerkelijke engineering-werk, dus hoort een frontier-coderingsmodel (claude-sonnet-4-6, claude-opus-4-7, gpt-5.5) hier thuis.
  • small_model verzorgt lichte taken zoals het genereren van sessietitels. Het vuurt vaak af maar draagt nooit het coderingswerk, dus een snel, goedkoop ID is de juiste vorm; er is geen reden om frontier-tokens te verbranden aan titels.
  • Codegestemde ID's zoals gpt-5.6-sol en kimi-k2.7-code zijn het waard om te declareren, zelfs als ze niet je standaard zijn: ernaar overschakelen voor een refactor-zware sessie is één keuze in /models, geen configwijziging.
  • Omdat beide slots provider/model-strings aanvaarden tegen hetzelfde providerblok, kunnen de main- en small-slots uit verschillende leveranciers komen in dezelfde sessie — iets wat geen enkele leverancierssleutel toelaat.

Betaal naar gebruik · onder officiële prijzen

Selected models are priced below official list prices. Exact input, output, cache, and per-request prices are shown for each model.

ModelOfficiële prijsOnze prijs
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

De faalmodi specifiek voor aangepaste providers in OpenCode.

Verkeerd SDK-package. "@ai-sdk/openai" post naar /v1/responses; een chat-completions-gateway beantwoordt die route met een fout. Als je eerste verzoek faalt met een protocol- of route-achtige fout in plaats van een authenticatiefout, controleer dan of het veld npm exact "@ai-sdk/openai-compatible" zegt. Model ontbreekt in de kiezer. Modellen van aangepaste providers bestaan alleen als ze zijn gedeclareerd; een tikfout in een models-sleutel, of een ID dat je aannam maar nooit hebt toegevoegd, verschijnt gewoon niet in /models. ID's zijn exacte strings inclusief versiesuffixen, en de /v1/models-lijst van de gateway is de bron van waarheid om van te kopiëren. Onopgeloste {env:...}. De sjabloon lost op vanuit de omgeving van het proces dat OpenCode heeft gestart. Een sleutel die in de ene terminal is geëxporteerd, bereikt geen OpenCode-instantie die vanuit een andere terminal is gestart, of vanuit een desktoplauncher die je profiel nooit heeft ingeladen. Zet de export in het shellprofiel, niet in een eenmalige sessie. Verrassingen bij het samenvoegen van configs. Omdat globale en projectconfigs worden samengevoegd, overschrijft een project-opencode.json die model op een andere provider zet, stilletjes je globale standaard, en een achtergebleven providerblok in een oud project kan verwachtingen overschaduwen. Als routering er verkeerd uitziet, lees dan beide bestanden voordat je aanneemt dat de gateway zich misdraagt. baseURL zonder /v1. De SDK voegt routepaden zoals /chat/completions toe aan welke base je ook opgeeft, dus https://api.apisrouter.com/v1 is correct en de kale host niet. Een verbindings- of 404-achtige mislukking bij een verder correcte config is bijna altijd dit.

Wie routeert OpenCode via een gateway.

  • Developers die de hele dag in de TUI leven en Claude, GPT en Kimi in één /models-kiezer willen in plaats van aparte providercredentials per leverancier te onderhouden.
  • Engineers die coderingsmodellen vergelijken op echt werk. Elke kandidaat is één gedeclareerde vermelding en één keuze in de kiezer; vergelijking sessie voor sessie vereist geen nieuwe accounts.
  • Teams die op één secret standaardiseren. Eén APISROUTER_API_KEY in de onboardingdocumentatie vervangt een checklist met sleutels per leverancier, en gebruik per sleutel toont wie wat uitgeeft.
  • Gebruikers die een frontier main-model koppelen aan een laaggeprijsd small_model van een andere leverancier, iets wat configuraties van één leverancier niet kunnen uitdrukken.
  • Developers zonder toegang tot de facturering van een bepaalde leverancier. Toegang op basis van opwaarderen zonder kaartvereiste verwijdert de aanmeldingsafhankelijkheid per provider.

Verifieer het endpoint en debug de eerste sessie.

Lijst voordat je een sessie start op wat de gateway bedient. De ID's die /v1/models retourneert, zijn precies de strings waarmee de sleutels van je models-map moeten overeenkomen. Mislukkingen bij de eerste sessie zijn consistent. Een 401 betekent dat APISROUTER_API_KEY niet zichtbaar was voor het OpenCode-proces; echo de variabele in dezelfde terminal van waaruit je start. Een model-not-found-fout van de gateway betekent dat de gedeclareerde sleutel niet overeenkomt met een bediend ID, versiesuffixen inbegrepen. Als de provider helemaal niet verschijnt, valideer dan de JSON, aangezien een overtollige komma of een verkeerd geplaatste accolade het hele bestand onleesbaar maakt en OpenCode terugvalt op standaardwaarden. Zodra verzoeken vloeien, toont de APIsRouter-console model per verzoek, tokenaantallen en uitgaven. Coderingsagents zijn workloads met lange context en veel beurten, en zien welke sessies en welke modellen de tokens verbruiken, is hoe je beslist of het main-slot zijn prijs waard is.

curl -s https://api.apisrouter.com/v1/models \
  -H "Authorization: Bearer $APISROUTER_API_KEY" | head -50

Veelgestelde vragen

Kan OpenCode Claude-, GPT- en Kimi-modellen gebruiken via één aangepaste provider?

Ja. Een aangepaste provider is niets meer dan een baseURL plus een models-allowlist. Wanneer het endpoint meerdere leveranciers bedient, declareer je één vermelding per ID en verschijnt elk gedeclareerd model in de /models-kiezer onder dezelfde provider en sleutel, wisselbaar midden in een sessie.

Waar komt de API-sleutel in opencode.json?

In options.apiKey, met de omgevingssjabloon, bijvoorbeeld "{env:APISROUTER_API_KEY}". De sjabloon lost bij het laden op, zodat de letterlijke sleutel nooit in het configuratiebestand staat. Exporteer de variabele vanuit je shellprofiel zodat elke terminal die OpenCode start, hem overneemt.

Hoort het providerblok in de globale of de projectconfig thuis?

Globaal, op ~/.config/opencode/opencode.json. OpenCode voegt configuratiebestanden samen, dus door de provider één keer globaal te declareren en alleen de modelkeuze per project in te stellen, blijven repo's vrij van credentialsloodgieterswerk en voorkom je dat gedupliceerde blokken uit elkaar drijven.

Waarom verschijnt mijn model niet in de /models-kiezer?

Modellen van aangepaste providers moeten expliciet worden gedeclareerd; OpenCode kan een aangepast endpoint niet inventariseren. Controleer of de models-map de exacte ID-string bevat, inclusief versiesuffixen, en kopieer ID's uit de /v1/models-respons van de gateway in plaats van ze uit het hoofd te typen.

Wat is hier het verschil tussen @ai-sdk/openai-compatible en @ai-sdk/openai?

@ai-sdk/openai-compatible spreekt /v1/chat/completions, het protocol dat gateways met meerdere leveranciers bedienen. @ai-sdk/openai spreekt het /v1/responses-protocol van OpenAI. Gebruik voor APIsRouter @ai-sdk/openai-compatible; het andere package post naar een route die de gateway hiervoor niet bedient.

Doen gedeclareerde contextlimieten er daadwerkelijk toe?

Ja. OpenCode gebruikt limit.context om te bepalen wanneer een sessie compactie nodig heeft. Limieten ongedeclareerd laten op een langecontextmodel betekent dat sessies eerder dan nodig worden samengevat, dus stel limit.context en limit.output in op wat het model werkelijk ondersteunt.