OpenAI-compatibele API
Laatst bijgewerkt op 11 nov 2026
Wat het is
Met de OpenAI-compatibele API kan een tool die het chat-completions-formaat van OpenAI spreekt de chatmodellen van ToRun gebruiken, betaald vanuit je ToRun-account. Een coding agent zoals opencode kan ToRun zo naast de MCP-tools van ToRun ook als modelprovider gebruiken.
Adres en inloggen
| Basis-URL | https://mcp.torun.ai/v1 |
| Inloggen | Authorization: Bearer <your developer key> |
Gebruik dezelfde ontwikkelaarssleutel als voor de MCP-server: zie Ontwikkelaarssleutels. Een sleutel die is gemaakt voordat de OpenAI-compatibele API werd toegevoegd, krijgt 403 insufficient_scope. De rechten van een sleutel veranderen nooit, dus maak een nieuwe sleutel.
De API heeft twee endpoints, GET /v1/models en POST /v1/chat/completions. Elk ander pad onder /v1 antwoordt met 404 not_found.
Modellen
GET /v1/models toont eerst torun/auto en daarna elk tekstmodel dat je abonnement kan gebruiken, met zijn model-id. Elk model vermeldt:
- hoeveel tekst het kan lezen (
context_length) en hoe lang een antwoord kan zijn dat het schrijft (max_completion_tokens), - of het tools kan aanroepen (
supports_tools) en afbeeldingen kan lezen (supports_vision), - zijn prijs in Runs per miljoen tokens (
pricing:inputenoutput).
Met torun/auto kiest ToRun voor elk verzoek een model: een dat afbeeldingen leest als het verzoek een afbeelding bevat, en een dat tools aanroept als het tools meestuurt.
Chat completions
POST /v1/chat/completions accepteert:
messages, met de rollensystem,developer(behandeld alssystem),user,assistantentool,toolsentool_choice(auto,none,requiredof één benoemde functie): de eigen tools van je tool komen als toolaanroepen naar hem terug, en ToRun voert ze nooit uit,response_formatmetjson_object.json_schemawordt geaccepteerd en als JSON beantwoord, maar het schema zelf wordt niet afgedwongen,temperature(0 tot 2),top_p(0 tot 1),max_completion_tokensofmax_tokens,stop(tot 4 reeksen),seedenreasoning_effort,streamenstream_options.include_usage.
n boven 1, logprobs, top_logprobs, audio en elke uitvoer anders dan tekst worden geweigerd met 400 unsupported_parameter in plaats van genegeerd.
Afbeeldingen
Stuur een afbeelding inline mee, als data:image/...;base64,... in een image_url-deel, tot 20 MB per verzoek. Een afbeelding die als link wordt gestuurd, wordt geweigerd met 400 image_url_not_supported: ToRun haalt hem niet op. Afbeeldingen worden net als in de app gecontroleerd op veiligheid.
Streaming
Met "stream": true komt het antwoord binnen als server-sent events in de vorm chat.completion.chunk:
- De eerste chunk bevat de rol
assistant, en toolaanroepen worden gestreamd met hunindex. - Zolang er niets te versturen is, komt er elke 15 seconden een commentaarregel
: keepalive; SSE-parsers slaan die over. data: [DONE]beëindigt een geslaagde stream.- Met
stream_options.include_usageheeft de laatste chunk een legechoicesen bevat hijusage. - Een fout nadat de stream is begonnen, komt binnen als één gebeurtenis
data: {"error": ...}, zonder[DONE].
Een aanroep zonder streaming wordt na 110 seconden gestopt met 504 timeout. Stuur lange verzoeken met "stream": true.
Gebruik
usage bevat prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens en completion_tokens_details.reasoning_tokens, plus torun_credits: wat de aanroep heeft gekost, in Runs.
Gebruiken in opencode
De opencode-configuratie op de pagina Ontwikkelaars voegt ToRun naast de MCP-server toe als modelprovider:
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"torun": {
"npm": "@ai-sdk/openai-compatible",
"name": "ToRun",
"options": { "baseURL": "https://mcp.torun.ai/v1", "apiKey": "{env:TORUN_API_KEY}" },
"models": { "torun/auto": { "name": "ToRun Auto" } }
}
}
}
Elke andere tool die de chat-API van OpenAI spreekt, werkt op dezelfde manier. Het tabblad OpenAI-API van de pagina toont deze aanroep:
curl https://mcp.torun.ai/v1/chat/completions \
-H "Authorization: Bearer $TORUN_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "torun/auto", "messages": [{"role": "user", "content": "Hello"}]}'
Hoe aanroepen worden betaald
API-aanroepen kosten dezelfde Runs als hetzelfde gebruik in de app. Alleen betaald tegoed betaalt ervoor: eerst het tegoed van je betaalde abonnement, daarna je wallet als je dat voor de sleutel hebt toegestaan. Het gratis tegoed betaalt nooit voor API-aanroepen. De maandelijkse en dagelijkse limieten van de sleutel gelden, en antwoorden worden net als chatantwoorden op veiligheid gecontroleerd.
Limieten
Elke sleutel kan 60 verzoeken per minuut naar deze API sturen en 4 completions tegelijk uitvoeren. Daarboven antwoordt de API met 429 rate_limit_exceeded en een Retry-After-header.
Fouten
Elke fout heeft de vorm {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. De message is in de taal waar de Accept-Language-header van het verzoek om vraagt.
| Status | Code | Betekenis |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
Het verzoek is onjuist opgebouwd, of gebruikt een parameter die ToRun niet ondersteunt. |
| 400 | image_url_not_supported |
Er is een afbeelding als link gestuurd; stuur hem inline mee. |
| 400 | content_blocked |
De veiligheidscontrole heeft de inhoud geblokkeerd. |
| 400 | upstream_rejected |
De provider van het model heeft het verzoek geweigerd; het bericht zegt waarom. |
| 401 | invalid_api_key |
De sleutel ontbreekt, is verkeerd getypt of is ingetrokken. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
Het account of de sleutel kan de aanroep niet betalen. |
| 403 | insufficient_scope |
De sleutel is gemaakt voordat deze API werd toegevoegd; maak een nieuwe sleutel. |
| 403 | model_not_available |
Het model zit niet in je abonnement. |
| 403 | account_suspended, no_developer_access |
Het account is geschorst of heeft geen ontwikkelaarstoegang. |
| 404 | model_not_found |
Het model-id is er niet een dat GET /v1/models toont. |
| 404 | not_found |
Er is geen zo'n pad onder /v1. |
| 429 | rate_limit_exceeded |
Te veel aanroepen; wacht de tijd in Retry-After af. |
| 500 | internal_error |
Er ging iets mis aan de kant van ToRun. |
| 502 | upstream_error, empty_reply |
De provider van het model faalde of stuurde een leeg antwoord. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Een dienst die de aanroep nodig heeft, is even niet beschikbaar; probeer het opnieuw. |
| 504 | timeout |
Een aanroep zonder streaming duurde langer dan 110 seconden. |
Een verzoek dat niet kan worden betaald, antwoordt met 402 en niet met 429, zodat een client het niet blijft herhalen.