CreaRack-SL

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_out está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

EscenarioResultado
Modelo en catálogo, sin overrideUsa precio del catálogo (placeholder en input)
Modelo en catálogo, con overrideUsa precio override (badge “Override manual” en tooltip)
Modelo sin catálogo, sin overrideCoste ”—” en análisis
Modelo sin catálogo, con overrideUsa 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:

ModeloIn $/MOut $/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]]