Chat Completions
POST /v1/chat/completions recebe uma conversa e retorna a próxima mensagem do modelo no formato OpenAI Chat Completions. Use-o a partir de qualquer SDK da OpenAI ou por HTTP puro; esta página é a referência campo a campo.
POST https://api.shannon-ai.com/v1/chat/completions
A menor requisição é um id de modelo e uma mensagem de usuário.
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 é um 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 da requisição
| Header | Valor | Descrição |
|---|---|---|
Authorization | Bearer YOUR_API_KEY | Sua chave de API. x-api-key: YOUR_API_KEY é aceito no lugar dela em todos os endpoints. |
Content-Type | application/json | Obrigatório. Qualquer outro valor retorna 415. |
x-request-id | Opcional. Seu próprio id para a requisição. Ele volta inalterado na resposta. |
Headers da resposta
| Header | Descrição |
|---|---|
x-request-id | Em toda resposta, inclusive erros e streams: o valor que você enviou, ou 12 caracteres hexadecimais quando você não enviou nenhum. Cite-o ao relatar um problema. |
content-type | application/json, ou text/event-stream quando stream é true. |
Campos da requisição
Apenas messages é obrigatório. A coluna Aplicado por indica os modelos nos quais um campo muda a resposta. Os modelos open-weight hospedados são os doze ids da lista de modelos; a família Shannon 3 é shannon-3, shannon-3-pro, shannon-3.1 e shannon-3.1-pro. Modelos e preços
| Campo | Tipo | Padrão | Descrição | Aplicado por |
|---|---|---|---|---|
model | string | shannon-1.6-lite | O modelo que responde: um id da lista de modelos. Envie-o em toda requisição. A correspondência não diferencia maiúsculas de minúsculas. Um id que não está publicado retorna 400 unknown model. | Todos os modelos |
messages | array | Obrigatório. A conversa, da mensagem mais antiga para a mais recente. Veja Mensagens abaixo. | Todos os modelos | |
stream | boolean | false | true envia a resposta como server-sent events enquanto ela é escrita. | Todos os modelos |
max_tokens | integer | 4096 | Limite máximo da resposta, em tokens. Um valor fora do intervalo de 1 a 65,536 é ajustado para dentro dele. Também é a quantia reservada do seu saldo enquanto a requisição é executada. Veja Tamanho da saída abaixo. | Modelos open-weight hospedados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 |
max_completion_tokens | integer | Igual a max_tokens. Quando os dois são enviados, max_tokens é usado. | Modelos open-weight hospedados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
temperature | number | Temperatura de amostragem. Nos modelos open-weight hospedados, o padrão é 1 e os valores são mantidos entre 0 e 2. | Modelos open-weight hospedados, shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | |
top_p | number | 0.95 | Amostragem nucleus. Os valores são mantidos entre 0 e 1. | Modelos open-weight hospedados |
seed | integer | Seed do amostrador, qualquer inteiro. Sem ele, a seed é derivada do modelo e da conversa, então a mesma requisição enviada duas vezes usa a mesma seed. | Modelos open-weight hospedados | |
stop | string | array | Uma string ou um array de strings. Até 4 são usadas. A resposta termina antes da primeira que aparecer; o próprio texto de parada não é retornado. | Modelos open-weight hospedados | |
reasoning_effort | string | high | Quanto o modelo raciocina antes de responder: off, low, medium ou high. none e minimal significam off, default significa medium, max significa high. Qualquer outro valor retorna 400. | Modelos open-weight hospedados |
reasoning | object | A mesma configuração em forma de objeto: {"effort": "low"}. Quando os dois são enviados, reasoning_effort é usado. | Modelos open-weight hospedados | |
tools | array | As funções que o modelo pode chamar, cada uma como {"type": "function", "function": {"name", "description", "parameters"}}. As chamadas do modelo voltam em tool_calls; o seu código as executa. | Todos os modelos | |
tool_choice | string | object | auto | "auto" deixa o modelo decidir. "required" o obriga a chamar uma ferramenta. {"type": "function", "function": {"name": "…"}} o obriga a chamar essa ferramenta. | Modelos open-weight hospedados |
response_format | object | {"type": "json_object"} para uma resposta JSON, ou {"type": "json_schema", "json_schema": {…}} para uma resposta que segue o seu schema. | Todos os níveis Shannon; modelos open-weight hospedados conforme listado por id | |
web_search | boolean | false | true permite que o modelo pesquise na web antes de responder. | shannon-1.6-*, shannon-2-*, família Shannon 3 |
Outros campos da OpenAI, como n, user, stream_options, parallel_tool_calls, presence_penalty, frequency_penalty, logit_bias, logprobs, metadata, store e prompt_cache_key, são aceitos para que o código de cliente existente rode sem alterações. Eles não mudam a resposta: há sempre uma única choice, e um stream sempre termina com o uso.
Um campo com o tipo JSON errado, por exemplo "max_tokens": "100", retorna 422. Uma requisição sem messages também.
Ferramentas, saída estruturada, raciocínio e busca na web têm, cada um, uma página própria: Chamada de funções, Saídas estruturadas, Esforço de raciocínio, Busca web integrada.
Uma requisição com opções
Esta requisição define uma mensagem de sistema, os campos de amostragem e o esforço de raciocínio. Ela usa um modelo open-weight hospedado, 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 tem o mesmo formato de cima. Seu usage acrescenta dois detalhes nos modelos open-weight hospedados: os tokens de prompt lidos do cache e os tokens gastos com raciocínio.
{
"usage": {
"prompt_tokens": 31,
"completion_tokens": 62,
"total_tokens": 93,
"prompt_tokens_details": {
"cached_tokens": 0
},
"completion_tokens_details": {
"reasoning_tokens": 21
}
}
} Tamanho da saída
max_tokens faz duas coisas. Primeiro, é o número de tokens reservados do seu saldo quando a requisição começa. Quando a resposta termina, essa quantia é substituída pelos tokens que a requisição usou. Se max_tokens for maior do que o que resta do seu saldo, a requisição retorna 429 Quota exceeded mesmo que a própria resposta coubesse. Envie um max_tokens menor para reservar menos.
shannon-coder-1 é contado de outra forma neste endpoint: cada requisição é uma das chamadas do Shannon Coder do seu plano, e nenhum token é reservado para ela. Limites e saldo
Segundo, ele limita o tamanho da resposta nestes modelos:
| Modelos | O que max_tokens faz |
|---|---|
shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 | A resposta para quando atinge o limite. Um stream então termina com finish_reason length. |
| Modelos open-weight hospedados | O texto da resposta para em max_tokens. O raciocínio não conta para ele. Valores abaixo de 256 valem como 256. |
Sem max_tokens nem max_completion_tokens, o valor é 4,096. Em shannon-coder-1, é 65,536.
Mensagens
Cada mensagem é um objeto com um role e um content. content é uma string ou um array de partes quando a mensagem traz mais do que texto.
| Papel | Descrição | Aplicado por |
|---|---|---|
system | Instruções para o modelo. Coloque-a primeiro. Nos níveis Shannon, a primeira mensagem system é a que é usada. | Modelos open-weight hospedados, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
developer | Lido como system. | Modelos open-weight hospedados |
user | O que você pergunta. Nos níveis Shannon, a última mensagem user é o prompt e as mensagens anteriores são o histórico. | Todos os modelos |
assistant | Respostas anteriores do modelo. Mantenha os tool_calls dele quando você enviar um resultado de ferramenta depois. | Todos os modelos |
tool | O resultado de uma chamada de ferramenta: tool_call_id contém o id da chamada e content o resultado como string. | Todos os modelos |
Com um id da família Shannon 3, coloque as instruções que precisam valer na mensagem user.
Nos níveis Shannon, uma requisição sem texto de usuário e sem tools retorna 400 No user message provided.
Partes de conteúdo
| Parte | Descrição | Disponível em |
|---|---|---|
{"type": "text", "text": "…"} | Texto simples. | Todos os modelos |
{"type": "image_url", "image_url": {"url": "…"}} | Uma imagem, como uma URL data: com conteúdo base64 ou como uma URL http(s). | Família Shannon 3, shannon-1.6-lite, shannon-1.6-pro e os modelos open-weight hospedados que listam entrada de imagem |
{"type": "file", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | Um documento (PDF, Word, PowerPoint ou Excel), em base64 ou por URL. | Família Shannon 3 |
Tamanhos, limites e a lista completa de formas têm página própria. Imagens e arquivos
O objeto de resposta
| Campo | Tipo | Descrição |
|---|---|---|
id | string | chatcmpl- seguido de 32 caracteres hexadecimais. |
object | string | Sempre chat.completion. |
created | integer | Hora da resposta, em segundos Unix. |
model | string | O id canônico do modelo que respondeu. Pode diferir na grafia do id que você enviou. |
choices | array | Sempre exatamente uma choice, com index 0. |
choices[0].message.role | string | Sempre assistant. |
choices[0].message.content | string | null | O texto da resposta. Com tool_calls, é null nos níveis Shannon; os modelos open-weight hospedados podem enviar texto junto das chamadas. |
choices[0].message.reasoning_content | string | null | O raciocínio que o modelo escreveu antes da resposta, ou null quando não há nenhum. |
choices[0].message.tool_calls | array | Presente apenas quando o modelo chama ferramentas. Cada entrada tem um id, type function e function com o name e os arguments como uma string JSON. |
choices[0].message.annotations | array | Somente em uma requisição com web_search: true cuja busca encontrou algo. Um url_citation para cada fonte que um marcador em content nomeia, com url, title, start_index e end_index (a posição do marcador, contada em caracteres, o fim não é incluído). |
choices[0].finish_reason | string | Por que a resposta terminou. Veja Motivos de término. |
usage | object | Os tokens da requisição. Veja Uso. |
sources | array | Somente em uma requisição com web_search: true cuja busca encontrou algo: os resultados entregues ao modelo, cada um com index, title e url. [1] na resposta é a entrada com index 1. |
Motivos de término
| finish_reason | Descrição |
|---|---|
stop | O modelo terminou sua resposta, ou uma string stop apareceu. |
tool_calls | O modelo chama uma ou mais ferramentas. Execute-as e envie os resultados em mensagens tool. |
length | A resposta foi cortada no limite de saída. Informado em streams de shannon-1.6-lite, shannon-1.6-pro, shannon-coder-1 e da família Shannon 3. |
Uma resposta sem streaming informa stop ou tool_calls.
Uso
| Campo | Tipo | Descrição | Disponível em |
|---|---|---|---|
usage.prompt_tokens | integer | Tokens de entrada. | Todos os modelos |
usage.completion_tokens | integer | Tokens de saída: raciocínio, resposta e chamadas de ferramenta juntos. | Todos os modelos |
usage.total_tokens | integer | prompt_tokens mais completion_tokens. | Todos os modelos |
usage.prompt_tokens_details.cached_tokens | integer | A parte de prompt_tokens que foi lida do cache de prompt. | Modelos open-weight hospedados |
usage.completion_tokens_details.reasoning_tokens | integer | A parte de completion_tokens que foi gasta com raciocínio. | Modelos open-weight hospedados |
Nos modelos open-weight hospedados, prompt_tokens são suas mensagens e definições de ferramenta contadas com o tokenizador do próprio modelo, mais os tokens de eventuais imagens. Os endpoints de contagem de tokens retornam o mesmo número antes de você enviar. Contagem de tokens
Nos níveis Shannon, prompt_tokens conta tudo o que o modelo leu para escrever a resposta, então é maior do que apenas o texto das suas mensagens.
Streaming
Com stream definido como true, a resposta chega como eventos chat.completion.chunk e termina com data: [DONE]. O último chunk antes dele traz finish_reason e usage; não é preciso stream_options. Os formatos dos chunks, as linhas de keep-alive e os erros dentro de um stream têm página própria. Streaming
Erros
Um erro é um objeto JSON com um membro error. As verificações são feitas nesta ordem: chave de API, corpo da requisição, id do modelo e, por fim, saldo. A tabela lista o que este endpoint retorna com mais frequência. A lista completa, com o que tentar de novo, tem página própria. Tratamento de erros
{
"error": {
"type": "invalid_request_error",
"message": "unknown model: no-such-model"
}
} | Status | Tipo | Mensagem | Quando |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Nenhuma chave de API foi enviada, ou a chave é desconhecida ou foi revogada. |
400 | invalid_request_error | unknown model: <id> | model não é um id publicado. |
400 | invalid_request_error | No user message provided | Níveis Shannon: a requisição não tem texto de usuário nem tools. |
400 | invalid_request_error | <id> does not accept image input | Uma parte de imagem foi enviada a um modelo open-weight hospedado sem entrada de imagem. |
400 | invalid_request_error | <id> does not accept response_format | response_format foi enviado a um modelo open-weight hospedado sem saída estruturada. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning_effort contém um valor fora da lista. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | messages está ausente, ou um campo tem o tipo JSON errado. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_tokens é maior do que o que resta do seu saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Proteção contra flood: mais de 120 requisições em um minuto na sua conta. |
500 | server_error | The model backend failed to answer. Please retry. | O modelo não produziu uma resposta. Envie a requisição novamente. |
502 | api_error | The model backend failed to answer. Please retry. | O mesmo, na família Shannon 3 e nos modelos open-weight hospedados. |