Saltar al contenido
API Responses

API Responses

Nuevo

POST /v1/responses recibe instrucciones y una lista de elementos de entrada y devuelve un objeto de respuesta formado por elementos de salida, en el formato OpenAI Responses. Úsalo con la API de responses del SDK de OpenAI y con las herramientas construidas sobre ella, como Codex CLI. El endpoint no guarda estado: envía la conversación completa con cada solicitud.

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

La solicitud más pequeña es un id de modelo y un texto. La respuesta no va con stream a menos que lo 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)

La respuesta es un objeto de respuesta. Su output contiene el razonamiento, cuando el modelo razonó, y el mensaje:

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 de solicitud

model e input son lo que necesita una solicitud. La columna Lo aplican nombra los modelos en los que un campo cambia la respuesta. Los modelos de pesos abiertos alojados son los doce ids de la lista de modelos; la familia Shannon 3 es shannon-3, shannon-3-pro, shannon-3.1 y shannon-3.1-pro. Modelos y precios

Campo Tipo Predeterminado Descripción Lo aplican
model string Obligatorio. Un id de la lista de modelos. La coincidencia no distingue mayúsculas de minúsculas. Un id ausente o no publicado devuelve 400 unknown model. Todos los modelos
input string | array Una cadena, que se lee como un mensaje de usuario, o un array de elementos de entrada. Consulta Elementos de entrada más abajo. Todos los modelos
instructions string Instrucciones para el modelo, el system prompt de este formato. Modelos de pesos abiertos alojados, shannon-1.6-*, shannon-2-*, shannon-coder-1
stream boolean false true envía la respuesta como server-sent events. Consulta Streaming más abajo. Todos los modelos
max_output_tokens integer 4096 Límite superior de la respuesta, en tokens. Un valor fuera del rango de 1 a 65,536 se lleva a ese rango. También es la cantidad que se reserva de tu saldo mientras se ejecuta la solicitud. Consulta Límite de salida más abajo. Modelos de pesos abiertos alojados, shannon-1.6-*, shannon-2-*, shannon-coder-1
temperature number Temperatura de muestreo. En los modelos de pesos abiertos alojados los valores se mantienen entre 0 y 2. Modelos de pesos abiertos alojados; shannon-1.6-*, shannon-2-* y shannon-coder-1 en respuestas sin stream
top_p number Muestreo por núcleo (nucleus). Los valores se mantienen entre 0 y 1. Modelos de pesos abiertos alojados
tools array Las funciones que el modelo puede llamar, en la forma plana de este formato: {"type": "function", "name", "description", "parameters"}. Consulta Herramientas más abajo. Todos los modelos
tool_choice string | object auto "auto" deja que el modelo decida. "required" lo obliga a llamar a una herramienta. {"type": "function", "name": "…"} lo obliga a llamar a esa herramienta. Modelos de pesos abiertos alojados
reasoning object {"effort": "…"} con off, low, medium o high. Cualquier otro valor devuelve 400. Modelos de pesos abiertos alojados
text object {"format": {…}} pide una respuesta JSON. Consulta Salida estructurada más abajo. Todos los niveles Shannon; modelos de pesos abiertos alojados según se indica por id

previous_response_id, store, metadata, parallel_tool_calls, truncation, include, user y prompt_cache_key se aceptan para que el código de cliente existente funcione sin cambios. No modifican la respuesta. Como no se guarda ninguna conversación, una solicitud posterior lleva los turnos anteriores en input.

Elementos de entrada

Un elemento de entrada es un mensaje, con un role y un content, o un elemento tipado que lleva una llamada a herramienta o su resultado. content es una cadena o un array de partes.

Elemento Descripción Lo aplican
{"role": "user", "content": …} Lo que preguntas. content es una cadena, o partes input_text e input_image. Todos los modelos
{"role": "assistant", "content": …} Una respuesta anterior del modelo. content es una cadena, o partes output_text. Todos los modelos
{"role": "system", "content": …}
{"role": "developer", "content": …}
Instrucciones dentro de la conversación. Modelos de pesos abiertos alojados
{"type": "function_call", "call_id": "…", "name": "…", "arguments": "…"} Una llamada a herramienta que el modelo hizo en una respuesta anterior. arguments es una cadena JSON. Todos los modelos
{"type": "function_call_output", "call_id": "…", "output": "…"} El resultado de esa llamada. call_id es el id de la llamada y output el resultado como cadena. Todos los modelos

Pon las instrucciones en el campo instructions. Con un id de la familia Shannon 3, pon las instrucciones que deben cumplirse en el mensaje user.

Los elementos del output de una respuesta pueden volver a input tal cual: los elementos message y function_call se leen, los elementos reasoning se omiten.

Partes de contenido

