6.1 KiB
6.1 KiB
🔄 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:
imported_mysql_id INTEGER -- ID original para evitar duplicados
imported_mysql_course_id INTEGER -- Curso original de MySQL
Lógica de importación:
// 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
- user_id, organization_id
- tokens_used, input_tokens, output_tokens
- endpoint, model, request_type
- estimated_cost_usd
- created_at
Función: log_ai_usage()
-- 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
{
"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
{
"daily_tokens": 50000,
"monthly_tokens": 1000000,
"max_requests_per_day": 100
}
Instructores
{
"daily_tokens": 200000,
"monthly_tokens": 5000000,
"max_requests_per_day": 500
}
Admin
{
"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
// 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
// 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)
-
Implementar límites de tokens
- Daily/monthly limits por rol
- Soft limits (warning) vs hard limits (block)
-
Notificaciones de uso
- Email al alcanzar 80% del límite
- Notificación a admin si usuario excede
-
Reportes avanzados
- Exportar CSV de usage
- Gráficos de tendencia
- Comparativa mes a mes
Implementación: 100% Completa 🎉