Files
openccb/FINAL_UPDATES.md
T

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** 🎉