Parte Descripción Disponible en
{"type": "input_text", "text": "…"} Texto de un mensaje de usuario. Todos los modelos
{"type": "output_text", "text": "…"} Texto de un mensaje del asistente. Todos los modelos
{"type": "input_image", "image_url": "…"} Una imagen, como URL data: con contenido base64 o como URL http(s). Familia Shannon 3, shannon-1.6-lite, shannon-1.6-pro y los modelos de pesos abiertos alojados que indican entrada de imágenes
{"type": "input_file", "file_data": "data:application/pdf;base64,…"} Un documento (PDF, Word, PowerPoint o Excel): file_data contiene una URL data:, o file_url una URL http(s). Familia Shannon 3

En los niveles Shannon las imágenes y los archivos se leen del último elemento user de input. Los tamaños y límites tienen su propia página. Imágenes y archivos

Una solicitud con instrucciones y opciones

Esta solicitud envía instrucciones, una conversación como elementos de entrada, un límite de salida, una temperatura y un esfuerzo de razonamiento. Usa un modelo de pesos abiertos alojado, que aplica todos ellos.

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)

La respuesta de un modelo de pesos abiertos alojado tiene id, object, model, created_at, status, output y usage. Su usage añade los tokens leídos de la caché y los tokens gastados en razonamiento:

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

El objeto de respuesta

id, object, status, output y usage están en toda respuesta. Basa tu código en ellos.

Campo Tipo Descripción Enviado por
id string resp_ seguido de 32 caracteres hexadecimales. Todos los modelos
object string Siempre response. Todos los modelos
status string completed. En un stream es primero in_progress, y failed en un evento response.failed. Todos los modelos
output array Los elementos de salida en el orden en que el modelo los produjo: reasoning, message, function_call. Todos los modelos
usage object input_tokens, output_tokens y total_tokens. Todos los modelos
usage.input_tokens_details object cached_tokens: los tokens de entrada leídos de la caché de prompts. Modelos de pesos abiertos alojados
usage.output_tokens_details object reasoning_tokens: los tokens de salida gastados en razonamiento. Modelos de pesos abiertos alojados
model string El id canónico del modelo que respondió. Familia Shannon 3, modelos de pesos abiertos alojados
created_at integer Hora de la respuesta, en segundos Unix. Familia Shannon 3, modelos de pesos abiertos alojados
instructions, tools, temperature, … instructions, tools y temperature repiten la solicitud. error e incomplete_details son null, metadata es {}, parallel_tool_calls es true, tool_choice es auto y top_p es null. Familia Shannon 3

Elementos de salida

Elemento Descripción
{"id": "rs_…", "type": "reasoning", "summary": [{"type": "summary_text", "text": "…"}]} El razonamiento del modelo como una parte summary_text. Solo está presente cuando el modelo razonó.
{"id": "msg_…", "type": "message", "role": "assistant", "content": [{"type": "output_text", "text": "…"}]} La respuesta: una parte output_text con el texto.
{"id": "fc_…", "type": "function_call", "call_id": "call_…", "name": "…", "arguments": "…"} Una llamada a herramienta. arguments es una cadena JSON. Envía el resultado de vuelta con el mismo call_id.

Los SDK de OpenAI unen por ti el texto del mensaje en response.output_text.

Streaming

Establece stream en true para recibir server-sent events. Cada trama tiene una línea event: con el nombre del evento y una línea data: con un objeto JSON; el objeto repite el nombre en type. Asocia los deltas con su elemento mediante output_index.

Con el SDK de OpenAI, lee los eventos por su 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")

Los eventos llegan en este orden. Los grupos de razonamiento, mensaje y llamadas a herramientas aparecen solo cuando la respuesta los tiene.

Evento Carga Cuándo
response.created response Siempre el primero. response.status es in_progress y response.output está vacío.
response.in_progress response Siempre el segundo, con el mismo objeto.
response.output_item.added output_index, item Empieza el razonamiento: un elemento reasoning con summary vacío.
response.reasoning_summary_text.delta output_index, summary_index, delta Un fragmento del razonamiento.
response.reasoning_summary_text.done output_index, summary_index, text El razonamiento está completo: su text entero.
response.output_item.done output_index, item El elemento reasoning terminado.
response.output_item.added output_index, item Empieza la respuesta: un elemento message con estado in_progress y sin contenido.
response.content_part.added output_index, content_index, part Se abre una parte output_text vacía.
response.output_text.delta output_index, content_index, delta Un fragmento de la respuesta.
response.output_text.done output_index, content_index, text La respuesta está completa: su text entero.
response.content_part.done output_index, content_index, part La parte output_text terminada.
response.output_item.done output_index, item El elemento message terminado, con estado completed.
response.output_item.added output_index, item Empieza una llamada a herramienta: un elemento function_call con call_id, name y arguments vacío.
response.function_call_arguments.delta output_index, delta Los argumentos de la llamada, completos en un solo delta.
response.function_call_arguments.done output_index, arguments Los mismos argumentos, como arguments.
response.output_item.done output_index, item El elemento function_call terminado.
response.completed response Siempre el último si todo va bien: el objeto de respuesta completo con output y 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}, …}}

Un stream que falla

