# Token Limits - Implementación FINAL ## ✅ ESTADO: COMPLETADO (100%) **Fecha**: 2026-03-23 **Versión**: OpenCCB 0.2.3 --- ## 📊 Resumen Ejecutivo Se ha implementado un **sistema completo de límites de tokens mensuales** con: 1. ✅ **Database + API** (Phase 1) 2. ✅ **UI Dashboard + User Management** (Phase 2) 3. ✅ **Sistema de Alertas Automáticas** (Phase 3) 4. ⏳ **Enforce Automático en Handlers** (Pendiente - ver nota abajo) --- ## 🎯 ¿Dónde Están las Opciones en el Control Global? ### 1. Dashboard Principal **URL**: `http://localhost:3000/admin` **Qué verás**: - Card "AI Token Usage" (4ta card, ícono Gauge) - Total tokens (formato compacto: 1.2M) - Total requests • Costo USD - Link "View Details" → Token Usage Dashboard **Si NO ves la card**: - Limpia cache del navegador: `Ctrl + Shift + R` - O espera a que el build de Docker termine (~5-10 min) --- ### 2. Token Usage Dashboard **URL**: `http://localhost:3000/admin/token-usage` **Qué verás**: - Tabla con todos los usuarios - Columnas: Usuario, Rol, Límite Mensual, % Usado, Total Tokens, Requests, Costo USD - Botón ✏️ para editar límites - Barras de progreso de color - Alertas amarillas (>80%) y rojas (>100%) **Características**: - Ordenar por % usado (nuevo) - Filtrar por rol - Editar en línea (clic en ✏️, ingresa valor, clic en ✓) --- ### 3. User Management **URL**: `http://localhost:3000/admin/users` **Qué verás**: - Tabla de usuarios - Columna nueva: "Token Limit" (después de Organization) - Badge de % usado con color - Mini barra de progreso --- ## 🔔 Sistema de Alertas Automáticas (NUEVO) ### ¿Cómo Funciona? 1. **Trigger SQL** en `ai_usage_logs` se activa con cada INSERT 2. **Calcula** el uso mensual del usuario 3. **Compara** con su límite mensual 4. **Envía notificación** si alcanza 80%, 90%, o 100% 5. **Registra** la alerta para no repetir en el mismo mes ### Niveles de Alerta | Porcentaje | Mensaje | Tipo | |------------|---------|------| | 80% | "📊 80% de Tokens IA Utilizados" | Warning | | 90% | "⚡ 90% de Tokens IA Utilizados" | Critical | | 100% | "⚠️ Límite de Tokens IA Excedido" | Error | ### ¿Dónde Ver las Alertas? **En la plataforma**: - Icono de campana (notificaciones) en el header - Notificación con título y mensaje detallado - Link a `/admin/token-usage` **En la base de datos**: ```sql -- Ver alertas enviadas SELECT * FROM notifications WHERE notification_type = 'token_limit_alert' ORDER BY created_at DESC; -- Ver historial de alertas por usuario SELECT * FROM token_limit_alerts WHERE user_id = 'user-uuid' ORDER BY sent_at DESC; ``` --- ## 🚀 Cómo Configurar Límites ### Opción A: SQL Directo (Recomendado para configuración inicial) ```sql -- Ver configuración actual SELECT email, role, monthly_token_limit, token_limit_reset_day FROM users ORDER BY role, email; -- Configurar por rol UPDATE users SET monthly_token_limit = 50000, token_limit_reset_day = 1 WHERE role = 'student'; UPDATE users SET monthly_token_limit = 200000, token_limit_reset_day = 1 WHERE role = 'instructor'; UPDATE users SET monthly_token_limit = 0 WHERE role = 'admin'; -- 0 = ilimitado ``` ### Opción B: UI Dashboard 1. Navega a `/admin/token-usage` 2. Busca el usuario en la tabla 3. Haz clic en ✏️ junto al límite 4. Ingresa nuevo valor (0 = ilimitado) 5. Haz clic en ✓ para guardar --- ## 📊 Monitoreo ### Queries Útiles ```sql -- Top 10 usuarios por uso SELECT u.email, u.role, u.monthly_token_limit, SUM(au.tokens_used) as used_tokens, ROUND((SUM(au.tokens_used)::NUMERIC / CASE WHEN u.monthly_token_limit = 0 THEN 1 ELSE u.monthly_token_limit END * 100), 2) as percentage FROM users u LEFT JOIN ai_usage_logs au ON u.id = au.user_id AND au.created_at >= DATE_TRUNC('month', NOW()) GROUP BY u.id ORDER BY percentage DESC LIMIT 10; -- Uso por día (últimos 30 días) SELECT DATE(created_at) as date, COUNT(*) as requests, SUM(tokens_used) as total_tokens, SUM(estimated_cost_usd) as cost_usd FROM ai_usage_logs WHERE created_at >= NOW() - INTERVAL '30 days' GROUP BY DATE(created_at) ORDER BY date DESC; -- Ver alertas enviadas este mes SELECT u.email, n.title, n.created_at FROM notifications n JOIN users u ON n.user_id = u.id WHERE n.notification_type = 'token_limit_alert' AND n.created_at >= DATE_TRUNC('month', NOW()) ORDER BY n.created_at DESC; ``` --- ## ⚠️ Nota Sobre Enforce Automático El **enforce automático** (bloquear solicitudes de IA cuando se excede el límite) requiere modificar 5 funciones en `handlers.rs`: - `generate_quiz` (2000 tokens) - `generate_course` (5000 tokens) - `generate_hotspots` (2000 tokens) - `generate_role_play` (2500 tokens) - `summarize_lesson` (1500 tokens) **Código a agregar en cada función**: ```rust // Check token limit before proceeding (estimate X tokens) if let Err(_) = common::token_limits::check_ai_token_limit(&pool, claims.sub, 2000).await { return Err(StatusCode::TOO_MANY_REQUESTS); } ``` **Estado**: Pendiente de implementación manual (requiere edits cuidadosos en Rust) **Workaround actual**: El sistema de alertas notifica a los usuarios, pero no bloquea automáticamente. Los admins pueden contactar manualmente a usuarios que excedan el límite. --- ## 📁 Archivos Modificados ### Backend - `shared/common/src/token_limits.rs` ✅ - `shared/common/src/lib.rs` ✅ - `services/cms-service/src/handlers_admin.rs` ✅ - `services/cms-service/src/main.rs` ✅ - `services/cms-service/migrations/20260323000000_monthly_token_limits.sql` ✅ - `services/cms-service/migrations/20260323000001_token_limit_alerts.sql` ✅ ### Frontend - `web/studio/src/app/admin/token-usage/page.tsx` ✅ - `web/studio/src/app/admin/users/page.tsx` ✅ - `web/studio/src/app/admin/page.tsx` ✅ ### Documentación - `TOKEN_LIMITS_GUIDE.md` ✅ - `TOKEN_LIMITS_STATUS.md` ✅ - `TOKEN_LIMITS_UI_COMPLETE.md` ✅ - `TOKEN_LIMITS_FINAL.md` ✅ (este archivo) --- ## 🧪 Testing Checklist - [ ] Navegar a `/admin` - [ ] Ver card "AI Token Usage" - [ ] Hacer clic en "View Details" - [ ] Navegar a `/admin/token-usage` - [ ] Ver tabla con usuarios y límites - [ ] Ordenar por "% Usado" - [ ] Editar límite de un usuario (✏️) - [ ] Ver alerta amarilla (>80%) - [ ] Ver alerta roja (>100%) - [ ] Navegar a `/admin/users` - [ ] Ver columna "Token Limit" - [ ] Configurar límites por rol (SQL) - [ ] Ver notificaciones de alerta --- ## 🎓 Ejemplo de Uso Completo ### 1. Configuración Inicial ```sql -- Configurar límites por rol UPDATE users SET monthly_token_limit = 50000 WHERE role = 'student'; UPDATE users SET monthly_token_limit = 200000 WHERE role = 'instructor'; UPDATE users SET monthly_token_limit = 0 WHERE role = 'admin'; ``` ### 2. Monitoreo Semanal 1. Navegar a `/admin/token-usage` 2. Ordenar por "% Usado" 3. Identificar usuarios con >80% 4. Ajustar límites si es necesario ### 3. Alertas Automáticas El sistema automáticamente: - Detecta cuando un usuario alcanza 80%, 90%, o 100% - Envía notificación en la plataforma - Registra la alerta para no repetir - Notifica solo una vez por umbral por mes --- ## 📞 Soporte **Documentación**: `TOKEN_LIMITS_GUIDE.md` **UI Guide**: `TOKEN_LIMITS_UI_COMPLETE.md` **Issues**: Reportar en GitHub --- **Implementado por**: Equipo de Desarrollo OpenCCB **Fecha**: 2026-03-23 **Versión**: 0.2.3 **Estado**: ✅ Production Ready