* feat(docs): mirror every docs/ page in all 65 locales Extends the documentation mirrors from the 22-page core set (#13940) to every Markdown page under docs/: 152 sources x 65 locales = 9,880 mirrors (6,208 new), language bars rewritten for the full locale list, state adopted so the blocking drift gate now covers all 152 pages. run-translation.mjs: an oversized block made only of table rows or list items (PROVIDER_REFERENCE.md 244-row table, FREE_TIERS.md 71-item list) is cut at item boundaries and rejoined without a blank line — the single 16-40 KB request outlived the backend socket for verbose scripts. 48 older mirrors whose tables had lost rows were retranslated with --force. * docs(i18n): refresh mirrors for the sources the base changed since the branch cut Section-level retranslation of the 29 docs (and README.md) whose source or mirrors moved on release/v3.8.51 during the run, then state adoption; the drift gate is green again on the merged tree.
17 KiB
Evaluations (Evals) (Español)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Fuente de referencia:
src/lib/evals/,src/lib/db/evals.ts,src/app/api/evals/Última actualización: 2026-06-28 — v3.8.40
OmniRoute incluye un framework de evaluación genérico que puede utilizar para comparar configuraciones de enrutamiento, proveedores/modelos individuales o las suites de referencia «golden set» incluidas. Úselo para verificar cambios de enrutamiento, validar nuevos proveedores y establecer controles de calidad para las versiones antes de desplegarlas en el tráfico de producción.
El framework está implementado mediante:
- Un ejecutor puro (
src/lib/evals/evalRunner.ts) que registra en memoria las suites integradas, evalúa los resultados según los criterios esperados y agrega las tarjetas de puntuación. - Una capa de persistencia (
src/lib/db/evals.ts) para las suites personalizadas (definidas por el usuario) y las ejecuciones históricas en SQLite. - Una capa de orquestación (
src/lib/evals/runtime.ts) que ejecuta cada caso enviando llamadas reales aPOST /v1/chat/completions, captura la latencia y los resultados, y conserva la ejecución. - Endpoints REST en
/api/evals/*(solo con autenticación de administración). - Una sección del panel en
Dashboard → Usage → Evals(EvalsTab.tsx).
Conceptos
Suite
Una suite es una colección con nombre de casos de prueba, con una description y uno o más casos. Las suites proceden de dos fuentes:
| Fuente | Dónde se define | ¿Modificable durante la ejecución? |
|---|---|---|
built-in |
Registrada mediante registerSuite() al iniciar |
No (definida en el código) |
custom |
Almacenada en SQLite eval_suites + eval_cases |
Sí (mediante API/UI) |
Las suites integradas actuales (consulte src/lib/evals/evalRunner.ts):
golden-set— 10 casos de referencia sobre saludos/matemáticas/traducción/seguridadcoding-proficiency— Python/JS/SQL/TS/detección de erroresreasoning-logic— silogismos, problemas verbales y reconocimiento de patronesmultilingual— traducción y detección de idiomassafety-guardrails— PII, jailbreak, rechazo y concienciación sobre sesgosinstruction-following— solo JSON, listas numeradas y restricciones de idiomacodex-comparison— tareas de programación comparativas destinadas al modo de comparación
Caso
Cada caso contiene:
| Campo | Descripción |
|---|---|
id |
Identificador estable (utilizado como clave de resultados y métricas) |
name |
Etiqueta legible para humanos |
model |
Modelo predeterminado cuando la ejecución utiliza el objetivo suite-default |
input |
{ messages, max_tokens? } — enviado a /v1/chat/completions |
expected |
{ strategy, value } — rúbrica de puntuación (consulte más adelante) |
tags |
Etiquetas opcionales (p. ej., safety, pii, jailbreak) |
Objetivo
La misma suite puede ejecutarse con distintos objetivos. El esquema del objetivo es evalTargetSchema en src/shared/validation/schemas.ts:
| Tipo de objetivo | id |
Comportamiento |
|---|---|---|
suite-default |
null |
Cada caso utiliza su campo model integrado |
model |
nombre del modelo | Fuerza que cada caso pase por un único modelo directo (p. ej., gpt-4o) |
combo |
nombre del combo | Ejecuta cada caso mediante un único combo (ejercita el motor de enrutamiento) |
Para model y combo, el campo id es obligatorio (impuesto mediante superRefine de Zod). Cuando se proporciona compareTarget, ambos objetivos deben ser diferentes; el ejecutor conserva ambas ejecuciones bajo el mismo runGroupId para la comparación A/B.
Rúbricas de puntuación
Implementadas en evaluateCase() (evalRunner.ts):
| Estrategia | Se aprueba cuando… |
|---|---|
exact |
actualOutput === expected.value |
contains |
actualOutput.toLowerCase().includes(expected.value.toLowerCase()) |
regex |
new RegExp(expected.value).test(actualOutput) es verdadero |
custom |
expected.fn(actualOutput, evalCase) devuelve un valor verdadero (solo integrada) |
Nota: La puntuación mediante funciones personalizadas está reservada para las suites
definidas en código (integradas), ya que las funciones no se pueden serializar mediante la API. El
evalCaseBuilderSchema solo acepta contains | exact | regex para las
suites creadas por el usuario.
Actualmente no existe ningún evaluador basado en LLM ni ningún sistema de puntuación de similitud basado en embeddings;
sería un punto de extensión claro en evaluateCase().
Esquema de la base de datos
Tres tablas (migraciones 030_create_eval_runs.sql y
031_create_eval_suites.sql):
| Tabla | Propósito |
|---|---|
eval_suites |
Metadatos de las suites personalizadas (id, name, description) |
eval_cases |
Casos por suite — input_json, expected_*, tags_json |
eval_runs |
Ejecuciones históricas — pass_rate, total, passed, failed, avg_latency_ms, summary_json, results_json, outputs_json |
Las suites integradas no se almacenan en la base de datos. Residen en memoria y se
vuelven a registrar cada vez que se importa evalRunner.ts.
API REST
Todos los endpoints requieren autenticación de administración (requireManagementAuth); no
forman parte de la superficie pública del proxy.
| Endpoint | Método | Descripción |
|---|---|---|
/api/evals |
GET |
Enumera suites + ejecuciones recientes + tabla de puntuaciones + destinos + claves |
/api/evals |
POST |
Ejecuta una suite (individual o comparativa) — esquema evalRunSuiteSchema |
/api/evals/{suiteId} |
GET |
Obtiene una suite (integrada o personalizada) |
/api/evals/suites |
POST |
Crea una suite personalizada — esquema evalSuiteSaveSchema |
/api/evals/suites/{suiteId} |
GET |
Obtiene una suite personalizada |
/api/evals/suites/{suiteId} |
PUT |
Sustituye una suite personalizada (los casos se vuelven a insertar) |
/api/evals/suites/{suiteId} |
DELETE |
Elimina una suite personalizada y sus casos |
Ejecutar una suite
curl -X POST http://localhost:20128/api/evals \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{
"suiteId": "golden-set",
"target": { "type": "combo", "id": "my-combo" },
"apiKeyId": "optional-api-key-uuid"
}'
Campos opcionales:
outputs—Record<caseId, string>de salidas calculadas previamente. Cuando se proporciona, el ejecutor omite el envío y solo puntúa las salidas almacenadas en caché (útil para la evaluación sin conexión).compareTarget— segundo destino que se ejecutará en paralelo; ambas ejecuciones comparten unrunGroupIdgenerado para la visualización comparativa.apiKeyId— clave de API interna utilizada para autenticar las llamadas enviadas a/v1/chat/completions. Es obligatoria cuandoREQUIRE_API_KEYestá habilitado.
Crear una suite personalizada
curl -X POST http://localhost:20128/api/evals/suites \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{
"name": "Production smoke",
"description": "Quick sanity check before deploy",
"cases": [
{
"name": "JSON shape",
"model": "gpt-4o",
"input": { "messages": [{ "role": "user", "content": "Reply with {\"ok\": true}" }] },
"expected": { "strategy": "regex", "value": "\"ok\"\\s*:\\s*true" }
}
]
}'
Canalización de ejecución
runEvalSuiteAgainstTarget() (src/lib/evals/runtime.ts):
- Resuelve la suite (integrada o personalizada).
- Para cada caso, crea una
Requesta/v1/chat/completionscon losmessagesdel caso, elmodelresuelto,stream: falseymax_tokens: 512(o el valor sobrescrito del caso). - Llama directamente al controlador del chat (en el mismo proceso, sin una solicitud HTTP adicional).
- Registra la latencia y extrae el texto de
choices[0].message.contento de la carga útiloutput[]de la API Responses. - Puntúa todas las salidas mediante
runSuite()y, a continuación, las persiste mediantesaveEvalRun().
Los casos se ejecutan secuencialmente. Actualmente no existe ninguna opción de concurrencia.
Panel de control
La interfaz de usuario se encuentra en Dashboard → Usage → Evals
(src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx). Desde allí puedes:
- Explorar suites integradas y personalizadas con una vista previa caso por caso.
- Crear, editar y eliminar suites personalizadas con el generador de casos.
- Elegir un destino (valores predeterminados de la suite / modelo / combo), opcionalmente un segundo
compareTarget, opcionalmente una clave de API y, a continuación, ejecutar bajo demanda. - Consultar el historial de ejecuciones, el resultado de aprobación o fallo por caso, la latencia y las salidas capturadas.
- Ver el cuadro de puntuaciones acumulado, agregado a partir de la ejecución más reciente por ámbito
(suite, target).
Relación con la RFC de evaluación automática
Existe un subsistema de evaluación separado y más específico en src/domain/assessment/
(consulta también AUTO-COMBO.md para obtener información sobre el motor de puntuación en vivo).
Este subsistema está orientado al motor Auto Combo: puntúa automáticamente los proveedores y
modelos para que los combos puedan autorrecuperarse cuando fallen los servicios de origen. Utiliza su propio ejecutor,
su propio categorizador y su propia lógica de puntuación.
El marco de Evals documentado aquí es la superficie de pruebas más amplia y de propósito general. Es preferible para suites de regresión arbitrarias, comparaciones A/B y pruebas de humo por versión. Utiliza el subsistema de evaluación automática cuando necesites que el estado en tiempo real de los proveedores influya en las decisiones de enrutamiento.
Integración con CI
Actualmente no existe un script npm eval:ci específico. Hay dos opciones si deseas
condicionar las versiones a los resultados de las evaluaciones:
- Vía HTTP: inicia el servidor, envía una solicitud a
POST /api/evalscon valores conocidos desuiteId+targety comprueba queruns[].summary.passRate >= Nen la respuesta. - Vía en el mismo proceso: importa
runEvalSuiteAgainstTarget()desde@/lib/evals/runtimeen un script, ejecútalo contra una base de datos de pruebas y comprueba el valorPersistedEvalRun.summarydevuelto.
Las pruebas que cubren la ruta y el historial se encuentran en
tests/unit/evals-route.test.ts y tests/unit/evals-history.test.ts.
Puntos de extensión
Cambios habituales y dónde realizarlos:
- Nueva estrategia de puntuación — amplía el bloque
switch (evalCase.expected.strategy)enevaluateCase()(evalRunner.ts) y amplíaEvalCaseStrategyensrc/lib/db/evals.ts, además deevalCaseBuilderSchemaenschemas.ts. - Nueva suite integrada — define un objeto de suite y llama a
registerSuite()al final deevalRunner.ts.listSuites()la descubrirá automáticamente. - Ejecución con concurrencia — cambia el bucle
forsecuencial derunEvalSuiteAgainstTarget()por unPromise.allacotado (actualmente no existe ningún control de concurrencia). - Casos de streaming/llamadas a herramientas — actualmente, el ejecutor fuerza
stream: false. La evaluación compatible con streaming o herramientas requeriría cambios enruntime.ts(capturar y agregar los fragmentos SSE antes de puntuar).
Véase también
- USER_GUIDE.md — guía general del producto
- ARCHITECTURE.md — referencia del flujo de solicitudes
- AUTO-COMBO.md — motor de puntuación Auto Combo (entorno de ejecución activo)
- Código fuente:
src/lib/evals/,src/lib/db/evals.ts,src/app/api/evals/ - Interfaz de usuario:
src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx