Módulo 5: OpenRouter - Introducción
Primeros Requests Multi-Provider
Descripción
Harás requests a múltiples modelos (GPT, Claude, Gemini, Mixtral) usando OpenRouter con OpenAI SDK.
Tiempo: 20 minutos
Dificultad: Baja
🎯 Objetivos
- ✅ Request a GPT-3.5 via OpenRouter
- ✅ Request a Claude 3 Haiku
- ✅ Request a Gemini Pro
- ✅ Comparar respuestas
💻 Setup Básico
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY")
)
Cambio vs Módulo 2: Solo base_url!
🚀 Request 1: GPT-3.5 (OpenAI)
response = client.chat.completions.create(
model="openai/gpt-3.5-turbo",
messages=[
{"role": "user", "content": "¿Qué es Python?"}
]
)
print("GPT-3.5:", response.choices[0].message.content)
Modelo ID: openai/gpt-3.5-turbo
Formato: provider/model-name
🔮 Request 2: Claude 3 Haiku (Anthropic)
response = client.chat.completions.create(
model="anthropic/claude-3-haiku",
messages=[
{"role": "user", "content": "¿Qué es Python?"}
]
)
print("Claude 3:", response.choices[0].message.content)
Modelo ID: anthropic/claude-3-haiku
🌟 Request 3: Gemini Pro (Google)
response = client.chat.completions.create(
model="google/gemini-pro",
messages=[
{"role": "user", "content": "¿Qué es Python?"}
]
)
print("Gemini:", response.choices[0].message.content)
Modelo ID: google/gemini-pro
🔥 Request 4: Mixtral (Mistral AI)
response = client.chat.completions.create(
model="mistralai/mixtral-8x7b-instruct",
messages=[
{"role": "user", "content": "¿Qué es Python?"}
]
)
print("Mixtral:", response.choices[0].message.content)
Modelo ID: mistralai/mixtral-8x7b-instruct
📊 Comparación Completa
from openai import OpenAI
import os
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.getenv("OPENROUTER_API_KEY")
)
models = [
"openai/gpt-3.5-turbo",
"anthropic/claude-3-haiku",
"google/gemini-pro",
"mistralai/mixtral-8x7b-instruct"
]
prompt = "Explica qué es Python en 20 palabras"
for model in models:
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
print(f"\n=== {model} ===")
print(response.choices[0].message.content)
Output ejemplo:
=== openai/gpt-3.5-turbo ===
Python es un lenguaje de programación interpretado, versátil y
fácil de aprender, usado en desarrollo web, ciencia de datos y más.
=== anthropic/claude-3-haiku ===
Python: lenguaje interpretado, multiparadigma, sintaxis clara,
ampliamente usado para web, data science, automatización y ML.
=== google/gemini-pro ===
Python es un lenguaje de programación popular, interpretado,
de alto nivel, orientado a objetos y versátil para múltiples usos.
=== mistralai/mixtral-8x7b-instruct ===
Python: lenguaje interpretado, dinámico, con sintaxis simple,
utilizado en web, análisis datos, IA y automatización.
🔍 Modelos Disponibles
Ver lista completa:
import requests
response = requests.get(
"https://openrouter.ai/api/v1/models",
headers={"Authorization": f"Bearer {os.getenv('OPENROUTER_API_KEY')}"}
)
models = response.json()["data"]
print(f"Total modelos: {len(models)}")
# Primeros 10
for model in models[:10]:
print(f" - {model['id']}")
Categorías principales:
- OpenAI: gpt-3.5-turbo, gpt-4, gpt-4-turbo
- Anthropic: claude-3-haiku, claude-3-sonnet, claude-3-opus
- Google: gemini-pro, gemini-pro-vision
- Meta: llama-2-70b, llama-3-70b
- Mistral: mixtral-8x7b, mistral-medium
- Open source: Muchos más
💰 Pricing Comparison
# Pricing (aproximado, Feb 2026)
pricing = {
"openai/gpt-3.5-turbo": 0.50, # $/1M tokens
"anthropic/claude-3-haiku": 0.25,
"google/gemini-pro": 0.50,
"mistralai/mixtral-8x7b-instruct": 0.24
}
prompt_tokens = 20
for model, price in pricing.items():
cost = (prompt_tokens / 1_000_000) * price
print(f"{model}: ${cost:.8f}")
Output:
openai/gpt-3.5-turbo: $0.00001000
anthropic/claude-3-haiku: $0.00000500 (50% cheaper!)
google/gemini-pro: $0.00001000
mistralai/mixtral-8x7b-instruct: $0.00000480 (52% cheaper!)
🔄 Switch Model Dinámicamente
def chat(prompt: str, model: str = "openai/gpt-3.5-turbo"):
"""Chat con modelo configurable."""
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content
# Usa diferentes modelos
print(chat("Hola", model="openai/gpt-3.5-turbo"))
print(chat("Hola", model="anthropic/claude-3-haiku"))
print(chat("Hola", model="mistralai/mixtral-8x7b-instruct"))
Ventaja: Mismo código, múltiples modelos
📊 Modelo Routing
Por tipo de query:
def smart_chat(prompt: str) -> str:
"""Auto-select modelo según query."""
# Queries simples → Modelo barato
if len(prompt) < 50:
model = "mistralai/mixtral-8x7b-instruct" # Barato
# Queries complejas → Modelo potente
else:
model = "openai/gpt-4-turbo" # Caro pero bueno
response = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}]
)
print(f"[Using: {model}]")
return response.choices[0].message.content
# Test
print(smart_chat("Hola")) # Usa Mixtral (barato)
print(smart_chat("Explica teoría de la relatividad en detalle...")) # Usa GPT-4
🐛 Troubleshooting
Error: Model not found
# Lista modelos disponibles
response = requests.get(
"https://openrouter.ai/api/v1/models",
headers={"Authorization": f"Bearer {api_key}"}
)
models = [m["id"] for m in response.json()["data"]]
print("Modelos:", models)
Error: 402 Payment Required
Causa: Credits agotados
Solución: Dashboard → Add credits
✅ Resumen
- Acceso a 100+ modelos con misma API
- Format:
provider/model-name - Switch modelo en 1 línea
- Pricing variable (50%+ ahorro posible)
- Mismo código OpenAI SDK
Siguiente: 04-cost-optimization.md
Aprenderás estrategias para minimizar costos eligiendo modelo óptimo.
Tiempo: 25 min