Belangrijkste punten
- Verifieer de endpoint met curl voordat je OpenCode aanraakt, zodat je weet of een fout in de configuratie of in de API zit.
- Een aangepaste provider heeft drie dingen nodig: basis-URL, API-sleutel en een model-ID, die hier uncensored is.
- Stel de contextlimiet in op 100.000 tokens zodat de agent plant rond het echte venster.
- Streaming en function calling worden ondersteund, wat een agent-loop nodig heeft.
Wat je nodig hebt voordat je begint
OpenCode is een open-source code-agent die in je terminal draait. Het kan communiceren met veel modelproviders, en het laat je je eigen provider toevoegen als de endpoint de OpenAI-chatopmaak volgt. Deze API doet dat, dus instellen is een kwestie van een paar velden invullen.
Verzamel eerst deze drie waarden:
- Base URL:
https://api.kimicode.top/v1 - Model ID:
uncensored - API-sleutel: maak er een aan op de API-sleutelpagina. Nieuwe accounts kunnen daar met één klik $0,50 aan proeftegoed claimen, wat meer dan genoeg is voor de onderstaande tests. De proefsleutel staat 2 gelijktijdige verzoeken en 60 verzoeken per minuut toe.
Houd de sleutel in een omgevingsvariabele in plaats van deze in bestanden te plakken die je commit:
export KIMICODE_API_KEY="your-key-here"Stap 1: test de endpoint met curl
Doe dit voordat je een tool configureert. Als curl werkt en OpenCode niet, dan weet je dat het probleem in de configuratie zit. Als curl faalt, los je de sleutel of de URL één keer op, niet op twee plaatsen.
curl https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer $KIMICODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Say hello in five words."}],
"max_tokens": 40
}'
Je zou een JSON-object moeten krijgen met een choices-array en een usage-blok. Een 401 betekent dat de sleutel onjuist is of dat de Bearer-prefix ontbreekt. Een 404 betekent meestal dat de URL verkeerd is getypt of al /chat/completions bevat.
Een code-agent streamt zijn antwoorden en roept tools aan, dus controleer die twee ook:
curl -N https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer $KIMICODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"stream": true,
"messages": [{"role": "user", "content": "Count from one to five."}]
}'
Je zou een reeks data:-regels moeten zien, elk met een kleine JSON-delta, eindigend met de gebruikscijfers en een eindmarker. De -N-vlag schakelt de buffering van curl uit, zodat chunks verschijnen zoals ze aankomen.
Stap 2: voeg een aangepaste provider toe aan OpenCode
OpenCode leest een JSON-configuratiebestand, opencode.json, uit je projectmap of uit zijn globale configuratiedirectory. Aangepaste OpenAI-stijl providers worden gedeclareerd met het OpenAI-compatible package van de AI SDK, een basis-URL en een lijst met modellen. De lay-out hieronder volgt de publieke documentatie van OpenCode op het moment van schrijven. Veldnamen kunnen tussen releases wijzigen, dus vergelijk het met de provider-sectie van de huidige OpenCode-documentatie als iets wordt afgewezen.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"kimicode": {
"npm": "@ai-sdk/openai-compatible",
"name": "Kimicode API",
"options": {
"baseURL": "https://api.kimicode.top/v1",
"apiKey": "{env:KIMICODE_API_KEY}"
},
"models": {
"uncensored": {
"name": "Uncensored",
"limit": {
"context": 100000,
"output": 8192
}
}
}
}
},
"model": "kimicode/uncensored"
}
De sleutel onder models is de exacte model-ID die naar de server wordt gestuurd, dus deze moet uncensored zijn. De laatste regel selecteert de provider en het model als standaard, geschreven als provider-naam, een slash, dan model-ID.
De {env:KIMICODE_API_KEY}-vorm vertelt OpenCode de variabele uit je shell te lezen. Als je versie referenties via zijn eigen login-commando afhandelt, gebruik dan die route en laat de sleutel weg uit het bestand. Hoe dan ook, commit geen echte sleutel.
Projectconfiguratie of globale configuratie
Je kunt de provider-blok op twee plaatsen houden. Een bestand in de projectroot geldt alleen voor die repository, wat geschikt is voor een team dat één setup deelt. Een bestand in je gebruikersconfiguratiemap geldt overal, wat geschikt is voor een persoonlijke standaard. Waar beide bestaan, voegt het projectbestand toe aan of overschrijdt het de globale configuratie.
Geef de voorkeur aan het globale bestand voor de provider-definitie en de omgevingsvariabele voor de sleutel. Dan kan elke repository de endpoint gebruiken, en er staat niets geheim naast je broncode. Als meerdere mensen in één project werken, commit dan alleen het provider-blok zonder sleutel, en laat elke persoon zijn eigen variabele instellen. Dit maakt het ook eenvoudig om een sleutel te roteren: verander de variabele, herstart de terminal, en het configuratiebestand blijft onaangetast.
Stap 3: kies het model en voer een taak uit
Start OpenCode in een projectmap en open de modelkiezer. Je aangepaste provider zou in de lijst moeten verschijnen met de weergavenaam die je hebt ingesteld. Selecteer het, geef de agent dan een kleine, controleerbare taak zoals het uitleggen van een functie of het schrijven van een unit test voor een kort bestand.
Begin klein om twee redenen. Ten eerste kun je zien of function calling werkt: wanneer OpenCode het model vraagt een bestand te lezen of te bewerken, gebeurt dit via de function calling-interface. Ten tweede stuurt een code-agent veel tekst per beurt, inclusief bestandsinhoud en geschiedenis, dus een lange sessie verbruikt tokens snel. De volgende sectie kwantificeert dat.
Als het model niet verschijnt, controleer dan of het bestand geldige JSON is, of het op de plek staat waar OpenCode configuratie zoekt, en of de providernaam overeenkomt met wat je in het model-veld hebt getypt.
Test function calling en JSON-modus direct
OpenCode vertrouwt op function calling om bestanden te lezen, commando's uit te voeren en code te bewerken, dus het is de moeite waard om te bevestigen dat de endpoint een tool-definitie aankan voordat je de agent de schuld geeft van een fout. Dit verzoek biedt één tool en stelt een vraag die het nodig heeft.
curl https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer $KIMICODE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "What is in the file notes.txt?"}],
"tools": [{
"type": "function",
"function": {
"name": "read_file",
"description": "Read a text file by path",
"parameters": {
"type": "object",
"properties": {"path": {"type": "string"}},
"required": ["path"]
}
}
}],
"tool_choice": "auto"
}'
Een goed antwoord bevat een tool_calls-vermelding met de naam read_file met een JSON-argumentreeks. De agent voert de tool uit en stuurt het resultaat terug als een bericht met role ingesteld op tool, en het model gaat daar vanaf. Als je alleen platte tekst ziet, probeer dan een meer directe prompt, omdat het model beslist of het een tool aanroept onderdeel is van zijn gedrag.
JSON-modus is een aparte schakelaar. Het toevoegen van "response_format": {"type": "json_object"} vraagt om geldige JSON-uitvoer, en het helpt wanneer een ander script moet parseren wat terugkomt. Vermeld JSON ook in je prompt, zodat het model weet welke vorm je verwacht.
Contextgrootte en wat een sessie kost
Het contextvenster is 100.000 tokens, tellend de prompt en de completion samen. Het instellen van limit.context op 100000 laat de agent het echte plafond zien, zodat het geschiedenis kan bijsnijden of samenvatten voordat de server een verzoek moet afwijzen. Een completion kan elke resterende ruimte gebruiken, en max_tokens is optioneel.
Facturering is $0,15 per 1M input tokens en $0,50 per 1M output tokens. Agents zijn input-heavy, omdat elke beurt het gesprek opnieuw verzendt. Hier is een uitgewerkt voorbeeld voor een gemiddelde sessie:
- 40 beurten, elk verzendt ongeveer 30.000 input tokens: 1.200.000 input tokens, wat 1,2 x $0,15 = $0,18 is.
- Elke beurt retourneert ongeveer 800 output tokens: 32.000 output tokens, wat 0,032 x $0,50 = $0,016 is.
- Totaal: $0,196, dus ongeveer twintig cent voor de hele sessie.
Je getallen verschillen. Lees de usage-waarden in responsen, of bekijk de X-Balance-USD-header, die je resterende saldo opgeeft bij elk antwoord. Tegoed is prepaid en verloopt nooit, en mislukte of geweigerde verzoeken worden niet in rekening gebracht. Details staan op de prijzenpagina.
Eerlijke verwachtingen voor een code-agent
Dit is een algemeen tekstmodel dat is geoptimaliseerd om te antwoorden zonder inhoudelijke weigeringen voor legaal gebruik door volwassenen. Het is geen model dat specifiek voor code is gebouwd, en deze pagina maakt geen uitspraken over benchmarks. Of het je repository betrouwbaar kan bewerken, moet je zelf testen op je eigen taken, met versiebeheer ingeschakeld, voordat je er belangrijke dingen aan toevertrouwt.
Het behandelt de infrastructuur die een agent nodig heeft: function calling met gestreamde tool_calls, tool-resultaten teruggezonden als role: "tool"-berichten, en JSON-modus via response_format. Het is alleen tekst, zonder afbeeldingen, dus functies die screenshots bijvoegen werken niet.
Twee limieten zijn belangrijk voor agents. Een volledige sleutel staat 8 gelijktijdige verzoeken en 300 verzoeken per minuut toe. Sub-agents of gelijktijdige tool-uitvoeringen die veel calls tegelijk afvuren, kunnen de concurrentielimiet raken, en een gestreamd verzoek houdt zijn slot vast tot de stream eindigt. Als dat gebeurt, krijg je HTTP 429 met de code concurrency. De code rate_limited betekent dat er te veel verzoeken per minuut zijn. Bij tijdelijke overbelasting kun je ook een 429 zien met Retry-After: 5. Verminder het parallelisme of wacht en probeer het opnieuw.
Probleemoplossing
| Symptoom | Waarschijnlijke oorzaak | Oplossing |
|---|---|---|
| 401 Niet geautoriseerd | Lege of onjuiste sleutel; de omgevingsvariabele is niet ingesteld in de shell die OpenCode lanceerde | Voer echo $KIMICODE_API_KEY uit in dezelfde terminal, en start OpenCode opnieuw |
| 404 Niet gevonden | Basis-URL bevat /chat/completions of mist /v1 | Gebruik exact https://api.kimicode.top/v1 |
| Model niet gevonden | Model sleutel verschilt van uncensored | Koppel de sleutel in models aan de ID die wordt teruggegeven door GET /v1/models |
429 met concurrency | Te veel verzoeken tegelijk | Minder gelijktijdige toolaanroepen, of wacht tot de streams zijn voltooid |
| Verzoek te groot | Body groter dan 8 MB of geschiedenis dicht bij de vensterlimiet | Start een nieuwe sessie of vat de geschiedenis samen |
Voor alles wat hier niet aan bod komt, heeft de documentatiepagina de volledige referentie voor verzoeken, en de integratiegids behandelt dezelfde endpoint vanuit het perspectief van andere OpenAI-compatibele clients.
