Chat Completions
POST /v1/chat/completions accetta una conversazione e restituisce il messaggio successivo del modello nel formato OpenAI Chat Completions. Usalo da qualsiasi SDK OpenAI o con semplice HTTP; questa pagina è il riferimento campo per campo.
POST https://api.shannon-ai.com/v1/chat/completions
La richiesta più piccola è un id di modello e un messaggio dell'utente.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="shannon-3",
messages=[{"role": "user", "content": "Say hello in one sentence."}],
)
print(response.choices[0].message.content) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.chat.completions.create({
model: "shannon-3",
messages: [{ role: "user", content: "Say hello in one sentence." }],
});
console.log(response.choices[0].message.content); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"messages": [{"role": "user", "content": "Say hello in one sentence."}]
}' La risposta è un oggetto JSON:
{
"id": "chatcmpl-5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
"object": "chat.completion",
"created": 1791625200,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Hello, it is good to meet you.",
"reasoning_content": "The user wants a greeting in one sentence. Keep it short and friendly."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1184,
"completion_tokens": 46,
"total_tokens": 1230
}
} Header
Header della richiesta
| Header | Valore | Descrizione |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | La tua chiave API. In alternativa, su ogni endpoint è accettato x-api-key: YOUR_API_KEY. |
Content-Type | application/json | Obbligatorio. Qualsiasi altro valore restituisce 415. |
x-request-id | Facoltativo. Un tuo id per la richiesta. Torna invariato nella risposta. |
Header della risposta
| Header | Descrizione |
|---|---|
x-request-id | Su ogni risposta, compresi errori e stream: il valore che hai inviato, oppure 12 caratteri esadecimali se non ne hai inviato nessuno. Citalo quando segnali un problema. |
content-type | application/json, oppure text/event-stream quando stream è true. |
Campi della richiesta
Solo messages è obbligatorio. La colonna Applicato da indica i modelli su cui un campo cambia la risposta. I modelli open-weight ospitati sono i dodici id dell'elenco dei modelli; la famiglia Shannon 3 è shannon-3, shannon-3-pro, shannon-3.1 e shannon-3.1-pro. Modelli e prezzi
| Campo | Tipo | Default | Descrizione | Applicato da |
|---|---|---|---|---|
model | string | shannon-1.6-lite | Il modello che risponde: un id dall'elenco dei modelli. Invialo a ogni richiesta. La corrispondenza non distingue maiuscole e minuscole. Un id non pubblicato restituisce 400 unknown model. | Tutti i modelli |
messages | array | Obbligatorio. La conversazione, dal messaggio più vecchio. Vedi Messaggi più sotto. | Tutti i modelli | |
stream | boolean | false | true invia la risposta come server-sent events man mano che viene scritta. | Tutti i modelli |
max_tokens | integer | 4096 | Limite massimo della risposta, in token. Un valore fuori dall'intervallo da 1 a 65,536 viene riportato dentro l'intervallo. È anche la quantità messa da parte dal tuo saldo mentre la richiesta è in corso. Vedi Lunghezza dell'output più sotto. | Modelli open-weight ospitati, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Come max_tokens. Se vengono inviati entrambi, si usa max_tokens. | Modelli open-weight ospitati, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura di campionamento. Sui modelli open-weight ospitati il default è 1 e i valori sono mantenuti tra 0 e 2. | Modelli open-weight ospitati, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Campionamento nucleus. I valori sono mantenuti tra 0 e 1. | Modelli open-weight ospitati |
seed | integer | Seed del campionatore, un intero qualsiasi. Senza di esso, il seed è derivato dal modello e dalla conversazione, quindi la stessa richiesta inviata due volte usa lo stesso seed. | Modelli open-weight ospitati | |
stop | string | array | Una stringa o un array di stringhe. Se ne usano al massimo 4. La risposta termina prima della prima che compare; il testo di stop stesso non viene restituito. | Modelli open-weight ospitati | |
reasoning_effort | string | high | Quanto ragiona il modello prima di rispondere: off, low, medium o high. none e minimal equivalgono a off, default equivale a medium, max equivale a high. Qualsiasi altro valore restituisce 400. | Modelli open-weight ospitati |
reasoning | object | La stessa impostazione in forma di oggetto: {"effort": "low"}. Se vengono inviati entrambi, si usa reasoning_effort. | Modelli open-weight ospitati | |
tools | array | Le funzioni che il modello può chiamare, ciascuna come {"type": "function", "function": {"name", "description", "parameters"}}. Le chiamate del modello tornano in tool_calls; le esegue il tuo codice. | Tutti i modelli | |
tool_choice | string | object | auto | "auto" lascia decidere il modello. "required" lo obbliga a chiamare un tool. {"type": "function", "function": {"name": "…"}} lo obbliga a chiamare quel tool. | Modelli open-weight ospitati |
response_format | object | {"type": "json_object"} per una risposta JSON, oppure {"type": "json_schema", "json_schema": {…}} per una risposta che segue il tuo schema. | Tutti i livelli Shannon; modelli open-weight ospitati come indicato per ogni id | |
web_search | boolean | false | true permette al modello di cercare sul web prima di rispondere. | shannon-1.6-*, shannon-2-*, famiglia Shannon 3 |
Altri campi OpenAI, come n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store e prompt_cache_key, sono accettati così il codice client esistente funziona senza modifiche. Non cambiano la risposta: c'è sempre una sola choice, e uno stream termina sempre con l'utilizzo.
Un campo con il tipo JSON sbagliato, per esempio "max_tokens": "100", restituisce 422. Lo stesso vale per una richiesta senza messages.
Tool, output strutturato, ragionamento e ricerca web hanno ciascuno una pagina propria: Chiamata di funzioni, Output strutturati, Sforzo di ragionamento, Ricerca web integrata.
Una richiesta con opzioni
Questa richiesta imposta un messaggio di sistema, i campi di campionamento e lo sforzo di ragionamento. Usa un modello open-weight ospitato, che li applica tutti.
from openai import OpenAI
client = OpenAI(
api_key="YOUR_API_KEY",
base_url="https://api.shannon-ai.com/v1",
)
response = client.chat.completions.create(
model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages=[
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"},
],
max_tokens=512,
temperature=0.3,
top_p=0.9,
seed=7,
stop=["\n\n"],
reasoning_effort="low",
)
message = response.choices[0].message
print(message.reasoning_content) # the reasoning
print(message.content) # the answer
print(response.usage) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.chat.completions.create({
model: "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
messages: [
{ role: "system", content: "You are a physics teacher. Answer in two sentences." },
{ role: "user", content: "Why is the sky blue?" },
],
max_tokens: 512,
temperature: 0.3,
top_p: 0.9,
seed: 7,
stop: ["\n\n"],
reasoning_effort: "low",
});
const message = response.choices[0].message;
console.log(message.reasoning_content); // the reasoning
console.log(message.content); // the answer
console.log(response.usage); curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
"messages": [
{"role": "system", "content": "You are a physics teacher. Answer in two sentences."},
{"role": "user", "content": "Why is the sky blue?"}
],
"max_tokens": 512,
"temperature": 0.3,
"top_p": 0.9,
"seed": 7,
"stop": ["\n\n"],
"reasoning_effort": "low"
}' La risposta ha la stessa forma di quella sopra. Il suo usage aggiunge due dettagli sui modelli open-weight ospitati: i token del prompt letti dalla cache e i token spesi per il ragionamento.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Lunghezza dell'output
max_tokens fa due cose. Primo, è il numero di token messi da parte dal tuo saldo quando la richiesta inizia. Quando la risposta è completa, quella quantità viene sostituita dai token effettivamente usati dalla richiesta. Se max_tokens è maggiore di ciò che resta del tuo saldo, la richiesta restituisce 429 Quota exceeded anche se la risposta stessa ci sarebbe stata. Invia un max_tokens più basso per mettere da parte meno.
shannon-coder-1 su questo endpoint è conteggiato in modo diverso: ogni richiesta è una delle chiamate Shannon Coder del tuo piano e non viene messo da parte alcun token. Limiti e saldo
Secondo, limita la lunghezza della risposta su questi modelli:
| Modelli | Cosa fa max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | La risposta si ferma quando raggiunge il limite. Uno stream termina allora con finish_reason length. |
| Modelli open-weight ospitati | Il testo della risposta si ferma a max_tokens. Il ragionamento non viene conteggiato. I valori inferiori a 256 valgono come 256. |
Senza max_tokens o max_completion_tokens, il valore è 4,096. Su shannon-coder-1 è 65,536.
Messaggi
Ogni messaggio è un oggetto con un role e un content. content è una stringa, oppure un array di parti quando il messaggio contiene più del solo testo.
| Ruolo | Descrizione | Applicato da |
|---|---|---|
system | Istruzioni per il modello. Mettilo per primo. Sui livelli Shannon viene usato il primo messaggio system. | Modelli open-weight ospitati, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Letto come system. | Modelli open-weight ospitati |
user | Ciò che chiedi. Sui livelli Shannon l'ultimo messaggio user è il prompt e i messaggi che lo precedono sono la cronologia. | Tutti i modelli |
assistant | Le risposte precedenti del modello. Mantieni i suoi tool_calls quando invii dopo di essi un risultato di tool. | Tutti i modelli |
tool | Il risultato di una chiamata a un tool: tool_call_id contiene l'id della chiamata e content il risultato come stringa. | Tutti i modelli |
Con un id della famiglia Shannon 3, inserisci nel messaggio user le istruzioni che devono valere.
Sui livelli Shannon una richiesta senza testo dell'utente e senza tools restituisce 400 No user message provided.
Parti di contenuto
| Parte | Descrizione | Disponibile su |
|---|---|---|
{"type": "text", "text": "…"} | Testo semplice. | Tutti i modelli |
{"type": "image_url", "image_url": {"url": "…"}} | Un'immagine, come URL data: con contenuto base64 oppure come URL http(s). | Famiglia Shannon 3, shannon-1.6-lite, shannon-1.6-pro e i modelli open-weight ospitati che prevedono l'input di immagini |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Un documento (PDF, Word, PowerPoint o Excel), in base64 o tramite URL. | Famiglia Shannon 3 |
Dimensioni, limiti e l'elenco completo delle forme hanno una pagina propria. Immagini e file
L'oggetto della risposta
| Campo | Tipo | Descrizione |
|---|---|---|
id | string | chatcmpl- seguito da 32 caratteri esadecimali. |
object | string | Sempre chat.completion. |
created | integer | Ora della risposta, in secondi Unix. |
model | string | L'id canonico del modello che ha risposto. Può differire nella grafia dall'id che hai inviato. |
choices | array | Sempre esattamente una choice, con index 0. |
choices[0].message.role | string | Sempre assistant. |
choices[0].message.content | string | null | Il testo della risposta. Con tool_calls è null sui livelli Shannon; i modelli open-weight ospitati possono inviare testo accanto alle chiamate. |
choices[0].message.reasoning_content | string | null | Il ragionamento che il modello ha scritto prima della risposta, oppure null se non ce n'è. |
choices[0].message.tool_calls | array | Presente solo quando il modello chiama dei tool. Ogni voce ha un id, type function e function con il name e gli arguments come stringa JSON. |
choices[0].message.annotations | array | Solo su una richiesta con web_search: true la cui ricerca ha trovato qualcosa. Un url_citation per ogni fonte nominata da un marcatore in content, con url, title, start_index e end_index (la posizione del marcatore, contata in caratteri, fine esclusa). |
choices[0].finish_reason | string | Perché la risposta è terminata. Vedi Motivi di conclusione. |
usage | object | I token della richiesta. Vedi Utilizzo. |
sources | array | Solo su una richiesta con web_search: true la cui ricerca ha trovato qualcosa: i risultati dati al modello, ciascuno con index, title e url. [1] nella risposta è la voce con index 1. |
Motivi di conclusione
| finish_reason | Descrizione |
|---|---|
stop | Il modello ha concluso la risposta, oppure è comparsa una stringa stop. |
tool_calls | Il modello chiama uno o più tool. Eseguili e invia i risultati in messaggi tool. |
length | La risposta è stata troncata al limite di output. Riportato negli stream di shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 e della famiglia Shannon 3. |
Una risposta senza streaming riporta stop o tool_calls.
Utilizzo
| Campo | Tipo | Descrizione | Disponibile su |
|---|---|---|---|
usage.prompt_tokens | integer | Token di input. | Tutti i modelli |
usage.completion_tokens | integer | Token di output: ragionamento, risposta e chiamate a tool insieme. | Tutti i modelli |
usage.total_tokens | integer | prompt_tokens più completion_tokens. | Tutti i modelli |
usage.prompt_tokens_details.cached_tokens | integer | La parte di prompt_tokens che è stata letta dalla prompt cache. | Modelli open-weight ospitati |
usage.completion_tokens_details.reasoning_tokens | integer | La parte di completion_tokens che è stata spesa per il ragionamento. | Modelli open-weight ospitati |
Sui modelli open-weight ospitati, prompt_tokens sono i tuoi messaggi e le definizioni dei tool contati con il tokenizer del modello stesso, più i token delle eventuali immagini. Gli endpoint di conteggio dei token restituiscono lo stesso numero prima dell'invio. Conteggio dei token
Sui livelli Shannon, prompt_tokens conta tutto ciò che il modello ha letto per scrivere la risposta, quindi è maggiore del solo testo dei tuoi messaggi.
Streaming
Con stream impostato su true la risposta arriva come eventi chat.completion.chunk e termina con data: [DONE]. L'ultimo chunk prima di esso porta finish_reason e usage; non servono stream_options. Le forme dei chunk, le righe keep-alive e gli errori all'interno di uno stream hanno una pagina propria. Streaming
Errori
Un errore è un oggetto JSON con un membro error. I controlli vengono eseguiti in quest'ordine: chiave API, corpo della richiesta, id del modello, poi saldo. La tabella elenca ciò che questo endpoint restituisce più spesso. L'elenco completo, con cosa riprovare, ha una pagina propria. Gestione errori
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Stato | Tipo | Messaggio | Quando |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Non è stata inviata alcuna chiave API, oppure la chiave è sconosciuta o revocata. |
400 | invalid_request_error | unknown model: <id> | model non è un id pubblicato. |
400 | invalid_request_error | No user message provided | Livelli Shannon: la richiesta non contiene testo dell'utente né tools. |
400 | invalid_request_error | <id> does not accept image input | È stata inviata una parte immagine a un modello open-weight ospitato senza input di immagini. |
400 | invalid_request_error | <id> does not accept response_format | response_format è stato inviato a un modello open-weight ospitato senza output strutturato. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort contiene un valore fuori dall'elenco. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages manca, oppure un campo ha il tipo JSON sbagliato. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens è maggiore di ciò che resta del tuo saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Flood protection: più di 120 richieste in un minuto sul tuo account. |
500 | server_error | The model backend failed to answer. Please retry. | Il modello non ha prodotto una risposta. Invia di nuovo la richiesta. |
502 | api_error | The model backend failed to answer. Please retry. | Lo stesso, sulla famiglia Shannon 3 e sui modelli open-weight ospitati. |