En los niveles Shannon una respuesta fallida termina con response.failed en lugar de response.completed. Su response.status es failed y response.error contiene un code, rate_limit_exceeded o server_error, y un message.

En los modelos de pesos abiertos alojados un fallo es un evento error con code api_error y un message. response.completed lo sigue de todos modos.

Considera fallido un stream cuando contiene un evento response.failed o error, y envía la solicitud de nuevo.

Herramientas

Una herramienta es una función que ejecuta tu código. Descríbela en tools; cuando el modelo la quiere, la respuesta contiene un elemento function_call en lugar del mensaje o junto a él.

Una definición de herramienta en tools:

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

El output de una respuesta que la llama:

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

Ejecuta la función y envía la solicitud de nuevo con la llamada y su resultado añadidos 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\"}"
  }
]

Solo se leen las herramientas de tipo function. En shannon-1.6-*, shannon-2-* y shannon-coder-1 el esquema de parameters se reduce a las palabras clave comunes de JSON Schema: oneOf se lee como anyOf, y palabras clave como $ref, additionalProperties, const, default y title no se pasan al modelo.

Los valores de tool_choice required y una función con nombre los aplican los modelos de pesos abiertos alojados.

El bucle de herramientas se describe por completo en su propia página. Llamadas a funciones

Salida estructurada

Este formato escribe la salida estructurada como text.format. El esquema va directamente en format, junto a name y strict, no bajo un miembro json_schema como en Chat Completions.

  • {"type": "json_object"} pide cualquier objeto JSON.
  • {"type": "json_schema", "name", "schema", "strict"} pide JSON que siga tu esquema. strict es true cuando lo omites.
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"
        ]
      }
    }
  }
}

El JSON llega como texto en la parte output_text del mensaje; analízalo tú mismo. Un modelo de pesos abiertos alojado sin salida estructurada devuelve 400.

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

Qué modelo acepta cada forma se enumera en su propia página. Salidas estructuradas

Razonamiento

Un modelo que razona devuelve su razonamiento como un elemento de salida de tipo reasoning, antes del mensaje. En un stream llega como eventos response.reasoning_summary_text.delta.

Los modelos de pesos abiertos alojados aplican reasoning.effort: off, low, medium o high, con high cuando no envías nada. off no devuelve ningún elemento de razonamiento. Envíalo como objeto; una cadena simple no se lee en este endpoint.

Los esfuerzos se describen en su propia página. Esfuerzo de razonamiento

Límite de salida

max_output_tokens es 4,096 cuando no lo envías. Es la cantidad de tokens que se reserva de tu saldo al empezar la solicitud; cuando la respuesta está completa, esa cantidad se sustituye por lo que usó la solicitud. Un valor que no cabe en tu saldo restante devuelve 429 Quota exceeded.

Limita la longitud de la respuesta en shannon-1.6-*, shannon-2-* y shannon-coder-1, y la longitud del texto de la respuesta en los modelos de pesos abiertos alojados.

En este endpoint shannon-coder-1 se cobra en tokens de tu saldo, como cualquier otro modelo.

El cuerpo de una solicitud puede tener hasta 32 MiB. Límites y saldo

Errores

Los errores usan el cuerpo de error de OpenAI: un objeto error con type y message; algunos llevan también code y param con el valor null. La tabla enumera lo que este endpoint devuelve con más frecuencia. La lista completa, con qué reintentar, tiene su propia página. Manejo de errores

Estado Tipo Mensaje Cuándo
401 authentication_error Missing authentication
Invalid API key
No se envió ninguna clave API, o la clave es desconocida o fue revocada.
400 invalid_request_error unknown model: <id> Falta model o no es un id publicado.
400 invalid_request_error No user message provided. Niveles Shannon: input no contiene texto de usuario.
400 invalid_request_error <id> does not accept image input Se envió una imagen a un modelo de pesos abiertos alojado sin entrada de imágenes.
400 invalid_request_error <id> does not accept response_format Se envió text.format a un modelo de pesos abiertos alojado sin salida estructurada.
400 invalid_request_error unknown reasoning effort '<value>'; expected off, low, medium or high reasoning.effort contiene un valor fuera de la lista.
422 invalid_request_error Failed to deserialize the JSON body into the target type: … El cuerpo es JSON válido, pero un campo tiene el tipo incorrecto.
429 rate_limit_error Quota exceeded. Upgrade your plan at shannon-ai.com/plan max_output_tokens es mayor que lo que queda de tu saldo.
429 rate_limit_error Too many requests. Retry in <n>s. Protección contra flood: más de 120 solicitudes en un minuto en tu cuenta.
500 api_error The model backend failed to answer. Please retry. El modelo no produjo una respuesta. Envía la solicitud de nuevo.
502 api_error The model backend failed to answer. Please retry. Lo mismo, en los modelos de pesos abiertos alojados.
504 api_error upstream timed out Un modelo de pesos abiertos alojado tardó más que el límite de tiempo de una respuesta sin stream. Envíala con stream establecido en true.