API Responses
NovoPOST /v1/responses recibe instrucións e unha lista de elementos de entrada e devolve un obxecto de resposta formado por elementos de saída, no formato OpenAI Responses. Úsao coa API responses do SDK de OpenAI e con ferramentas baseadas nela, como Codex CLI. O endpoint non garda estado: envía toda a conversa en cada solicitude.
POST https://api.shannon-ai.com/v1/responses
A solicitude máis pequena é un id de modelo e un texto. A resposta non ten stream a menos que o pidas.
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 é un obxecto de resposta. O seu output contén o razoamento, cando o modelo razoou, e a mensaxe:
{
"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 solicitude
model e input son o que necesita unha solicitude. A columna Aplicado por indica os modelos nos que un campo cambia a resposta. Os modelos open-weight alojados son os doce ids da lista de modelos; a familia Shannon 3 é shannon-3, shannon-3-pro, shannon-3.1 e shannon-3.1-pro. Modelos e prezos
| Campo | Tipo | Valor predeterminado | Descrición | Aplicado por |
|---|---|---|---|---|
model | string | Obrigatorio. Un id da lista de modelos. A coincidencia non distingue maiúsculas de minúsculas. Un id ausente ou non publicado devolve 400 unknown model. | Todos os modelos | |
input | string | array | Unha cadea, que se le como unha mensaxe de usuario, ou unha matriz de elementos de entrada. Consulta Elementos de entrada máis abaixo. | Todos os modelos | |
instructions | string | Instrucións para o modelo, o system prompt deste formato. | Modelos open-weight alojados, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
stream | boolean | false | true envía a resposta como server-sent events. Consulta Streaming máis abaixo. | Todos os modelos |
max_output_tokens | integer | 4096 | Límite superior da resposta, en tokens. Un valor fóra do intervalo de 1 a 65,536 axústase a ese intervalo. É tamén a cantidade que se reserva do teu saldo mentres a solicitude está en curso. Consulta Límite de saída máis abaixo. | Modelos open-weight alojados, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
temperature | number | Temperatura de mostraxe. Nos modelos open-weight alojados os valores mantéñense entre 0 e 2. | Modelos open-weight alojados; shannon-1.6-*, shannon-2-* e shannon-coder-1 en respostas sen stream | |
top_p | number | Mostraxe por núcleo (nucleus sampling). Os valores mantéñense entre 0 e 1. | Modelos open-weight alojados | |
tools | array | As funcións ás que pode chamar o modelo, na forma plana deste formato: {"type": "function", "name", "description", "parameters"}. Consulta Ferramentas máis abaixo. | Todos os modelos | |
tool_choice | string | object | auto | "auto" deixa que decida o modelo. "required" obrígao a chamar a unha ferramenta. {"type": "function", "name": "…"} obrígao a chamar a esa ferramenta. | Modelos open-weight alojados |
reasoning | object | {"effort": "…"} con off, low, medium ou high. Calquera outro valor devolve 400. | Modelos open-weight alojados | |
text | object | {"format": {…}} pide unha resposta JSON. Consulta Saída estruturada máis abaixo. | Todos os niveis Shannon; modelos open-weight alojados segundo se indica por id |
Acéptanse previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user e prompt_cache_key para que o código de cliente existente funcione sen cambios. Non alteran a resposta. Como non se garda ningunha conversa, unha solicitude posterior leva os turnos anteriores en input.
Elementos de entrada
Un elemento de entrada é ou ben unha mensaxe, cun role e un content, ou ben un elemento tipado que leva unha chamada a unha ferramenta ou o seu resultado. content é unha cadea ou unha matriz de partes.
| Elemento | Descrición | Aplicado por |
|---|---|---|
{"role": "user", "content": …} | O que preguntas. content é unha cadea ou partes input_text e input_image. | Todos os modelos |
{"role": "assistant", "content": …} | Unha resposta anterior do modelo. content é unha cadea ou partes output_text. | Todos os modelos |
{"role": "system", "content": …}{"role": "developer", "content": …} | Instrucións dentro da conversa. | Modelos open-weight alojados |
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} | Unha chamada a unha ferramenta que fixo o modelo nunha resposta anterior. arguments é unha cadea JSON. | Todos os modelos |
{"type": "function_call_output", "call_id": "…", "output": "…"} | O resultado desa chamada. call_id é o id da chamada e output o resultado como cadea. | Todos os modelos |
Pon as instrucións no campo instructions. Cun id da familia Shannon 3, pon na mensaxe user as instrucións que deban cumprirse.
Os elementos do output dunha resposta poden volver a input tal cales: os elementos message e function_call lense e os elementos reasoning omítense.
Partes de contido
| Parte | Descrición | Dispoñible en |
|---|---|---|
{"type": "input_text", "text": "…"} | Texto dunha mensaxe de usuario. | Todos os modelos |
{"type": "output_text", "text": "…"} | Texto dunha mensaxe do asistente. | Todos os modelos |
{"type": "input_image", "image_url": "…"} | Unha imaxe, como URL data: con contido en base64 ou como URL http(s). | Familia Shannon 3, shannon-1.6-lite, shannon-1.6-pro e os modelos open-weight alojados que admiten imaxes como entrada |
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} | Un documento (PDF, Word, PowerPoint ou Excel): file_data contén unha URL data:, ou file_url unha URL http(s). | Familia Shannon 3 |
Nos niveis Shannon, as imaxes e os ficheiros lense do último elemento user de input. Os tamaños e os límites teñen a súa propia páxina. Imaxes e ficheiros
Unha solicitude con instrucións e opcións
Esta solicitude envía instrucións, unha conversa como elementos de entrada, un límite de saída, unha temperatura e un esforzo de razoamento. Usa un modelo open-weight alojado, 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 dun modelo open-weight alojado ten id, object, model, created_at, status, output e usage. O seu usage engade os tokens lidos da caché e os tokens gastados en razoamento:
{
"usage": {
"input_tokens": 58,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 67,
"output_tokens_details": {
"reasoning_tokens": 19
},
"total_tokens": 125
}
} O obxecto de resposta
id, object, status, output e usage están en todas as respostas. Constrúe o teu código sobre eles.
| Campo | Tipo | Descrición | Enviado por |
|---|---|---|---|
id | string | resp_ seguido de 32 caracteres hexadecimais. | Todos os modelos |
object | string | Sempre response. | Todos os modelos |
status | string | completed. Nun stream é primeiro in_progress, e failed nun evento response.failed. | Todos os modelos |
output | array | Os elementos de saída na orde na que os produciu o modelo: 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 da caché de prompts. | Modelos open-weight alojados |
usage.output_tokens_details | object | reasoning_tokens: os tokens de saída gastados en razoamento. | Modelos open-weight alojados |
model | string | O id canónico do modelo que respondeu. | Familia Shannon 3, modelos open-weight alojados |
created_at | integer | Hora da resposta, en segundos Unix. | Familia Shannon 3, modelos open-weight alojados |
instructions, tools, temperature, … | instructions, tools e temperature repiten a solicitude. error e incomplete_details son null, metadata é {}, parallel_tool_calls é true, tool_choice é auto e top_p é null. | Familia Shannon 3 |
Elementos de saída
| Elemento | Descrición |
|---|---|
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} | O razoamento do modelo como unha parte summary_text. Só está presente cando o modelo razoou. |
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} | A resposta: unha parte output_text co texto. |
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} | Unha chamada a unha ferramenta. arguments é unha cadea JSON. Devolve o resultado co mesmo call_id. |
Os SDK de OpenAI únenche o texto da mensaxe en response.output_text.
Streaming
Define stream como true para obter server-sent events. Cada frame ten unha liña event: co nome do evento e unha liña data: cun obxecto JSON; o obxecto repite o nome en type. Asocia os deltas co seu elemento por output_index.
Co SDK de OpenAI, le os eventos polo 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 chegan nesta orde. Os grupos de razoamento, mensaxe e chamadas a ferramentas aparecen só cando a resposta os ten.
| Evento | Contido | Cando |
|---|---|---|
response.created | response | Sempre o primeiro. response.status é in_progress e response.output está baleiro. |
response.in_progress | response | Sempre o segundo, co mesmo obxecto. |
response.output_item.added | output_index, item | Comeza o razoamento: un elemento reasoning cun summary baleiro. |
response.reasoning_summary_text.delta | output_index, summary_index, delta | Un anaco do razoamento. |
response.reasoning_summary_text.done | output_index, summary_index, text | O razoamento está completo: o seu text enteiro. |
response.output_item.done | output_index, item | O elemento reasoning rematado. |
response.output_item.added | output_index, item | Comeza a resposta: un elemento message co estado in_progress e sen contido. |
response.content_part.added | output_index, content_index, part | Ábrese unha parte output_text baleira. |
response.output_text.delta | output_index, content_index, delta | Un anaco da resposta. |
response.output_text.done | output_index, content_index, text | A resposta está completa: o seu text enteiro. |
response.content_part.done | output_index, content_index, part | A parte output_text rematada. |
response.output_item.done | output_index, item | O elemento message rematado, co estado completed. |
response.output_item.added | output_index, item | Comeza unha chamada a unha ferramenta: un elemento function_call con call_id, name e arguments baleiro. |
response.function_call_arguments.delta | output_index, delta | Os argumentos da chamada, completos nun só delta. |
response.function_call_arguments.done | output_index, arguments | Os mesmos argumentos, como arguments. |
response.output_item.done | output_index, item | O elemento function_call rematado. |
response.completed | response | Sempre o último se hai éxito: o obxecto de resposta completo con 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}, …}} Un stream que falla
Nos niveis Shannon, unha resposta fallida remata con response.failed en vez de response.completed. O seu response.status é failed e response.error contén un code, rate_limit_exceeded ou server_error, e un message.
Nos modelos open-weight alojados, un fallo é un evento error con code api_error e un message. Despois segue chegando response.completed.
Considera un stream como fallido cando contén un evento response.failed ou error, e envía a solicitude de novo.
Ferramentas
Unha ferramenta é unha función que executa o teu código. Descríbea en tools; cando o modelo a quere, a resposta contén un elemento function_call no lugar da mensaxe, ou xunto a ela.
Unha definición de ferramenta en tools:
[
{
"type": "function",
"name": "get_weather",
"description": "Current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] O output dunha resposta que a chama:
[
{
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function_call",
"name": "get_weather",
"call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"arguments": "{\"city\":\"Paris\"}"
}
] Executa a función e envía a solicitude de novo coa chamada e o seu resultado engadidos 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\"}"
}
] Só se len as ferramentas de tipo function. En shannon-1.6-*, shannon-2-* e shannon-coder-1, o esquema de parameters redúcese ás palabras clave comúns de JSON Schema: oneOf lese como anyOf, e palabras clave como $ref, additionalProperties, const, default e title non se pasan ao modelo.
Os valores required e unha función nomeada de tool_choice aplícanos os modelos open-weight alojados.
O bucle de ferramentas descríbese por completo na súa propia páxina. Chamadas a funcións
Saída estruturada
Este formato escribe a saída estruturada como text.format. O esquema está directamente en format, xunto a name e strict, non baixo un membro json_schema como en Chat Completions.
{"type": "json_object"}pide calquera obxecto JSON.{"type": "json_schema", "name", "schema", "strict"}pide JSON que siga o teu esquema.strictétruecando o omites.
{
"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 mensaxe; analízao ti mesmo. Un modelo open-weight alojado sen saída estruturada devolve 400.
{"city": "Lisbon", "date": "2027-05-12"} Que modelo acepta cada forma está listado na súa propia páxina. Saídas estruturadas
Razoamento
Un modelo que razoa devolve o seu razoamento como un elemento de saída de tipo reasoning, antes da mensaxe. Nun stream chega como eventos response.reasoning_summary_text.delta.
Os modelos open-weight alojados aplican reasoning.effort: off, low, medium ou high, con high cando non envías nada. off non devolve ningún elemento de razoamento. Envíao como obxecto; unha cadea simple non se le neste endpoint.
Os esforzos descríbense na súa propia páxina. Esforzo de razoamento
Límite de saída
max_output_tokens é 4,096 cando non o envías. É o número de tokens que se reservan do teu saldo cando comeza a solicitude; cando a resposta está completa, esa cantidade substitúese polo que usou a solicitude. Un valor que non cabe no saldo que che queda devolve 429 Quota exceeded.
Limita a lonxitude da resposta en shannon-1.6-*, shannon-2-* e shannon-coder-1, e a lonxitude do texto da resposta nos modelos open-weight alojados.
Neste endpoint shannon-coder-1 cóbrase en tokens do teu saldo, como todos os demais modelos.
O corpo dunha solicitude pode ser de ata 32 MiB. Límites e saldo
Erros
Os erros usan o corpo de erro de OpenAI: un obxecto error con type e message; algúns levan tamén code e param co valor null. A táboa mostra o que este endpoint devolve con máis frecuencia. A lista completa, con indicacións sobre que reintentar, ten a súa propia páxina. Xestión de erros
| Estado | Tipo | Mensaxe | Cando |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | Non se enviou ningunha clave API, ou a clave é descoñecida ou está revogada. |
400 | invalid_request_error | unknown model: <id> | model falta ou non é un id publicado. |
400 | invalid_request_error | No user message provided. | Niveis Shannon: input non contén texto de usuario. |
400 | invalid_request_error | <id> does not accept image input | Enviouse unha imaxe a un modelo open-weight alojado sen entrada de imaxe. |
400 | invalid_request_error | <id> does not accept response_format | Enviouse text.format a un modelo open-weight alojado sen saída estruturada. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning.effort contén un valor que non está na lista. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | O corpo é JSON válido pero un campo ten o tipo incorrecto. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_output_tokens é maior que o que queda do teu saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protección contra inundación: máis de 120 solicitudes nun minuto na túa conta. |
500 | api_error | The model backend failed to answer. Please retry. | O modelo non produciu unha resposta. Envía a solicitude de novo. |
502 | api_error | The model backend failed to answer. Please retry. | O mesmo, nos modelos open-weight alojados. |
504 | api_error | upstream timed out | Un modelo open-weight alojado tardou máis que o límite de tempo dunha resposta sen stream. Envíaa con stream definido como true. |