Files
openccb/FINAL_UPDATES.md
T

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)

  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 🎉