API compatível com a OpenAI
Última atualização: 11 nov. 2026
O que é
A API compatível com a OpenAI permite que uma ferramenta que fala o formato chat completions da OpenAI use os modelos de chat do ToRun, pagos pela sua conta ToRun. Um agente de programação como o opencode pode usar o ToRun como provedor de modelos, junto com as ferramentas MCP do ToRun.
Endereço e login
| URL base | https://mcp.torun.ai/v1 |
| Login | Authorization: Bearer <your developer key> |
Use a mesma chave de desenvolvedor do servidor MCP: veja Chaves de desenvolvedor. Uma chave criada antes de a API compatível com a OpenAI ser adicionada recebe 403 insufficient_scope. As permissões de uma chave nunca mudam, então crie uma nova chave.
A API tem dois endpoints, GET /v1/models e POST /v1/chat/completions. Qualquer outro caminho em /v1 responde 404 not_found.
Modelos
GET /v1/models lista primeiro torun/auto e depois todo modelo de texto que seu plano pode usar, pelo id do modelo. Cada modelo informa:
- quanto texto ele consegue ler (
context_length) e qual o tamanho da resposta que consegue escrever (max_completion_tokens), - se consegue chamar ferramentas (
supports_tools) e ler imagens (supports_vision), - seu preço em Runs por milhão de tokens (
pricing:inputeoutput).
torun/auto deixa o ToRun escolher um modelo para cada solicitação: um que lê imagens quando a solicitação tem uma imagem, e um que chama ferramentas quando ela envia tools.
Chat completions
POST /v1/chat/completions aceita:
messages, com os papéissystem,developer(tratado comosystem),user,assistantetool,toolsetool_choice(auto,none,requiredou uma função nomeada): as ferramentas da sua própria ferramenta voltam para ela como chamadas de ferramenta, e o ToRun nunca as executa,response_formatcomjson_object.json_schemaé aceito e respondido em JSON, mas o esquema em si não é imposto,temperature(0 a 2),top_p(0 a 1),max_completion_tokensoumax_tokens,stop(até 4 sequências),seedereasoning_effort,streamestream_options.include_usage.
n acima de 1, logprobs, top_logprobs, áudio e qualquer saída que não seja texto são recusados com 400 unsupported_parameter em vez de ignorados.
Imagens
Envie uma imagem embutida, como data:image/...;base64,... em uma parte image_url, com até 20 MB por solicitação. Uma imagem enviada como link é recusada com 400 image_url_not_supported: o ToRun não a baixa. As imagens passam por uma verificação de segurança, como no app.
Streaming
Com "stream": true a resposta chega como server-sent events no formato chat.completion.chunk:
- O primeiro chunk traz o papel
assistant, e as chamadas de ferramenta são transmitidas com seuindex. - Enquanto não há nada para enviar, chega uma linha de comentário
: keepalivea cada 15 segundos; os parsers de SSE a ignoram. data: [DONE]encerra um stream que deu certo.- Com
stream_options.include_usage, o último chunk temchoicesvazio e trazusage. - Uma falha depois que o stream começou chega como um único evento
data: {"error": ...}, sem[DONE].
Uma chamada sem streaming é interrompida depois de 110 segundos com 504 timeout. Envie solicitações longas com "stream": true.
Uso
usage traz prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens e completion_tokens_details.reasoning_tokens, além de torun_credits: quanto a chamada custou, em Runs.
Use no opencode
A configuração do opencode na página Desenvolvedores adiciona o ToRun como provedor de modelos ao lado do 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" } }
}
}
}
Qualquer outra ferramenta que fale a API de chat da OpenAI funciona do mesmo jeito. A aba API da OpenAI da página mostra esta chamada:
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"}]}'
Como as chamadas são pagas
Chamadas de API custam os mesmos Runs que o mesmo uso no app. Só recursos pagos as pagam: primeiro a cota do seu plano pago e depois sua carteira, se você permitiu isso na chave. A cota gratuita nunca paga chamadas de API. Os limites mensal e diário da chave se aplicam, e as respostas passam por verificação de segurança como as respostas do chat.
Limites
Cada chave pode fazer 60 solicitações por minuto a esta API e executar 4 completions ao mesmo tempo. Acima disso, a API responde 429 rate_limit_exceeded com um cabeçalho Retry-After.
Erros
Todo erro tem o formato {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. A message vem no idioma pedido pelo cabeçalho Accept-Language da solicitação.
| Status | Código | Significado |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
A solicitação está malformada ou usa um parâmetro que o ToRun não suporta. |
| 400 | image_url_not_supported |
Uma imagem foi enviada como link; envie-a embutida. |
| 400 | content_blocked |
A verificação de segurança bloqueou o conteúdo. |
| 400 | upstream_rejected |
O provedor do modelo recusou a solicitação; a mensagem diz por quê. |
| 401 | invalid_api_key |
A chave está faltando, foi digitada errado ou foi revogada. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
A conta ou a chave não consegue pagar a chamada. |
| 403 | insufficient_scope |
A chave foi criada antes de esta API ser adicionada; crie uma nova chave. |
| 403 | model_not_available |
O modelo não está no seu plano. |
| 403 | account_suspended, no_developer_access |
A conta está suspensa ou não tem acesso de desenvolvedor. |
| 404 | model_not_found |
O id do modelo não é um dos que GET /v1/models lista. |
| 404 | not_found |
Não existe esse caminho em /v1. |
| 429 | rate_limit_exceeded |
Chamadas demais; espere o tempo indicado em Retry-After. |
| 500 | internal_error |
Algo falhou do lado do ToRun. |
| 502 | upstream_error, empty_reply |
O provedor do modelo falhou ou enviou uma resposta vazia. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Um serviço de que a chamada precisa está indisponível por um momento; tente de novo. |
| 504 | timeout |
Uma chamada sem streaming passou de 110 segundos. |
Uma solicitação que não pode ser paga responde 402, não 429, para que um cliente não fique tentando de novo.