API compatible OpenAI
Dernière mise à jour : 11 nov. 2026
De quoi s’agit-il
L’API compatible OpenAI permet à un outil qui parle le format chat completions d’OpenAI d’utiliser les modèles de chat de ToRun, payés depuis votre compte ToRun. Un agent de code comme opencode peut utiliser ToRun comme fournisseur de modèles, à côté des outils MCP de ToRun.
Adresse et connexion
| URL de base | https://mcp.torun.ai/v1 |
| Connexion | Authorization: Bearer <your developer key> |
Utilisez la même clé développeur que pour le serveur MCP : voir Clés développeur. Une clé créée avant l’ajout de l’API compatible OpenAI reçoit la réponse 403 insufficient_scope. Les autorisations d’une clé ne changent jamais : créez donc une nouvelle clé.
L’API a deux points de terminaison, GET /v1/models et POST /v1/chat/completions. Tout autre chemin sous /v1 répond 404 not_found.
Modèles
GET /v1/models liste d’abord torun/auto, puis chaque modèle de texte que votre forfait peut utiliser, par son identifiant de modèle. Chaque modèle indique :
- la quantité de texte qu’il peut lire (
context_length) et la longueur de réponse qu’il peut écrire (max_completion_tokens), - s’il peut appeler des outils (
supports_tools) et lire des images (supports_vision), - son prix en Runs par million de tokens (
pricing:inputetoutput).
torun/auto laisse ToRun choisir un modèle pour chaque requête : un modèle qui lit les images quand la requête contient une image, et un modèle qui appelle des outils quand elle envoie tools.
Chat completions
POST /v1/chat/completions accepte :
messages, avec les rôlessystem,developer(traité commesystem),user,assistantettool,toolsettool_choice(auto,none,requiredou une fonction nommée) : les outils propres à votre outil lui reviennent sous forme d’appels d’outils, et ToRun ne les exécute jamais,response_formatavecjson_object.json_schemaest accepté et la réponse est en JSON, mais le schéma lui-même n’est pas imposé,temperature(de 0 à 2),top_p(de 0 à 1),max_completion_tokensoumax_tokens,stop(jusqu’à 4 séquences),seedetreasoning_effort,streametstream_options.include_usage.
n supérieur à 1, logprobs, top_logprobs, l’audio et toute sortie autre que du texte sont refusés avec 400 unsupported_parameter plutôt qu’ignorés.
Images
Envoyez une image en ligne, sous la forme data:image/...;base64,... dans une partie image_url, jusqu’à 20 Mo par requête. Une image envoyée sous forme de lien est refusée avec 400 image_url_not_supported : ToRun ne la récupère pas. Les images font l’objet d’un contrôle de sécurité, comme dans l’application.
Streaming
Avec "stream": true, la réponse arrive sous forme d’événements envoyés par le serveur au format chat.completion.chunk :
- Le premier fragment porte le rôle
assistant, et les appels d’outils sont diffusés avec leurindex. - Tant qu’il n’y a rien à envoyer, une ligne de commentaire
: keepalivearrive toutes les 15 secondes ; les analyseurs SSE l’ignorent. data: [DONE]termine un flux qui a réussi.- Avec
stream_options.include_usage, le dernier fragment a unchoicesvide et porteusage. - Une erreur survenue après le début du flux arrive sous la forme d’un seul événement
data: {"error": ...}, sans[DONE].
Un appel sans streaming est arrêté au bout de 110 secondes avec 504 timeout. Envoyez les requêtes longues avec "stream": true.
Utilisation
usage contient prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens et completion_tokens_details.reasoning_tokens, ainsi que torun_credits : ce que l’appel a coûté, en Runs.
L’utiliser dans opencode
La configuration opencode de la page Développeurs ajoute ToRun comme fournisseur de modèles à côté du serveur MCP :
{
"$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" } }
}
}
}
Tout autre outil qui parle l’API de chat d’OpenAI fonctionne de la même façon. L’onglet API OpenAI de la page montre cet appel :
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"}]}'
Comment les appels sont payés
Les appels API coûtent les mêmes Runs que le même usage dans l’application. Seuls des fonds payants les paient : d’abord l’allocation de votre forfait payant, puis votre portefeuille si vous l’avez autorisé pour la clé. L’allocation gratuite ne paie jamais les appels API. Les limites mensuelle et quotidienne de la clé s’appliquent, et les réponses font l’objet d’un contrôle de sécurité comme les réponses du chat.
Limites
Chaque clé peut envoyer 60 requêtes par minute à cette API et exécuter 4 completions en même temps. Au-delà, l’API répond 429 rate_limit_exceeded avec un en-tête Retry-After.
Erreurs
Chaque erreur a la forme {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. Le message est dans la langue demandée par l’en-tête Accept-Language de la requête.
| Statut | Code | Signification |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
La requête est mal formée ou utilise un paramètre que ToRun ne prend pas en charge. |
| 400 | image_url_not_supported |
Une image a été envoyée sous forme de lien ; envoyez-la en ligne. |
| 400 | content_blocked |
Le contrôle de sécurité a bloqué le contenu. |
| 400 | upstream_rejected |
Le fournisseur du modèle a refusé la requête ; le message indique pourquoi. |
| 401 | invalid_api_key |
La clé est absente, mal saisie ou révoquée. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
Le compte ou la clé ne peut pas payer l’appel. |
| 403 | insufficient_scope |
La clé a été créée avant l’ajout de cette API ; créez une nouvelle clé. |
| 403 | model_not_available |
Le modèle n’est pas inclus dans votre forfait. |
| 403 | account_suspended, no_developer_access |
Le compte est suspendu ou n’a pas d’accès développeur. |
| 404 | model_not_found |
L’identifiant de modèle ne fait pas partie de ceux que liste GET /v1/models. |
| 404 | not_found |
Ce chemin n’existe pas sous /v1. |
| 429 | rate_limit_exceeded |
Trop d’appels ; attendez le délai indiqué dans Retry-After. |
| 500 | internal_error |
Une erreur s’est produite du côté de ToRun. |
| 502 | upstream_error, empty_reply |
Le fournisseur du modèle a échoué ou a envoyé une réponse vide. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Un service dont l’appel a besoin est momentanément indisponible ; réessayez. |
| 504 | timeout |
Un appel sans streaming a dépassé 110 secondes. |
Une requête qui ne peut pas être payée répond 402, et non 429, pour qu’un client ne continue pas à la relancer.