Ir para o conteúdo
API Responses

API Responses

Novo

POST /v1/responses recebe instruções e uma lista de itens de entrada e retorna um objeto de resposta composto por itens de saída, no formato OpenAI Responses. Use-o com a API responses do SDK da OpenAI e com ferramentas construídas sobre ela, como o Codex CLI. O endpoint não guarda estado: envie a conversa inteira a cada requisição.

POST https://api.shannon-ai.com/v1/responses

A menor requisição é um id de modelo e um texto. A resposta não vem em stream, a menos que você peça.

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com/v1",
)

response = client.responses.create(
    model="shannon-3",
    input="Say hello in one sentence.",
)

print(response.output_text)

A resposta é um objeto de resposta. O seu output contém o raciocínio, quando o modelo raciocinou, e a mensagem:

200 JSON
{
  "id": "resp_5f0c1e7a9b3d4c62a8e1f07d2b46c9a3",
  "object": "response",
  "created_at": 1791625200,
  "model": "shannon-3",
  "status": "completed",
  "error": null,
  "incomplete_details": null,
  "instructions": null,
  "metadata": {},
  "parallel_tool_calls": true,
  "temperature": null,
  "tool_choice": "auto",
  "tools": [],
  "top_p": null,
  "output": [
    {
      "id": "rs_8a2e6c1f4b7d4e03b9c5a1d70f3e2b64",
      "type": "reasoning",
      "summary": [
        {
          "type": "summary_text",
          "text": "The user wants a greeting in one sentence. Keep it short and friendly."
        }
      ]
    },
    {
      "id": "msg_1c7b9e3a5d2f4a86b0e4c8d19a6f7e25",
      "type": "message",
      "role": "assistant",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "text": "Hello, it is good to meet you.",
          "annotations": []
        }
      ]
    }
  ],
  "usage": {
    "input_tokens": 1184,
    "output_tokens": 46,
    "total_tokens": 1230
  }
}

Campos da requisição

model e input são o que uma requisição precisa. A coluna Aplicado por nomeia 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 Obrigatório. Um id da lista de modelos. A comparação não diferencia maiúsculas de minúsculas. Um id ausente ou não publicado retorna 400 unknown model. Todos os modelos
input string | array Uma string, lida como uma única mensagem de usuário, ou um array de itens de entrada. Veja Itens de entrada abaixo. Todos os modelos
instructions string Instruções para o modelo, o system prompt deste formato. Modelos open-weight hospedados, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true envia a resposta como server-sent events. Veja Streaming abaixo. Todos os modelos
max_output_tokens integer 4096 Limite superior da resposta, em tokens. Um valor fora de 1 a 65,536 é ajustado para dentro desse intervalo. É também a quantidade reservada do seu saldo enquanto a requisição é executada. Veja Limite de saída abaixo. Modelos open-weight hospedados, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Temperatura de amostragem. Nos modelos open-weight hospedados, os valores são mantidos entre 0 e 2. Modelos open-weight hospedados; shannon-1.6-*, shannon-2-* e shannon-coder-1 em respostas sem stream
top_p number Amostragem por núcleo (nucleus sampling). Os valores são mantidos entre 0 e 1. Modelos open-weight hospedados
tools array As funções que o modelo pode chamar, na forma plana deste formato: {"type": "function", "name", "description", "parameters"}. Veja Ferramentas abaixo. Todos os modelos
tool_choice string | object auto "auto" deixa o modelo decidir. "required" o obriga a chamar uma ferramenta. {"type": "function", "name": "…"} o obriga a chamar essa ferramenta. Modelos open-weight hospedados
reasoning object {"effort": "…"} com off, low, medium ou high. Qualquer outro valor retorna 400. Modelos open-weight hospedados
text object {"format": {…}} pede uma resposta em JSON. Veja Saída estruturada abaixo. Todos os níveis Shannon; modelos open-weight hospedados conforme listado por id

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user e prompt_cache_key são aceitos para que o código de clientes existentes funcione sem alterações. Eles não mudam a resposta. Como nenhuma conversa é armazenada, uma requisição seguinte leva os turnos anteriores em input.

Itens de entrada

Um item de entrada é uma mensagem, com role e content, ou um item tipado que traz uma chamada de ferramenta ou o seu resultado. content é uma string ou um array de partes.

Item Descrição Aplicado por
{"role": "user", "content": …} O que você pergunta. content é uma string ou partes input_text e input_image. Todos os modelos
{"role": "assistant", "content": …} Uma resposta anterior do modelo. content é uma string ou partes output_text. Todos os modelos
{"role": "system", "content": …}
{"role": "developer", "content": …}
Instruções dentro da conversa. Modelos open-weight hospedados
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Uma chamada de ferramenta que o modelo fez em uma resposta anterior. arguments é uma string JSON. Todos os modelos
{"type": "function_call_output", "call_id": "…", "output": "…"} O resultado dessa chamada. call_id é o id da chamada e output é o resultado como string. Todos os modelos

