Chat Completions
POST /v1/chat/completions recibe una conversación y devuelve el siguiente mensaje del modelo en el formato OpenAI Chat Completions. Úsalo desde cualquier SDK de OpenAI o por HTTP simple; esta página es la referencia campo por campo.
POST https://api.shannon-ai.com/v1/chat/completions
La solicitud más pequeña es un id de modelo y un mensaje 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."}]
}' La respuesta es un único objeto 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
}
} Headers
Headers de la solicitud
| Header | Valor | Descripción |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Tu clave API. En su lugar se acepta x-api-key: YOUR_API_KEY en todos los endpoints. |
Content-Type | application/json | Obligatorio. Cualquier otro valor devuelve 415. |
x-request-id | Opcional. Tu propio id para la solicitud. Vuelve sin cambios en la respuesta. |
Headers de la respuesta
| Header | Descripción |
|---|---|
x-request-id | En todas las respuestas, incluidos errores y streams: el valor que enviaste, o 12 caracteres hexadecimales si no enviaste ninguno. Cítalo cuando informes de un problema. |
content-type | application/json, o text/event-stream cuando stream es true. |
Campos de solicitud
Solo messages es obligatorio. La columna Aplicado por indica los modelos en los que un campo cambia la respuesta. Los modelos de pesos abiertos alojados son los doce ids de la lista de modelos; la familia Shannon 3 es shannon-3, shannon-3-pro, shannon-3.1 y shannon-3.1-pro. Modelos y precios
| Campo | Tipo | Predeterminado | Descripción | Aplicado por |
|---|---|---|---|---|
model | string | shannon-1.6-lite | El modelo que responde: un id de la lista de modelos. Envíalo en cada solicitud. La comparación no distingue mayúsculas de minúsculas. Un id que no está publicado devuelve 400 unknown model. | Todos los modelos |
messages | array | Obligatorio. La conversación, del mensaje más antiguo al más reciente. Consulta Mensajes más abajo. | Todos los modelos | |
stream | boolean | false | true envía la respuesta como server-sent events mientras se escribe. | Todos los modelos |
max_tokens | integer | 4096 | Límite superior de la respuesta, en tokens. Un valor fuera del rango de 1 a 65,536 se ajusta a ese rango. Es también la cantidad que se reserva de tu saldo mientras se ejecuta la solicitud. Consulta Longitud de salida más abajo. | Modelos de pesos abiertos alojados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Igual que max_tokens. Si se envían ambos, se usa max_tokens. | Modelos de pesos abiertos alojados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura de muestreo. En los modelos de pesos abiertos alojados el valor predeterminado es 1 y los valores se mantienen entre 0 y 2. | Modelos de pesos abiertos alojados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Muestreo por núcleo (nucleus sampling). Los valores se mantienen entre 0 y 1. | Modelos de pesos abiertos alojados |
seed | integer | Semilla del muestreador, cualquier entero. Sin ella, la semilla se deriva del modelo y de la conversación, de modo que la misma solicitud enviada dos veces usa la misma semilla. | Modelos de pesos abiertos alojados | |
stop | string | array | Una cadena o un array de cadenas. Se usan hasta 4. La respuesta termina antes de la primera que aparezca; el propio texto de parada no se devuelve. | Modelos de pesos abiertos alojados | |
reasoning_effort | string | high | Cuánto razona el modelo antes de responder: off, low, medium o high. none y minimal equivalen a off, default equivale a medium, max equivale a high. Cualquier otro valor devuelve 400. | Modelos de pesos abiertos alojados |
reasoning | object | El mismo ajuste en forma de objeto: {"effort": "low"}. Si se envían ambos, se usa reasoning_effort. | Modelos de pesos abiertos alojados | |
tools | array | Las funciones que el modelo puede llamar, cada una como {"type": "function", "function": {"name", "description", "parameters"}}. Las llamadas del modelo vuelven en tool_calls; tu código las ejecuta. | Todos los modelos | |
tool_choice | string | object | auto | "auto" deja que el modelo decida. "required" lo obliga a llamar a una herramienta. {"type": "function", "function": {"name": "…"}} lo obliga a llamar a esa herramienta. | Modelos de pesos abiertos alojados |
response_format | object | {"type": "json_object"} para una respuesta JSON, o {"type": "json_schema", "json_schema": {…}} para una respuesta que sigue tu esquema. | Todos los niveles de Shannon; modelos de pesos abiertos alojados según se indica por id | |
web_search | boolean | false | true permite que el modelo busque en la web antes de responder. | shannon-1.6-*, shannon-2-*, familia Shannon 3 |
Se aceptan otros campos de OpenAI, como n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store y prompt_cache_key, para que el código de cliente existente funcione sin cambios. No modifican la respuesta: siempre hay una sola choice, y un stream siempre termina con el uso.
Un campo con un tipo JSON incorrecto, por ejemplo "max_tokens": "100", devuelve 422. Una solicitud sin messages también.
Las herramientas, la salida estructurada, el razonamiento y la búsqueda web tienen cada uno su propia página: Llamadas a funciones, Salidas estructuradas, Esfuerzo de razonamiento, Búsqueda web integrada.
Una solicitud con opciones
Esta solicitud establece un mensaje de sistema, los campos de muestreo y el esfuerzo de razonamiento. Usa un modelo de pesos abiertos alojado, que aplica todos ellos.
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 respuesta tiene la misma forma que la anterior. Su usage añade dos detalles en los modelos de pesos abiertos alojados: los tokens del prompt leídos de la caché y los tokens gastados en razonamiento.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Longitud de salida
max_tokens hace dos cosas. Primero, es el número de tokens que se reservan de tu saldo cuando empieza la solicitud. Cuando la respuesta está completa, esa cantidad se sustituye por los tokens que usó la solicitud. Si max_tokens es mayor que lo que queda de tu saldo, la solicitud devuelve 429 Quota exceeded aunque la respuesta en sí hubiera cabido. Envía un max_tokens menor para reservar menos.
shannon-coder-1 se cuenta de forma distinta en este endpoint: cada solicitud es una de las llamadas de Shannon Coder de tu plan, y no se reservan tokens para ella. Límites y saldo
Segundo, limita la longitud de la respuesta en estos modelos:
| Modelos | Qué hace max_tokens |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | La respuesta se detiene al llegar al límite. Entonces un stream termina con finish_reason length. |
| Modelos de pesos abiertos alojados | El texto de la respuesta se detiene en max_tokens. El razonamiento no cuenta para él. Los valores inferiores a 256 se tratan como 256. |
Sin max_tokens ni max_completion_tokens, el valor es 4,096. En shannon-coder-1 es 65,536.
Mensajes
Cada mensaje es un objeto con un role y un content. content es una cadena o un array de partes cuando el mensaje lleva algo más que texto.
| Rol | Descripción | Aplicado por |
|---|---|---|
system | Instrucciones para el modelo. Ponlo primero. En los niveles de Shannon se usa el primer mensaje system. | Modelos de pesos abiertos alojados, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Se lee como system. | Modelos de pesos abiertos alojados |
user | Lo que preguntas. En los niveles de Shannon, el último mensaje user es el prompt y los mensajes anteriores son el historial. | Todos los modelos |
assistant | Respuestas anteriores del modelo. Conserva sus tool_calls cuando envíes después un resultado de herramienta. | Todos los modelos |
tool | El resultado de una llamada a herramienta: tool_call_id contiene el id de la llamada y content el resultado como cadena. | Todos los modelos |
Con un id de la familia Shannon 3, pon las instrucciones que deben cumplirse en el mensaje user.
En los niveles de Shannon, una solicitud sin texto de usuario ni tools devuelve 400 No user message provided.
Partes de contenido
| Parte | Descripción | Disponible en |
|---|---|---|
{"type": "text", "text": "…"} | Texto simple. | Todos los modelos |
{"type": "image_url", "image_url": {"url": "…"}} | Una imagen, como URL data: con contenido en base64 o como URL http(s). | Familia Shannon 3, shannon-1.6-lite, shannon-1.6-pro y los modelos de pesos abiertos alojados que indican entrada de imágenes |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Un documento (PDF, Word, PowerPoint o Excel), en base64 o por URL. | Familia Shannon 3 |
Los tamaños, los límites y la lista completa de formas tienen su propia página. Imágenes y archivos
El objeto de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
id | string | chatcmpl- seguido de 32 caracteres hexadecimales. |
object | string | Siempre chat.completion. |
created | integer | Hora de la respuesta, en segundos Unix. |
model | string | El id canónico del modelo que respondió. Puede diferir en la ortografía del id que enviaste. |
choices | array | Siempre exactamente una choice, con index 0. |
choices[0].message.role | string | Siempre assistant. |
choices[0].message.content | string | null | El texto de la respuesta. Con tool_calls es null en los niveles de Shannon; los modelos de pesos abiertos alojados pueden enviar texto junto a las llamadas. |
choices[0].message.reasoning_content | string | null | El razonamiento que el modelo escribió antes de la respuesta, o null cuando no hay ninguno. |
choices[0].message.tool_calls | array | Presente solo cuando el modelo llama a herramientas. Cada entrada tiene un id, type function y function con el name y los arguments como cadena JSON. |
choices[0].message.annotations | array | Solo en una solicitud con web_search: true cuya búsqueda encontró algo. Un url_citation por cada fuente que nombra un marcador en content, con url, title, start_index y end_index (la posición del marcador, contada en caracteres, sin incluir el final). |
choices[0].finish_reason | string | Por qué terminó la respuesta. Consulta Motivos de finalización. |
usage | object | Los tokens de la solicitud. Consulta Uso. |
sources | array | Solo en una solicitud con web_search: true cuya búsqueda encontró algo: los resultados que recibió el modelo, cada uno con index, title y url. [1] en la respuesta es la entrada con index 1. |
Motivos de finalización
| finish_reason | Descripción |
|---|---|
stop | El modelo terminó su respuesta, o apareció una cadena de stop. |
tool_calls | El modelo llama a una o más herramientas. Ejecútalas y envía los resultados en mensajes tool. |
length | La respuesta se cortó en el límite de salida. Se informa en los streams de shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 y la familia Shannon 3. |
Una respuesta sin streaming informa stop o tool_calls.
Uso
| Campo | Tipo | Descripción | Disponible en |
|---|---|---|---|
usage.prompt_tokens | integer | Tokens de entrada. | Todos los modelos |
usage.completion_tokens | integer | Tokens de salida: razonamiento, respuesta y llamadas a herramientas en conjunto. | Todos los modelos |
usage.total_tokens | integer | prompt_tokens más completion_tokens. | Todos los modelos |
usage.prompt_tokens_details.cached_tokens | integer | La parte de prompt_tokens que se leyó de la caché de prompts. | Modelos de pesos abiertos alojados |
usage.completion_tokens_details.reasoning_tokens | integer | La parte de completion_tokens que se gastó en razonamiento. | Modelos de pesos abiertos alojados |
En los modelos de pesos abiertos alojados, prompt_tokens son tus mensajes y definiciones de herramientas contados con el tokenizador propio del modelo, más los tokens de las imágenes. Los endpoints de conteo de tokens devuelven el mismo número antes de que envíes. Conteo de tokens
En los niveles de Shannon, prompt_tokens cuenta todo lo que el modelo leyó para escribir la respuesta, por lo que es mayor que el texto de tus mensajes por sí solo.
Streaming
Con stream en true, la respuesta llega como eventos chat.completion.chunk y termina con data: [DONE]. El último fragmento antes de este lleva finish_reason y usage; no hacen falta stream_options. Las formas de los fragmentos, las líneas de keep-alive y los errores dentro de un stream tienen su propia página. Streaming
Errores
Un error es un objeto JSON con un miembro error. Las comprobaciones se ejecutan en este orden: clave API, cuerpo de la solicitud, id del modelo y después saldo. La tabla muestra lo que este endpoint devuelve con más frecuencia. La lista completa, con qué reintentar, tiene su propia página. Manejo de errores
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Estado | Tipo | Mensaje | Cuándo |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | No se envió ninguna clave API, o la clave es desconocida o está revocada. |
400 | invalid_request_error | unknown model: <id> | model no es un id publicado. |
400 | invalid_request_error | No user message provided | Niveles de Shannon: la solicitud no tiene texto de usuario ni tools. |
400 | invalid_request_error | <id> does not accept image input | Se envió una parte de imagen a un modelo de pesos abiertos alojado sin entrada de imágenes. |
400 | invalid_request_error | <id> does not accept response_format | Se envió response_format a un modelo de pesos abiertos alojado sin salida estructurada. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort contiene un valor fuera de la lista. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | Falta messages, o un campo tiene un tipo JSON incorrecto. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens es mayor que lo que queda de tu saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protección contra flood: más de 120 solicitudes en un minuto en tu cuenta. |
500 | server_error | The model backend failed to answer. Please retry. | El modelo no produjo una respuesta. Envía la solicitud de nuevo. |
502 | api_error | The model backend failed to answer. Please retry. | Lo mismo, en la familia Shannon 3 y en los modelos de pesos abiertos alojados. |