docs: Token limits implementation status
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
@@ -0,0 +1,155 @@
|
|||||||
|
# Token Limits - Estado de Implementación
|
||||||
|
|
||||||
|
## ✅ Phase 1: Completado (Database + API)
|
||||||
|
|
||||||
|
### Base de Datos
|
||||||
|
- [x] Columnas `monthly_token_limit` y `token_limit_reset_day` en users
|
||||||
|
- [x] Vista `ai_usage_monthly`
|
||||||
|
- [x] Función `check_token_limit()`
|
||||||
|
- [x] Función `get_user_usage_stats()`
|
||||||
|
|
||||||
|
### API Endpoints
|
||||||
|
- [x] `PUT /admin/users/{user_id}/token-limit`
|
||||||
|
- [x] `GET /admin/users/{user_id}/token-usage`
|
||||||
|
- [x] `GET /admin/users/{user_id}/token-limit/check`
|
||||||
|
|
||||||
|
### Common Library
|
||||||
|
- [x] Módulo `token_limits`
|
||||||
|
- [x] Función `check_ai_token_limit()`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🔄 Phase 2: En Progreso (Enforce + Dashboard + Alertas)
|
||||||
|
|
||||||
|
### 1. Enforce Automático en Handlers de IA
|
||||||
|
- [ ] `generate_quiz` - 2000 tokens estimados
|
||||||
|
- [ ] `generate_course` - 5000 tokens estimados
|
||||||
|
- [ ] `generate_hotspots` - 2000 tokens estimados
|
||||||
|
- [ ] `generate_role_play` - 2500 tokens estimados
|
||||||
|
- [ ] `summarize_lesson` - 1500 tokens estimados
|
||||||
|
- [ ] `chat_with_tutor` (LMS) - 1000 tokens estimados
|
||||||
|
- [ ] `evaluate_audio` (LMS) - 1500 tokens estimados
|
||||||
|
|
||||||
|
**Código a agregar en cada handler:**
|
||||||
|
```rust
|
||||||
|
// Check token limit before proceeding (estimate X tokens)
|
||||||
|
if let Err(_) = common::token_limits::check_ai_token_limit(&pool, claims.sub, 2000).await {
|
||||||
|
return Err(StatusCode::TOO_MANY_REQUESTS);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Dashboard UI para Admins
|
||||||
|
- [ ] Página `/admin/token-usage` en Studio
|
||||||
|
- [ ] Tabla de usuarios con uso de tokens
|
||||||
|
- [ ] Gráfico de uso por día/semana/mes
|
||||||
|
- [ ] Input para editar límites por usuario
|
||||||
|
- [ ] Alertas visuales (>80%, >90%, 100%)
|
||||||
|
|
||||||
|
**Componentes necesarios:**
|
||||||
|
- `TokenUsageDashboard.tsx` - Página principal
|
||||||
|
- `UserTokenRow.tsx` - Fila de tabla de usuario
|
||||||
|
- `TokenLimitEditor.tsx` - Editor de límites
|
||||||
|
- `UsageChart.tsx` - Gráfico de uso
|
||||||
|
|
||||||
|
### 3. Sistema de Alertas
|
||||||
|
- [ ] Trigger en `ai_usage_logs` INSERT
|
||||||
|
- [ ] Notificaciones al alcanzar 80%, 90%, 100%
|
||||||
|
- [ ] Email opcional al usuario
|
||||||
|
- [ ] Registro en tabla `notifications`
|
||||||
|
|
||||||
|
**Trigger SQL:**
|
||||||
|
```sql
|
||||||
|
CREATE OR REPLACE FUNCTION check_token_limit_alert()
|
||||||
|
RETURNS TRIGGER AS $$
|
||||||
|
DECLARE
|
||||||
|
v_limit INTEGER;
|
||||||
|
v_used BIGINT;
|
||||||
|
v_percentage NUMERIC;
|
||||||
|
BEGIN
|
||||||
|
-- Get user limit
|
||||||
|
SELECT monthly_token_limit INTO v_limit
|
||||||
|
FROM users WHERE id = NEW.user_id;
|
||||||
|
|
||||||
|
IF v_limit > 0 THEN
|
||||||
|
-- Calculate current usage
|
||||||
|
SELECT SUM(tokens_used) INTO v_used
|
||||||
|
FROM ai_usage_logs
|
||||||
|
WHERE user_id = NEW.user_id
|
||||||
|
AND created_at >= DATE_TRUNC('month', NOW());
|
||||||
|
|
||||||
|
v_percentage := (v_used::NUMERIC / v_limit * 100);
|
||||||
|
|
||||||
|
-- Send notification at thresholds
|
||||||
|
IF v_percentage >= 80 AND v_percentage < 90 THEN
|
||||||
|
-- Send 80% alert
|
||||||
|
ELSIF v_percentage >= 90 AND v_percentage < 100 THEN
|
||||||
|
-- Send 90% alert
|
||||||
|
ELSIF v_percentage >= 100 THEN
|
||||||
|
-- Send 100% alert
|
||||||
|
END IF;
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
RETURN NEW;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 📊 Métricas de Uso
|
||||||
|
|
||||||
|
### Queries Útiles
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Usuarios que excedieron 80% de su límite
|
||||||
|
SELECT
|
||||||
|
u.email,
|
||||||
|
u.monthly_token_limit,
|
||||||
|
SUM(au.tokens_used) as used,
|
||||||
|
ROUND((SUM(au.tokens_used)::NUMERIC / u.monthly_token_limit * 100), 2) as percentage
|
||||||
|
FROM users u
|
||||||
|
JOIN ai_usage_logs au ON u.id = au.user_id
|
||||||
|
WHERE au.created_at >= DATE_TRUNC('month', NOW())
|
||||||
|
AND u.monthly_token_limit > 0
|
||||||
|
GROUP BY u.id
|
||||||
|
HAVING SUM(au.tokens_used)::NUMERIC / u.monthly_token_limit > 0.8
|
||||||
|
ORDER BY percentage DESC;
|
||||||
|
|
||||||
|
-- Uso por endpoint
|
||||||
|
SELECT
|
||||||
|
endpoint,
|
||||||
|
COUNT(*) as requests,
|
||||||
|
SUM(tokens_used) as total_tokens,
|
||||||
|
AVG(tokens_used) as avg_tokens
|
||||||
|
FROM ai_usage_logs
|
||||||
|
WHERE created_at >= DATE_TRUNC('month', NOW())
|
||||||
|
GROUP BY endpoint
|
||||||
|
ORDER BY total_tokens DESC;
|
||||||
|
|
||||||
|
-- Top 10 usuarios por uso
|
||||||
|
SELECT
|
||||||
|
u.email,
|
||||||
|
SUM(au.tokens_used) as total_tokens,
|
||||||
|
COUNT(*) as requests
|
||||||
|
FROM users u
|
||||||
|
JOIN ai_usage_logs au ON u.id = au.user_id
|
||||||
|
WHERE au.created_at >= DATE_TRUNC('month', NOW())
|
||||||
|
GROUP BY u.id
|
||||||
|
ORDER BY total_tokens DESC
|
||||||
|
LIMIT 10;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 🎯 Próximos Pasos
|
||||||
|
|
||||||
|
1. **Enforce Automático**: Agregar check en handlers de IA (CMS + LMS)
|
||||||
|
2. **Dashboard UI**: Crear componentes React para admin
|
||||||
|
3. **Alertas**: Implementar trigger y notificaciones
|
||||||
|
4. **Testing**: Verificar que los límites se respetan
|
||||||
|
5. **Documentación**: Actualizar guías de uso
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Fecha**: 2026-03-23
|
||||||
|
**Estado**: Phase 1 ✅ Completado, Phase 2 🔄 En Progreso
|
||||||
Reference in New Issue
Block a user