296 lines
6.1 KiB
Markdown
296 lines
6.1 KiB
Markdown
# 🔄 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
|
|
|
|
---
|
|
|
|
**Implementación: 100% Completa** 🎉
|