Referência da API

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étodoCaminhoDescrição
POST/v1/projects/:projectId/experimentsCria o experimento e dispara a execução.
GET/v1/projects/:projectId/experimentsLista experimentos por cursor, com filtro opcional de dataset.
GET/v1/projects/:projectId/experiments/:idLê status, contagens e métricas agregadas.
GET/v1/projects/:projectId/experiments/:id/resultsLista 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.

json
{
  "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.

json
{
  "type": "agent",
  "agentId": "agent_...",
  "agentVersion": 7,
  "maxTurns": 12,
  "timeoutMs": 600000,
  "confineReadonly": false
}
CampoTipoObservação
agentIdstringObrigatório.
agentVersionnumberOpcional na entrada. Ver "versão congelada" abaixo.
maxTurnsnumberTeto de chamadas de modelo por caso. Padrão 12, máximo 50.
timeoutMsnumberTeto de duração de um caso. Padrão 600000 (10 min), máximo 1800000 (30 min).
confineReadonlybooleanRoda 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).

typeCampos
containsvalue, caseSensitive?
exact_matchcaseSensitive?, trim?
regexpattern, flags?
json_valid
not_empty
llm_judgerubric?, model?

#Criar experimento

ts
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 a message traz 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_action falha na hora. Um caso que pause aguardando ação externa — custom tool sem cliente para executá-la, ou uma tool always_ask sem 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ódigoHTTPQuando
experiment.not_found404Experimento inexistente ou fora do projeto.
experiment.empty_dataset400O dataset não tem casos.
experiment.too_many_cases400Dataset acima de 200 casos num task de agent.
agent.not_found404O agent do task não existe no projeto.
agent.archived409O agent do task está arquivado.
agent.version_not_found404A agentVersion pedida não existe.
budget.exceeded403Teto de consumo estourado (workspace ou agent).

#Relacionado