Skip to content

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.

useCaseNombre UIProveedorModeloFallbackModelo FBCaché TTL
tutor_chatTutor conversacionalAnthropicclaude-sonnet-4-5OpenAIgpt-4o0s (sin caché)
adaptive_engineMotor adaptativoOpenAIgpt-4o-miniGeminigemini-1.5-flash300s
content_gen_quizGeneración quizzesOpenAIgpt-4o-miniAnthropicclaude-haiku-4-50s
content_gen_summaryResúmenes de lecciónGeminigemini-1.5-flashOpenAIgpt-4o-mini600s
content_gen_caseCasos prácticosAnthropicclaude-sonnet-4-5OpenAIgpt-4o0s
open_answer_evaluationEvaluación abiertaAnthropicclaude-sonnet-4-5OpenAIgpt-4o0s
fluency_test_scoringAI Fluency TestGeminigemini-1.5-proOpenAIgpt-4o0s
churn_predictionPredicción abandonoOpenAIgpt-4o-miniGeminigemini-1.5-flash3600s
semantic_searchBúsqueda semánticaOpenAItext-embedding-3-small300s

Archivo: apps/ai-backend/src/modules/router/router.service.ts

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
};
}

La tabla de routing se puede actualizar sin redeploy:

  1. SUPER_ADMIN edita una ruta en /admin/ai/routes
  2. apps/api actualiza AIRouteConfig en BD
  3. apps/api llama a POST /admin/router/reload en el AI Backend
  4. RouterService.reload() recarga los configs desde la API
  5. 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);
}

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.

Ver schema de AIRouteConfig.