Avaliando nos seus traces

Antes de colocar o guardrail na frente das suas ferramentas, passe por ele as chamadas antigas do seu agente: quantas ele teria barrado, por qual regra, com que frequência teria perguntado e, onde você rotula as chamadas, com que frequência errou. Tudo é lido na sua máquina, e os relatórios trazem nomes de ferramentas, nomes de regras, contagens e ids de decisão, nunca o valor de um argumento ou uma palavra que uma pessoa disse.

Formatos de trace

Formato O que é
jsonl uma chamada por linha: {"conversation", "tool", "arguments", "turns"?, "result"?, "label"?}; ou um turno por linha: {"conversation", "turn"}, que as chamadas depois dele leem
openai logs de chat: uma conversa por linha (ou uma lista JSON), cada uma com as suas messages com tool_calls e respostas tool
anthropic o mesmo com blocos tool_use e tool_result
langsmith uma exportação de runs: os runs de ferramenta (run_type: tool) de cada trace, em ordem de tempo
tau2 um arquivo de resultados do tau2-bench: cada simulação uma conversa

auto distingue os formatos pelo primeiro registro. Cada chamada é verificada com os turnos da pessoa ditos antes dela e o que as ferramentas devolveram antes dela, e cada conversa é uma sessão própria.

Repetindo: o que ele teria feito?

replay(trace) no stalwart mcp, ou evaluation.replay em Python:

Avaliando: ele acertou?

Rotule cada chamada should_allow, should_confirm ou should_refuse (um label em cada linha), e evaluate(labelled):

respondeu permitir respondeu confirmar respondeu recusar
deveria permitir certo alarme falso alarme falso
deveria confirmar falha certo alarme falso
deveria recusar falha falha certo

O relatório dá a matriz, as contagens e as chamadas por trás de cada alarme falso e falha, no total e por regra.

Contrafactual: o que ele teria mudado?

counterfactual(trace, "check.py:outcome") pontua cada conversa com a sua própria verificação de resultado, como rodou e sem as chamadas que o guardrail barrou. A sua função recebe o id de uma conversa e as chamadas que rodaram, e devolve um número ou um valor verdadeiro/falso (por exemplo, se o banco de dados que ela deixa é o que a tarefa esperava).

É um contrafactual offline: o resto da conversa é mantido como foi gravado. Um agente ao vivo que encontrasse a recusa poderia ter seguido de outro jeito.

O seu guard do Guardrails AI, com e sem o nosso

compare_with_gai(trace, "guard.py:guard") passa cada chamada pelo seu guard do Guardrails AI sozinho, e por ele com o nosso validador acrescentado: quantas cada um deixa passar, e as chamadas que só o nosso barra. Precisa de stalwart-agents[guardrails] onde o servidor roda.

Brechas nas suas regras

hunt("rules.yaml") roda o caçador de falhas na sua planilha de regras: cada achado é um caminho que as suas regras permitem, com uma testemunha para repetir. redteam(server) prova as ferramentas de um servidor MCP atrás do gateway para qualquer chamada que um modelo possa fazer. Os dois rodam no serviço, com a sua chave. São uma verificação de qualidade das suas próprias regras, não um certificado.

O benchmark tau2-bench

benchmark("tau2-airline") e benchmark("tau2-retail") buscam os dados de terceiros do tau2-bench nos seus commits fixados, para benchmarks/, sob demanda; nada vem embutido. Os números publicados (companhia aérea: 114 de 1.161 escritas barradas; varejo: 290 de 3.450) vêm da própria repetição desses dados pela Stalwart, que o pacote ainda não carrega: o relatório os dá como publicados, diz que não foram reproduzidos aqui e nomeia as fontes que buscou.