Coloque as instruções no campo instructions. Com um id da família Shannon 3, coloque as instruções que precisam valer na mensagem user.

Os itens de output de uma resposta podem voltar para input como estão: os itens message e function_call são lidos, os itens reasoning são ignorados.

Partes de conteúdo

Parte Descrição Disponível em
{"type": "input_text", "text": "…"} Texto de uma mensagem de usuário. Todos os modelos
{"type": "output_text", "text": "…"} Texto de uma mensagem do assistente. Todos os modelos
{"type": "input_image", "image_url": "…"} Uma imagem, como uma URL data: com conteúdo em 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": "input_file", "file_data": "data:application/pdf;base64,…"} Um documento (PDF, Word, PowerPoint ou Excel): file_data contém uma URL data:, ou file_url uma URL http(s). Família Shannon 3

Nos níveis Shannon, imagens e arquivos são lidos do último item user de input. Tamanhos e limites têm a sua própria página. Imagens e arquivos

Uma requisição com instruções e opções

Esta requisição envia instruções, uma conversa como itens de entrada, um limite de saída, uma temperatura e um 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.responses.create(
    model="DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP",
    instructions="You are a physics teacher. Answer in two sentences.",
    input=[
        {"role": "user", "content": "Why is the sky blue?"},
        {"role": "assistant", "content": "Air scatters blue light more than red light."},
        {"role": "user", "content": "And why are sunsets red?"},
    ],
    max_output_tokens=512,
    temperature=0.3,
    reasoning={"effort": "low"},
)

for item in response.output:
    if item.type == "reasoning":
        print("reasoning:", item.summary[0].text)
    elif item.type == "message":
        print("answer:", item.content[0].text)
print(response.usage)

A resposta de um modelo open-weight hospedado tem id, object, model, created_at, status, output e usage. O seu usage acrescenta os tokens lidos do cache e os tokens gastos com raciocínio:

200 JSON
{
  "usage": {
    "input_tokens": 58,
    "input_tokens_details": {
      "cached_tokens": 0
    },
    "output_tokens": 67,
    "output_tokens_details": {
      "reasoning_tokens": 19
    },
    "total_tokens": 125
  }
}

O objeto de resposta

id, object, status, output e usage estão em toda resposta. Baseie o seu código nesses campos.

Campo Tipo Descrição Enviado por
id string resp_ seguido de 32 caracteres hexadecimais. Todos os modelos
object string Sempre response. Todos os modelos
status string completed. Em um stream, é primeiro in_progress e failed em um evento response.failed. Todos os modelos
output array Os itens de saída na ordem em que o modelo os produziu: reasoning, message, function_call. Todos os modelos
usage object input_tokens, output_tokens e total_tokens. Todos os modelos
usage.input_tokens_details object cached_tokens: os tokens de entrada lidos do cache de prompt. Modelos open-weight hospedados
usage.output_tokens_details object reasoning_tokens: os tokens de saída gastos com raciocínio. Modelos open-weight hospedados
model string O id canônico do modelo que respondeu. Família Shannon 3, modelos open-weight hospedados
created_at integer Hora da resposta, em segundos Unix. Família Shannon 3, modelos open-weight hospedados
instructions, tools, temperature, … instructions, tools e temperature repetem a requisição. error e incomplete_details são null, metadata é {}, parallel_tool_calls é true, tool_choice é auto e top_p é null. Família Shannon 3

Itens de saída

Item Descrição
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} O raciocínio do modelo como uma parte summary_text. Presente apenas quando o modelo raciocinou.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} A resposta: uma parte output_text com o texto.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Uma chamada de ferramenta. arguments é uma string JSON. Envie o resultado de volta com o mesmo call_id.

Os SDKs da OpenAI juntam para você o texto da mensagem em response.output_text.

Streaming

Defina stream como true para receber server-sent events. Cada frame tem uma linha event: com o nome do evento e uma linha data: com um objeto JSON; o objeto repete o nome em type. Associe os deltas ao seu item por output_index.

Com o SDK da OpenAI, leia os eventos pelo seu type:

from openai import OpenAI

client = OpenAI(
    api_key="YOUR_API_KEY",
    base_url="https://api.shannon-ai.com/v1",
)

stream = client.responses.create(
    model="shannon-3",
    input="Explain server-sent events in three sentences.",
    stream=True,
)

