Ir para o conteúdo
Chat Completions

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)

A resposta é um objeto JSON:

200 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)

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.

200 JSON
{
  "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

400 JSON
{
  "error": {
    "type": "invalid_request_error",
    "message": "unknown model: no-such-model"
  }
}
Status Tipo Mensagem Quando
401 authentication_error Missing authentication
Invalid 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.