Experimentos
Rode um dataset contra um modelo ou contra um agent inteiro e pontue cada caso com scorers.
Um experimento executa um task sobre todos os casos de um dataset, pontua cada saída com os scorers configurados e agrega métricas. A execução é assíncrona: a criação devolve o experimento em pending e o status avança para running e depois completed ou failed.
#Endpoints
| Método | Caminho | Descrição |
|---|---|---|
| POST | /v1/projects/:projectId/experiments | Cria o experimento e dispara a execução. |
| GET | /v1/projects/:projectId/experiments | Lista experimentos por cursor, com filtro opcional de dataset. |
| GET | /v1/projects/:projectId/experiments/:id | Lê status, contagens e métricas agregadas. |
| GET | /v1/projects/:projectId/experiments/:id/results | Lista o resultado de cada caso por cursor. |
#Task: modelo ou agent
task é uma união discriminada por type.
Modelo direto — sem ferramentas; o input do caso vira a mensagem do usuário.
{
"type": "model",
"model": "anthropic/claude-haiku-4-5",
"system": "Responda apenas com o número da apólice.",
"temperature": 0,
"maxOutputTokens": 512
}Agent — cada caso roda como uma session real do agent, com tools, skills, memória e o loop durável. A última mensagem do assistente é o que os scorers pontuam.
{
"type": "agent",
"agentId": "agent_...",
"agentVersion": 7,
"maxTurns": 12,
"timeoutMs": 600000,
"confineReadonly": false
}| Campo | Tipo | Observação |
|---|---|---|
agentId | string | Obrigatório. |
agentVersion | number | Opcional na entrada. Ver "versão congelada" abaixo. |
maxTurns | number | Teto de chamadas de modelo por caso. Padrão 12, máximo 50. |
timeoutMs | number | Teto de duração de um caso. Padrão 600000 (10 min), máximo 1800000 (30 min). |
confineReadonly | boolean | Roda cada caso com o confinamento de leitura: as tools mutantes somem de todas as origens. Padrão false. |
confineReadonly é false por padrão de propósito: a avaliação vale pela fidelidade ao que o agent faz em produção. Ligue quando o dataset for grande e os efeitos colaterais forem indesejados.
#Versão congelada no start
agentVersion é resolvida e congelada na criação: omitida, a API grava a versão corrente daquele instante. O experimento persistido sempre tem um número.
Sem isso, um experimento que guardasse "o agent X" sem versão deixaria de ser reprodutível — bastaria alguém editar o agent para a mesma leitura passar a descrever outra coisa, e a comparação entre a versão N e a N+1 perderia o sentido.
A criação barra na hora se o agent não existir, estiver arquivado ou a versão pedida não existir: não se enfileira um run que só falharia caso a caso, depois de gastar sessão.
#Scorers
Pelo menos um scorer, no máximo 8, todos de tipos distintos (a agregação por scorer chaveia por tipo).
type | Campos |
|---|---|
contains | value, caseSensitive? |
exact_match | caseSensitive?, trim? |
regex | pattern, flags? |
json_valid | — |
not_empty | — |
llm_judge | rubric?, model? |
#Criar experimento
const experiment = await client.experiments.create({
datasetId: 'ds_...',
name: 'Extração de apólice — v7 vs v6',
task: { type: 'agent', agentId: agent.id, agentVersion: 7 },
scorers: [{ type: 'contains', value: 'apólice' }],
});Resposta (201): o experimento com status: "pending", caseCount já preenchido e totals: null. Acompanhe por GET /:id até completed ou failed; os resultados por caso saem em GET /:id/results.
#Limites e falhas de caso
- 200 casos é o teto de um experimento de agent (cada caso é uma execução com ferramentas, não uma chamada de modelo). Dataset maior devolve
400 experiment.too_many_cases, e amessagetraz o teto e a contagem do dataset. Task de modelo não tem esse teto. - Falha de um caso não derruba o experimento: estouro de turnos, estouro de tempo ou erro do loop viram um resultado com
status: "error", e o lote continua. requires_actionfalha na hora. Um caso que pause aguardando ação externa — custom tool sem cliente para executá-la, ou uma toolalways_asksem operador para confirmar — não fica pendurado até o teto de tempo: o caso termina com erro explícito dizendo o que faltou. Agents que dependem de custom tools do cliente não são avaliáveis sem um executor.- Orçamento. A criação de um experimento de agent passa pelo enforcement de budget — do workspace e do agent alvo. Estourado com ação
block, a resposta é403 budget.exceeded. Ver Usage e orçamentos.
#Erros
| Código | HTTP | Quando |
|---|---|---|
experiment.not_found | 404 | Experimento inexistente ou fora do projeto. |
experiment.empty_dataset | 400 | O dataset não tem casos. |
experiment.too_many_cases | 400 | Dataset acima de 200 casos num task de agent. |
agent.not_found | 404 | O agent do task não existe no projeto. |
agent.archived | 409 | O agent do task está arquivado. |
agent.version_not_found | 404 | A agentVersion pedida não existe. |
budget.exceeded | 403 | Teto de consumo estourado (workspace ou agent). |