for event in stream:
    kind = getattr(event, "type", "error")     # an event without a type is an error event
    if kind == "response.reasoning_summary_text.delta":
        pass                                   # a piece of reasoning: event.delta
    elif kind == "response.output_text.delta":
        print(event.delta, end="", flush=True)
    elif kind == "response.output_item.done" and event.item.type == "function_call":
        print("\ntool call:", event.item.name, event.item.arguments)
    elif kind == "response.completed":
        print("\n", event.response.usage)
    elif kind in ("response.failed", "error"):
        raise RuntimeError("the stream failed, send the request again")

Os eventos chegam nesta ordem. Os grupos de raciocínio, mensagem e chamadas de ferramenta aparecem apenas quando a resposta os tem.

Evento Payload Quando
response.created response Sempre o primeiro. response.status é in_progress e response.output está vazio.
response.in_progress response Sempre o segundo, com o mesmo objeto.
response.output_item.added output_index, item O raciocínio começa: um item reasoning com summary vazio.
response.reasoning_summary_text.delta output_index, summary_index, delta Um trecho do raciocínio.
response.reasoning_summary_text.done output_index, summary_index, text O raciocínio está completo: o seu text inteiro.
response.output_item.done output_index, item O item reasoning finalizado.
response.output_item.added output_index, item A resposta começa: um item message com status in_progress e sem conteúdo.
response.content_part.added output_index, content_index, part Uma parte output_text vazia é aberta.
response.output_text.delta output_index, content_index, delta Um trecho da resposta.
response.output_text.done output_index, content_index, text A resposta está completa: o seu text inteiro.
response.content_part.done output_index, content_index, part A parte output_text finalizada.
response.output_item.done output_index, item O item message finalizado, com status completed.
response.output_item.added output_index, item Uma chamada de ferramenta começa: um item function_call com call_id, name e arguments vazio.
response.function_call_arguments.delta output_index, delta Os argumentos da chamada, completos em um único delta.
response.function_call_arguments.done output_index, arguments Os mesmos argumentos, como arguments.
response.output_item.done output_index, item O item function_call finalizado.
response.completed response Sempre o último em caso de sucesso: o objeto de resposta inteiro com output e usage.
200 text/event-stream
event: response.created
data: {"type":"response.created","response":{"id":"resp_5f0c…","object":"response","status":"in_progress","output":[], …}}

event: response.in_progress
data: {"type":"response.in_progress","response":{"id":"resp_5f0c…","object":"response","status":"in_progress","output":[], …}}

event: response.output_item.added
data: {"type":"response.output_item.added","output_index":0,"item":{"id":"msg_1c7b…","type":"message","role":"assistant","status":"in_progress","content":[]}}

event: response.content_part.added
data: {"type":"response.content_part.added","output_index":0,"content_index":0,"part":{"type":"output_text","text":""}}

event: response.output_text.delta
data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":"Server-sent"}

event: response.output_text.delta
data: {"type":"response.output_text.delta","output_index":0,"content_index":0,"delta":" events let a server push text over one HTTP reply."}

event: response.output_text.done
data: {"type":"response.output_text.done","output_index":0,"content_index":0,"text":"Server-sent events let a server push text over one HTTP reply."}

event: response.content_part.done
data: {"type":"response.content_part.done","output_index":0,"content_index":0,"part":{"type":"output_text","text":"Server-sent events let a server push text over one HTTP reply."}}

event: response.output_item.done
data: {"type":"response.output_item.done","output_index":0,"item":{"id":"msg_1c7b…","type":"message","role":"assistant","status":"completed","content":[{"type":"output_text","text":"Server-sent events let a server push text over one HTTP reply.","annotations":[]}]}}

event: response.completed
data: {"type":"response.completed","response":{"id":"resp_5f0c…","object":"response","status":"completed","output":[…],"usage":{"input_tokens":1190,"output_tokens":18,"total_tokens":1208}, …}}

Um stream que falha

Nos níveis Shannon, uma resposta com falha termina com response.failed no lugar de response.completed. O seu response.status é failed e response.error contém um code, rate_limit_exceeded ou server_error, e uma message.

Nos modelos open-weight hospedados, uma falha é um evento error com code api_error e uma message. response.completed ainda vem depois dele.

Trate um stream como falho quando ele contiver um evento response.failed ou error, e envie a requisição novamente.

Ferramentas

Uma ferramenta é uma função que o seu código executa. Descreva-a em tools; quando o modelo a quer, a resposta contém um item function_call no lugar da mensagem ou ao lado dela.

Uma definição de ferramenta em tools:

