Panoramica
La mappa dell'API: ogni endpoint, come appaiono una richiesta e un errore, come si pagano le chiamate e cosa sapere se vieni da un SDK OpenAI o Anthropic.
Endpoint
Ogni endpoint si trova sotto un unico URL di base ed è servito tramite HTTPS.
https://api.shannon-ai.com | Endpoint | Formato | A cosa serve |
|---|---|---|
POST /v1/chat/completions | OpenAI Chat Completions | Invia una conversazione, ottieni la risposta successiva. Con o senza streaming. |
POST /v1/messages | Anthropic Messages | Lo stesso, nelle forme di richiesta e risposta degli SDK Anthropic. |
POST /v1/responses | OpenAI Responses | Lo stesso, nelle forme di Responses. L'endpoint non conserva alcuno stato: invia la conversazione a ogni richiesta. |
GET /v1/models | Elenco modelli OpenAI | Elenca i modelli con finestra di contesto, prezzi e funzionalità. Non richiede una chiave. |
POST /v1/tokenize | API Shannon | Conta i token di un testo o di una richiesta di chat per un modello open-weight ospitato. Gratuito. |
POST /v1/messages/count_tokens | Conteggio token Anthropic | Conta i token di input di una richiesta Messages per un modello open-weight ospitato. Gratuito. |
I tre endpoint che producono testo raggiungono gli stessi modelli. Scegli quello il cui formato è già usato dal tuo codice.
Nozioni di base sulle richieste
| Header | Descrizione |
|---|---|
Authorization: Bearer <key> | La tua chiave API. Obbligatoria su ogni endpoint tranne GET /v1/models, a meno che tu non invii x-api-key. |
x-api-key: <key> | La stessa chiave nell'header che inviano gli SDK Anthropic. Letta su ogni endpoint. |
Content-Type: application/json | Obbligatorio su ogni POST. Senza di esso la risposta è 415. |
x-request-id: <your id> | Facoltativo. Un tuo id per la richiesta; torna nell'header di risposta x-request-id. Senza di esso l'API ne crea uno di 12 caratteri esadecimali. |
- Il corpo di ogni
POSTè un solo oggetto JSON, fino a 32 MiB. - Un campo che l'API non conosce non causa errori e non ha effetto. Una richiesta scritta per un altro provider non fallisce a causa di un campo in più.
- Un campo noto con il tipo JSON sbagliato, o un campo obbligatorio mancante, riceve come risposta
422. Un corpo che non è JSON valido riceve come risposta400. modelè uno degli id in Modelli e prezzi. Maiuscole e minuscole non contano.
Una risposta è JSON, oppure uno stream di server-sent events quando la richiesta imposta stream su true. Ogni endpoint risponde nel proprio formato. Ogni risposta ha l'header x-request-id.
Cosa supera una richiesta
Una richiesta viene verificata in un ordine fisso prima che un modello venga eseguito. Risponde il primo controllo che fallisce, quindi un 401 non ti dice ancora nulla sul corpo.
| Verificato, in quest'ordine | Stato in caso di errore |
|---|---|
| Chiave API | 401 |
| Corpo: dimensione, tipo di contenuto, JSON, tipi dei campi | 413 · 415 · 400 · 422 |
| Id del modello | 400 |
| Flood protection: 120 richieste al minuto per account | 429 |
| Saldo: il budget di output della richiesta deve rientrare | 429 |
Forma degli errori
Un errore è un oggetto JSON con un error che contiene type e message. /v1/messages lo racchiude come si aspettano gli SDK Anthropic; ogni altro percorso usa la forma OpenAI.
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: gpt-4o"
}
} {
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "unknown model: gpt-4o"
}
} - Leggi
typeemessage.codeeparamsono presenti solo in alcuni errori: trattali come facoltativi.paramè semprenull. - Dopo l'avvio di uno stream, lo stato è già
200. Un errore arriva allora come frame di errore all'interno dello stream. - Ogni risposta di errore porta l'header
x-request-id.
| Stato | Tipo | Quando |
|---|---|---|
400 | invalid_request_error | Il corpo non è JSON valido, l'id del modello è sconosciuto, oppure il modello non accetta un tipo di input che hai inviato. |
401 | authentication_error | La chiave manca o non è valida. |
404 | not_found_error | Il percorso non esiste. |
405 | api_error | Il percorso esiste, ma il metodo è sbagliato. |
413 | invalid_request_error | Il corpo è più grande di 32 MiB. |
415 | invalid_request_error | Content-Type non è application/json. |
422 | invalid_request_error | Un campo ha il tipo JSON sbagliato oppure manca un campo obbligatorio. |
429 | rate_limit_error | Il saldo non copre la richiesta, in un minuto sono arrivate più di 120 richieste, le chiamate Shannon Coder della finestra sono esaurite, oppure il modello è occupato. Il messaggio indica quale caso si è verificato. |
5xx | api_error | Stato 500, 502, 503 o 504: la richiesta era valida e non è stato possibile rispondere. Inviala di nuovo. Un 500 può riportare il tipo server_error. |
Fatturazione e saldo
- C'è un solo saldo per account, e chat e API lo condividono: prima la quota del piano di oggi, poi il credito acquistato. L'API non ha una quota propria.
- Una richiesta riserva il proprio budget di output (
max_tokens, default 4,096) e viene poi addebitata per i token realmente usati, al prezzo del modello. - Ogni risposta riporta i suoi conteggi di token in
usage. La pagina Chiavi e utilizzo mostra il saldo e quanto è costata ogni richiesta. - Ogni richiesta è servita allo stesso modo. L'unico limite alla frequenza delle richieste è la flood protection: 120 richieste al minuto per account. Le richieste inviate in parallelo attendono in coda.
Limiti e saldo Modelli e prezzi Chiavi e utilizzo
Campi che dipendono dal modello
Ogni modello accetta la stessa richiesta. Alcuni campi hanno effetto solo su certi modelli; la tabella indica dove. Le pagine degli endpoint elencano ogni campo.
| Campo | Descrizione | Applicato da |
|---|---|---|
system | Istruzioni per il modello: un messaggio system su Chat Completions, system su Messages, instructions su Responses. | Modelli open-weight ospitati, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
temperature | Temperatura di campionamento. | Modelli open-weight ospitati, shannon-1.6-*, shannon-coder-1 |
top_p | Campionamento nucleus. | Modelli open-weight ospitati |
seed | Un seed fisso per il campionamento. | Modelli open-weight ospitati |
stop | Fino a 4 sequenze di stop. | Modelli open-weight ospitati |
reasoning_effort | Quanto ragiona il modello prima di rispondere. reasoning.effort su Responses, thinking su Messages. | Modelli open-weight ospitati |
web_search | true permette al modello di cercare sul web per questa richiesta. Un campo di questa API, su Chat Completions e Messages. | Modelli Shannon tranne shannon-coder-1 |
max_tokens | Il budget di output. Su ogni modello stabilisce la quantità riservata dal tuo saldo. | Come limite alla lunghezza della risposta: modelli open-weight ospitati, shannon-1.6-*, shannon-coder-1 |
Se arrivi da un SDK OpenAI
- Imposta l'URL di base su
https://api.shannon-ai.com/v1e la chiave sulla tua chiave Shannon. Le chiamate a Chat Completions e Responses funzionano poi con l'SDK così com'è. modeldeve essere un id Shannon. Il nome di un modello di un altro provider, comegpt-4o, riceve come risposta400eunknown model.- Il ragionamento arriva in un campo a parte:
reasoning_contentaccanto acontent, sia nel messaggio sia nei delta dello stream. - Uno stream porta sempre
usagenell'ultimo chunk, insieme afinish_reason. - Una chiamata di tool in uno stream arriva come un unico chunk con la stringa
argumentscompleta. - Una risposta ha una sola choice.
- I percorsi dell'API OpenAI che non compaiono nella tabella qui sopra, come
/v1/embeddings, ricevono risposta404.
Se arrivi da un SDK Anthropic
- Imposta l'URL di base su
https://api.shannon-ai.com, senza/v1, e la chiave sulla tua chiave Shannon. L'SDK la invia comex-api-key. modeldeve essere un id Shannon.max_tokensè facoltativo su questa API. Il suo default è 4,096.- Una risposta contiene blocchi di contenuto di tipo
thinking,textetool_use. Il primo blocco non è sempre il testo: scegli i blocchi in base altype. stop_reasonèend_turnotool_use. Uno stream di un modello Shannon può terminare anche conmax_tokens.anthropic-versioneanthropic-betasono accettati, quindi l'SDK funziona senza modifiche. Una richiesta non ne ha bisogno.- Gli errori su
/v1/messageshanno la forma Anthropic:{"type": "error", "error": {…}}.
Gli strumenti di programmazione che parlano questi formati si configurano allo stesso modo: URL di base, chiave e un id Shannon come modello. Strumenti CLI per la programmazione