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