Construyendo Agentes de IA con Múltiples Modelos: Una Guía Práctica de Arquitectura
La mayoría de los agentes de IA usan un solo modelo para todo. El paso de planificación, las llamadas a herramientas, la resumición, la recuperación de errores. Esto funciona para demos. En producción, es un desperdicio.
Un paso de planificación que requiere razonamiento profundo no necesita el mismo modelo que un paso de extracción de JSON. Una tarea de generación de código tiene requisitos diferentes a una tarea de clasificación. Usar Claude Opus 4.6 ($25/1M tokens de salida) para formatear una cadena de fecha es como contratar a un arquitecto senior para pintar una pared.
Aquí te mostramos cómo construir agentes que dirigen cada paso al modelo óptimo.
La Arquitectura del Agente Multi-Modelo
Solicitud del Usuario
│
▼
┌─────────────┐
│ Router │ ← Clasifica la complejidad de la tarea
│ (modelo rápido)│
└──────┬──────┘
│
┌───┴───┐
▼ ▼
┌──────┐ ┌──────┐
│Simple│ │Complejo│
│Modelo│ │Modelo │
└──┬───┘ └──┬───┘
│ │
▼ ▼
┌─────────────┐
│ Agregador │ ← Combina resultados
│ (modelo rápido)│
└─────────────┘
Tres componentes:
- Un router que clasifica las tareas entrantes según su complejidad
- Un conjunto de modelos asignados a diferentes tipos de tareas
- Un agregador que combina resultados cuando es necesario
Implementación con OpenAI SDK
Usando una sola clave API a través de un agregador, puedes acceder a todos los modelos sin gestionar múltiples SDKs:
from openai import OpenAI
client = OpenAI(
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
# Pool de modelos con niveles de costo/capacidad
MODELS = {
"router": "gpt-4.1-mini", # $0.40/1M tokens entrada - clasificación rápida
"simple": "gpt-4.1-mini", # $0.40/1M tokens entrada - extracción, formateo
"reasoning": "claude-sonnet-4-6", # $3.00/1M tokens entrada - planificación, análisis
"complex": "gpt-4.1", # $2.00/1M tokens entrada - generación de código, multi-pasos
"budget": "deepseek-chat", # $0.28/1M tokens entrada - procesamiento masivo
}
def route_task(task: str) -> str:
"""Usa un modelo barato para clasificar la complejidad de la tarea."""
response = client.chat.completions.create(
model=MODELS["router"],
messages=[
{"role": "system", "content": """Clasifica esta tarea en una categoría:
- simple: extracción de datos, formateo, traducción
- reasoning: análisis, planificación, comparación
- complex: generación de código, resolución de problemas multi-pasos
- budget: procesamiento masivo, tareas no críticas
Responde solo con el nombre de la categoría."""},
{"role": "user", "content": task}
],
max_tokens=10
)
category = response.choices[0].message.content.strip().lower()
return MODELS.get(category, MODELS["simple"])
def execute_task(task: str, context: str = "") -> str:
"""Dirige la tarea al modelo apropiado y la ejecuta."""
model = route_task(task)
messages = []
if context:
messages.append({"role": "system", "content": context})
messages.append({"role": "user", "content": task})
response = client.chat.completions.create(
model=model,
messages=messages
)
return response.choices[0].message.content
Agente Real: Pipeline de Revisión de Código
Aquí tienes un agente multi-modelo práctico que revisa pull requests:
def review_pr(diff: str) -> dict:
"""Pipeline multi-modelo para revisión de PR."""
# Paso 1: Clasificar cambios (modelo barato)
classification = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[{
"role": "user",
"content": f"Clasifica estos cambios de código: {diff[:2000]}\n"
"Categorías: bugfix, feature, refactor, docs, test"
}],
max_tokens=20
).choices[0].message.content
# Paso 2: Escaneo de seguridad (modelo de razonamiento)
security = client.chat.completions.create(
model="claude-sonnet-4-6",
messages=[{
"role": "system",
"content": "Eres un revisor de seguridad. Revisa: "
"inyección SQL, XSS, bypass de autenticación, secretos en el código, "
"deserialización insegura. Sé específico con los números de línea."
}, {
"role": "user",
"content": f"Revisa este diff en busca de problemas de seguridad:\n{diff}"
}]
).choices[0].message.content
# Paso 3: Calidad del código (modelo general)
quality = client.chat.completions.create(
model="gpt-4.1",
messages=[{
"role": "user",
"content": f"Revisa la calidad del código: nombres, estructura, "
f"manejo de errores, cobertura de tests.\n{diff}"
}]
).choices[0].message.content
# Paso 4: Resumen (modelo barato)
summary = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[{
"role": "user",
"content": f"Resume esta revisión de PR en 3 puntos clave:\n"
f"Tipo: {classification}\n"
f"Seguridad: {security[:500]}\n"
f"Calidad: {quality[:500]}"
}]
).choices[0].message.content
return {
"classification": classification,
"security": security,
"quality": quality,
"summary": summary
}
Desglose de costos para una revisión típica de PR (diff de 2K tokens):
| Paso | Modelo | Tokens de Entrada | Costo |
|---|---|---|---|
| Clasificación | GPT-4.1-mini | ~2,100 | $0.0008 |
| Seguridad | Claude Sonnet 4.6 | ~2,500 | $0.0075 |
| Calidad | GPT-4.1 | ~2,500 | $0.0050 |
| Resumen | GPT-4.1-mini | ~1,200 | $0.0005 |
| Total | ~$0.014 |
Usar Claude Sonnet 4.6 para los cuatro pasos costaría ~$0.028. El enfoque multi-modelo reduce costos en un 50% mientras usa el modelo más fuerte donde más importa (revisión de seguridad).
Integración con LangChain
from langchain_openai import ChatOpenAI
# Crear instancias de modelos con diferentes configuraciones
fast = ChatOpenAI(
model="gpt-4.1-mini",
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
reasoning = ChatOpenAI(
model="claude-sonnet-4-6",
api_key="sk-lemon-xxx",
base_url="https://api.lemondata.cc/v1"
)
# Uso en cadenas de LangChain
from langchain_core.prompts import ChatPromptTemplate
classify_chain = ChatPromptTemplate.from_template(
"Clasifica: {input}"
) | fast
analyze_chain = ChatPromptTemplate.from_template(
"Analiza en profundidad: {input}"
) | reasoning
Cuándo Usar Agentes Multi-Modelo
El enrutamiento multi-modelo añade complejidad. Vale la pena cuando:
- Tu agente maneja tipos de tareas diversas (no solo chat)
- Los costos mensuales de API superan los $100 (el ahorro se vuelve significativo)
- Necesitas fortalezas específicas de modelos (Claude para código, Gemini para contexto largo, GPT para velocidad)
- La latencia importa para algunos pasos pero no para otros
Para chatbots simples o agentes de propósito único, un solo modelo está bien. El overhead del enrutamiento no se justifica cuando cada solicitud necesita la misma capacidad.
Puntos Clave
- Usa el modelo más barato que maneje bien cada paso
- Reserva los modelos caros para tareas que realmente los requieren
- Los pasos de clasificación/enrutamiento siempre deben usar el modelo más barato disponible
- Mide el costo real por ejecución de agente, no solo el precio por token
- Un agregador API con una clave simplifica significativamente el acceso multi-modelo
Accede a todos los modelos con una sola API: lemondata.cc ofrece más de 300 modelos con una sola clave API. Construye agentes multi-modelo sin gestionar múltiples cuentas de proveedores.
