Capítulo 2: Orquestación Multi-Modelo
Enrutador de modelos
from typing import Callable
class ModelRouter:
def __init__(self):
self.models = {}
self.routing_rules = []
def register_model(self, name: str, client: Callable, config: dict):
self.models[name] = {"client": client, "config": config}
def add_routing_rule(self, condition: Callable, model_name: str):
self.routing_rules.append((condition, model_name))
def route(self, request: dict) -> str:
"""Determine which model to use."""
for condition, model_name in self.routing_rules:
if condition(request):
return model_name
return "default"
async def generate(self, request: dict) -> dict:
model_name = self.route(request)
model = self.models[model_name]
try:
response = await model["client"].generate(request["prompt"])
return {"response": response, "model": model_name}
except Exception as e:
# Fallback to next model
return await self.fallback(request, exclude=[model_name])
# Usage
router = ModelRouter()
router.register_model("gpt-4", gpt4_client, {"cost": "high", "quality": "best"})
router.register_model("gpt-3.5", gpt35_client, {"cost": "low", "quality": "good"})
router.register_model("claude", claude_client, {"cost": "medium", "quality": "best"})
# Route simple queries to cheaper model
router.add_routing_rule(
lambda r: len(r["prompt"]) < 100,
"gpt-3.5"
)
Estrategia de respaldo
class FallbackChain:
def __init__(self, models: list[str], router: ModelRouter):
self.models = models
self.router = router
async def generate_with_fallback(self, request: dict) -> dict:
last_error = None
for model_name in self.models:
try:
response = await self.router.models[model_name]["client"].generate(
request["prompt"]
)
return {"response": response, "model": model_name}
except Exception as e:
last_error = e
continue
raise FallbackExhaustedException(f"All models failed: {last_error}")
Siguiente: Capítulo 3: Creación de plataformas LLM