Files
openccb/docs/TOKEN_USAGE_TRACKING.md
2026-03-17 12:07:56 -03:00

302 lines
6.9 KiB
Markdown

# 📊 Token Usage Tracking - Implementación Completa
## ✅ Lo Que Se Implementó
### 1. **Base de Datos** ✅
- Tabla `ai_usage_logs` para registrar cada llamada a IA
- Función `log_ai_usage()` para logging fácil
- Vista `ai_usage_daily` para reportes
- Índices para queries rápidos
### 2. **Función count_tokens()** ✅
```rust
fn count_tokens(text: &str) -> i32 {
// Aproximación: 1 token ≈ 4 caracteres
let char_count = text.len();
((char_count as f64) / 4.0).ceil() as i32
}
```
**Precisión:**
- ✅ Suficiente para estimaciones de costo
- ✅ Rápida (no requiere librerías externas)
- ✅ Funciona para inglés y español
### 3. **Endpoints con Tracking** ✅
#### generate_quiz
```rust
// Calcular tokens
let input_tokens = count_tokens(&system_prompt) + count_tokens(&content_text);
let output_tokens = count_tokens(&response_json.to_string());
let total_tokens = input_tokens + output_tokens;
// Loguear
let _ = sqlx::query("SELECT log_ai_usage($1, $2, $3, $4, $5, $6, $7, $8, $9)")
.bind(claims.sub)
.bind(org_ctx.id)
.bind(total_tokens)
.bind(input_tokens)
.bind(output_tokens)
.bind("/lessons/generate-quiz")
.bind(&model)
.bind("quiz-generation")
.bind(&json!({ "lesson_id": id, "quiz_type": quiz_req.quiz_type }))
.execute(&pool)
.await;
```
### 4. **Endpoint Admin** ✅
- `/admin/token-usage` - Ver uso por usuario
- Muestra:
- Total tokens por usuario
- Input vs output tokens
- Número de requests
- Costo estimado en USD
- Última actividad
### 5. **UI Dashboard** ✅
- Página `/admin/token-usage`
- Stats cards con:
- Total tokens
- Requests IA
- Costo estimado
- Usuarios activos
- Tabla filtrable por rol
- Alertas de alto consumo (>1M tokens)
## 📊 Esquema de la Tabla
```sql
CREATE TABLE ai_usage_logs (
id UUID,
user_id UUID,
organization_id UUID,
tokens_used INTEGER,
input_tokens INTEGER,
output_tokens INTEGER,
endpoint VARCHAR(255),
model VARCHAR(100),
request_type VARCHAR(50),
request_metadata JSONB,
estimated_cost_usd NUMERIC(10, 6),
created_at TIMESTAMPTZ
);
```
## 💰 Cálculo de Costos
**Fórmula (OpenAI-like pricing):**
```rust
v_cost := (input_tokens * 0.000001) + (output_tokens * 0.000003);
// $1 por 1M input tokens
// $3 por 1M output tokens
```
**Ejemplos:**
| Endpoint | Input | Output | Total | Costo |
|----------|-------|--------|-------|-------|
| generate_quiz | 500 | 800 | 1,300 | $0.0029 |
| transcribe (1 min) | 0 | 150 | 150 | $0.00045 |
| chat (pregunta) | 200 | 300 | 500 | $0.0011 |
## 🎯 Endpoints a Implementar
Para tracking completo, agregar en:
### 1. **generate_summary_with_ollama**
```rust
// Al final de la función
let input_tokens = count_tokens(&text);
let output_tokens = count_tokens(&summary);
let _ = sqlx::query("SELECT log_ai_usage(...)")
.bind(...)
.execute(&pool)
.await;
```
### 2. **chat con lesson tutor**
```rust
// En handlers.rs, función de chat
let input_tokens = count_tokens(&conversation_history);
let output_tokens = count_tokens(&ai_response);
// Log...
```
### 3. **generate_feedback**
```rust
// Similar a generate_quiz
```
## 📈 Dashboard de Admin
### Stats en Tiempo Real
```
┌──────────────┬──────────────┬──────────────┬──────────────┐
│ Total Tokens │ Requests IA │ Costo USD │ Usuarios │
│ 5,234,567 │ 1,234 │ $15.67 │ 345 │
└──────────────┴──────────────┴──────────────┴──────────────┘
```
### Filtros Disponibles
- Por rol (student/instructor/admin)
- Por fecha (daily view)
- Por endpoint
- Por tipo de request
### Alertas Automáticas
```
⚠️ Usuarios con alto consumo detectado
5 usuario(s) han superado 1M de tokens.
Considere implementar límites de uso.
```
## 🔧 Límites Sugeridos
### 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
}
```
### Admins
```json
{
"daily_tokens": 1000000,
"monthly_tokens": 20000000,
"max_requests_per_day": 2000
}
```
## 📝 Implementación de Límites (Opcional)
```rust
// Middleware o check antes de llamada a IA
async fn check_token_limit(
pool: &PgPool,
user_id: Uuid,
daily_limit: i32,
) -> Result<(), StatusCode> {
let today_usage: i64 = sqlx::query_scalar(
"SELECT COALESCE(SUM(tokens_used), 0) FROM ai_usage_logs
WHERE user_id = $1 AND DATE(created_at) = CURRENT_DATE"
)
.bind(user_id)
.fetch_one(pool)
.await?;
if today_usage > daily_limit as i64 {
return Err(StatusCode::TOO_MANY_REQUESTS);
}
Ok(())
}
```
## 🎯 Métricas Clave
### Por Usuario
- Total tokens (lifetime)
- Tokens hoy
- Requests hoy
- Costo acumulado
### Por Organización
- Total tokens (todos los usuarios)
- Top users
- Costo mensual
- Growth trend
### Por Endpoint
- Most used endpoints
- Average tokens per request
- Error rates
## 📖 Uso del Dashboard
1. **Ver uso general**
- Ve a `/admin/token-usage`
- Revisa stats cards
2. **Filtrar por rol**
- Selecciona "Estudiantes" o "Instructores"
- Ordena por "Total Tokens"
3. **Identificar power users**
- Ordena por "Total Tokens"
- Revisa usuarios > 1M tokens
4. **Monitorear costos**
- Revisa "Costo USD"
- Proyecta uso mensual
5. **Detectar anomalías**
- Alertas automáticas > 1M tokens
- Picos de uso inusuales
## 🚀 Próximos Pasos
### Corto Plazo
- [ ] Agregar logging en todos los endpoints de IA
- [ ] Implementar límites suaves (warnings)
- [ ] Exportar CSV de usage
### Mediano Plazo
- [ ] Límites duros (block requests)
- [ ] Notificaciones email (80% del límite)
- [ ] Gráficos de tendencia
### Largo Plazo
- [ ] Budget por organización
- [ ] Alertas de costo
- [ ] Integration con sistemas de billing
## 📁 Archivos Modificados
```
services/cms-service/migrations/20260316000002_ai_usage_tracking.sql
services/cms-service/src/handlers.rs
+ count_tokens() function
+ Token logging in generate_quiz
services/cms-service/src/handlers_admin.rs (NUEVO)
+ get_token_usage endpoint
services/cms-service/src/main.rs
+ /admin/token-usage route
shared/common/src/models.rs
+ TokenUsage models
web/studio/src/app/admin/token-usage/page.tsx (NUEVO)
+ Admin dashboard UI
web/studio/src/app/admin/page.tsx
+ Link a Token Usage
```
## ✅ Estado
| Componente | Estado |
|------------|--------|
| DB Schema | ✅ 100% |
| Logging Function | ✅ 100% |
| generate_quiz Tracking | ✅ 100% |
| Admin Endpoint | ✅ 100% |
| Admin Dashboard UI | ✅ 100% |
| Límites | ⏸️ Listo para implementar |
| Otros Endpoints | ⏳ Pendiente agregar |
**Progreso Total: 80%** 🎉