API Responses
NouPOST /v1/responses accepta instruccions i una llista d'elements d'entrada i retorna un objecte de resposta fet d'elements de sortida, en el format OpenAI Responses. Fes-lo servir amb l'API de responses de l'SDK d'OpenAI i amb eines construïdes sobre ella, com Codex CLI. L'endpoint no guarda cap estat: envia la conversa sencera a cada sol·licitud.
POST https://api.shannon-ai.com/v1/responses
La sol·licitud més petita és un id de model i un text. La resposta no va en streaming tret que ho demanis.
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."
}' La resposta és un objecte de resposta. El seu output conté el raonament, quan el model ha raonat, i el missatge:
{
"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
}
} Camps de la sol·licitud
model i input són el que necessita una sol·licitud. La columna L'apliquen indica els models en què un camp canvia la resposta. Els models open-weight hostejats són els dotze ids de la llista de models; la família Shannon 3 és shannon-3, shannon-3-pro, shannon-3.1 i shannon-3.1-pro. Models i preus
| Camp | Tipus | Per defecte | Descripció | L'apliquen |
|---|---|---|---|---|
model | string | Obligatori. Un id de la llista de models. La coincidència no distingeix majúscules i minúscules. Un id que falta o no està publicat retorna 400 unknown model. | Tots els models | |
input | string | array | Una cadena, que es llegeix com un missatge d'usuari, o una matriu d'elements d'entrada. Vegeu Elements d'entrada més avall. | Tots els models | |
instructions | string | Instruccions per al model, el prompt de sistema d'aquest format. | Models open-weight hostejats, shannon-1.6-*, shannon-2-*, shannon-coder-1 | |
stream | boolean | false | true envia la resposta com a server-sent events. Vegeu Streaming més avall. | Tots els models |
max_output_tokens | integer | 4096 | Límit superior de la resposta, en tokens. Un valor fora d'1 a 65,536 es mou dins d'aquest interval. També és la quantitat que es reserva del teu saldo mentre la sol·licitud s'executa. Vegeu Límit de sortida més avall. | Models open-weight hostejats, shannon-1.6-*, shannon-2-*, shannon-coder-1 |
temperature | number | Temperatura de mostreig. En els models open-weight hostejats els valors es mantenen entre 0 i 2. | Models open-weight hostejats; shannon-1.6-*, shannon-2-* i shannon-coder-1 en respostes sense streaming | |
top_p | number | Mostreig de nucli. Els valors es mantenen entre 0 i 1. | Models open-weight hostejats | |
tools | array | Les funcions que el model pot cridar, en la forma plana d'aquest format: {"type": "function", "name", "description", "parameters"}. Vegeu Eines més avall. | Tots els models | |
tool_choice | string | object | auto | "auto" deixa que el model decideixi. "required" el fa cridar una eina. {"type": "function", "name": "…"} el fa cridar aquesta eina. | Models open-weight hostejats |
reasoning | object | {"effort": "…"} amb off, low, medium o high. Qualsevol altre valor retorna 400. | Models open-weight hostejats | |
text | object | {"format": {…}} demana una resposta JSON. Vegeu Sortida estructurada més avall. | Tots els nivells Shannon; models open-weight hostejats segons es llista per id |
previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user i prompt_cache_key s'accepten perquè el codi client existent funcioni sense canvis. No canvien la resposta. Com que no es desa cap conversa, una sol·licitud de seguiment porta els torns anteriors a input.
Elements d'entrada
Un element d'entrada és un missatge, amb un role i un content, o un element tipat que porta una crida d'eina o el seu resultat. content és una cadena o una matriu de parts.
| Element | Descripció | L'apliquen |
|---|---|---|
{"role": "user", "content": …} | El que preguntes. content és una cadena, o parts input_text i input_image. | Tots els models |
{"role": "assistant", "content": …} | Una resposta anterior del model. content és una cadena, o parts output_text. | Tots els models |
{"role": "system", "content": …}{"role": "developer", "content": …} | Instruccions dins de la conversa. | Models open-weight hostejats |
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} | Una crida d'eina que el model va fer en una resposta anterior. arguments és una cadena JSON. | Tots els models |
{"type": "function_call_output", "call_id": "…", "output": "…"} | El resultat d'aquesta crida. call_id és l'id de la crida i output el resultat com a cadena. | Tots els models |
Posa les instruccions al camp instructions. Amb un id de la família Shannon 3, posa les instruccions que s'han de complir al missatge user.
Els elements d'output d'una resposta poden tornar a input tal com són: els elements message i function_call es llegeixen, els elements reasoning s'ometen.
Parts de contingut
| Part | Descripció | Disponible a |
|---|---|---|
{"type": "input_text", "text": "…"} | Text d'un missatge d'usuari. | Tots els models |
{"type": "output_text", "text": "…"} | Text d'un missatge de l'assistent. | Tots els models |
{"type": "input_image", "image_url": "…"} | Una imatge, com a URL data: amb contingut base64 o com a URL http(s). | Família Shannon 3, shannon-1.6-lite, shannon-1.6-pro i els models open-weight hostejats que llisten entrada d'imatges |
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} | Un document (PDF, Word, PowerPoint o Excel): file_data conté una URL data:, o file_url una URL http(s). | Família Shannon 3 |
Als nivells Shannon, les imatges i els fitxers es llegeixen de l'últim element user d'input. Les mides i els límits tenen la seva pròpia pàgina. Imatges i fitxers
Una sol·licitud amb instruccions i opcions
Aquesta sol·licitud envia instruccions, una conversa com a elements d'entrada, un límit de sortida, una temperatura i un esforç de raonament. Fa servir un model open-weight hostejat, que els aplica tots.
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"}
}' La resposta d'un model open-weight hostejat té id, object, model, created_at, status, output i usage. El seu usage afegeix els tokens llegits de la cache i els tokens gastats en raonament:
{
"usage": {
"input_tokens": 58,
"input_tokens_details": {
"cached_tokens": 0
},
"output_tokens": 67,
"output_tokens_details": {
"reasoning_tokens": 19
},
"total_tokens": 125
}
} L'objecte de resposta
id, object, status, output i usage són a totes les respostes. Construeix el teu codi sobre aquests.
| Camp | Tipus | Descripció | L'envia |
|---|---|---|---|
id | string | resp_ seguit de 32 caràcters hexadecimals. | Tots els models |
object | string | Sempre response. | Tots els models |
status | string | completed. En un stream és primer in_progress, i failed en un esdeveniment response.failed. | Tots els models |
output | array | Els elements de sortida en l'ordre en què el model els ha produït: reasoning, message, function_call. | Tots els models |
usage | object | input_tokens, output_tokens i total_tokens. | Tots els models |
usage.input_tokens_details | object | cached_tokens: els tokens d'entrada llegits de la cache de prompts. | Models open-weight hostejats |
usage.output_tokens_details | object | reasoning_tokens: els tokens de sortida gastats en raonament. | Models open-weight hostejats |
model | string | L'id canònic del model que ha respost. | Família Shannon 3, models open-weight hostejats |
created_at | integer | Hora de la resposta, en segons Unix. | Família Shannon 3, models open-weight hostejats |
instructions, tools, temperature, … | instructions, tools i temperature repeteixen la sol·licitud. error i incomplete_details són null, metadata és {}, parallel_tool_calls és true, tool_choice és auto i top_p és null. | Família Shannon 3 |
Elements de sortida
| Element | Descripció |
|---|---|
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} | El raonament del model com una part summary_text. Només hi és quan el model ha raonat. |
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} | La resposta: una part output_text amb el text. |
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} | Una crida d'eina. arguments és una cadena JSON. Torna el resultat amb el mateix call_id. |
Els SDK d'OpenAI uneixen per tu el text del missatge a response.output_text.
Streaming
Posa stream a true per obtenir server-sent events. Cada frame té una línia event: amb el nom de l'esdeveniment i una línia data: amb un objecte JSON; l'objecte repeteix el nom a type. Associa els deltas al seu element per output_index.
Amb l'SDK d'OpenAI, llegeix els esdeveniments pel 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
}' Els esdeveniments arriben en aquest ordre. Els grups del raonament, del missatge i de les crides d'eina només hi són quan la resposta els té.
| Esdeveniment | Càrrega | Quan |
|---|---|---|
response.created | response | Sempre el primer. response.status és in_progress i response.output és buit. |
response.in_progress | response | Sempre el segon, amb el mateix objecte. |
response.output_item.added | output_index, item | Comença el raonament: un element reasoning amb un summary buit. |
response.reasoning_summary_text.delta | output_index, summary_index, delta | Un troç del raonament. |
response.reasoning_summary_text.done | output_index, summary_index, text | El raonament és complet: tot el seu text. |
response.output_item.done | output_index, item | L'element reasoning acabat. |
response.output_item.added | output_index, item | Comença la resposta: un element message amb estat in_progress i sense contingut. |
response.content_part.added | output_index, content_index, part | S'obre una part output_text buida. |
response.output_text.delta | output_index, content_index, delta | Un troç de la resposta. |
response.output_text.done | output_index, content_index, text | La resposta és completa: tot el seu text. |
response.content_part.done | output_index, content_index, part | La part output_text acabada. |
response.output_item.done | output_index, item | L'element message acabat, amb estat completed. |
response.output_item.added | output_index, item | Comença una crida d'eina: un element function_call amb call_id, name i arguments buit. |
response.function_call_arguments.delta | output_index, delta | Els arguments de la crida, complets en un sol delta. |
response.function_call_arguments.done | output_index, arguments | Els mateixos arguments, com a arguments. |
response.output_item.done | output_index, item | L'element function_call acabat. |
response.completed | response | Sempre l'últim quan va bé: l'objecte de resposta sencer amb output i 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
Als nivells Shannon, una resposta fallida acaba amb response.failed en lloc de response.completed. El seu response.status és failed i response.error conté un code, rate_limit_exceeded o server_error, i un message.
En els models open-weight hostejats, un error és un esdeveniment error amb code api_error i un message. response.completed el segueix igualment.
Tracta un stream com a fallit quan conté un esdeveniment response.failed o error, i torna a enviar la sol·licitud.
Eines
Una eina és una funció que executa el teu codi. Descriu-la a tools; quan el model la vol, la resposta conté un element function_call en lloc del missatge, o al costat.
Una definició d'eina a tools:
[
{
"type": "function",
"name": "get_weather",
"description": "Current weather for a city.",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
] L'output d'una resposta que la crida:
[
{
"id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"type": "function_call",
"name": "get_weather",
"call_id": "call_3d9a7c1e5b2f4a60c8e1d7f09b24a6c5",
"arguments": "{\"city\":\"Paris\"}"
}
] Executa la funció i torna a enviar la sol·licitud amb la crida i el seu resultat afegits 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\"}"
}
] Només es llegeixen les eines del tipus function. A shannon-1.6-*, shannon-2-* i shannon-coder-1, l'esquema de parameters es redueix a les paraules clau comunes de JSON Schema: oneOf es llegeix com a anyOf, i paraules clau com $ref, additionalProperties, const, default i title no es passen al model.
Els valors required i una funció amb nom de tool_choice els apliquen els models open-weight hostejats.
El bucle d'eines es descriu sencer a la seva pròpia pàgina. Crida de funcions
Sortida estructurada
Aquest format escriu la sortida estructurada com a text.format. L'esquema és directament a format, al costat de name i strict, no sota un membre json_schema com a Chat Completions.
{"type": "json_object"}demana qualsevol objecte JSON.{"type": "json_schema", "name", "schema", "strict"}demana JSON que segueixi el teu esquema.strictéstruequan l'omets.
{
"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"
]
}
}
}
} El JSON arriba com a text a la part output_text del missatge; analitza'l tu mateix. Un model open-weight hostejat sense sortida estructurada retorna 400.
{"city": "Lisbon", "date": "2027-05-12"} Quin model accepta quina forma es llista a la seva pròpia pàgina. Sortides estructurades
Raonament
Un model que raona retorna el seu raonament com un element de sortida del tipus reasoning, abans del missatge. En un stream arriba com a esdeveniments response.reasoning_summary_text.delta.
Els models open-weight hostejats apliquen reasoning.effort: off, low, medium o high, amb high quan no envies res. off no retorna cap element de raonament. Envia'l com a objecte; una cadena sola no es llegeix en aquest endpoint.
Els esforços es descriuen a la seva pròpia pàgina. Esforç de raonament
Límit de sortida
max_output_tokens és 4,096 quan no l'envies. És el nombre de tokens que es reserva del teu saldo quan comença la sol·licitud; quan la resposta és completa, aquesta quantitat se substitueix pel que ha fet servir la sol·licitud. Un valor que no cap al saldo que et queda retorna 429 Quota exceeded.
Limita la longitud de la resposta a shannon-1.6-*, shannon-2-* i shannon-coder-1, i la longitud del text de la resposta en els models open-weight hostejats.
En aquest endpoint, shannon-coder-1 es cobra en tokens del teu saldo, com tots els altres models.
El cos d'una sol·licitud pot ser de fins a 32 MiB. Límits i saldo
Errors
Els errors fan servir el cos d'error d'OpenAI: un objecte error amb type i message; alguns porten també code i param amb el valor null. La taula llista el que aquest endpoint retorna més sovint. La llista completa, amb què cal reintentar, té la seva pròpia pàgina. Gestió d’errors
| Estat | Tipus | Missatge | Quan |
|---|---|---|---|
401 | authentication_error | Missing authenticationInvalid API key | No s'ha enviat cap clau API, o la clau és desconeguda o revocada. |
400 | invalid_request_error | unknown model: <id> | Falta model o no és un id publicat. |
400 | invalid_request_error | No user message provided. | Nivells Shannon: input no conté cap text d'usuari. |
400 | invalid_request_error | <id> does not accept image input | S'ha enviat una imatge a un model open-weight hostejat sense entrada d'imatges. |
400 | invalid_request_error | <id> does not accept response_format | S'ha enviat text.format a un model open-weight hostejat sense sortida estructurada. |
400 | invalid_request_error | unknown reasoning effort '<value>'; expected off, low, medium or high | reasoning.effort conté un valor fora de la llista. |
422 | invalid_request_error | Failed to deserialize the JSON body into the target type: … | El cos és JSON vàlid però un camp té el tipus incorrecte. |
429 | rate_limit_error | Quota exceeded. Upgrade your plan at shannon-ai.com/plan | max_output_tokens és més gran que el que queda del teu saldo. |
429 | rate_limit_error | Too many requests. Retry in <n>s. | Protecció contra inundació: més de 120 sol·licituds en un minut al teu compte. |
500 | api_error | The model backend failed to answer. Please retry. | El model no ha produït cap resposta. Torna a enviar la sol·licitud. |
502 | api_error | The model backend failed to answer. Please retry. | El mateix, en els models open-weight hostejats. |
504 | api_error | upstream timed out | Un model open-weight hostejat ha trigat més que el límit de temps d'una resposta sense streaming. Envia-la amb stream a true. |