Chat

Chat completions

La API Chat Completions de OpenAI, para todos los modelos de texto: la misma petición y la misma respuesta, el mismo streaming, los mismos SDK.

POST/v1/chat/completions

Petición

modelstringobligatorio
Un ID de modelo de la página de modelos, como claude-opus-5-5 o gpt-6-sol.
messagesarrayobligatorio
La conversación: mensajes system (o developer), user, assistant y tool. content es una cadena, o un array de partes para añadir imágenes, PDF, audio o vídeo.
streamboolean
Envía la respuesta como server-sent events mientras se escribe. Consulta Streaming más abajo.
stream_optionsobject
{ "include_usage": true } añade un fragmento final con el uso de tokens.
max_completion_tokensinteger
El máximo de tokens a generar, razonamiento incluido. max_tokens también funciona.
temperaturenumber
De 0 a 2. Más bajo es más centrado, más alto más variado. Algunos modelos de razonamiento lo ignoran. Claude desde Opus 4.7 en adelante (Opus 5 y 5.5, Fable 5 y 5.1, Sonnet 5.5, Haiku 5.5) no lo acepta, así que lo omitimos en esos modelos.
top_pnumber
Muestreo de núcleo, de 0 a 1. Cambia este parámetro o temperature, no ambos. Se omite en los mismos modelos Claude, igual que top_k en ellos y en Muse Wonder.
stopstring | array
Hasta 4 secuencias en las que se detiene la generación.
toolsarray
Funciones que el modelo puede llamar. Consulta Llamada a herramientas más abajo.
tool_choicestring | object
auto, none, required o una función concreta. Cuando el laboratorio de un modelo rechaza o ignora una opción (una herramienta forzada en Claude Opus 5.5, Sonnet 5.5 y Fable 5.1; cualquier cosa salvo auto en Muse Wonder; none en algunos modelos Gemini, DeepSeek Flash, MiMo, HY4 y MiniMax), la enviamos en una forma que el modelo respeta y le indicamos al modelo lo que pediste; una función forzada por nombre va como la única ofrecida.
response_formatobject
Salida JSON: { "type": "json_object" }, o json_schema con un esquema. Consulta Salida estructurada más abajo.
reasoning_effortstring
Cuánto razona un modelo de razonamiento: none, minimal, low, medium, high, xhigh o max. Cada modelo acepta algunos de estos (consulta Razonamiento más abajo); otro nivel se ejecuta en el más cercano que acepte. Más alto razona más tiempo y cuesta más tokens de salida.
seedinteger
Reproducibilidad en la medida de lo posible, para los modelos que la admiten.
modelsarray
Enrutamiento inteligente para esta petición: alternativas que probar, en orden, si el modelo está caído. Consulta Enrutamiento inteligente.
Otros parámetros de OpenAI se pasan al modelo sin cambios, excepto user y metadata, que se quedan con nosotros. Qué parámetros respeta un modelo (herramientas, esquemas JSON, razonamiento) depende del modelo, igual que con su propio laboratorio. Con el SDK de Python de OpenAI, envía models como extra_body={"models": [...]}.

Respuesta

Respuesta
{
"id": "chatcmpl-AbC123...",
"object": "chat.completion",
"created": 1790870400,
"model": "claude-opus-5-5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Here's the summary..."
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1204,
"completion_tokens": 312,
"total_tokens": 1516,
"prompt_tokens_details": { "cached_tokens": 1024 },
"completion_tokens_details": { "reasoning_tokens": 128 }
}
}
  • model es el modelo que respondió. Es el que pediste, salvo que el enrutamiento inteligente haya respondido con una alternativa.
  • Los modelos de razonamiento pueden añadir reasoning_content al mensaje: el razonamiento del modelo, cuando lo comparte.
  • usage es lo que se te factura. cached_tokens son tokens de entrada leídos de la caché de prompts del modelo, facturados al precio de caché donde el modelo lo tenga.

Todas las respuestas incluyen además estas cabeceras:

CabeceraValor
x-request-idEl ID de la petición, tal como aparece en tu registro de peticiones. Cítalo al contactar con soporte.
x-zurelay-modelEl modelo que respondió.
x-zurelay-routed-fromSolo tras el enrutamiento inteligente: el modelo que pediste.
x-zurelay-reasoning-effortSolo cuando la petición definió un nivel de razonamiento: el nivel al que se ejecutó el modelo, el más cercano que acepta (consulta Razonamiento).
x-zurelay-stoppedSolo cuando el saldo o el presupuesto de la clave se agotó a mitad, o la respuesta alcanzó el max_tokens al que se redujo porque no alcanzaba para más: insufficient_quota, key_budget_exceeded o key_daily_budget_exceeded. La respuesta es lo que se escribió hasta entonces, con finish_reason: "length".

Streaming

