Saltar al contenido principal
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.
Todo lo que hace el menú Agregar casos del panel lo puedes hacer con la API REST o con MCP: escribir casos a mano, convertir conversaciones o trazas de producción en casos de forma masiva, y adjuntar expectativas de llamadas a herramientas y ajustes de jueces. Ambas superficies usan el mismo servicio que el panel, así que un caso creado por API es idéntico a uno creado en la interfaz.

Qué es un caso

Un caso es una entrada más su resultado esperado. Cada caso tiene un caseType: 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 con 403.
Los casos solo pueden referirse a agentes asignados al benchmark. Para agregar un caso de otro agente, asigna primero ese agente al benchmark.

Crear casos

POST /v1/benchmarks/{id}/cases crea hasta 100 casos por solicitud y los devuelve en data.
cases.json
Respuesta (201)
Envía un encabezado 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:
Solo se verifican los argumentos que indicas; usa 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 con GET /v1/benchmarks/{id} (validators[]); la API llama a los jueces “validators”.
  • skippedJudgeIds excluye 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.
  • judgeParamOverrides cambia 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:
Cada id de juez y clave de parámetro debe existir en el benchmark, y los valores deben coincidir con el tipo del parámetro y respetar su 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:
  1. Prepara el archivo con POST /v1/recording-uploads y luego haz PUT de los bytes a la uploadUrl devuelta.
  2. Crea el caso con "audio": { "uploadId": "<id>" }.
También puedes enviar "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, como from-conversations con turn: "last_assistant".
Cada caso creado informa 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:
El cliente llama a 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:
Publicar excluye los casos que siguen en estado 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