Benchmarks está en vista previa y se habilita para las
organizaciones de forma gradual. Los endpoints y herramientas de esta página
están disponibles cuando Benchmarks está habilitado para tu organización; hasta
entonces responden
403 not_entitled.Qué es un caso
Un caso es una entrada más su resultado esperado. Cada caso tiene uncaseType:
Un caso
turn no es dueño de un prompt. Apunta a una
versión del agente (prompt.agentVersionId), así que
el mismo caso puede reproducirse contra varias revisiones de prompt y modelos.
Autenticación
Usa una clave de API de la organización como token bearer. La misma clave sirve para REST y para MCP. Crear y editar casos es una escritura: la clave debe pertenecer a un propietario o administrador de la organización; si no, la solicitud se rechaza con403.
Crear casos
POST /v1/benchmarks/{id}/cases crea hasta 100 casos por solicitud y los
devuelve en data.
cases.json
Respuesta (201)
Idempotency-Key en la creación por lotes para que una
solicitud reintentada devuelva los casos que creó la primera vez en lugar de
crear duplicados.
Campos del caso
Un caso
turn debe verificar al menos algo: una expectativa de respuesta distinta
de none, o una expectativa de herramientas.
Expectativas de llamadas a herramientas
toolExpectation verifica si el paso llamó a la herramienta correcta y si la
llamada tiene la forma correcta. Elige una de tres formas:
Este caso espera que se cree un plan de pagos de tres cuotas, en la moneda del
cliente, y nunca un reembolso:
noExtraArguments: true para
que fallen las llamadas que envían cualquier otro argumento. Cuando un paso habla y
además llama herramientas, replyAt (con ordered: true) fija dónde va la
respuesta entre las llamadas: 0 significa antes de todas. Cada tool indicada
debe existir en el prompt del caso.
Comparadores de argumentos
Además de los comparadores, los argumentos de cada llamada deben validar contra el
JSON schema de la herramienta:
"amount": "240" falla en un argumento
{ "type": "number" }.
Omitir o ajustar un juez para un caso
Los jueces se definen en el benchmark. Obtén sus ids conGET /v1/benchmarks/{id} (validators[]); la API llama a los jueces
“validators”.
skippedJudgeIdsexcluye este caso de jueces que no tienen sentido para él, como una rúbrica de tono en un paso que solo llama herramientas. Los jueces obligatorios no se pueden omitir, y al menos un juez debe seguir ejecutándose.judgeParamOverridescambia los parámetros de un juez solo para este caso. Un juez con la etiqueta “Respuesta de menos de palabras” y un valor por defecto de 60 puede ajustarse a 10 para un caso:
min / max. Un ajuste
para un juez que también omites se descarta.
Casos de conversación
Casos de audio (STT)
En un benchmark STT, cada caso es{ audio, referenceTranscript, keyTerms?, tags? }.
El audio nunca pasa por el cuerpo de la solicitud, salvo clips cortos:
- Prepara el archivo con
POST /v1/recording-uploadsy luego hazPUTde los bytes a lauploadUrldevuelta. - Crea el caso con
"audio": { "uploadId": "<id>" }.
"audio": { "url": "https://..." } (Zelto lo descarga; el
caso queda preparing hasta que termina la descarga) o, para clips de hasta
3 MB, "audio": { "base64": "...", "contentType": "audio/wav" }.
Agregar casos desde llamadas de producción
POST /v1/benchmarks/{id}/cases/from-conversations convierte hasta 100
conversaciones en casos en una sola solicitud, con el
mismo mapeo que Desde llamadas de producción en el panel. Cada caso registra
la versión del agente de la llamada, los valores de variables capturados de la
llamada, el nodo activo (en agentes basados en nodos) y la transcripción previa al
turno evaluado.
Las variables capturadas aparecen enmascaradas en la respuesta. Los casos cuyo
nodo no se pudo resolver vuelven como
draft. Usa
PATCH /v1/benchmarks/{id}/cases/{caseId} para afinar cualquier caso después:
cambiar su resultado esperado, agregar una expectativa de herramientas, reemplazar
una variable capturada con variableOverrides, o enviar "status": "ready" para
aceptar un borrador.
Agregar casos desde trazas
POST /v1/benchmarks/{id}/cases/from-traces crea hasta 100 casos a partir de
trazas, igual que Agregar al benchmark en una traza o un
span.
- Con un
spanId(un span de LLM o de herramienta), el caso prueba esa única llamada al LLM: los mensajes de entrada del span se convierten en el historial, y su salida en el paso esperado. - Sin
spanId, se usa la conversación vinculada de la traza, comofrom-conversationsconturn: "last_assistant".
turnSource: span_messages cuando el historial vino del
span, o transcript cuando vino de la llamada vinculada. Una traza sin llamada
vinculada necesita un span que haya registrado sus mensajes; si no, ese elemento
falla con 422 no_turn_source.
Con MCP
El servidor MCP de Zelto expone las mismas operaciones como herramientas, así que puedes pedirle a Claude, Cursor o cualquier cliente MCP que construya un benchmark por ti:
Un prompt de ejemplo:
list_benchmarks, list_conversations,
add_benchmark_cases_from_conversations y luego a update_benchmark_case para
las expectativas de herramientas.
Dónde quedan los casos nuevos
Los casos nuevos y editados van al borrador del benchmark, la copia de trabajo que el panel muestra como “Cambios en borrador”. Las ejecuciones usan por defecto la última versión publicada, así que los casos nuevos entran en una ejecución solo después de publicar:draft y te avisa de ellos. Los
propietarios y administradores también pueden ejecutar el borrador directamente;
esa ejecución se marca como “ejecución de borrador”. Los casos nunca se eliminan:
editar uno crea una nueva revisión, y retirarlo lo quita de la siguiente versión
mientras las ejecuciones anteriores conservan sus resultados.
Errores
Los errores son JSON:{ "error": "<code>", "details": ... }.
Por MCP, los mismos rechazos llegan como resultados de herramienta con
isError: true; consulta Resultados de error.
Contenido relacionado
- Benchmarks: casos, jueces y versiones.
- Versiones de agentes: a qué apunta
prompt.agentVersionId. - MCP: conectar un cliente y autenticarse.