Con stream: true, la respuesta llega como server-sent events en el formato de fragmentos de OpenAI, terminando con data: [DONE]. Todos los SDK los leen por ti.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
stream = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[
{
"role": "user",
"content": "Write a limerick about databases."
}
],
stream=True,
stream_options={
"include_usage": True
},
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
  • No se envía ninguna respuesta hasta que el modelo ha producido su primer token, así que un reintento o un cambio a otra ruta pasa inadvertido para ti.
  • Los tramos de silencio (un modelo razonando entre pasos) se rellenan con líneas de comentario SSE (: keep-alive) cada 15 segundos. Los clientes las ignoran; evitan que los proxies cierren la conexión. Si el primer token tarda más de 20 segundos (un prompt largo, o una ruta que se bloqueó y está siendo reemplazada), el stream se abre entonces: las cabeceras y los comentarios de keep-alive llegan mientras esperas. Cada ruta tiene hasta 3 minutos para arrancar (5 con un nivel de razonamiento alto) antes de probar la siguiente, así que configura el timeout de tu cliente a 10 minutos.
  • Un stream que se abrió antes de su primer token solo incluye x-zurelay-model cuando ningún otro modelo puede responderla (enrutamiento inteligente desactivado), y un error posterior a su apertura llega como un evento de error en el stream (con la misma forma que el cuerpo del error) en lugar de un estado de error.
  • Con include_usage, el último fragmento antes de [DONE] tiene una lista choices vacía y el usage.

Llamadas a herramientas

Describe funciones en tools; cuando el modelo quiere una, responde con tool_calls en lugar de texto. Ejecuta la función, envía el resultado de vuelta como mensaje tool con el ID de la llamada, y el modelo continúa.

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gpt-6-sol",
messages=[
{
"role": "user",
"content": "What's the weather in Lisbon right now?"
}
],
tools=[
{
"type": "function",
"function": {
"name": "get_weather",
"description": "Current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string"
}
},
"required": [
"city"
]
}
}
}
],
)
print(response.choices[0].message.content)

Salida estructurada

Pide JSON con response_format. Un json_schema obliga a los modelos que lo admiten a seguir tu esquema; json_object pide cualquier JSON válido (indícalo también en tu prompt).

import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.zurelay.com/v1",
api_key=os.environ["ZURELAY_API_KEY"],
)
response = client.chat.completions.create(
model="gpt-6.1-sol",
messages=[
{
"role": "user",
"content": "Extract the people: 'Ana met Ben and Chloe in Porto.'"
}
],
response_format={
"type": "json_schema",
"json_schema": {
"name": "people",
"schema": {
"type": "object",
"properties": {
"names": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"names"
]
}
}
},
)
print(response.choices[0].message.content)

Razonamiento

Los modelos de razonamiento piensan antes de responder. Configura reasoning_effort para cambiar velocidad y coste por profundidad: un nivel más alto piensa más tiempo, tarda más y usa más tokens de salida. Cada modelo acepta los niveles que documenta su laboratorio, desde none (sin pensar) pasando por minimal, low, medium, high y xhigh (extra alto) hasta max; la tabla de abajo los enumera. Si lo omites, el modelo usa su nivel por defecto. Funciona igual con cualquier OpenAI SDK, y puedes probar cada nivel en el Playground del panel.

from openai import OpenAI
client = OpenAI(base_url="https://api.zurelay.com/v1", api_key="YOUR_ZURELAY_KEY")
response = client.chat.completions.create(
model="zurelay-auto",
reasoning_effort="high",
messages=[{"role": "user", "content": "How many primes are there below 1,000?"}],
)
message = response.choices[0].message
print(getattr(message, "reasoning_content", None)) # the thinking, when the model shares it
print(message.content)

El razonamiento vuelve junto con la respuesta en message.reasoning_content (al hacer streaming, en delta.reasoning_content) en los modelos que lo comparten; algunos llaman al campo reasoning. Se factura como tokens de salida y siempre forma parte de completion_tokens; completion_tokens_details.reasoning_tokens lo cuenta aparte cuando el modelo lo informa. Con un esfuerzo alto, una respuesta puede tardar minutos en empezar, así que dale a tu cliente un timeout generoso (consulta Fiabilidad y timeouts).

Niveles de cada modelo

Según la documentación de cada laboratorio. Si un modelo no acepta un nivel, se ejecuta en el más cercano que sí acepta (si hay dos igual de cercanos, el inferior; y el razonamiento solo se desactiva cuando envías none), así que una misma petición funciona en todos los modelos, incluido el enrutado inteligente. La cabecera de respuesta x-zurelay-reasoning-effort indica qué nivel se ejecutó. Una palabra que no sea un nivel se rechaza con un 400 que enumera los niveles del modelo.

