Enrutamiento por Caso de Uso
El RouterService resuelve qué proveedor LLM y modelo usar para cada caso de uso. La configuración vive en la BD (AIRouteConfig) y se carga al arrancar el servicio.
Tabla de enrutamiento (9 casos de uso)
Section titled “Tabla de enrutamiento (9 casos de uso)”useCase | Nombre UI | Proveedor | Modelo | Fallback | Modelo FB | Caché TTL |
|---|---|---|---|---|---|---|
tutor_chat | Tutor conversacional | Anthropic | claude-sonnet-4-5 | OpenAI | gpt-4o | 0s (sin caché) |
adaptive_engine | Motor adaptativo | OpenAI | gpt-4o-mini | Gemini | gemini-1.5-flash | 300s |
content_gen_quiz | Generación quizzes | OpenAI | gpt-4o-mini | Anthropic | claude-haiku-4-5 | 0s |
content_gen_summary | Resúmenes de lección | Gemini | gemini-1.5-flash | OpenAI | gpt-4o-mini | 600s |
content_gen_case | Casos prácticos | Anthropic | claude-sonnet-4-5 | OpenAI | gpt-4o | 0s |
open_answer_evaluation | Evaluación abierta | Anthropic | claude-sonnet-4-5 | OpenAI | gpt-4o | 0s |
fluency_test_scoring | AI Fluency Test | Gemini | gemini-1.5-pro | OpenAI | gpt-4o | 0s |
churn_prediction | Predicción abandono | OpenAI | gpt-4o-mini | Gemini | gemini-1.5-flash | 3600s |
semantic_search | Búsqueda semántica | OpenAI | text-embedding-3-small | — | — | 300s |
RouterService
Section titled “RouterService”Archivo: apps/ai-backend/src/modules/router/router.service.ts
Resolución de proveedor
Section titled “Resolución de proveedor”resolveProvider(useCase: AIUseCase): { provider: AIProvider; model: string; isFallback: boolean } { const config = this.getConfig(useCase);
// Si el circuit breaker del proveedor primario está abierto → fallback if (!this.circuitBreaker.isOpen(config.provider)) { return { provider: config.provider, model: config.model, isFallback: false }; }
return { provider: config.fallbackProvider, model: config.fallbackModel, isFallback: true };}Recarga en caliente
Section titled “Recarga en caliente”La tabla de routing se puede actualizar sin redeploy:
- SUPER_ADMIN edita una ruta en
/admin/ai/routes apps/apiactualizaAIRouteConfigen BDapps/apillama aPOST /admin/router/reloaden el AI BackendRouterService.reload()recarga los configs desde la API- Requests futuras usan la nueva configuración
// RouterAdminController@Post('reload')async reload(): Promise<{ loaded: number; source: string }> { return this.routerService.reload();}
// Invalidar solo una ruta@Post('invalidate/:useCase')invalidate(@Param('useCase') useCase: AIUseCase): void { this.routerService.invalidateRoute(useCase);}AIRouteConfig (modelo Prisma)
Section titled “AIRouteConfig (modelo Prisma)”La tabla AIRouteConfig en BD es la fuente de verdad en producción. Los DEFAULT_ROUTE_CONFIG en código son el fallback si la BD no está disponible al arrancar.