Referencia de la API
La autenticación, la superficie de endpoints compatible con OpenAI, el streaming, el razonamiento y la taxonomía de errores.
Autenticación
Cada petición a /v1/* se autentica con una clave virtual en la cabecera Authorization: Bearer. Acuñe claves en la Consola; el secreto se muestra una sola vez y solo se almacena su hash. Una clave lleva sus propios límites de tasa, presupuesto, etiquetas y una lista opcional de modelos permitidos (vacía = cualquier modelo).
Una petición cuyo modelo no está en la lista de permitidos no vacía de la clave se rechaza con un 403 permission_error sellado antes de despachar nada; el propio rechazo queda registrado en la cadena de auditoría.
Acuñar una clave de producción requiere una dirección de correo verificada.
curl https://api.sluis.ai/v1/models \ -H "Authorization: Bearer $SLUIS_KEY" # a model outside the key's allow-list never dispatches: # → 403 permission_error · the refusal is sealed in the audit chain
Endpoints
Sluis expone la superficie compatible con OpenAI que se muestra a continuación. Los endpoints sin un handler de primera clase se retransmiten literalmente al proveedor enrutado, streaming incluido, de modo que los upstreams compatibles con OpenAI conservan plena fidelidad.
| Endpoint | Propósito |
|---|---|
| POST /v1/chat/completions | Chat completions, la superficie principal: enrutamiento, protección de datos, caché, streaming. |
| POST /v1/completions | Text completions heredadas. |
| POST /v1/embeddings | Embeddings; también alimenta la caché semántica. |
| POST /v1/moderations | Clasificación de moderación. |
| POST /v1/responses | La API de Responses de OpenAI. |
| GET /v1/models | Los modelos que su política y sus credenciales pueden alcanzar de verdad, nada hipotético. |
| GET /v1/models/{id} | Metadatos de un modelo. |
| POST /v1/audio/* | Transcripción, traducción, voz · retransmitido al proveedor enrutado. |
| POST /v1/images/* | Generación y edición de imágenes · retransmitido. |
| POST /v1/video/generations | Generación de vídeo · retransmitido. |
| /v1/files | Operaciones con archivos · retransmitido. |
Streaming
Ponga stream: true y la respuesta llega como server-sent events: cada frame es un delta chat.completion.chunk y el stream termina con data: [DONE]. Los streams nunca se almacenan en búfer en la pasarela: pasan a través de ella en modo tee, y el sellado de auditoría y la medición ocurren aunque el cliente cuelgue antes de tiempo.
Pida stream_options.include_usage y el frame final lleva el uso exacto de tokens, las mismas cifras que la pasarela mide y factura.
stream = client.chat.completions.create(
model="mistral/mistral-large-latest",
messages=[{"role": "user", "content": "Write a haiku"}],
stream=True,
stream_options={"include_usage": True},
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")const stream = await client.chat.completions.create({ model: "mistral/mistral-large-latest", messages: [{ role: "user", content: "Write a haiku" }], stream: true, stream_options: { include_usage: true }, }); for await (const chunk of stream) { process.stdout.write(chunk.choices[0]?.delta?.content ?? ""); }
Razonamiento
Pase el parámetro OpenAI reasoning_effort (minimal | low | medium | high) en cualquier modelo con capacidad de razonamiento. Sluis lo traduce por proveedor (el nivel de pensamiento de Gemini, el esfuerzo de pensamiento adaptativo de Claude) y lo omite donde un modelo lo rechazaría, así que un solo parámetro funciona en todo el catálogo.
resp = client.chat.completions.create(
model="vertex/claude-opus-4-8",
messages=[{"role": "user", "content": "Prove it step by step…"}],
reasoning_effort="high", # minimal | low | medium | high
)Códigos de error
Los errores usan el sobre de error de OpenAI; el valor error.type refleja el estado HTTP, así que el manejo de errores de su SDK sigue funcionando sin cambios.
| Código | Cuándo |
|---|---|
| 400 invalid_request_error | Cuerpo de la petición o parámetros mal formados. |
| 400 invalid_request_error | Identificador de modelo sin prefijo de proveedor. Cada identificador invocable es provider/model, p. ej. mistral/mistral-large-latest; el cuerpo indica: model must be provider-prefixed. |
| 401 authentication_error | Clave de API ausente o desconocida. |
| 402 insufficient_quota | Asignación gratuita agotada o presupuesto alcanzado. Active un plan o suba el presupuesto; la petición nunca llega a un proveedor. |
| 403 permission_error | La clave carece de permiso, por ejemplo el modelo no está en su lista de permitidos. |
| 422 invalid_request_error | Rechazada antes de despachar, por ejemplo la protección de datos en modo block coincidió con la petición. |
| 429 rate_limit_error | Límite de tasa alcanzado. Se aplica en la pasarela; la petición nunca llega a un proveedor. |
| 451 permission_error | Bloqueada por la política de residencia: ninguna jurisdicción permitida sirve la petición. El cuerpo incluye el motivo. |
| 5xx api_error | Fallo del proveedor upstream tras los reintentos; el cortacircuitos desvía el tráfico de los proveedores no saludables. |