ModeloIDNivelesPredeterminado
Abliterated Large V2abliterated-large-v2low, high, maxmax
Claude Fable 5claude-fable-5low, medium, high, xhigh, maxhigh
Claude Fable 5.1claude-fable-5-1low, medium, high, xhigh, maxhigh
Claude Haiku 5.5claude-haiku-5-5low, medium, high, xhigh, maxmedium
Claude Opus 4.6claude-opus-4-6low, medium, high, maxDesactivado hasta que definas un nivel
Claude Opus 4.7claude-opus-4-7low, medium, high, xhigh, maxDesactivado hasta que definas un nivel
Claude Opus 4.8claude-opus-4-8low, medium, high, xhigh, maxDesactivado hasta que definas un nivel
Claude Opus 5claude-opus-5low, medium, high, xhigh, maxhigh
Claude Opus 5.5claude-opus-5-5low, medium, high, xhigh, maxmedium
Claude Sonnet 5.5claude-sonnet-5-5low, medium, high, xhigh, maxhigh
DeepSeek V4 Flashdeepseek-v4-flashnone, high, maxhigh
DeepSeek V4 Flash 0731deepseek-v4-flash-0731none, low, high, maxhigh
DeepSeek V4 Pro 0813deepseek-v4-pro-0813none, low, high, maxhigh
DeepSeek V4.1 Flashdeepseek-v4.1-flashnone, high, maxhigh
DeepSeek V4.1 Flash 1017deepseek-v4.1-flash-1017none, high, maxhigh
Gemini 3.1 Flash-Litegemini-3.1-flash-liteminimal, low, medium, highminimal
Gemini 3.1 Progemini-3.1-prolow, medium, highhigh
Gemini 3.5 Flash-Litegemini-3.5-flash-liteminimal, low, medium, highminimal
Gemini 3.7 Flashgemini-3.7-flashlow, medium, highmedium
Gemini 3.8 Flashgemini-3.8-flashlow, medium, highmedium
Gemini 4 Argongemini-4-argonlow, medium, highmedium
GLM-5.2glm-5.2none, high, maxmax
GLM-5.3glm-5.3low, high, maxmax
GLM-5.3 Flashglm-5.3-flashlow, high, maxmax
GLM-5.3 FlashXglm-5.3-flashxlow, high, maxmax
GPT-5.6 Lunagpt-5.6-lunanone, low, medium, high, xhigh, maxmedium
GPT-5.6 Solgpt-5.6-solnone, low, medium, high, xhigh, maxmedium
GPT-5.6 Terragpt-5.6-terranone, low, medium, high, xhigh, maxmedium
GPT-6 Astragpt-6-astralow, medium, high, xhigh, maxmedium
GPT-6 Lunagpt-6-lunanone, low, medium, high, xhigh, maxmedium
GPT-6 Solgpt-6-solnone, low, medium, high, xhigh, maxmedium
GPT-6.1 Solgpt-6.1-sollow, medium, high, xhigh, maxmedium
GPT-6.1 Terragpt-6.1-terranone, low, medium, high, xhigh, maxmedium
Grok 4.7grok-4.7low, medium, high, xhighhigh
HY4 Previewhy4-previewnone, highhigh
Kimi K2.5kimi-k2.5none, highhigh
Kimi K2.6kimi-k2.6none, highhigh
Kimi K3kimi-k3low, high, maxmax
Kimi K3.1 Prokimi-k3.1-prolow, high, maxmax
Kimi K3.1 Pro Highspeedkimi-k3.1-pro-highspeedlow, high, maxmax
MiMo V2.6 Flashmimo-v2.6-flashnone, highhigh
MiMo V2.6 Promimo-v2.6-pronone, highhigh
MiniMax M3minimax-m3none, highhigh
MiniMax M3.1 Flashminimax-m3.1-flashlow, medium, high, xhigh, maxmax
Muse Spark 1.3 Contributormuse-spark-1.3-contributorminimal, low, medium, high, xhighmedium
Muse Wondermuse-wonder-1.0minimal, low, medium, high, xhigh, maxhigh
Qwen 3.8 Flashqwen3.8-flashnone, low, medium, xhighxhigh
Qwen 3.8 Maxqwen3.8-maxnone, low, medium, xhighxhigh
Qwen 3.8 Omni Flashqwen3.8-omni-flashnone, low, medium, xhighxhigh
Paso 5 Previewstep-5-previewlow, medium, highmedium
Zurelay Autozurelay-autonone, minimal, low, medium, high, xhigh, maxDesactivado hasta que definas un nivel
MiniMax M2.5minimax-m2.5Nada que configurarSiempre razona
Claude Haiku 4.5claude-haiku-4-5Ninguno (un presupuesto de razonamiento en formato Anthropic)Desactivado
Ministral 3 14Bministral-3-14bNingunoDesactivado
Ministral 3 3Bministral-3-3bNingunoDesactivado

El razonamiento de Claude

A través de este endpoint, Claude acepta reasoning_effort como cualquier otro modelo: low, medium, high, xhigh o max (Opus 4.6 no tiene xhigh). En el formato propio de Anthropic, Claude razona de forma adaptativa según un nivel: envía thinking: { type: "adaptive", display: "summarized" } con output_config: { effort: "xhigh" } y lee los bloques de razonamiento. Consulta Anthropic Messages.

¿Tienes dudas o falta algo? Escribe a nuestro equipo de soporte y te responderemos por email, normalmente en menos de un minuto.