AI Eval — Comparador de modelos IA
URL: /tools/ai-eval · Acceso: cualquier persona del staff con CF Access.
Para qué sirve
Cuando hay que decidir si migrar un call site IA del proyecto a otro modelo (más rápido, más barato, mejor calidad, o por una API que se quedó deprecated), esta tool te lanza una matriz de candidatos × casos de prueba y te enseña la latencia, los tokens y el coste real de cada combinación. Sin tener que pelear con un script Python ni tirar de la línea de comandos.
El caso histórico que la motivó es la sesión 33: queríamos comparar gemini-3-flash-preview con gemini-3.1-flash-lite-preview en los 4 casos reales de CreaRack-Pro (MIB Assistant, Network Tutor, Perf Review, Vision Auto-Plan). Antes de esto se hacía con scripts/eval_ai_models.py lanzado en el contenedor — funcionaba, pero solo lo lanzaba quien sabía el comando. Ahora cualquiera del equipo abre la web y compara modelos en 30 segundos.
Si te interesa el contexto de por qué migramos:
decision--20260427--gemini-3-1-flash-lite-migration.
Cómo se usa (golden path)
- Entras en
/tools/ai-eval. - Modelos candidatos: añades los modelos que quieres comparar. Tienes 13 presets en botones (3 Gemini, 3 Claude, 4 GPT, 3 OpenRouter). Si necesitas algo que no está, abajo hay un input custom donde eliges provider y escribes el
model id. - Prompts: marcas uno o varios de los 4 templates predefinidos (
MIB,Tutor,Perf Review,Vision) o activas elPrompt personalizadoy escribes el tuyo. Los 4 templates son copia literal de los prompts que CreaRack-Pro usa en producción — lo que veas aquí es exactamente lo que recibe la API en el flujo real. - API keys: aparecen sólo los inputs de los providers que estés usando. La key viaja en el body de la request y nunca se guarda — ni en la base de datos ni en logs. Cada vez que ejecutas, la pasas otra vez.
- Ejecutar. Tarda entre 5 y 30 segundos según cuántas celdas (cap 25 por run, candidates × cases ≤ 25).
- Ves la matriz de resultados: latencia, tokens y respuesta resumida por celda. El botón
Ver respuestaexpande el JSON/texto completo. Puedes abrir varias respuestas a la vez para comparar lado a lado. - Debajo aparece la sección Análisis con el resumen ejecutivo: celdas OK, latencia total, coste estimado USD, modelo más rápido, modelo más barato. Si comparas exactamente 2 modelos, te suelta una frase tipo “GPT-5.4 cuesta 12x más que Claude Haiku 4.5”.
- Histórico en la columna derecha. Cada run queda guardado (sin las keys, claro). Click en una entrada y la tool se rellena con los mismos parámetros para repetir o comparar.
Providers soportados
| Provider | Tipo | Cómo conseguir la key | Notas |
|---|---|---|---|
| Google Gemini | Nativo (generativelanguage.googleapis.com) | AI Studio | El proyecto ya tiene una en Dokploy env. Modelos preview soportan responseMimeType: application/json y vision. |
| Anthropic Claude | Nativo (api.anthropic.com/v1/messages) | Console Anthropic | Header anthropic-version: 2023-06-01. No tiene response_format json_object nativo (si lo activas, lo ignora). Sí soporta vision. |
| OpenAI | Nativo (api.openai.com/v1/chat/completions) | Platform OpenAI | Usa max_completion_tokens (compat GPT-4o → GPT-5+). Para reasoning models (o3, o4-mini) la tool omite automáticamente el parámetro temperature para no romper. |
| OpenRouter | Gateway agnóstico | OpenRouter | Da acceso a 200+ modelos con una sola key. Markup ~5% sobre el precio del proveedor original. Útil para probar Mistral, Cohere, DeepSeek y modelos open-source sin abrir cuenta en cada provider. |
Templates de prompts
Los 4 templates están embebidos en functions/api/tools/ai-eval/templates.ts y son copia literal de los call sites de CreaRack-Pro:
- MIB Assistant: Clasificación de OIDs SNMP a categorías de monitoreo. JSON estructurado. Temperatura baja (0.1). Origen:
network/services/mib_assistant.py::GEMINI_PROMPT. - Network Tutor: Q&A pedagógico de redes con system prompt restrictivo (sólo responde sobre networking, rechaza el resto). Texto natural. Temperatura 0.4. Origen:
monitoring/services/tutor_service.py::TUTOR_SYSTEM_PROMPT. - Perf Review: Análisis de informe de rendimiento Postgres+Django. Recomendaciones priorizadas. Temperatura 0.2. Origen: prompt del cron
core/management/commands/perf_review.py. - Vision (Auto-Plan): Detección de racks en imagen de plano de sala de servidores. JSON estructurado. Requiere que subas un PNG (campo file appears cuando seleccionas el template). Origen:
blueprints/services/autoplan.py.
Para añadir más templates: editar el array TEMPLATES en functions/api/tools/ai-eval/templates.ts y deployar.
Override manual de precios
El catálogo MODEL_PRICING (en AiEvalPanel.tsx) tiene los precios oficiales a fecha de 27-04-2026, verificados contra la documentación de Anthropic y el catálogo de OpenRouter. Pero los providers cambian tarifas y nuevos modelos salen cada semana, así que el catálogo se queda desfasado.
Por eso cada fila de la tabla “Modelos candidatos” tiene dos campos editables: In $/M y Out $/M. El placeholder gris muestra el precio del catálogo automático. Si dejas el campo vacío, se usa ese. Si escribes un valor, sobrescribe — útil cuando:
- El modelo que estás probando no está en el catálogo (te aparece
—). - El provider acaba de subir o bajar el precio y no hemos actualizado el código aún.
- Quieres simular un escenario hipotético (“¿y si Anthropic baja Sonnet a $1.5?”).
Vaciar el input vuelve al precio del catálogo. El override afecta a la sección “Análisis” entera (cards globales, tabla por modelo, comparativa par).
Cómo añadir un modelo o provider nuevo
Modelo dentro de un provider ya soportado:
- Vía UI: input “Custom” debajo de los presets — eliges provider, pegas el
model id, listo. - Vía código (para que aparezca como botón preset): edita
MODEL_PRESETSenAiEvalPanel.tsxy opcionalmente añade entrada aMODEL_PRICINGpara que el coste salga sin tener que escribirlo.
Provider nuevo (no Google / Anthropic / OpenAI / OpenRouter):
- Implementar
callXxx(apiKey, model, c)enfunctions/api/tools/ai-eval/run.ts. MiracallAnthropicocallOpenAIcomo plantilla — devuelve{ answer, latency_ms, tokens_in?, tokens_out?, error? }. - Añadir el provider al type
Candidate.provider(en run.ts y AiEvalPanel.tsx). - Añadir la key al state, validación y dropdown del CustomModelInput.
- Añadir input password en la sección API Keys con el
providersInUse.has('xxx')correspondiente.
Trabajo: 30-45 min por provider nuevo.
Persistencia y privacidad
- Tabla D1:
ai_eval_runs(migración0016_create_ai_eval_runs.sql). Guarda timestamp, email del usuario (de CF Access), candidatos, cases (sinimage_b64para no inflar D1), results completos, total_cells, duration_ms, status, notes. - Lo que NO se guarda: API keys (van en el body de la request y se descartan al volver), imágenes subidas (sólo el flag
has_image). - Sin rate limit: somos 3 personas en el workspace, no se va a abusar. Si en el futuro hubiera abuso (raro), el cap de 25 celdas por run ya limita el daño.
Coste estimado y consideraciones
El cap de 25 celdas existe para no quemar OpenRouter o las APIs de pago accidentalmente. Si pones 5 modelos × 5 prompts = 25 celdas, ese run podría costar entre fracciones de céntimo (sólo Gemini Lite + Llama) y varios dólares (todo Claude Opus + GPT-5.5 con prompts largos). El número de la card “Coste estimado” sale al final, así que lo ves antes de meterte en otro run.
Si el modelo es de pago directo (Gemini, Anthropic, OpenAI), el cargo va a tu cuenta de ese provider. OpenRouter cobra una sola factura para todos los modelos que pases por el gateway.
Limitaciones conocidas
- Vision sólo en template Vision: el template Custom no acepta imagen. Si necesitas probar otro caso vision con prompt distinto, edita Vision en
templates.tso añade un nuevo template conrequires_image: true. - Anthropic + JSON estricto: si activas
response_jsonpara un caso ejecutado contra Claude, el flag se ignora (Claude devuelve texto). Solución estándar Claude: pedir el JSON dentro del prompt y validarlo después. - OpenAI o-series: la tool detecta el prefijo
o*y omitetemperatureautomáticamente. Si OpenAI saca un modelo nuevo cuya nomenclatura escape esa heurística, habrá que actualizar el regex encallOpenAI. - Sin streaming: la tool espera la respuesta completa antes de pintar la celda. Si una llamada tarda >30s, la UI parece colgada (aunque sigue funcionando). Para casos largos, usar prompts más cortos.
Véase también
- [[decision—20260427—gemini-3-1-flash-lite-migration]] — la decisión que motivó construir esta tool.
scripts/eval_ai_models.pyen CreaRack-Pro — el script Python original que hace lo mismo desde línea de comandos. Se mantiene en el repo por si alguien quiere correr una matriz desde CI o ad-hoc en local sin abrir el navegador.