API compatibile con OpenAI
Ultimo aggiornamento: 11 nov 2026
Che cos'è
L'API compatibile con OpenAI permette a uno strumento che usa il formato chat completions di OpenAI di usare i modelli di chat di ToRun, pagati dal tuo account ToRun. Un agente di programmazione come opencode può usare ToRun come provider di modelli, accanto agli strumenti MCP di ToRun.
Indirizzo e accesso
| URL di base | https://mcp.torun.ai/v1 |
| Accesso | Authorization: Bearer <your developer key> |
Usa la stessa chiave sviluppatore del server MCP: vedi Chiavi sviluppatore. Una chiave creata prima che venisse aggiunta l'API compatibile con OpenAI riceve la risposta 403 insufficient_scope. I permessi di una chiave non cambiano mai, quindi crea una nuova chiave.
L'API ha due endpoint, GET /v1/models e POST /v1/chat/completions. Qualsiasi altro percorso sotto /v1 risponde 404 not_found.
Modelli
GET /v1/models elenca prima torun/auto, poi ogni modello di testo che il tuo piano può usare, con il suo id di modello. Ogni modello indica:
- quanto testo può leggere (
context_length) e quanto può essere lunga una risposta che scrive (max_completion_tokens), - se può chiamare strumenti (
supports_tools) e leggere immagini (supports_vision), - il suo prezzo in Runs per milione di token (
pricing:inputeoutput).
torun/auto lascia che ToRun scelga un modello per ogni richiesta: uno che legge le immagini quando la richiesta contiene un'immagine, e uno che chiama strumenti quando invia tools.
Chat completions
POST /v1/chat/completions accetta:
messages, con i ruolisystem,developer(trattato comesystem),user,assistantetool,toolsetool_choice(auto,none,requiredo una funzione con nome): gli strumenti del tuo strumento gli tornano come chiamate a strumenti, e ToRun non li esegue mai,response_formatconjson_object.json_schemaè accettato e la risposta è in JSON, ma lo schema in sé non viene imposto,temperature(da 0 a 2),top_p(da 0 a 1),max_completion_tokensomax_tokens,stop(fino a 4 sequenze),seedereasoning_effort,streamestream_options.include_usage.
n maggiore di 1, logprobs, top_logprobs, l'audio e qualsiasi output diverso dal testo vengono rifiutati con 400 unsupported_parameter invece di essere ignorati.
Immagini
Invia un'immagine inline, come data:image/...;base64,... in una parte image_url, fino a 20 MB per richiesta. Un'immagine inviata come link viene rifiutata con 400 image_url_not_supported: ToRun non la scarica. Le immagini passano un controllo di sicurezza, come nell'app.
Streaming
Con "stream": true la risposta arriva come server-sent events nel formato chat.completion.chunk:
- Il primo chunk porta il ruolo
assistant, e le chiamate a strumenti vengono trasmesse con il loroindex. - Finché non c'è nulla da inviare, arriva una riga di commento
: keepaliveogni 15 secondi; i parser SSE la ignorano. data: [DONE]chiude uno stream andato a buon fine.- Con
stream_options.include_usage, l'ultimo chunk hachoicesvuoto e portausage. - Un errore dopo l'inizio dello stream arriva come un unico evento
data: {"error": ...}, senza[DONE].
Una chiamata senza streaming viene interrotta dopo 110 secondi con 504 timeout. Invia le richieste lunghe con "stream": true.
Utilizzo
usage contiene prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens e completion_tokens_details.reasoning_tokens, più torun_credits: quanto è costata la chiamata, in Runs.
Usala in opencode
La configurazione di opencode nella pagina Sviluppatori aggiunge ToRun come provider di modelli accanto al server 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" } }
}
}
}
Qualsiasi altro strumento che usa l'API di chat di OpenAI funziona allo stesso modo. La scheda API OpenAI della pagina mostra questa chiamata:
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"}]}'
Come vengono pagate le chiamate
Le chiamate API costano gli stessi Runs dello stesso uso nell'app. Le pagano solo fondi a pagamento: prima la quota del tuo piano a pagamento, poi il tuo portafoglio se lo hai consentito sulla chiave. La quota gratuita non paga mai le chiamate API. Valgono i limiti mensile e giornaliero della chiave, e le risposte passano un controllo di sicurezza come le risposte della chat.
Limiti
Ogni chiave può fare 60 richieste al minuto a questa API ed eseguire 4 completion contemporaneamente. Oltre questa soglia, l'API risponde 429 rate_limit_exceeded con un'intestazione Retry-After.
Errori
Ogni errore ha la forma {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. Il message è nella lingua richiesta dall'intestazione Accept-Language della richiesta.
| Stato | Codice | Significato |
|---|---|---|
| 400 | invalid_json, missing_parameter, invalid_parameter, unsupported_parameter |
La richiesta non è ben formata, oppure usa un parametro che ToRun non supporta. |
| 400 | image_url_not_supported |
Un'immagine è stata inviata come link; inviala inline. |
| 400 | content_blocked |
Il controllo di sicurezza ha bloccato il contenuto. |
| 400 | upstream_rejected |
Il provider del modello ha rifiutato la richiesta; il messaggio spiega perché. |
| 401 | invalid_api_key |
La chiave manca, è scritta male o è stata revocata. |
| 402 | insufficient_credits, wallet_spend_not_allowed, spending_cap_reached |
L'account o la chiave non può pagare la chiamata. |
| 403 | insufficient_scope |
La chiave è stata creata prima che venisse aggiunta questa API; crea una nuova chiave. |
| 403 | model_not_available |
Il modello non è incluso nel tuo piano. |
| 403 | account_suspended, no_developer_access |
L'account è sospeso o non ha accesso sviluppatore. |
| 404 | model_not_found |
L'id del modello non è tra quelli elencati da GET /v1/models. |
| 404 | not_found |
Non esiste un percorso simile sotto /v1. |
| 429 | rate_limit_exceeded |
Troppe chiamate; aspetta il tempo indicato in Retry-After. |
| 500 | internal_error |
Qualcosa non ha funzionato dal lato di ToRun. |
| 502 | upstream_error, empty_reply |
Il provider del modello ha avuto un errore o ha inviato una risposta vuota. |
| 503 | upstream_error, cap_unreadable, scan_unavailable |
Un servizio di cui la chiamata ha bisogno non è disponibile per un momento; riprova. |
| 504 | timeout |
Una chiamata senza streaming ha superato i 110 secondi. |
Una richiesta che non può essere pagata risponde 402, non 429, così un client non continua a riprovarla.