tools
[
  {
    "type": "function",
    "name": "get_weather",
    "description": "Current weather for a city.",
    "parameters": {
      "type": "object",
      "properties": {
        "city": {
          "type": "string"
        }
      },
      "required": [
        "city"
      ]
    }
  }
]

O output de uma resposta que a chama:

200 output
[
  {
    "id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "type": "function_call",
    "name": "get_weather",
    "call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "arguments": "{\"city\":\"Paris\"}"
  }
]

Execute a função e envie a requisição de novo, com a chamada e o seu resultado acrescentados a input:

input
[
  {
    "role": "user",
    "content": "What is the weather in Paris?"
  },
  {
    "type": "function_call",
    "call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "name": "get_weather",
    "arguments": "{\"city\":\"Paris\"}"
  },
  {
    "type": "function_call_output",
    "call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
    "output": "{\"temperature_c\": 18, \"sky\": \"cloudy\"}"
  }
]

Apenas ferramentas do tipo function são lidas. Em shannon-1.6-*, shannon-2-* e shannon-coder-1, o schema de parameters é reduzido às palavras-chave comuns do JSON Schema: oneOf é lido como anyOf, e palavras-chave como $ref, additionalProperties, const, default e title não são repassadas ao modelo.

Os valores required e uma função nomeada de tool_choice são aplicados pelos modelos open-weight hospedados.

O ciclo de ferramentas é descrito por completo na sua própria página. Chamada de funções

Saída estruturada

Este formato escreve a saída estruturada como text.format. O schema fica diretamente em format, ao lado de name e strict, e não sob um membro json_schema como no Chat Completions.

  • {"type": "json_object"} pede qualquer objeto JSON.
  • {"type": "json_schema", "name", "schema", "strict"} pede um JSON que siga o seu schema. strict é true quando você o omite.
POST /v1/responses
{
  "model": "shannon-1.6-lite",
  "input": "Extract the city and the date: 'The conference opens in Lisbon on 12 May 2027.'",
  "text": {
    "format": {
      "type": "json_schema",
      "name": "event",
      "strict": true,
      "schema": {
        "type": "object",
        "properties": {
          "city": {
            "type": "string"
          },
          "date": {
            "type": "string",
            "description": "ISO 8601 date"
          }
        },
        "required": [
          "city",
          "date"
        ]
      }
    }
  }
}

O JSON chega como texto na parte output_text da mensagem; faça o parse você mesmo. Um modelo open-weight hospedado sem saída estruturada retorna 400.

output_text
{"city": "Lisbon", "date": "2027-05-12"}

Qual modelo aceita qual forma está listado na sua própria página. Saídas estruturadas

Raciocínio

Um modelo que raciocina retorna o seu raciocínio como um item de saída do tipo reasoning, antes da mensagem. Em um stream, ele chega como eventos response.reasoning_summary_text.delta.

Os modelos open-weight hospedados aplicam reasoning.effort: off, low, medium ou high, com high quando você não envia nada. off não retorna item de raciocínio. Envie-o como objeto; uma string simples não é lida neste endpoint.

Os níveis de esforço são descritos na sua própria página. Esforço de raciocínio

Limite de saída

max_output_tokens é 4,096 quando você não o envia. É o número de tokens reservado do seu saldo quando a requisição começa; quando a resposta está completa, essa quantidade é substituída pelo que a requisição usou. Um valor que não cabe no seu saldo restante retorna 429 Quota exceeded.

Ele limita o tamanho da resposta em shannon-1.6-*, shannon-2-* e shannon-coder-1, e o tamanho do texto da resposta nos modelos open-weight hospedados.

Neste endpoint, shannon-coder-1 é cobrado em tokens do seu saldo, como qualquer outro modelo.

O corpo de uma requisição pode ter até 32 MiB. Limites e saldo

Erros

Os erros usam o corpo de erro da OpenAI: um objeto error com type e message; alguns também trazem code e param com o valor null. A tabela lista o que este endpoint retorna com mais frequência. A lista completa, com o que tentar de novo, tem a sua própria página. Tratamento de erros

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 está ausente ou não é um id publicado.
400 invalid_request_error No user message provided. Níveis Shannon: input não contém texto de usuário.
400 invalid_request_error <id> does not accept image input Uma imagem foi enviada a um modelo open-weight hospedado sem entrada de imagem.
400 invalid_request_error <id> does not accept response_format text.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: … O corpo é um JSON válido, mas um campo tem o tipo errado.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_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 api_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, nos modelos open-weight hospedados.
504 api_error upstream timed out Um modelo open-weight hospedado demorou mais do que o limite de tempo de uma resposta sem stream. Envie a requisição com stream definido como true.