API compatible con OpenAI
Última actualización: 11 nov 2026
Qué es
La API compatible con OpenAI permite que una herramienta que habla el formato chat completions de OpenAI use los modelos de chat de ToRun, pagados desde tu cuenta de ToRun. Un agente de programación como opencode puede usar ToRun como su proveedor de modelos, junto a las herramientas MCP de ToRun.
Dirección e inicio de sesión
| URL base | https://mcp.torun.ai/v1 |
| Inicio de sesión | Authorization: Bearer <your developer key> |
Usa la misma clave de desarrollador que para el servidor MCP: consulta Claves de desarrollador. Una clave creada antes de que se añadiera la API compatible con OpenAI responde 403 insufficient_scope. Los permisos de una clave nunca cambian, así que crea una clave nueva.
La API tiene dos endpoints, GET /v1/models y POST /v1/chat/completions. Cualquier otra ruta bajo /v1 responde 404 not_found.
Modelos
GET /v1/models muestra primero torun/auto y después todos los modelos de texto que puede usar tu plan, por su id de modelo. Cada modelo indica:
- cuánto texto puede leer (
context_length) y qué longitud de respuesta puede escribir (max_completion_tokens), - si puede llamar a herramientas (
supports_tools) y leer imágenes (supports_vision), - su precio en Runs por millón de tokens (
pricing:inputyoutput).
torun/auto deja que ToRun elija un modelo para cada solicitud: uno que lee imágenes cuando la solicitud tiene una imagen, y uno que llama a herramientas cuando envía tools.
Chat completions
POST /v1/chat/completions acepta:
messages, con los rolessystem,developer(tratado comosystem),user,assistantytool,toolsytool_choice(auto,none,requiredo una función con nombre): las herramientas propias de tu herramienta vuelven a ella como llamadas a herramientas, y ToRun nunca las ejecuta,response_formatconjson_object.json_schemase acepta y se responde como JSON, pero el esquema en sí no se impone,temperature(de 0 a 2),top_p(de 0 a 1),max_completion_tokensomax_tokens,stop(hasta 4 secuencias),seedyreasoning_effort,streamystream_options.include_usage.
n mayor que 1, logprobs, top_logprobs, el audio y cualquier salida que no sea texto se rechazan con 400 unsupported_parameter en lugar de ignorarse.
Imágenes
Envía una imagen en línea, como data:image/...;base64,... en una parte image_url, de hasta 20 MB por solicitud. Una imagen enviada como enlace se rechaza con 400 image_url_not_supported: ToRun no la descarga. Las imágenes pasan una comprobación de seguridad, como en la app.
Streaming
Con "stream": true la respuesta llega como eventos enviados por el servidor con la forma chat.completion.chunk:
- El primer fragmento lleva el rol
assistant, y las llamadas a herramientas se transmiten con suindex. - Mientras no hay nada que enviar, llega una línea de comentario
: keepalivecada 15 segundos; los analizadores de SSE la omiten. data: [DONE]termina un stream que ha salido bien.- Con
stream_options.include_usage, el último fragmento tienechoicesvacío y llevausage. - Un fallo después de que empiece el stream llega como un único evento
data: {"error": ...}, sin[DONE].
Una llamada sin streaming se detiene a los 110 segundos con 504 timeout. Envía las solicitudes largas con "stream": true.
Uso
usage incluye prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens y completion_tokens_details.reasoning_tokens, además de torun_credits: lo que costó la llamada, en Runs.
Úsala en opencode
La configuración de opencode de la página Desarrolladores añade ToRun como proveedor de modelos junto al servidor 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" } }
}
}
}
Cualquier otra herramienta que hable la API de chat de OpenAI funciona igual. La pestaña API de OpenAI de la página muestra esta llamada:
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"}]}'
Cómo se pagan las llamadas
Las llamadas a la API cuestan los mismos Runs que el mismo uso en la app. Solo las pagan fondos de pago: primero la asignación de tu plan de pago y después tu monedero, si lo permitiste en la clave. La asignación gratuita nunca paga llamadas a la API. Se aplican los límites mensual y diario de la clave, y las respuestas pasan una comprobación de seguridad como las respuestas del chat.
Límites
Cada clave puede hacer 60 solicitudes por minuto a esta API y ejecutar 4 completions a la vez. Por encima de eso, la API responde 429 rate_limit_exceeded con una cabecera Retry-After.
Errores
Todos los errores tienen la forma {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. El message está en el idioma que pide la cabecera Accept-Language de la solicitud.
| Estado | Código | Significado |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
La solicitud está mal formada o usa un parámetro que ToRun no admite. |
| 400 | image_url_not_supported |
Se envió una imagen como enlace; envíala en línea. |
| 400 | content_blocked |
La comprobación de seguridad bloqueó el contenido. |
| 400 | upstream_rejected |
El proveedor del modelo rechazó la solicitud; el mensaje dice por qué. |
| 401 | invalid_api_key |
Falta la clave, está mal escrita o se ha revocado. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
La cuenta o la clave no puede pagar la llamada. |
| 403 | insufficient_scope |
La clave se creó antes de que se añadiera esta API; crea una clave nueva. |
| 403 | model_not_available |
El modelo no está en tu plan. |
| 403 | account_suspended, no_developer_access |
La cuenta está suspendida o no tiene acceso para desarrolladores. |
| 404 | model_not_found |
El id de modelo no es uno de los que muestra GET /v1/models. |
| 404 | not_found |
No existe esa ruta bajo /v1. |
| 429 | rate_limit_exceeded |
Demasiadas llamadas; espera el tiempo indicado en Retry-After. |
| 500 | internal_error |
Algo falló en el lado de ToRun. |
| 502 | upstream_error, empty_reply |
El proveedor del modelo falló o envió una respuesta vacía. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Un servicio que necesita la llamada no está disponible por un momento; inténtalo de nuevo. |
| 504 | timeout |
Una llamada sin streaming superó los 110 segundos. |
Una solicitud que no se puede pagar responde 402, no 429, para que un cliente no la siga reintentando.