Chat Completions
POST /v1/chat/completions accepta una conversa i retorna el missatge següent del model en el format OpenAI Chat Completions. Fes-lo servir des de qualsevol SDK d'OpenAI o amb HTTP pla; aquesta pàgina és la referència camp per camp.
POST https://api.shannon-ai.com/v1/chat/completions
La sol·licitud més petita és un id de model i un missatge d'usuari.
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 resposta és un sol objecte 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
}
} Capçaleres
Capçaleres de la sol·licitud
| Capçalera | Valor | Descripció |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | La teva clau API. En lloc seu, a tots els endpoints s'accepta x-api-key: YOUR_API_KEY. |
Content-Type | application/json | Obligatori. Qualsevol altre valor retorna 415. |
x-request-id | Opcional. El teu propi id per a la sol·licitud. Torna sense canvis a la resposta. |
Capçaleres de la resposta
| Capçalera | Descripció |
|---|---|
x-request-id | A cada resposta, errors i streams inclosos: el valor que has enviat, o 12 caràcters hexadecimals si no n'has enviat cap. Cita'l quan informis d'un problema. |
content-type | application/json, o text/event-stream quan stream és true. |
Camps de la sol·licitud
Només messages és obligatori. La columna S'aplica a indica els models en què un camp canvia la resposta. Els models open-weight hostejats són els dotze ids de la llista de models; la família Shannon 3 és shannon-3, shannon-3-pro, shannon-3.1 i shannon-3.1-pro. Models i preus
| Camp | Tipus | Per defecte | Descripció | S'aplica a |
|---|---|---|---|---|
model | string | shannon-1.6-lite | El model que respon: un id de la llista de models. Envia'l a cada sol·licitud. La coincidència no distingeix majúscules i minúscules. Un id que no és publicat retorna 400 unknown model. | Tots els models |
messages | array | Obligatori. La conversa, amb el missatge més antic primer. Vegeu Missatges més avall. | Tots els models | |
stream | boolean | false | true envia la resposta com a server-sent events mentre s'escriu. | Tots els models |
max_tokens | integer | 4096 | Límit superior de la resposta, en tokens. Un valor fora de l'interval d'1 a 65,536 es porta a aquest interval. També és la quantitat que es reserva del teu saldo mentre la sol·licitud s'executa. Vegeu Longitud de la sortida més avall. | Models open-weight hostejats, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Igual que max_tokens. Quan s'envien tots dos, es fa servir max_tokens. | Models open-weight hostejats, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura de mostreig. Als models open-weight hostejats el valor per defecte és 1 i els valors es mantenen entre 0 i 2. | Models open-weight hostejats, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Mostreig de nucli. Els valors es mantenen entre 0 i 1. | Models open-weight hostejats |
seed | integer | Llavor del mostrejador, qualsevol enter. Sense ella, la llavor es deriva del model i de la conversa, de manera que la mateixa sol·licitud enviada dues vegades fa servir la mateixa llavor. | Models open-weight hostejats | |
stop | string | array | Una cadena o una matriu de cadenes. Se'n fan servir fins a 4. La resposta acaba abans de la primera que aparegui; el text d'aturada en si no es retorna. | Models open-weight hostejats | |
reasoning_effort | string | high | Quant raona el model abans de respondre: off, low, medium o high. none i minimal volen dir off, default vol dir medium, max vol dir high. Qualsevol altre valor retorna 400. | Models open-weight hostejats |
reasoning | object | El mateix paràmetre en forma d'objecte: {"effort": "low"}. Quan s'envien tots dos, es fa servir reasoning_effort. | Models open-weight hostejats | |
tools | array | Les funcions que el model pot cridar, cadascuna com a {"type": "function", "function": {"name", "description", "parameters"}}. Les crides del model tornen a tool_calls; el teu codi les executa. | Tots els models | |
tool_choice | string | object | auto | "auto" deixa que el model decideixi. "required" l'obliga a cridar una eina. {"type": "function", "function": {"name": "…"}} l'obliga a cridar aquesta eina. | Models open-weight hostejats |
response_format | object | {"type": "json_object"} per a una resposta JSON, o {"type": "json_schema", "json_schema": {…}} per a una resposta que segueix el teu esquema. | Tots els nivells Shannon; models open-weight hostejats segons s'indica per id | |
web_search | boolean | false | true deixa que el model cerqui al web abans de respondre. | shannon-1.6-*, shannon-2-*, família Shannon 3 |
Altres camps d'OpenAI, com n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store i prompt_cache_key, s'accepten perquè el codi de client existent funcioni sense canvis. No canvien la resposta: sempre hi ha una sola opció, i un stream sempre acaba amb l'ús.
Un camp amb un tipus JSON incorrecte, per exemple "max_tokens": "100", retorna 422. Una sol·licitud sense messages també.
Les eines, la sortida estructurada, el raonament i la cerca web tenen cadascun la seva pròpia pàgina: Crida de funcions, Sortides estructurades, Esforç de raonament, Cerca web.
Una sol·licitud amb opcions
Aquesta sol·licitud defineix un missatge de sistema, els camps de mostreig i l'esforç de raonament. Fa servir un model open-weight hostejat, que els aplica tots.
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 resposta té la mateixa forma que dalt. El seu usage afegeix dos detalls als models open-weight hostejats: els tokens de prompt llegits de la cache i els tokens gastats en raonament.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Longitud de la sortida
max_tokens fa dues coses. Primer, és el nombre de tokens que es reserven del teu saldo quan comença la sol·licitud. Quan la resposta és completa, aquesta quantitat se substitueix pels tokens que la sol·licitud ha fet servir. Si max_tokens és més gran que el que queda del teu saldo, la sol·licitud retorna 429 Quota exceeded encara que la resposta mateixa hauria cabut. Envia un max_tokens més baix per reservar-ne menys.
shannon-coder-1 es compta de manera diferent en aquest endpoint: cada sol·licitud és una de les crides de Shannon Coder del teu pla, i no es reserva cap token per a ella. Límits i saldo
Segon, limita la longitud de la resposta en aquests models:
| Models | Què fa max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | La resposta s'atura quan arriba al límit. Un stream acaba llavors amb finish_reason length. |
| Models open-weight hostejats | El text de la resposta s'atura a max_tokens. El raonament no hi compta. Els valors per sota de 256 actuen com a 256. |
Sense max_tokens ni max_completion_tokens, el valor és 4,096. A shannon-coder-1 és 65,536.
Missatges
Cada missatge és un objecte amb un role i un content. content és una cadena o una matriu de parts quan el missatge porta més que text.
| Rol | Descripció | S'aplica a |
|---|---|---|
system | Instruccions per al model. Posa'l primer. Als nivells Shannon es fa servir el primer missatge system. | Models open-weight hostejats, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Es llegeix com a system. | Models open-weight hostejats |
user | El que demanes. Als nivells Shannon, l'últim missatge user és el prompt i els missatges anteriors són l'historial. | Tots els models |
assistant | Respostes anteriors del model. Conserva'n els tool_calls quan enviïs un resultat d'eina després. | Tots els models |
tool | El resultat d'una crida d'eina: tool_call_id conté l'id de la crida i content el resultat com a cadena. | Tots els models |
Amb un id de la família Shannon 3, posa les instruccions que s'han de complir al missatge user.
Als nivells Shannon, una sol·licitud sense text d'usuari ni tools retorna 400 No user message provided.
Parts del contingut
| Part | Descripció | Disponible a |
|---|---|---|
{"type": "text", "text": "…"} | Text pla. | Tots els models |
{"type": "image_url", "image_url": {"url": "…"}} | Una imatge, com a URL data: amb contingut en base64 o com a URL http(s). | Família Shannon 3, shannon-1.6-lite, shannon-1.6-pro i els models open-weight hostejats que admeten entrada d'imatge |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Un document (PDF, Word, PowerPoint o Excel), en base64 o per URL. | Família Shannon 3 |
Les mides, els límits i la llista completa de formes tenen la seva pròpia pàgina. Imatges i fitxers
L'objecte de resposta
| Camp | Tipus | Descripció |
|---|---|---|
id | string | chatcmpl- seguit de 32 caràcters hexadecimals. |
object | string | Sempre chat.completion. |
created | integer | Hora de la resposta, en segons Unix. |
model | string | L'id canònic del model que ha respost. Pot diferir en l'ortografia de l'id que has enviat. |
choices | array | Sempre exactament una opció, amb index 0. |
choices[0].message.role | string | Sempre assistant. |
choices[0].message.content | string | null | El text de la resposta. Amb tool_calls és null als nivells Shannon; els models open-weight hostejats poden enviar text al costat de les crides. |
choices[0].message.reasoning_content | string | null | El raonament que el model ha escrit abans de la resposta, o null quan no n'hi ha. |
choices[0].message.tool_calls | array | Present només quan el model crida eines. Cada entrada té un id, type function, i function amb el name i els arguments com a cadena JSON. |
choices[0].message.annotations | array | Només en una sol·licitud amb web_search: true la cerca de la qual ha trobat alguna cosa. Un url_citation per a cada font que anomena un marcador a content, amb url, title, start_index i end_index (la posició del marcador, comptada en caràcters, el final no s'inclou). |
choices[0].finish_reason | string | Per què ha acabat la resposta. Vegeu Motius de finalització. |
usage | object | Els tokens de la sol·licitud. Vegeu Ús. |
sources | array | Només en una sol·licitud amb web_search: true la cerca de la qual ha trobat alguna cosa: els resultats que s'han donat al model, cadascun amb index, title i url. [1] a la resposta és l'entrada amb index 1. |
Motius de finalització
| finish_reason | Descripció |
|---|---|
stop | El model ha acabat la seva resposta, o ha aparegut una cadena de stop. |
tool_calls | El model crida una o més eines. Executa-les i envia els resultats en missatges tool. |
length | La resposta s'ha tallat al límit de sortida. S'informa als streams de shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 i la família Shannon 3. |
Una resposta sense stream informa stop o tool_calls.
Ús
| Camp | Tipus | Descripció | Disponible a |
|---|---|---|---|
usage.prompt_tokens | integer | Tokens d'entrada. | Tots els models |
usage.completion_tokens | integer | Tokens de sortida: raonament, resposta i crides d'eina junts. | Tots els models |
usage.total_tokens | integer | prompt_tokens més completion_tokens. | Tots els models |
usage.prompt_tokens_details.cached_tokens | integer | La part de prompt_tokens que s'ha llegit de la cache del prompt. | Models open-weight hostejats |
usage.completion_tokens_details.reasoning_tokens | integer | La part de completion_tokens que s'ha gastat en raonament. | Models open-weight hostejats |
Als models open-weight hostejats, prompt_tokens són els teus missatges i definicions d'eines comptats amb el tokenitzador del mateix model, més els tokens de les imatges. Els endpoints de recompte de tokens retornen el mateix número abans que enviïs. Recompte de tokens
Als nivells Shannon, prompt_tokens compta tot el que el model ha llegit per escriure la resposta, de manera que és més gran que el text dels teus missatges sol.
Streaming
Amb stream definit a true, la resposta arriba com a esdeveniments chat.completion.chunk i acaba amb data: [DONE]. L'últim fragment abans porta finish_reason i usage; no calen stream_options. Les formes dels fragments, les línies keep-alive i els errors dins d'un stream tenen la seva pròpia pàgina. Streaming
Errors
Un error és un objecte JSON amb un membre error. Les comprovacions s'executen en aquest ordre: clau API, cos de la sol·licitud, id del model i després saldo. La taula llista el que aquest endpoint retorna més sovint. La llista completa, amb què cal tornar a provar, té la seva pròpia pàgina. Gestió d’errors
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Estat | Tipus | Missatge | Quan |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | No s'ha enviat cap clau API, o la clau és desconeguda o està revocada. |
400 | invalid_request_error | unknown model: <id> | model no és un id publicat. |
400 | invalid_request_error | No user message provided | Nivells Shannon: la sol·licitud no té text d'usuari ni tools. |
400 | invalid_request_error | <id> does not accept image input | S'ha enviat una part d'imatge a un model open-weight hostejat sense entrada d'imatge. |
400 | invalid_request_error | <id> does not accept response_format | S'ha enviat response_format a un model open-weight hostejat sense sortida estructurada. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort conté un valor fora de la llista. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Falta messages, o un camp té un tipus JSON incorrecte. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens és més gran que el que queda del teu saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protecció contra inundació: més de 120 sol·licituds en un minut al teu compte. |
500 | server_error | The model backend failed to answer. Please retry. | El model no ha produït cap resposta. Torna a enviar la sol·licitud. |
502 | api_error | The model backend failed to answer. Please retry. | El mateix, a la família Shannon 3 i als models open-weight hostejats. |