API Responses
NovoPOST /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) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await client.responses.create({
model: "shannon-3",
input: "Say hello in one sentence.",
});
console.log(response.output_text); curl https://api.shannon-ai.com/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"input": "Say hello in one sentence."
}' A resposta é um objeto de resposta. O seu output contém o raciocínio, quando o modelo raciocinou, e a mensagem:
{
"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) import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const response = await 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 (const item of response.output) {
if (item.type === "reasoning") console.log("reasoning:", item.summary[0].text);
if (item.type === "message") console.log("answer:", item.content[0].text);
}
console.log(response.usage); curl https://api.shannon-ai.com/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"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"}
}' 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:
{
"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") import OpenAI from "openai";
const client = new OpenAI({
apiKey: "YOUR_API_KEY",
baseURL: "https://api.shannon-ai.com/v1",
});
const stream = await client.responses.create({
model: "shannon-3",
input: "Explain server-sent events in three sentences.",
stream: true,
});
for await (const event of stream) {
if (event.type === "response.reasoning_summary_text.delta") {
// a piece of reasoning: event.delta
} else if (event.type === "response.output_text.delta") {
process.stdout.write(event.delta);
} else if (event.type === "response.output_item.done" && event.item.type === "function_call") {
console.log("\ntool call:", event.item.name, event.item.arguments);
} else if (event.type === "response.completed") {
console.log("\n", event.response.usage);
} else if (event.type === "response.failed" || event.type === "error") {
throw new Error("the stream failed, send the request again");
}
} curl -N https://api.shannon-ai.com/v1/responses \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "shannon-3",
"input": "Explain server-sent events in three sentences.",
"stream": true
}' 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. |
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:
[
{
"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:
[
{
"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:
[
{
"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étruequando você o omite.
{
"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.
{"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 authenticationInvalid 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. |