OpenAI SDK
MarkdownLas bibliotecas oficiales de OpenAI para Python y Node.js funcionan con Ailoot sin cambios en el código; solo se cambian la URL y la clave.
Guía completa
Instalación
pip install openainpm install openaiConexión
Configura la URL base https://api.ailoot.ai/v1 en el código o mediante las variables OPENAI_BASE_URL y OPENAI_API_KEY , sin necesidad de modificar el código.
from openai import OpenAI
import os
client = OpenAI(max_retries=0,
base_url="https://api.ailoot.ai/v1",
api_key=os.environ["AILOOT_API_KEY"],
)
resp = client.chat.completions.create(
model="claude-sonnet-5-5",
messages=[{"role": "user", "content": "Explica en dos frases qué es una API."}],
)
print(resp.choices[0].message.content)import OpenAI from "openai";
const client = new OpenAI({ maxRetries: 0,
baseURL: "https://api.ailoot.ai/v1",
apiKey: process.env.AILOOT_API_KEY,
});
const resp = await client.chat.completions.create({
model: "claude-sonnet-5-5",
messages: [{ role: "user", content: "Explica en dos frases qué es una API." }],
});
console.log(resp.choices[0].message.content);Responses API
Nuevo formato OpenAI. Disponible en los modelos cuyo catálogo indica el formato Responses: 53 identificadores, incluidos Claude, GPT, DeepSeek, Qwen, Kimi y GLM.
resp = client.responses.create(
model="gpt-6.1-sol",
instructions="Responde de forma breve y directa.",
input="¿En qué se diferencia TCP de UDP?",
)
print(resp.output_text)const resp = await client.responses.create({
model: "gpt-6.1-sol",
instructions: "Responde de forma breve y directa.",
input: "¿En qué se diferencia TCP de UDP?",
});
console.log(resp.output_text);Herramientas (function calling)
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "El tiempo en la ciudad",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"],
},
},
}]
import json
messages = [{"role": "user", "content": "¿Qué tiempo hace en Kazán?"}]
# Desactiva los reintentos automáticos: tras un tiempo de espera agotado, consulta primero el Request ID en tu historial de uso.
client = client.with_options(max_retries=0)
for turn in range(4):
resp = client.chat.completions.create(
model="claude-sonnet-5-5", messages=messages, tools=tools,
)
message = resp.choices[0].message
messages.append(message.model_dump(exclude_none=True))
if not message.tool_calls:
print(message.content)
break
for call in message.tool_calls:
if call.function.name != "get_weather":
raise ValueError("Unexpected function")
arguments = json.loads(call.function.arguments)
# Sustituye esto por tu propia función meteorológica; estos datos son expresamente de demostración.
result = {"city": arguments["city"], "temperature_c": 20, "demo": True}
messages.append({"role": "tool", "tool_call_id": call.id,
"content": json.dumps(result, ensure_ascii=False)})
else:
raise RuntimeError("Tool loop limit reached")Embeddings
emb = client.embeddings.create(
model="nvidia/nemotron-3-embed-1b",
input=["Primer documento", "Segundo documento"],
)
print(len(emb.data), len(emb.data[0].embedding))Imágenes de entrada
resp = client.chat.completions.create(
model="gpt-6.1-sol",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "¿Qué aparece en esta imagen?"},
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}},
],
}],
)Gestión de errores
Los errores de Ailoot llegan en formato OpenAI, por lo que se capturan con las excepciones estándar del SDK. El mensaje incluye el Request ID.
import openai
try:
resp = client.chat.completions.create(model="claude-sonnet-5-5", messages=[{"role": "user", "content": "Hola"}])
except openai.APIStatusError as e:
print(e.status_code, e.response.json()["error"]["code"])
print(e.response.headers.get("x-request-id"))try {
await client.chat.completions.create({ model: "claude-sonnet-5-5", messages: [{ role: "user", content: "Hola" }] });
} catch (err) {
if (err instanceof OpenAI.APIError) {
console.log(err.status, err.code, err.headers?.["x-request-id"]);
}
}¿Tienes alguna pregunta? Envíanos el Request ID y una descripción; te ayudaremos a resolverla.Contactar con soporte