SDKs de OpenAI y otros
El SDK de Python de OpenAI es el patrón de referencia para completaciones de chat, embeddings y llamadas a herramientas. LiteLLM y bibliotecas similares abstraen múltiples proveedores cuando necesitas flexibilidad de proveedor.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
from openai import OpenAI
client = OpenAI() # lee OPENAI_API_KEY
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hola"}],
)
print(response.choices[0].message.content)Cuándo usar esto:
- Para construir sobre modelos GPT-4o, GPT-4o-mini o de embeddings.
- Para migrar del SDK de OpenAI v0 (
openai.ChatCompletion) a v1. - Para abstraer entre OpenAI, Anthropic y modelos locales con LiteLLM.
- Para llamar a la API de Respuestas o a los puntos finales de lotes para ahorrar costos.
Ejemplo de trabajo
"""openai_sdks.py - chat, embeddings, herramientas y fallback de LiteLLM."""
from __future__ import annotations
import json
import os
from openai import OpenAI, AsyncOpenAI
client = OpenAI()
# Completación de chat
chat = client.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": "Eres un asistente útil."},
{"role": "user", "content": "¿Qué es FastAPI?"},
],
temperature=0.2,
)
print(chat.choices[0].message.content)
# Embeddings
emb = client.embeddings.create(
model="text-embedding-3-small",
input=["Tuberías de datos en Python", "Conceptos básicos de aprendizaje automático"],
)
print("dimensión del embedding:", len(emb.data[0].embedding))
# Llamada a función
tools = [{
"type": "function",
"function": {
"name": "search_docs",
"description": "Busca documentación interna",
"parameters": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"],
},
},
}]
tool_resp = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Busca documentación sobre validadores de pydantic"}],
tools=tools,
)
msg = tool_resp.choices[0].message
if msg.tool_calls:
call = msg.tool_calls[0]
print(f"herramienta: {call.function.name}({call.function.arguments})")
# Multi-proveedor LiteLLM
try:
import litellm
response = litellm.completion(
model="gpt-4o-mini",
messages=[{"role": "user", "content": "Hola"}],
)
print("litellm:", response.choices[0].message.content[:50])
except ImportError:
print("litellm no instalado - omitiendo")Lo que esto demuestra:
- Patrón de cliente del SDK de OpenAI v1 para chat y embeddings.
- Llamadas a herramientas/funciones con parámetros de esquema JSON.
- Vectores de embeddings para tuberías de búsqueda semántica.
- LiteLLM como un envoltorio multi-proveedor "plug-and-play".
Inmersión Profunda
Cómo funciona
- Instancia de cliente contiene la clave API, la URL base y la configuración HTTP.
- Completaciones de chat envían mensajes; el modelo devuelve una opción de completación.
- Embeddings mapean texto a vectores densos para búsqueda de similitud.
- Llamadas a herramientas permiten al modelo solicitar la ejecución de funciones con argumentos analizados.
- AsyncOpenAI replica la API síncrona para servidores web asíncronos.
Comparación de Proveedores
| Proveedor | SDK | Fortalezas |
|---|---|---|
| OpenAI | openai | Modelos GPT, embeddings, herramientas amplias |
| Anthropic | anthropic | Claude, contexto largo, uso de herramientas |
google-genai | Gemini, multimodal | |
| LiteLLM | litellm | API unificada para más de 100 modelos |
Notas de Python
# URL base personalizada (Azure OpenAI, proxy local)
client = OpenAI(base_url=os.environ["OPENAI_BASE_URL"], api_key=os.environ["OPENAI_API_KEY"])
# Uso asíncrono en FastAPI
async def ask(question: str) -> str:
client = AsyncOpenAI()
resp = await client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": question}],
)
return resp.choices[0].message.content or ""Errores Comunes
- Uso de la API v0 obsoleta -
openai.ChatCompletion.createha sido eliminada. Solución: migrar al clienteOpenAI(). - Claves API codificadas - las claves en el código fuente se confirman en git. Solución: variables de entorno y gestores de secretos.
- No manejar
tool_calls- el modelo solicita una función pero el código la ignora. Solución: comprobarmessage.tool_callsy usar un bucle. - Ignorar límites de tasa - errores 429 bajo carga. Solución: retroceso exponencial; respetar las cabeceras
retry-after. - Dimensiones incorrectas del modelo de embedding - mezclar modelos rompe la búsqueda vectorial. Solución: fijar un modelo de embedding por índice.
- Asumir contenido no nulo - las negativas o las llamadas a herramientas dejan
contentcomoNone. Solución: comprobar antes de usar.content.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| SDK de OpenAI | Modelos GPT directamente | Necesitas Claude o Gemini |
| LiteLLM | Aplicaciones multi-proveedor | Proveedor único, no se necesita abstracción |
| Envoltorios LLM de LangChain | Cadenas y agentes | Llamadas API simples y únicas |
| HTTP sin formato (httpx) | Control total, sin dependencia del SDK | Las características estándar del SDK son suficientes |
Preguntas Frecuentes
¿Cómo migro de openai v0 a v1?
# v0 (obsoleto)
# openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=[...])
# v1
client = OpenAI()
client.chat.completions.create(model="gpt-4o-mini", messages=[...])¿Qué es la API de Respuestas?
- API más reciente de OpenAI para flujos de trabajo de agentes con manejo de herramientas integrado.
- Consulta la documentación actual para la migración desde completaciones de chat.
¿Cómo uso Azure OpenAI?
client = OpenAI(
api_key=os.environ["AZURE_OPENAI_API_KEY"],
base_url=f"{os.environ['AZURE_OPENAI_ENDPOINT']}/openai/v1/",
)¿Cómo agrupo solicitudes para ahorrar costos?
- La API Batch de OpenAI procesa solicitudes de forma asíncrona a menor costo.
- Buena para generación de embeddings sin conexión o evaluación masiva.
¿Qué es LiteLLM?
- Envoltorio "plug-and-play":
litellm.completion(model="claude-sonnet-4-20250514", ...). - Dirige al SDK del proveedor correcto según el prefijo del nombre del modelo.
¿Cómo listo los modelos disponibles?
models = client.models.list()
for m in models.data:
print(m.id)¿Cómo configuro tiempos de espera?
client = OpenAI(timeout=30.0, max_retries=3)¿Puedo usar embeddings de OpenAI con pgvector?
- Sí, almacena vectores
text-embedding-3-small(1536 dims) en PostgreSQL. - Ver Bases de Datos Vectoriales.
¿Cómo registro las solicitudes?
- El panel de OpenAI muestra el uso y los costos.
- Registra hashes de prompts y recuentos de tokens en tu aplicación.
¿Qué pasa con los modelos de código abierto a través de una API compatible con OpenAI?
- vLLM y Ollama exponen puntos finales compatibles con
/v1/chat/completions. - Apunta
base_urlal servidor local.
¿Cómo manejo las negativas de la política de contenido?
- Comprueba
finish_reason == "content_filter". - Proporciona mensajes de respaldo a los usuarios.
¿Cómo pruebo sin llamadas API?
- Mockea el cliente en pruebas unitarias.
- Usa fixtures grabados (estilo VCR) para pruebas de integración.
Relacionado
- SDK de Anthropic Claude - Patrones específicos de Claude
- Embeddings y Similitud - modelos de embedding
- Salida Estructurada - modo JSON
- Modelos Locales y de Código Abierto - Ollama y vLLM
- Uso de Herramientas y Llamadas a Funciones - bucles de herramientas
Versiones de Stack: Esta página se escribió para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.