Chat Completions
POST /v1/chat/completions recibe unha conversa e devolve a seguinte mensaxe do modelo no formato OpenAI Chat Completions. Úsao desde calquera SDK de OpenAI ou por HTTP simple; esta páxina é a referencia campo por campo.
POST https://api.shannon-ai.com/v1/chat/completions
A solicitude máis pequena é un id de modelo e unha mensaxe de usuario.
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."}]
}' A resposta é un obxecto 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
}
} Cabeceiras
Cabeceiras da solicitude
| Cabeceira | Valor | Descrición |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | A túa clave API. En todos os endpoints acéptase x-api-key: YOUR_API_KEY no seu lugar. |
Content-Type | application/json | Obrigatoria. Calquera outro valor devolve 415. |
x-request-id | Opcional. O teu propio id para a solicitude. Volve sen cambios na resposta. |
Cabeceiras da resposta
| Cabeceira | Descrición |
|---|---|
x-request-id | En todas as respostas, incluídos erros e streams: o valor que enviaches, ou 12 caracteres hexadecimais se non enviaches ningún. Cítao cando informes dun problema. |
content-type | application/json, ou text/event-stream cando stream é true. |
Campos da solicitude
Só messages é obrigatorio. A columna Aplicado por indica os modelos nos que un campo cambia a resposta. Os modelos open-weight alojados son os doce ids da lista de modelos; a familia Shannon 3 é shannon-3, shannon-3-pro, shannon-3.1 e shannon-3.1-pro. Modelos e prezos
| Campo | Tipo | Valor predeterminado | Descrición | Aplicado por |
|---|---|---|---|---|
model | string | shannon-1.6-lite | O modelo que responde: un id da lista de modelos. Envíao en cada solicitude. A coincidencia non distingue maiúsculas de minúsculas. Un id que non está publicado devolve 400 unknown model. | Todos os modelos |
messages | array | Obrigatorio. A conversa, coa mensaxe máis antiga primeiro. Consulta Mensaxes máis abaixo. | Todos os modelos | |
stream | boolean | false | true envía a resposta como server-sent events a medida que se escribe. | Todos os modelos |
max_tokens | integer | 4096 | Límite superior da resposta, en tokens. Un valor fóra do intervalo de 1 a 65,536 axústase a ese intervalo. É tamén a cantidade que se reserva do teu saldo mentres a solicitude está en curso. Consulta Lonxitude da saída máis abaixo. | Modelos open-weight alojados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | O mesmo que max_tokens. Se se envían os dous, úsase max_tokens. | Modelos open-weight alojados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura de mostraxe. Nos modelos open-weight alojados o valor predeterminado é 1 e os valores mantéñense entre 0 e 2. | Modelos open-weight alojados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Mostraxe por núcleo (nucleus sampling). Os valores mantéñense entre 0 e 1. | Modelos open-weight alojados |
seed | integer | Semente do mostreador, calquera enteiro. Sen ela, a semente derívase do modelo e da conversa, así que a mesma solicitude enviada dúas veces usa a mesma semente. | Modelos open-weight alojados | |
stop | string | array | Unha cadea ou unha matriz de cadeas. Úsanse ata 4. A resposta remata antes da primeira que apareza; o texto de parada en si non se devolve. | Modelos open-weight alojados | |
reasoning_effort | string | high | Canto razoa o modelo antes de responder: off, low, medium ou high. none e minimal significan off, default significa medium e max significa high. Calquera outro valor devolve 400. | Modelos open-weight alojados |
reasoning | object | O mesmo axuste en forma de obxecto: {"effort": "low"}. Se se envían os dous, úsase reasoning_effort. | Modelos open-weight alojados | |
tools | array | As funcións ás que pode chamar o modelo, cada unha como {"type": "function", "function": {"name", "description", "parameters"}}. As chamadas do modelo volven en tool_calls; o teu código execútaas. | Todos os modelos | |
tool_choice | string | object | auto | "auto" deixa que decida o modelo. "required" obrígao a chamar a unha ferramenta. {"type": "function", "function": {"name": "…"}} obrígao a chamar a esa ferramenta. | Modelos open-weight alojados |
response_format | object | {"type": "json_object"} para unha resposta JSON, ou {"type": "json_schema", "json_schema": {…}} para unha resposta que siga o teu esquema. | Todos os niveis Shannon; modelos open-weight alojados segundo se indica por id | |
web_search | boolean | false | true permite que o modelo busque na web antes de responder. | shannon-1.6-*, shannon-2-*, familia Shannon 3 |
Acéptanse outros campos de OpenAI, como n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store e prompt_cache_key, para que o código de cliente existente funcione sen cambios. Non alteran a resposta: sempre hai unha soa opción (choice) e un stream remata sempre co uso.
Un campo co tipo JSON incorrecto, por exemplo "max_tokens": "100", devolve 422. Unha solicitude sen messages tamén.
As ferramentas, a saída estruturada, o razoamento e a busca web teñen cada un a súa propia páxina: Chamadas a funcións, Saídas estruturadas, Esforzo de razoamento, Busca web.
Unha solicitude con opcións
Esta solicitude define unha mensaxe de sistema, os campos de mostraxe e o esforzo de razoamento. Usa un modelo open-weight alojado, que aplica todos eles.
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"
}' A resposta ten a mesma forma que a anterior. O seu usage engade dous detalles nos modelos open-weight alojados: os tokens de prompt lidos da caché e os tokens gastados en razoamento.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Lonxitude da saída
max_tokens fai dúas cousas. Primeiro, é o número de tokens que se reservan do teu saldo cando comeza a solicitude. Cando a resposta está completa, esa cantidade substitúese polos tokens que usou a solicitude. Se max_tokens é maior que o que queda do teu saldo, a solicitude devolve 429 Quota exceeded aínda que a resposta en si tería cabido. Envía un max_tokens menor para reservar menos.
shannon-coder-1 cóntase de forma diferente neste endpoint: cada solicitude é unha das chamadas de Shannon Coder do teu plan, e non se reserva ningún token para ela. Límites e saldo
Segundo, limita a lonxitude da resposta nestes modelos:
| Modelos | O que fai max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | A resposta detense cando alcanza o límite. Un stream remata entón con finish_reason length. |
| Modelos open-weight alojados | O texto da resposta detense en max_tokens. O razoamento non conta para ese límite. Os valores inferiores a 256 actúan como 256. |
Sen max_tokens nin max_completion_tokens, o valor é 4,096. En shannon-coder-1 é 65,536.
Mensaxes
Cada mensaxe é un obxecto cun role e un content. content é unha cadea ou unha matriz de partes cando a mensaxe leva algo máis que texto.
| Rol | Descrición | Aplicado por |
|---|---|---|
system | Instrucións para o modelo. Ponas primeiro. Nos niveis Shannon, a que se usa é a primeira mensaxe system. | Modelos open-weight alojados, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Lese como system. | Modelos open-weight alojados |
user | O que preguntas. Nos niveis Shannon, a última mensaxe user é o prompt e as mensaxes anteriores son o historial. | Todos os modelos |
assistant | Respostas anteriores do modelo. Conserva os seus tool_calls cando envíes despois un resultado de ferramenta. | Todos os modelos |
tool | O resultado dunha chamada a unha ferramenta: tool_call_id contén o id da chamada e content o resultado como cadea. | Todos os modelos |
Cun id da familia Shannon 3, pon na mensaxe user as instrucións que deban cumprirse.
Nos niveis Shannon, unha solicitude sen texto de usuario nin tools devolve 400 No user message provided.
Partes de contido
| Parte | Descrición | Dispoñible en |
|---|---|---|
{"type": "text", "text": "…"} | Texto simple. | Todos os modelos |
{"type": "image_url", "image_url": {"url": "…"}} | Unha imaxe, como URL data: con contido en base64 ou como URL http(s). | Familia Shannon 3, shannon-1.6-lite, shannon-1.6-pro e os modelos open-weight alojados que admiten imaxes como entrada |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Un documento (PDF, Word, PowerPoint ou Excel), en base64 ou por URL. | Familia Shannon 3 |
Os tamaños, os límites e a lista completa de formas teñen a súa propia páxina. Imaxes e ficheiros
O obxecto de resposta
| Campo | Tipo | Descrición |
|---|---|---|
id | string | chatcmpl- seguido de 32 caracteres hexadecimais. |
object | string | Sempre chat.completion. |
created | integer | Hora da resposta, en segundos Unix. |
model | string | O id canónico do modelo que respondeu. Pode diferir na grafía do id que enviaches. |
choices | array | Sempre exactamente unha opción (choice), con index 0. |
choices[0].message.role | string | Sempre assistant. |
choices[0].message.content | string | null | O texto da resposta. Con tool_calls é null nos niveis Shannon; os modelos open-weight alojados poden enviar texto xunto coas chamadas. |
choices[0].message.reasoning_content | string | null | O razoamento que o modelo escribiu antes da resposta, ou null cando non hai ningún. |
choices[0].message.tool_calls | array | Só está presente cando o modelo chama a ferramentas. Cada entrada ten un id, type function e function co name e os arguments como cadea JSON. |
choices[0].message.annotations | array | Só nunha solicitude con web_search: true cuxa busca atopou algo. Un url_citation por cada fonte que nomea un marcador en content, con url, title, start_index e end_index (a posición do marcador, contada en caracteres, sen incluír o final). |
choices[0].finish_reason | string | Por que rematou a resposta. Consulta Motivos de finalización. |
usage | object | Os tokens da solicitude. Consulta Uso. |
sources | array | Só nunha solicitude con web_search: true cuxa busca atopou algo: os resultados que recibiu o modelo, cada un con index, title e url. [1] na resposta é a entrada con index 1. |
Motivos de finalización
| finish_reason | Descrición |
|---|---|
stop | O modelo rematou a súa resposta, ou apareceu unha cadea de stop. |
tool_calls | O modelo chama a unha ou varias ferramentas. Execútaas e envía os resultados en mensaxes tool. |
length | A resposta cortouse no límite de saída. Infórmase nos streams de shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 e a familia Shannon 3. |
Unha resposta sen stream informa stop ou tool_calls.
Uso
| Campo | Tipo | Descrición | Dispoñible en |
|---|---|---|---|
usage.prompt_tokens | integer | Tokens de entrada. | Todos os modelos |
usage.completion_tokens | integer | Tokens de saída: razoamento, resposta e chamadas a ferramentas xuntos. | Todos os modelos |
usage.total_tokens | integer | prompt_tokens máis completion_tokens. | Todos os modelos |
usage.prompt_tokens_details.cached_tokens | integer | A parte de prompt_tokens que se leu da caché de prompts. | Modelos open-weight alojados |
usage.completion_tokens_details.reasoning_tokens | integer | A parte de completion_tokens que se gastou en razoamento. | Modelos open-weight alojados |
Nos modelos open-weight alojados, prompt_tokens son as túas mensaxes e definicións de ferramentas contadas co tokenizador propio do modelo, máis os tokens das imaxes. Os endpoints de reconto de tokens devolven o mesmo número antes de que envíes. Reconto de tokens
Nos niveis Shannon, prompt_tokens conta todo o que leu o modelo para escribir a resposta, así que é maior que o texto das túas mensaxes só.
Streaming
Con stream definido como true, a resposta chega como eventos chat.completion.chunk e remata con data: [DONE]. O último chunk antes del leva finish_reason e usage; non fan falta stream_options. As formas dos chunks, as liñas keep-alive e os erros dentro dun stream teñen a súa propia páxina. Streaming
Erros
Un erro é un obxecto JSON cun membro error. As comprobacións execútanse nesta orde: clave API, corpo da solicitude, id do modelo e despois saldo. A táboa mostra o que este endpoint devolve con máis frecuencia. A lista completa, con indicacións sobre que reintentar, ten a súa propia páxina. Xestión de erros
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Estado | Tipo | Mensaxe | Cando |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Non se enviou ningunha clave API, ou a clave é descoñecida ou está revogada. |
400 | invalid_request_error | unknown model: <id> | model non é un id publicado. |
400 | invalid_request_error | No user message provided | Niveis Shannon: a solicitude non ten texto de usuario nin tools. |
400 | invalid_request_error | <id> does not accept image input | Enviouse unha parte de imaxe a un modelo open-weight alojado sen entrada de imaxe. |
400 | invalid_request_error | <id> does not accept response_format | Enviouse response_format a un modelo open-weight alojado sen saída estruturada. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort contén un valor que non está na lista. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Falta messages, ou un campo ten o tipo JSON incorrecto. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens é maior que o que queda do teu saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protección contra inundación: máis de 120 solicitudes nun minuto na túa conta. |
500 | server_error | The model backend failed to answer. Please retry. | O modelo non produciu unha resposta. Envía a solicitude de novo. |
502 | api_error | The model backend failed to answer. Please retry. | O mesmo, na familia Shannon 3 e nos modelos open-weight alojados. |