Chat completions
POST /v1/chat/completions sigue el formato de OpenAI. Zabio no guarda nada de estas llamadas salvo que tu API key tenga activado el registro de cuerpos (consulta Organizaciones y equipos). La key necesita el scope chat (las keys lo tienen por defecto).
Para la forma exacta de cada petición y respuesta, con ejemplos en curl, Python y Node, consulta la Referencia de la API.
Campos de la petición
Section titled “Campos de la petición”| Campo | Soporte | Notas |
|---|---|---|
model |
no | un id del catálogo o auto, auto/best, auto/balanced, auto/cheap. Si se omite, es auto |
messages |
sí | de 1 a 4096 mensajes. Roles: system, developer, user, assistant, tool. Los mensajes system y developer se unen en un solo system prompt. El rol antiguo function se rechaza |
messages[].content |
sí | una cadena o un array de partes. Los mensajes user aceptan partes text e image_url; el resto de roles solo partes text |
tools |
sí | hasta 256 herramientas de tipo function. parameters toma por defecto un esquema de objeto vacío |
tool_choice |
sí | auto, none, required o {"type": "function", "function": {"name": "..."}}; requiere tools salvo que sea none |
parallel_tool_calls |
sí | se pasa al proveedor cuando lo soporta |
max_tokens, max_completion_tokens |
sí | max_completion_tokens gana cuando están los dos. Por defecto 16000, limitado a la salida máxima del modelo. Un valor por encima de la salida máxima del modelo servido se baja a ese límite, en cada intento, para que auto y el fallback nunca envíen al proveedor un presupuesto que rechace |
temperature |
sí | de 0 a 2. Se omite para un modelo que no lo admite, y se nombra en zabio.dropped_parameters y en la cabecera x-zabio-dropped-params; consulta Parámetros de muestreo por modelo |
top_p |
sí | de 0 a 1. Se omite para un modelo que no lo admite, y se nombra en zabio.dropped_parameters y en la cabecera x-zabio-dropped-params; consulta Parámetros de muestreo por modelo |
stop |
sí | una cadena o hasta 4 cadenas. Donde el proveedor del modelo no lo admite, Zabio corta la respuesta en la primera secuencia, así que siempre se respeta |
stream |
sí | server sent events, ver más abajo |
stream_options.include_usage |
se acepta | el chunk final de uso se envía siempre, así que este flag no cambia nada |
response_format |
sí | text, json_object o json_schema; ver salida estructurada más abajo |
reasoning_effort |
sí | none, minimal, low, medium, high o xhigh, una sola escala para todos los proveedores, aplicada al control propio del modelo servido e indicada en zabio.reasoning. Con auto, no lo envíes y Zabio elige el ajuste junto con el modelo; consulta Niveles de razonamiento |
user, metadata |
sí | se reenvían como metadatos de la petición |
n |
solo 1 | n mayor que 1 se rechaza |
seed, logit_bias, presence_penalty, frequency_penalty |
se ignoran | se aceptan para que los valores por defecto de los SDK no fallen; aparecen en zabio.ignored_parameters cuando llevan un valor distinto del predeterminado |
logprobs, top_logprobs, audio, prediction, web_search_options, modalities distintas de texto |
se rechazan | 400 unsupported_parameter |
zabio |
sí | las opciones de Zabio, más abajo |
Los cuerpos de petición están limitados a 32 MB (413 payload_too_large).
El objeto zabio de la petición
Section titled “El objeto zabio de la petición”{ "model": "auto", "messages": [...], "zabio": { "session_id": "chat-7f3a", "vendors": ["anthropic", "openai"], "fallback": "same_vendor", "cache": {"ttl": "1h", "breakpoints": "auto"}, "split": "auto", "deadline": "30m" }}| Campo | Valores | Qué hace |
|---|---|---|
session_id |
cualquier cadena de hasta 128 caracteres | agrupa llamadas para reutilizar la decisión de enrutado y acumular señales. Consulta Modelos y enrutado |
vendors |
lista con anthropic, openai, google |
solo estos proveedores son candidatos |
fallback |
same_vendor, cross_vendor, none |
qué pasa cuando un modelo nombrado explícitamente no está disponible. Por defecto: el fallback_policy de la key |
cache.ttl |
5m, 1h, none |
duración de la caché de prompt cuando el proveedor la ofrece. Anthropic: 5 minutos o 1 hora (la de 1 hora cuesta más escribirla). En OpenAI la caché es automática y este valor se ignora. Google y los demás proveedores con un precio de caché publicado guardan en caché de forma automática, así que con ellos este valor también se ignora. La caché es automática en cada llamada, a auto o a un modelo nombrado; none la desactiva. Por defecto: 5m, la duración que se usa cuando Zabio escribe. Un prompt largo (1,024 tokens o más) se escribe en la caché en su segunda aparición, no en la primera: la primera vez se envía sin escritura, y cuando el mismo prompt, o el mismo system prompt con las mismas herramientas, vuelve dentro de la vida de la caché, se escribe y las llamadas siguientes lo leen. Un prompt enviado una sola vez nunca paga la escritura. Las llamadas de una session_id, las peticiones que llevan turnos anteriores de la conversación y las peticiones que fijan cache.ttl se escriben enseguida. Con ese valor por defecto, una llamada de una session_id cuyo turno anterior fue hace más de cinco minutos recibe 1h: una caché de 5 minutos habría caducado y se reescribiría en cada turno, lo que cuesta más que no usar caché. zabio.cache.ttl_applied informa de la elección. Dentro de un lote el valor por defecto es none: una línea de lote solo usa caché cuando lo pide |
cache.breakpoints |
auto, none |
auto coloca marcadores de caché en el system prompt, en la última herramienta, en el último mensaje y en el turno anterior del usuario, de modo que el historial de una conversación se guarda en caché de un turno al siguiente; none desactiva la caché para esta llamada y fuerza ttl a none |
split |
auto, off |
si Zabio puede dividir una petición grande con auto (ver División y enrutado): un modelo barato copia las líneas relevantes de una fuente grande y el modelo enrutado responde sobre ese extracto, cuando sale más barato. off envía la petición entera. Por defecto auto. No es un ajuste de la key: la elección va en la petición |
deadline |
una duración con unidades s, m o h (15m, 1h, 24h), hasta 168h |
cuánto puede tardar la respuesta. Sin valor o por debajo de 15 minutos, no cambia nada. A partir de 15 minutos, la llamada puede servirse en el nivel flex del proveedor cuando el modelo lo tiene: el mismo modelo a la mitad de precio, más despacio (ver Nivel flex). No garantiza un plazo de entrega, y no es un ajuste de la key: la elección va en la petición |
Si tu SDK rechaza campos desconocidos en el cuerpo, envía los mismos valores como cabeceras. Las cabeceras tienen prioridad sobre el cuerpo.
| Cabecera | Equivale a |
|---|---|
x-zabio-session-id |
zabio.session_id |
x-zabio-cache-ttl |
zabio.cache.ttl |
x-zabio-fallback |
zabio.fallback |
x-zabio-split |
zabio.split |
x-zabio-deadline |
zabio.deadline |
Streaming
Section titled “Streaming”Con stream: true la respuesta es text/event-stream. Cada evento es una línea data: con un chat.completion.chunk. El orden es: un chunk con delta.role, los deltas de contenido y de llamadas a herramientas, un chunk con finish_reason, después un chunk de uso con choices vacío, el bloque usage y el objeto zabio, y por último data: [DONE].
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Hola"},"finish_reason":null}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-...","object":"chat.completion.chunk","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":9,"total_tokens":21},"zabio":{...}}
data: [DONE]El chunk de uso se envía siempre. Si la conexión con el proveedor falla a mitad del stream, se envía un objeto error en un chunk y el stream termina.
Llamadas largas
Section titled “Llamadas largas”Algunas llamadas tardan minutos: una salida larga, o un modelo potente que piensa un rato antes de responder. Zabio permite que un intento con el proveedor dure hasta 600 segundos en los modelos powerful y frontier (180 segundos en los demás) y mantiene viva la conexión, para que nada entre tú y el proveedor se rinda antes.
- Sin streaming. Si el proveedor no ha respondido a los 90 segundos, Zabio confirma el estado
200y las cabeceras y escribe un espacio cada 20 segundos hasta que llega la respuesta; el cuerpo JSON viene después de los espacios, y todos los parsers de JSON los ignoran. Un fallo a partir de ese momento ya no puede cambiar el estado, así que el cuerpo es entonces unchat.completioncon la listachoicesvacía y un objetoerroral lado (message,type,code). Compruebaerrorcuandochoicesesté vacía. Las llamadas respondidas antes de 90 segundos son exactamente las de siempre, códigos de estado incluidos. - Con streaming. Desde unos 20 segundos, y siempre que el proveedor calla durante 20 segundos, Zabio envía una línea de comentario SSE (
: keepalive), que los clientes SSE ignoran. Un fallo antes de que llegue ningún dato viene como un evento de error,data: {"error": {...}}, seguido dedata: [DONE]; los SDK oficiales lanzan una excepción con él. - Tu propio timeout. Pon el timeout de petición de tu cliente en al menos 600 segundos para los modelos powerful y frontier. Los SDK de OpenAI usan 600 segundos por defecto; LangChain y el Vercel AI SDK no tienen timeout por defecto.
- Si te desconectas. Cerrar la conexión cancela la llamada al proveedor. Una llamada sin streaming no te cuesta nada; un stream se factura por los tokens entregados antes de la desconexión.
- Cabeceras en una llamada mantenida viva. Las cabeceras
x-zabio-*se enviaron antes de elegir el proveedor, así que en esa llamada no llevan proveedor; el proveedor, el modelo servido y el enrutado están en el objetozabiodel cuerpo, como siempre.
División y enrutado
Section titled “División y enrutado”Con auto, una petición grande puede responderse en dos pasos cuando sale más barato: un modelo barato copia, palabra por palabra, las líneas de tu fuente que la pregunta necesita, y el modelo que eligió el enrutado responde sobre ese extracto en lugar de sobre la fuente entera. Zabio lo hace solo cuando el último mensaje del usuario es texto plano de varios miles de tokens con una pregunta aparte que necesita una parte de él, la petición no lleva herramientas ni imágenes, su propia estimación dice que la división cuesta como máximo el 70 por ciento de la llamada entera, una comprobación confirma que el extracto contiene lo que la pregunta nombra y todas las salvaguardas pasan; si no, la petición va entera, como siempre. Al modelo que responde se le dice que el material se extractó y puede contestar con la línea NEED_MORE_SOURCE; en ese caso Zabio envía la petición completa al mismo modelo y devuelve esa respuesta. Un modelo con nombre nunca se divide. Envía zabio.split: "off" (o la cabecera x-zabio-split: off) para mandar una petición entera. Cada paso, modelo y coste está en zabio.split, y una división nunca te cuesta más que la llamada entera. Consulta División y enrutado para saber qué ve el modelo y Facturación para la comisión.
Tareas de clasificación en auto
Section titled “Tareas de clasificación en auto”Con auto, una petición cuyo response_format es un json_schema formado solo por opciones fijas (enum), booleanos y enteros o números acotados, sin herramientas, imágenes ni stream, puede responderla Jev (jev-1.13.0) en lugar del modelo de texto que eligió el enrutado, cuando la estimación de Zabio dice que Jev es más barato. Jev responde en unos 0.15 segundos con la probabilidad calibrada de cada respuesta; cuando algún campo de su respuesta está por debajo de 0.5, Zabio la descarta y responde el modelo de texto como siempre, a coste de Zabio. Lo sabes por zabio.model_served (jev-1.13.0) y zabio.decision; la respuesta conserva la forma de tu esquema. Un modelo con nombre nunca lo responde Jev. Ver Tareas de clasificación en auto.
Nivel flex
Section titled “Nivel flex”OpenAI (flex processing) y Google (Flex inference) sirven el mismo modelo a la mitad de precio, más o menos, cuando puedes esperar: su propio objetivo de latencia llega a 15 minutos, y la capacidad es la que haya en cada momento. Zabio usa estos niveles cuando tu petición dice que puede esperar: envía zabio.deadline (o la cabecera x-zabio-deadline) con una duración de 15 minutos o más, por ejemplo "30m" o "2h". Un plazo menor de 15 minutos, o ninguno, no cambia nada.
- Qué modelos. Los modelos de chat GPT-5, GPT-5.x y GPT-6 de OpenAI,
o3yo4-mini; todos los modelos Gemini de Google. Los precios flex son la mitad de los precios estándar de entrada, salida y lectura de caché, salvo la entrada en caché degpt-5.4y deo4-mini, que OpenAI publica a 0.13 y 0.138 USD por millón de tokens. Los demás modelos (la familia GPT-4,o1,o3-mini,chat-latesty todos los de Anthropic, DeepSeek, xAI, Mistral y Together AI) no tienen nivel flex y se sirven y facturan a precio estándar, con plazo o sin él. - Con
auto. El enrutado compara los candidatos a su precio flex cuando el modelo lo tiene, así queautopuede elegir un modelo porque sale más barato en flex. Un modelo con nombre se sirve en flex cuando tiene precio flex. - Nunca una llamada fallida. Cuando el proveedor rechaza una petición flex por falta de capacidad (OpenAI responde 429 resource unavailable, Google 503 o 429), Zabio reintenta al momento el mismo modelo en el nivel estándar y factura el precio que se usó de verdad.
zabio.tier.fallbackes entoncescapacity. - Tiempo. Un intento flex puede tardar hasta 900 segundos; Zabio mantiene la conexión viva mientras tanto, como se explica en Llamadas largas. Pon el timeout de tu cliente en al menos 900 segundos cuando envíes un plazo.
- Qué ves.
zabio.tierindicarequested(flexostandard, a qué se tradujo tu plazo),applied(qué sirvió la llamada) yfallback(capacitycuando se rechazó flex). - La comisión. El ahorro de una llamada flex se mide contra el precio flex del modelo de referencia de tu key, o contra su precio estándar cuando ese modelo no tiene nivel flex, porque eso es lo que habrías pagado allí. Zabio nunca se queda una parte del descuento del propio proveedor. Ver Facturación.
- División y enrutado. Los pasos previos de una división (el extracto y las comprobaciones) se ejecutan en el nivel estándar; solo la respuesta puede ir en flex.
El trabajo que puede esperar un día va por Lotes (/v1/files y /v1/batches), donde cada línea se cobra a los precios por lotes de los proveedores, o por una response en segundo plano con un deadline de 24 horas o más, que se suma al siguiente lote de tu organización sin archivo. Una llamada síncrona con ese plazo no puede esperar tanto en una sola conexión, así que se sirve en el nivel flex cuando el modelo lo tiene (en estándar si no) y zabio.tier lo indica: {"requested": "batch", "applied": "flex", "fallback": "synchronous"}.
Imágenes
Section titled “Imágenes”Los mensajes user pueden contener partes image_url:
{"role": "user", "content": [ {"type": "text", "text": "¿Qué hay en esta imagen?"}, {"type": "image_url", "image_url": {"url": "https://example.com/foto.jpg"}}]}url es una URL http(s) o un data URI con la forma data:image/<tipo>;base64,<datos>. Zabio descarga las URL y envía los bytes al proveedor, así que todos los proveedores reciben la misma entrada. Reglas para las URL:
- solo hosts públicos; se rechazan las direcciones de rangos privados, loopback, link local u otros rangos internos
- como máximo 20 MB por imagen, hasta 20 imágenes por petición
- el servidor debe responder con
image/png,image/jpeg,image/webpoimage/gif - como máximo 3 redirecciones, solo
http(s), 15 segundos de tiempo límite
Los fallos devuelven 400 invalid_image_url con param apuntando a la parte que falló. Una petición con imágenes solo se enruta a modelos con visión.
Herramientas
Section titled “Herramientas”Las herramientas de tipo función funcionan como en OpenAI. Envía tools, recibe tool_calls en el mensaje del asistente con finish_reason: "tool_calls", y responde con mensajes tool que lleven tool_call_id. Los argumentos son siempre una cadena JSON ({} cuando está vacía). Las peticiones con herramientas solo se enrutan a modelos que las soportan.
Salida estructurada
Section titled “Salida estructurada”response_format.type |
Comportamiento |
|---|---|
text |
por defecto |
json_object |
OpenAI, Google, DeepSeek, xAI, Mistral AI y Together AI usan su modo JSON nativo. Anthropic no tiene modo JSON object: Zabio añade una instrucción de sistema que pide exactamente un objeto JSON y nada más, arranca la respuesta dentro del objeto en los modelos que lo permiten, y elimina el bloque de código Markdown alrededor del objeto cuando el modelo lo añade de todas formas. Es un mecanismo de mejor esfuerzo por construcción. Valida la salida por tu parte cuando la respuesta pueda venir de un modelo de Anthropic, y prefiere json_schema siempre que conozcas la forma que quieres |
json_schema |
{"type": "json_schema", "json_schema": {"name": "...", "schema": {...}, "strict": true}}. Se traduce a la salida estructurada nativa de cada proveedor. schema es obligatorio. Solo se enruta a modelos con soporte json_schema (no a los modelos directos de DeepSeek). Con jev-1.13.0, el modelo de decisión, las propiedades del esquema son las preguntas que Jev responde, cada una con su probabilidad en zabio.decision; ver Modelos de decisión |
La respuesta
Section titled “La respuesta”Un objeto chat.completion estándar. usage.prompt_tokens cuenta todos los tokens de entrada, en caché o no, para que los totales coincidan con lo que procesó el proveedor; usage.prompt_tokens_details.cached_tokens es la parte en caché, y usage.completion_tokens_details.reasoning_tokens es el recuento del proveedor de tokens de razonamiento dentro de completion_tokens, presente cuando el proveedor lo informa. finish_reason es stop, length, tool_calls o content_filter. Zabio sirve exactamente una opción. Un modelo de razonamiento que gasta todo su presupuesto de salida pensando devuelve una respuesta vacía con finish_reason: "length": sube max_tokens para que deje sitio a la respuesta por encima del razonamiento, o baja reasoning_effort.
El objeto zabio de la respuesta
Section titled “El objeto zabio de la respuesta”| Campo | Tipo | Significado |
|---|---|---|
vendor |
cadena | quién sirvió la llamada: anthropic, openai, google, deepseek, xai, mistral, together o typesafe |
model_served |
cadena | el modelo que respondió; difiere del model que enviaste con auto y con los fallbacks |
routing |
objeto o ausente | line, task, task_type (el tipo de trabajo como etiqueta, ver Tipos de trabajo), difficulty, band, stakes, biased, cell, confidence (de 0 a 1), reason (la frase del clasificador), trigger (por qué se tomó la decisión; consulta Modelos y enrutado), classifier (quién decidió: typesafe/jev-1.13.0, o el clasificador de texto al que se recurrió; ausente en modelos explícitos), effort (el ajuste de razonamiento elegido junto con el modelo), effort_reason (por qué) y sticky (solo presente cuando la caché de prompt caliente de la sesión decidió la elección: el modelo que se mantuvo y el que habría elegido el precio en frío). Ausente en modelos explícitos sin información de enrutado |
reasoning |
objeto | requested (el nivel que enviaste, omitido si ninguno) y applied (lo que recibió el modelo servido: default, off, el nombre del nivel del proveedor, budget N, on, always on o not supported) |
cost_micros |
entero | lo que se te facturó, en millonésimas de dólar (1,000,000 micros = 1 USD) |
cost |
objeto | el desglose: vendor_micros (precio de lista del proveedor), service_fee_micros, call_fee_micros (la cantidad fija que paga una vez una petición auto, el precio de la elección automática del modelo; 0 en un modelo con nombre), savings_fee_micros y classifier_micros (ambos siempre 0, se mantienen para que los clientes existentes sigan leyéndolos), direct_micros (la misma llamada en el modelo de referencia de tu key con las mismas lecturas y escrituras de caché; igual al precio del proveedor en un modelo con nombre) y saved_micros (direct_micros menos cost_micros, nunca negativo: una llamada que costó más que su referencia indica 0 con saving_note "no saving on this call"; no aparece en auto mientras la referencia de tu key está pendiente); en auto, baseline dice si tu key ya tiene referencia (pending, model) o cuántas de las 20 llamadas correctas que necesita lleva (calls, calls_needed) |
byok |
booleano | true cuando la llamada usó tu propia key del proveedor |
cache |
objeto | read_tokens, write_tokens y ttl_applied (5m, 1h o vacío) |
session_id |
cadena | repite el id de sesión que enviaste |
escalated_from |
cadena | la línea y el modelo cuya respuesta auto sustituyó: en la Responses API cuando ese modelo pidió uno más potente, y en cualquier petición sin streaming cuando su respuesta no pasó la comprobación de Zabio |
compacted |
booleano | solo Responses API: el historial guardado se resumió antes de este turno |
vendor_stop_reason |
cadena | el motivo de parada propio del proveedor, para depurar |
ignored_parameters |
lista | campos de la petición que Zabio aceptó e ignoró |
dropped_parameters |
lista | parámetros de muestreo que el modelo que respondió no admite (temperature, top_p), omitidos de su petición; también la cabecera x-zabio-dropped-params |
attempts |
entero | cuántos proveedores se probaron antes de que uno respondiera |
decision |
objeto | cuando respondió jev-1.13.0, nombrado o elegido por auto para una tarea de clasificación: las probabilidades calibradas detrás de cada propiedad de la respuesta, ver Modelos de decisión |
no_answer |
string | presente cuando la petición terminó sin respuesta, con el presupuesto de salida gastado en razonamiento: qué pasó y qué cambiar. No se cobra. Consulta Respuestas comprobadas |
split |
objeto | presente mientras división y enrutado está activo: applied (true cuando la respuesta vino de un extracto de tu fuente), pattern (distill), reason (por qué no se dividió la petición: named_model, opt_out, not_eligible, below_threshold, jev_no, jev_failed, price_check), estimate (unsplit_micros, split_micros), steps (cada llamada de la división: role questions, extract, check o answer, con vendor, model, input_tokens, output_tokens, micros a precio de lista y billed), excerpt (lines_kept, lines_total, tokens, verbatim_rate), check_p (la probabilidad de la comprobación), fallback (la salvaguarda que mandó la petición entera) y saved_micros (en una división que se mantuvo, lo que ahorró la división frente a la petición entera, a precio de lista; aparece también mientras la referencia de tu key está pendiente). Ver División y enrutado |
tier |
objeto | el nivel de servicio: requested (standard, flex o batch, a qué se tradujo tu deadline: flex a partir de 15 minutos, batch a partir de 24 horas), applied (qué sirvió la llamada) y fallback (capacity cuando se pidió flex y el proveedor lo rechazó, de modo que el nivel estándar sirvió y fue el facturado; synchronous cuando el plazo pedía lotes en una llamada síncrona, que no puede esperar un día, así que sirvió flex o estándar). Ver Nivel flex |
plan |
objeto | presente en una llamada servida con los límites de Free (consulta Facturación): tier (free), reason (free_plan, la organización nunca ha recargado; zero_balance, una organización de pago en cero que continúa en el nivel gratuito), paid_would_use (con auto, el modelo que habría recibido una cuenta de pago, cuando es distinto del que respondió) y topup_url. Ausente en una llamada de pago. No confundir con tier, el nivel de procesamiento del proveedor |
Los campos con valor vacío se omiten, así que comprueba su presencia.
Cabeceras de respuesta
Section titled “Cabeceras de respuesta”| Cabecera | Significado |
|---|---|
x-request-id |
id para citar en las consultas a soporte |
x-zabio-vendor |
igual que zabio.vendor. En una llamada mantenida viva más de 90 segundos (ver Llamadas largas) las cabeceras salieron antes de elegir el proveedor, así que lee proveedor, modelo y enrutado del objeto zabio del cuerpo |
x-zabio-byok |
true cuando se usó tu propia key del proveedor |
x-zabio-balance-micros |
el saldo de créditos de tu organización tras la comprobación de admisión |
x-ratelimit-limit-requests, x-ratelimit-remaining-requests, x-ratelimit-reset-requests |
el cupo de peticiones por minuto de la key |
x-ratelimit-limit-tokens, x-ratelimit-remaining-tokens, x-ratelimit-reset-tokens |
el cupo de tokens por minuto de la key. Se cobra por adelantado con la estimación de entrada más el presupuesto de salida, limitado a lo que el modelo servido puede producir, y se ajusta tras la llamada; un max_tokens muy por encima de lo que la tarea necesita puede agotar el límite antes de tiempo, así que ponlo cerca de lo que necesitas |
x-zabio-quota-scope, x-zabio-quota-limit, x-zabio-quota-remaining |
presentes cuando se aplica un límite de gasto a la key (key, en su periodo) o la cuota mensual del miembro que la creó (member) |
x-zabio-plan |
free en toda llamada servida con los límites de Free; ausente en una llamada de pago |
x-ratelimit-limit-requests-day, x-ratelimit-remaining-requests-day, x-ratelimit-reset-requests-day |
el día del plan Free: 100 peticiones correctas, las que quedan y el tiempo hasta las 00:00 UTC. Solo con x-zabio-plan: free; en esas llamadas x-ratelimit-*-requests es el cupo del minuto de Free (20), más estricto que el propio de la key |
x-zabio-free-limit |
en un 429 o 403 free_tier_limit, qué límite se alcanzó: requests_per_day, requests_per_minute, daily_cost, input_tokens, max_tokens, members o api_keys |
Retry-After |
segundos a esperar, en 429 y en los 5xx reintentables |
Consulta Errores para saber qué pasa cuando se alcanza un límite.