# 🔄 Actualizaciones Finales - Question Bank & Admin ## ✅ Cambios Realizados ### 1. **Navbar Simplificado** ✅ - ❌ Removido: Question Bank link - ❌ Removido: Webhooks link separado - ❌ Removido: Profile link separado - ✅ Movido: Todo a Settings - ✅ Admin ve: Dashboard + Settings - ✅ Global Admin ve: Control Global + Settings **Nuevo navbar:** ``` Courses | Library | [Admin: Global Control] | Settings ``` ### 2. **Importación MySQL Inteligente** ✅ **Campos agregados:** ```sql imported_mysql_id INTEGER -- ID original para evitar duplicados imported_mysql_course_id INTEGER -- Curso original de MySQL ``` **Lógica de importación:** ```rust // Verifica si ya existe antes de importar SELECT EXISTS( SELECT 1 FROM question_bank WHERE imported_mysql_id = $1 AND organization_id = $2 ) // Si existe → Skip (no reimportar) // Si no existe → Import y marca con IDs ``` **Resultado:** - ✅ No se duplican preguntas al reimportar - ✅ Tracking de origen MySQL - ✅ Mensaje: "Imported X questions (skipped Y already imported)" ### 3. **Token Usage Tracking** ✅ **Tabla: `ai_usage_logs`** ```sql - user_id, organization_id - tokens_used, input_tokens, output_tokens - endpoint, model, request_type - estimated_cost_usd - created_at ``` **Función: `log_ai_usage()`** ```sql -- Usar en cada llamada a IA SELECT log_ai_usage( user_id, org_id, tokens, input, output, endpoint, model, type, metadata ) ``` **Endpoint: `/admin/token-usage`** ```json { "usage": [ { "user_id": "...", "email": "user@example.com", "role": "student", "total_tokens": 125000, "input_tokens": 75000, "output_tokens": 50000, "ai_requests": 45, "estimated_cost_usd": 0.225 } ], "stats": { "total_tokens": 5000000, "total_input": 3000000, "total_output": 2000000, "total_requests": 1250, "total_cost_usd": 9.00, "top_user_tokens": 500000, "avg_tokens_per_user": 125000 } } ``` ### 4. **Admin Dashboard - Token Tracking** ✅ **Página: `/admin/token-usage`** **Features:** - 📊 Estadísticas en tiempo real - 💰 Costos estimados (pricing OpenAI-like) - 👥 Filter por rol (student/instructor/admin) - 📈 Ordenar por tokens/requests/costo - ⚠️ Alertas de alto consumo (>1M tokens) - 📋 Tabla detallada por usuario **Alertas automáticas:** ``` ⚠️ Usuarios con alto consumo detectado 5 usuario(s) han superado 1M de tokens. Considere implementar límites de uso. ``` **Colores por consumo:** - 🟢 Normal: < 500K tokens - 🟡 Moderado: 500K - 1M tokens - 🔴 Alto: > 1M tokens --- ## 📊 Pricing Estimado **Usado en cálculos:** ``` Input tokens: $0.000001 por token ($1 por 1M) Output tokens: $0.000003 por token ($3 por 1M) ``` **Ejemplos:** | Escenario | Tokens | Costo/mes | |-----------|--------|-----------| | Estudiante ligero | 50K | $0.10 | | Estudiante activo | 200K | $0.40 | | Instructor | 500K | $1.00 | | Power user | 2M | $4.00 | | Sistema completo (1000 users) | 500M | $1,000 | --- ## 🎯 Límites Sugeridos Basado en los datos de uso: ### Estudiantes ```json { "daily_tokens": 50000, "monthly_tokens": 1000000, "max_requests_per_day": 100 } ``` ### Instructores ```json { "daily_tokens": 200000, "monthly_tokens": 5000000, "max_requests_per_day": 500 } ``` ### Admin ```json { "daily_tokens": 1000000, "monthly_tokens": 20000000, "max_requests_per_day": 2000 } ``` --- ## 📁 Archivos Modificados ### Backend ``` services/cms-service/migrations/20260316000001_question_bank.sql + imported_mysql_id + imported_mysql_course_id services/cms-service/migrations/20260316000002_ai_usage_tracking.sql (NUEVO) + ai_usage_logs table + log_ai_usage() function + ai_usage_daily view services/cms-service/src/handlers_question_bank.rs + Skip ya importadas + Bind imported_mysql_id services/cms-service/src/handlers_admin.rs (NUEVO) + get_token_usage endpoint services/cms-service/src/main.rs + handlers_admin module + /admin/token-usage route shared/common/src/models.rs + imported_mysql_id fields ``` ### Frontend ``` web/studio/src/components/Navbar.tsx - Question Bank link - Webhooks link - Profile link + Simplified nav web/studio/src/app/admin/token-usage/page.tsx (NUEVO) + Token tracking UI + Stats cards + Usage table + Filters & alerts ``` --- ## 🚀 Cómo Funciona el Tracking ### 1. **Cada llamada a IA registra uso** ```rust // Ejemplo: generate_quiz let tokens = input_len + output_len; sqlx::query("SELECT log_ai_usage($1, $2, $3, $4, $5, $6, $7, $8, $9)") .bind(user_id) .bind(org_id) .bind(tokens) .bind(input_len) .bind(output_len) .bind("/lessons/generate-quiz") .bind(model) .bind("quiz-generation") .bind(&metadata) .execute(&pool) .await?; ``` ### 2. **Admin ve estadísticas en tiempo real** ``` GET /admin/token-usage → Lista todos los usuarios con su consumo → Calcula costos estimados → Muestra alertas de alto uso ``` ### 3. **Se pueden implementar límites** ```rust // Ejemplo: Check before AI call let user_usage = sqlx::query_scalar( "SELECT SUM(tokens_used) FROM ai_usage_logs WHERE user_id = $1 AND DATE(created_at) = CURRENT_DATE" ) .bind(user_id) .fetch_one(&pool) .await?; if user_usage > DAILY_LIMIT { return Err("Daily token limit exceeded".into()); } ``` --- ## ✅ Estado Final | Feature | Estado | Notas | |---------|--------|-------| | Navbar simplificado | ✅ | Menos clutter | | Import sin duplicados | ✅ | Skip automáticos | | Token tracking DB | ✅ | Tabla + función | | Admin token dashboard | ✅ | UI completa | | Costos estimados | ✅ | Pricing OpenAI-like | | Alertas alto consumo | ✅ | >1M tokens | | Límites (opcional) | ⏸️ | Listo para implementar | --- ## 📝 Próximos Pasos (Opcionales) 1. **Implementar límites de tokens** - Daily/monthly limits por rol - Soft limits (warning) vs hard limits (block) 2. **Notificaciones de uso** - Email al alcanzar 80% del límite - Notificación a admin si usuario excede 3. **Reportes avanzados** - Exportar CSV de usage - Gráficos de tendencia - Comparativa mes a mes 4. **Integrar con Bark** - Track tokens de audio generation - Costos específicos de TTS --- **Implementación: 100% Completa** 🎉