OpenAI-kompatible API
Zuletzt aktualisiert am 11 Nov. 2026
Was sie ist
Die OpenAI-kompatible API lässt ein Tool, das das Chat-Completions-Format von OpenAI spricht, die Chat-Modelle von ToRun nutzen, bezahlt über Ihr ToRun-Konto. Ein Coding-Agent wie opencode kann ToRun so neben den MCP-Tools von ToRun auch als Modellanbieter nutzen.
Adresse und Anmeldung
| Basis-URL | https://mcp.torun.ai/v1 |
| Anmeldung | Authorization: Bearer <your developer key> |
Verwenden Sie denselben Entwicklerschlüssel wie für den MCP-Server: siehe Entwicklerschlüssel. Ein Schlüssel, der erstellt wurde, bevor die OpenAI-kompatible API hinzukam, erhält 403 insufficient_scope. Die Berechtigungen eines Schlüssels ändern sich nie, erstellen Sie also einen neuen Schlüssel.
Die API hat zwei Endpunkte, GET /v1/models und POST /v1/chat/completions. Jeder andere Pfad unter /v1 antwortet mit 404 not_found.
Modelle
GET /v1/models listet zuerst torun/auto auf, dann jedes Textmodell, das Ihr Plan nutzen kann, mit seiner Modell-ID. Jedes Modell gibt an:
- wie viel Text es lesen kann (
context_length) und wie lang eine Antwort sein kann, die es schreibt (max_completion_tokens), - ob es Tools aufrufen (
supports_tools) und Bilder lesen kann (supports_vision), - seinen Preis in Runs pro Million Tokens (
pricing:inputundoutput).
Mit torun/auto wählt ToRun für jede Anfrage ein Modell: eines, das Bilder liest, wenn die Anfrage ein Bild enthält, und eines, das Tools aufruft, wenn sie tools sendet.
Chat Completions
POST /v1/chat/completions nimmt an:
messagesmit den Rollensystem,developer(wiesystembehandelt),user,assistantundtool,toolsundtool_choice(auto,none,requiredoder eine benannte Funktion): Die eigenen Tools Ihres Tools kommen als Tool-Aufrufe zu ihm zurück, und ToRun führt sie nie aus,response_formatmitjson_object.json_schemawird angenommen und als JSON beantwortet, das Schema selbst wird aber nicht erzwungen,temperature(0 bis 2),top_p(0 bis 1),max_completion_tokensodermax_tokens,stop(bis zu 4 Sequenzen),seedundreasoning_effort,streamundstream_options.include_usage.
n über 1, logprobs, top_logprobs, Audio und jede andere Ausgabe als Text werden mit 400 unsupported_parameter abgewiesen statt ignoriert.
Bilder
Senden Sie ein Bild inline, als data:image/...;base64,... in einem image_url-Teil, bis 20 MB pro Anfrage. Ein als Link gesendetes Bild wird mit 400 image_url_not_supported abgewiesen: ToRun ruft es nicht ab. Bilder werden wie in der App auf Sicherheit geprüft.
Streaming
Mit "stream": true kommt die Antwort als Server-Sent Events in der Form chat.completion.chunk:
- Der erste Chunk trägt die Rolle
assistant, und Tool-Aufrufe werden mit ihremindexgestreamt. - Solange es nichts zu senden gibt, kommt alle 15 Sekunden eine Kommentarzeile
: keepalive; SSE-Parser überspringen sie. data: [DONE]beendet einen erfolgreichen Stream.- Mit
stream_options.include_usagehat der letzte Chunk ein leereschoicesund trägtusage. - Ein Fehler nach dem Start des Streams kommt als ein einzelnes Ereignis
data: {"error": ...}, ohne[DONE].
Ein Aufruf ohne Streaming wird nach 110 Sekunden mit 504 timeout gestoppt. Senden Sie lange Anfragen mit "stream": true.
Nutzung
usage enthält prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens und completion_tokens_details.reasoning_tokens sowie torun_credits: was der Aufruf gekostet hat, in Runs.
In opencode nutzen
Die opencode-Konfiguration auf der Entwicklerseite fügt ToRun neben dem MCP-Server als Modellanbieter hinzu:
{
"$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" } }
}
}
}
Jedes andere Tool, das die Chat-API von OpenAI spricht, funktioniert genauso. Der Tab OpenAI-API der Seite zeigt diesen Aufruf:
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"}]}'
Wie Aufrufe bezahlt werden
API-Aufrufe kosten dieselben Runs wie dieselbe Nutzung in der App. Sie werden nur aus bezahlten Mitteln bezahlt: zuerst aus dem Kontingent Ihres bezahlten Plans, dann aus Ihrem Wallet, wenn Sie das für den Schlüssel erlaubt haben. Das kostenlose Kontingent bezahlt nie API-Aufrufe. Die monatlichen und täglichen Limits des Schlüssels gelten, und Antworten werden wie Chat-Antworten auf Sicherheit geprüft.
Limits
Jeder Schlüssel kann 60 Anfragen pro Minute an diese API senden und 4 Completions gleichzeitig ausführen. Darüber antwortet die API mit 429 rate_limit_exceeded und einem Retry-After-Header.
Fehler
Jeder Fehler hat die Form {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. Die message ist in der Sprache, die der Accept-Language-Header der Anfrage verlangt.
| Status | Code | Bedeutung |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
Die Anfrage ist fehlerhaft oder nutzt einen Parameter, den ToRun nicht unterstützt. |
| 400 | image_url_not_supported |
Ein Bild wurde als Link gesendet; senden Sie es inline. |
| 400 | content_blocked |
Die Sicherheitsprüfung hat den Inhalt blockiert. |
| 400 | upstream_rejected |
Der Anbieter des Modells hat die Anfrage abgelehnt; die Meldung nennt den Grund. |
| 401 | invalid_api_key |
Der Schlüssel fehlt, ist falsch geschrieben oder widerrufen. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
Das Konto oder der Schlüssel kann den Aufruf nicht bezahlen. |
| 403 | insufficient_scope |
Der Schlüssel wurde erstellt, bevor diese API hinzukam; erstellen Sie einen neuen Schlüssel. |
| 403 | model_not_available |
Das Modell ist nicht in Ihrem Plan enthalten. |
| 403 | account_suspended, no_developer_access |
Das Konto ist gesperrt oder hat keinen Entwicklerzugang. |
| 404 | model_not_found |
Die Modell-ID ist keine, die GET /v1/models auflistet. |
| 404 | not_found |
Unter /v1 gibt es keinen solchen Pfad. |
| 429 | rate_limit_exceeded |
Zu viele Aufrufe; warten Sie die Zeit in Retry-After ab. |
| 500 | internal_error |
Auf der Seite von ToRun ist etwas fehlgeschlagen. |
| 502 | upstream_error, empty_reply |
Der Anbieter des Modells ist ausgefallen oder hat eine leere Antwort gesendet. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Ein Dienst, den der Aufruf braucht, ist kurz nicht verfügbar; versuchen Sie es erneut. |
| 504 | timeout |
Ein Aufruf ohne Streaming lief länger als 110 Sekunden. |
Eine Anfrage, die nicht bezahlt werden kann, antwortet mit 402, nicht mit 429, damit ein Client sie nicht immer wieder versucht.