AiEvalPanel — Componente de Evaluación de Modelos LLM
AiEvalPanel — Componente de Evaluación de Modelos LLM
Descripción
AiEvalPanel es el componente React principal de la herramienta AI Eval dentro del Workspace de CreaRack. Permite al equipo técnico comparar múltiples modelos LLM (Gemini, Anthropic, OpenAI, OpenRouter) sobre un conjunto de casos de prueba definidos manualmente, obteniendo métricas de coste, latencia y calidad de respuesta por modelo.
Ruta: src/components/tools/AiEvalPanel.tsx
Interfaces principales
Candidate
Representa un modelo candidato a evaluar.
interface Candidate {
provider: 'gemini' | 'anthropic' | 'openai' | 'openrouter';
model: string;
label?: string;
// Override manual de precio (USD por 1M tokens)
price_in?: number; // $/M tokens de entrada
price_out?: number; // $/M tokens de salida
}
Los campos price_in y price_out son opcionales. Si se omiten, el sistema usa el catálogo embebido MODEL_PRICING. Si se definen, tienen prioridad absoluta sobre el catálogo.
CaseDef
Define un caso de prueba: prompt + parámetros de llamada.
CellResult
Resultado de ejecutar un caso concreto con un modelo concreto: respuesta, tokens de entrada/salida y latencia en ms.
RunSummary / RunFull
Agregados del resultado de una ejecución completa: métricas por modelo (coste total, latencia media, tokens) y comparativa de pares.
Funciones clave
priceForModel(model: string)
Busca el precio en el catálogo embebido MODEL_PRICING. Devuelve { in, out } en USD/1M tokens, o null si el modelo no está catalogado.
effectivePrice(c: Candidate)
Calcula el precio efectivo para un candidato aplicando la lógica de override:
function effectivePrice(c: Candidate): { in: number; out: number } | null {
const auto = priceForModel(c.model);
const inP = c.price_in ?? auto?.in;
const outP = c.price_out ?? auto?.out;
if (inP === undefined || outP === undefined) return null;
return { in: inP, out: outP };
}
- Si
price_in/price_outestán definidos en el candidato → override manual. - Si no, usa el catálogo automático.
- Si no hay precio de ninguna fuente → devuelve
null(celda de coste muestra ”—”).
cellCostUsd(cell: CellResult, candidate: Candidate)
Calcula el coste en USD de una ejecución individual usando effectivePrice. Recibe el Candidate completo (no solo el model id) para que los overrides se propaguen a todas las vistas.
updateCandidatePrice(i, field, value)
Handler de cambio en los inputs de precio de la tabla de candidatos. Valida que el valor sea un número finito >= 0. Si el input queda vacío, elimina el campo de override y restaura el precio automático del catálogo.
Feature: Override Manual de Precios (commit@456485f)
Motivación
El catálogo embebido MODEL_PRICING puede quedar desactualizado cuando los providers modifican sus tarifas, o puede no contener modelos recientes o de OpenRouter. En ese caso, la sección de Análisis mostraba ”—” en las celdas de coste, imposibilitando comparaciones económicas.
Comportamiento
| Escenario | Resultado |
|---|---|
| Modelo en catálogo, sin override | Usa precio del catálogo (placeholder en input) |
| Modelo en catálogo, con override | Usa precio override (badge “Override manual” en tooltip) |
| Modelo sin catálogo, sin override | Coste ”—” en análisis |
| Modelo sin catálogo, con override | Usa precio override → coste calculado correctamente |
UI: Tabla de candidatos
La sección Modelos candidatos pasó de ser una lista de chips a una tabla con columnas:
| Modelo | In $/M | Out $/M | ✕ |
|---|---|---|---|
gpt-4o [openai] | <input> | <input> | Quitar |
- El placeholder del input muestra el precio catalogado (si existe).
- El tooltip distingue entre “Auto: $X/M (catálogo)” y “Override manual”.
- Vaciar el input limpia el override y restaura el automático.
Propagación a RunSummary
RunSummary ahora mantiene un mapa candidateByKey: Record<string, Candidate> (antes era solo el model id). Esto garantiza que los overrides de precio se reflejen correctamente en:
- Cards globales de coste total por modelo.
- Comparativa de pares (tabla de diferencias entre modelos).
MODEL_PRICING (catálogo embebido)
Diccionario estático Record<string, { in: number; out: number }> con precios en USD/1M tokens de los modelos más comunes de Gemini, Anthropic y OpenAI. Es la fuente de precios por defecto cuando no hay override manual.
Limitaciones conocidas:
- Debe actualizarse manualmente cuando los providers modifican tarifas.
- No cubre todos los modelos de OpenRouter.
- El override manual es el mecanismo de escape ante estas limitaciones.
Véase también
- [[workspace—que-es-workspace]]
- [[workspace—agentes-ia]]
- [[workspace—informes]]
- [[workspace—tareas-notas]]