job_id para que o AgentEye faça polling. Os resultados são armazenados e exibidos no dashboard.
Este guia cobre:
- Como a conclusão de sessão é detectada.
- O contrato HTTP que o avaliador deve implementar.
- Como configurar o servidor AgentEye.
- Como visualizar os resultados.
- Solução de problemas.
agenteye-evaluator no PyPI.
Como funciona
agent_end para uma sessão, o servidor
agenda uma avaliação. Em seguida, envia via POST a transcrição completa de eventos
para o seu serviço avaliador, que pode:
-
Retornar o resultado de forma inline com
{"status":"done", "scores":{...}, "reasoning":{...}, "summary":"..."}. O resultado é adicionado à linha do tempo de avaliações da sessão.reasoningesummarysão opcionais. -
Adiar com
{"status":"pending", "job_id":"abc-123"}. O AgentEye então chamaGET {EVALUATOR_ENDPOINT}/evaluate/abc-123até que o avaliador retorne{"status":"done", ...}ou{"status":"error", "error":"..."}. A cadência de polling é por job: uma respostapendingpode incluirnext_poll_secspara substituir o padrão; caso contrário, o AgentEye usa o valordefault_poll_interval_secsdeGET /config; caso contrário, o servidor usaEVALUATOR_POLLING_INTERVAL_SECScomo fallback (padrão: 10s). Todos os valores são limitados ao intervalo [1s, 1h].
agent_end (por exemplo, um processo de agente que travou)
também podem ser processadas: o GET /config do avaliador pode retornar
{"inactivity_timeout_secs": 1800}, e o AgentEye avaliará qualquer sessão
que ficou ociosa por esse período. Defina o campo como null ou omita-o para
desabilitar esse fallback.
O pipeline é completamente inativo quando EVALUATOR_ENDPOINT não está definido.
Uma sessão pode acumular múltiplas avaliações terminais ao longo do tempo: cada
evento agent_end (e cada re-avaliação manual pelo dashboard) adiciona uma nova
linha de avaliação. Essa é a forma recomendada de avaliar uma conversa retomada:
um usuário encerra um agente, retorna mais tarde, envia mais eventos,
encerra o agente novamente, e uma segunda avaliação é executada contra a transcrição
completa e atualizada. O dashboard renderiza a avaliação mais recente como destaque
e as avaliações anteriores como uma linha do tempo recolhível. Enquanto uma
avaliação está em andamento para uma sessão, eventos agent_end adicionais para essa
sessão são ignorados; o próximo após a avaliação em andamento ser concluída
enfileirará uma nova avaliação normalmente.
O fallback de inatividade também é reativado em sessões retomadas: se novos eventos
chegarem após uma avaliação terminal anterior e a sessão ficar ociosa por mais tempo
que inactivity_timeout_secs, uma nova avaliação é enfileirada.
Falhas transientes (5xx, 429, timeouts, erros de rede) são repetidas com
backoff exponencial até EVALUATOR_MAX_ATTEMPTS; respostas 4xx são
terminais. O AgentEye pode ser executado com segurança em múltiplas instâncias
de servidor com escalonamento horizontal; o trabalho é particionado para que a mesma
sessão nunca seja despachada duas vezes simultaneamente.
Contrato HTTP
Todas as rotas autenticadas usam autenticação via bearer token. O mesmo valor deve ser configurado em ambos os lados:- Servidor AgentEye: variável de ambiente
EVALUATOR_TOKEN - Serviço avaliador: configurado da mesma forma (o SDK
agenteye-evaluatorlêEVALUATOR_TOKENpor convenção)
EVALUATOR_TOKEN não estiver definido, o servidor não envia o header Authorization;
o avaliador pode então aceitar requisições anônimas, o que é aceitável para uma
rede interna, mas não recomendado na internet pública.
Rotas que o avaliador deve disponibilizar
| Rota | Body / parâmetros | Resposta |
|---|---|---|
GET /health | nenhum | {"status":"ok"} (aberta, sem auth) |
GET /config | nenhum | {"inactivity_timeout_secs": <int> | null, "default_poll_interval_secs": <int> | omitted} |
POST /evaluate | JSON EvalRequest | {"status":"done", ...} ou {"status":"pending", "job_id":"..."} |
GET /evaluate/{id} | nenhum | mesmo formato de resposta que /evaluate |
Body EvalRequest enviado pelo servidor
Formatos de resposta
Síncrono (done):reasoning (um mapa de justificativa por pontuação) e summary (uma narrativa
geral de um parágrafo) são ambos opcionais. As chaves em reasoning devem
espelhar as chaves em scores; o dashboard renderiza cada entrada inline abaixo
de sua barra de pontuação. Avaliadores mais antigos que retornam apenas scores continuam
funcionando sem alterações; reasoning e summary simplesmente são lidos como null e
os elementos de interface correspondentes são omitidos.
Assíncrono (adiado):
next_poll_secs é opcional; se omitido, o servidor usa como fallback o
default_poll_interval_secs do avaliador via /config, e depois a sua própria
variável de ambiente EVALUATOR_POLLING_INTERVAL_SECS.
Erro terminal no lado do avaliador:
error terminal para a sessão.
Escrevendo um avaliador com o SDK
O pacote Pythonagenteye-evaluator fornece um wrapper FastAPI tipado
que implementa o contrato HTTP acima. Instale-o via PyPI:
app é ASGI-callable, então uvicorn module:app a executa.
Para avaliadores que precisam adiar trabalho pesado, retorne JobPending
em vez disso e registre um handler @app.job_lookup; o servidor AgentEye
faz polling em GET /evaluate/{job_id} até que você retorne um status terminal ou o
limite EVALUATOR_MAX_POLL_DURATION_SECS (padrão: 1h) seja atingido.
Referência completa da API, padrão assíncrono e schema de eventos: o README do
agenteye-evaluator está incluído em cada tarball de release na
página de releases do agenteye-enterprise,
ou você pode lê-lo na página do pacote no PyPI.
Executando um avaliador no Kubernetes
O avaliador é seu serviço: o AgentEye não inclui um container avaliador padrão. O release inclui manifests de referência do Kubernetes emdeploy/examples/evaluator/ que você pode aplicar diretamente
após substituir sua imagem e um bearer token compartilhado.
1. Containerize seu avaliador
Um Dockerfile mínimo para seu avaliador:runAsNonRoot (UID 10001) mantém o container compatível com perfis de segurança
restritos do Pod Security.
2. Crie o bearer token compartilhado
EVALUATOR_TOKEN no servidor AgentEye. O
servidor envia Authorization: Bearer <token> em cada requisição; o SDK
usa hmac.compare_digest para uma verificação em tempo constante e rejeita
incompatibilidades com HTTP 401.
3. Aplique os manifests de exemplo
- Um Deployment de 2 réplicas com
runAsNonRoot, sistema de arquivos raiz somente leitura, todas as capabilities removidas, liveness + readiness em/health - Um Service ClusterIP na porta 9000
- Um template
secret.example.yaml(intencionalmente excluído da Kustomization; crie o secret real fora do processo para que nenhum token vá parar no git)
4. Configure o AgentEye para usá-lo
No servidor AgentEye, defina:EVALUATOR_WORKERS × EVALUATOR_CLAIM_BATCH
requisições concorrentes entre todos os pods do avaliador (padrões: 2 × 4 = 8).
Escale replicas e os limites de recursos por pod em conjunto com esses
parâmetros do lado do servidor.
Verificação
GET /evaluations no servidor AgentEye
deve retornar uma linha com status: "done" e as pontuações produzidas pelo seu avaliador.
Configurando o servidor AgentEye
Defina no processo do servidor:| Variável de ambiente | Significado |
|---|---|
EVALUATOR_ENDPOINT | URL base do seu avaliador (http://evaluator:9000). Não definida = pipeline desabilitado. |
EVALUATOR_TOKEN | Bearer token. Deve ser igual ao valor com que o serviço avaliador está configurado. |
EVALUATOR_WORKERS | Tarefas de worker por instância do servidor (padrão: 2). |
EVALUATOR_CLAIM_BATCH | Linhas processadas por tick de worker (padrão: 4). Os lotes são processados de forma concorrente; a concorrência efetiva no endpoint do avaliador é EVALUATOR_WORKERS × EVALUATOR_CLAIM_BATCH. |
EVALUATOR_POLL_IDLE_SECS | Quanto tempo um worker dorme entre tentativas de despacho quando nenhuma avaliação está pendente (padrão: 2s). |
EVALUATOR_POLLING_INTERVAL_SECS | Fallback final para a cadência de GET /evaluate/{id} quando nem o next_poll_secs por resposta nem o default_poll_interval_secs do avaliador está definido (padrão: 10s). |
EVALUATOR_REQUEST_TIMEOUT_MS | Timeout por requisição (padrão: 30000). |
EVALUATOR_MAX_ATTEMPTS | Após este número de falhas transientes, o resultado é registrado como error terminal (padrão: 5). |
EVALUATOR_CONFIG_REFRESH_SECS | Cadência de GET /config (padrão: 300). |
EVALUATOR_MAX_POLL_DURATION_SECS | Tempo máximo em relógio de parede que uma sessão pode permanecer na fila de polling antes de ser encerrada como timeout (padrão: 3600s). Protege contra um avaliador que continua retornando pending indefinidamente. |
agenteye-evaluator com ambas as chaves definidas. Nos manifests Kubernetes incluídos, o servidor lê EVALUATOR_ENDPOINT e EVALUATOR_TOKEN desse Secret opcional. Crie-o pelo processo padrão de gerenciamento de secrets da sua organização e reinicie o Deployment do servidor para aplicar a mudança.
Os parâmetros de ajuste acima não são configurados por padrão; exponha as variáveis de ambiente correspondentes no container do servidor no seu manifest de Deployment caso precise substituir os valores padrão.
Consulte deployment.md para a tabela completa de variáveis de ambiente.
Referência da API
| Método | Caminho | Permissão necessária | Finalidade |
|---|---|---|---|
GET | /evaluations | evaluations:read | Consulta resultados terminais. Suporta session_id, agent_id, environment, status (done/error/timeout), ts_from, ts_to, cursor, limit, score_filters, latest_per_session. limit tem padrão 50 e máximo 200 (diferente de /events, que tem máximo 1000). environment aceita uma lista separada por vírgulas (ex.: environment=prod,staging); valores únicos ainda funcionam. Com latest_per_session=true, a resposta contém no máximo uma linha por session_id (a mais recente por completed_at), usada pela página de listagem de sessões para colapsar a linha do tempo de avaliações de uma sessão ao seu destaque atual. Padrão é false (retorna o histórico completo). |
GET | /evaluations/aggregate | evaluations:read | Métricas agregadas de saúde de avaliação para uma fatia filtrada: contagem total, distribuição done/error/timeout, estatísticas por chave de pontuação (count/avg/min/max/p50 sobre as chaves arbitrárias de scores), e uma linha do tempo por intervalos de tempo. Aceita os mesmos parâmetros de filtro que /evaluations mais featured_keys (CSV de chaves de pontuação para tendência) e latest_per_session. Alimenta a funcionalidade de Dashboards; as métricas são exatas sobre todo o conjunto correspondente, sem amostragem. |
GET | /evaluations/environments | evaluations:read | Valores distintos de environment da tabela evaluations. Usado para preencher dropdowns de filtro com escopo para dados legíveis por avaliações. |
GET | /evaluation-jobs | evaluations:read | Visibilidade sobre avaliações em andamento. Filtre por status (pending/polling). |
GET | /events | events:read | Transmite os eventos brutos de uma sessão. Suporta session_id, agent_id, event_type (CSV), environment (CSV), ts_from, ts_to, cursor, limit e order. order é desc (mais recente primeiro, padrão) ou asc (mais antigo primeiro); um valor não reconhecido usa desc como fallback. Pagine via cursor usando o next_cursor da resposta (um id de evento): passe-o de volta como cursor para obter a próxima página; com asc a próxima página são os eventos após esse id, com desc os eventos antes dele. limit tem padrão 50 e máximo 1000. |
GET | /sessions/:session_id/export | events:read | Retorna exatamente o body JSON que o avaliador receberia para esta sessão, servido como um anexo para download chamado session-<id>.json. Útil para reproduzir sessões de produção através do agenteye-evaluator para testes offline. Os bytes são idênticos ao que o pipeline do avaliador envia. |
POST | /sessions/:session_id/re-evaluate | evaluations:trigger | Enfileira uma nova avaliação para uma sessão; executa independentemente de existir uma avaliação anterior. O novo resultado é adicionado à linha do tempo de avaliações da sessão em vez de sobrescrever o anterior, então as pontuações anteriores permanecem visíveis como histórico. Retorna 202 ao enfileirar, 404 para sessão desconhecida, 409 se já houver uma avaliação em andamento. Use isso após implantar um novo avaliador, ou para sessões que nunca emitiram agent_end. |
Filtrando por intervalo de pontuação: score_filters
GET /evaluations aceita um parâmetro opcional score_filters que
restringe os resultados por valores numéricos dentro do objeto scores. O
parâmetro é uma lista separada por vírgulas de entradas key:min..max; qualquer
um dos limites pode ser omitido. Múltiplas entradas se combinam com AND lógico. Linhas
onde a chave nomeada está ausente ou não é numérica são excluídas. Uma requisição pode
conter no máximo 20 entradas de filtro; exceder isso retorna HTTP 400.
Exemplos:
/evaluations tem estes campos:
| Campo | Tipo | Observações |
|---|---|---|
evaluation_id | string (UUID) | O identificador canônico desta avaliação terminal. Cada avaliação terminal recebe um novo UUID; uma única sessão pode ter múltiplos. |
id | string (UUID) | Alias de compatibilidade retroativa com o mesmo valor que evaluation_id. |
session_id | string | A sessão contra a qual esta avaliação foi executada. Uma sessão pode ter múltiplas avaliações na linha do tempo. |
agent_id | string | Identifica o agente que produziu a sessão. |
environment | string | Rótulo de environment copiado da sessão. |
status | enum | Um de "done", "error", "timeout". |
scores | object | null | Pontuações retornadas pelo seu avaliador. |
reasoning | object | null | Mapa opcional de justificativa por pontuação retornado pelo seu avaliador. As chaves normalmente espelham as de scores. O dashboard renderiza cada entrada abaixo de sua barra de pontuação. |
summary | string | null | Narrativa geral opcional de um parágrafo retornada pelo seu avaliador. O dashboard a renderiza acima da distribuição por pontuação como o destaque da avaliação. |
error | string | null | Preenchido apenas em "error" / "timeout". |
attempt_count | integer | Número de tentativas de despacho (≥ 1). |
duration_ms | integer | null | Duração da tentativa final. |
completed_at | string (ISO 8601 UTC) | Quando o resultado terminal foi registrado. Os resultados são ordenados por completed_at (mais recente primeiro). |
created_at | string (ISO 8601 UTC) | Carrega o mesmo timestamp que completed_at (semântica de escrita única). |
Permissões
| Permissão | Concede |
|---|---|
evaluations:read | Listar resultados de avaliação, visualizar pontuações no dashboard e carregar métricas de saúde do dashboard. |
evaluations:trigger | Enfileirar manualmente uma avaliação para uma sessão via POST /sessions/:session_id/re-evaluate ou o botão de re-avaliar no dashboard. |
dashboards:read | Visualizar dashboards salvos (também precisa de evaluations:read para carregar suas métricas). |
dashboards:write | Criar e editar dashboards. |
dashboards:delete | Excluir dashboards. |
ADMIN_KEY, ADMIN_EMAIL) recebe essas permissões automaticamente.
Visualizando resultados
/sessions/<id>: linha do tempo de eventos + um painel lateral direito mostrando as pontuações da sessão e qualquer erro da tentativa de despacho. Se sua chave temevaluations:trigger, um botão de re-avaliar aparece ao lado do botão de exportar, útil para sessões que nunca emitiramagent_end, ou para atualizar pontuações após implantar um novo avaliador. O dashboard faz polling pelo novo resultado e atualiza o painel lateral quando ele chegar./sessions: grade de sessões filtrável; a coluna de pontuação mostra o status de avaliação e as pontuações de cada sessão rapidamente./dashboards: visualizações salvas de saúde de avaliação (veja Dashboards abaixo).


Dashboards
A página Dashboards (/dashboards) permite salvar uma combinação de filtros de avaliação
como uma visualização nomeada e reutilizável, e acompanhar como aquela fatia de avaliações está
se saindo rapidamente. Os Dashboards são compartilhados por toda a sua organização;
todos com dashboards:read veem o mesmo conjunto.
Cada dashboard fixa:
- Filtros: os mesmos controles da página de sessões: environment, status,
agente, uma janela de tempo contínua e filtros de intervalo de pontuação (
key:min..max). - Uma configuração de exibição: quais chaves de pontuação destacar, os limites de saúde verde/âmbar/vermelho, quais painéis mostrar e se colapsar para a avaliação mais recente por sessão.
GET /evaluations/aggregate), então
os números são exatos em vez de amostrados.

dashboards:read quanto evaluations:read;
criar e editar requer dashboards:write; excluir requer dashboards:delete.
O admin bootstrap recebe todas essas permissões automaticamente.
Solução de problemas
Sessões existem mas nenhuma avaliação é criada. Confirme queEVALUATOR_ENDPOINT
está definido no processo do servidor, que o servidor e o avaliador compartilham o mesmo
valor de EVALUATOR_TOKEN, e que o endpoint /health do avaliador é
acessível a partir do servidor. Com EVALUATOR_ENDPOINT não definido, o pipeline é inativo.
Avaliações em andamento se acumulam. Consulte GET /evaluation-jobs para ver a
fila em andamento. Inspecione attempt_count, next_attempt_at e last_error
em cada linha. Causas comuns: serviço avaliador inacessível ou retornando 5xx
(repetido com backoff), EVALUATOR_TOKEN incorreto (401 é terminal), ou um
avaliador assíncrono que retorna pending indefinidamente (veja abaixo).
Sessões concluídas mas sem avaliação terminal. Consulte
GET /evaluation-jobs?status=polling; o resultado pode ainda estar em andamento.
Se um job está preso em pending, o servidor está tendo dificuldade em acessar o
avaliador; verifique se o avaliador está em funcionamento e se EVALUATOR_TOKEN corresponde.
HTTP 401 from evaluator: invalid bearer token. O EVALUATOR_TOKEN
no servidor não corresponde ao valor com que o serviço avaliador está configurado.
Eles devem ser idênticos.
Avaliador assíncrono retorna pending indefinidamente. O servidor faz polling em
GET /evaluate/{job_id} até que o avaliador retorne done ou error, ou
até que EVALUATOR_MAX_POLL_DURATION_SECS (padrão: 1h) seja atingido. Após o limite,
a avaliação é registrada como timeout e removida da fila em andamento.
Aumente EVALUATOR_MAX_POLL_DURATION_SECS se o seu avaliador legitimamente precisar
de mais tempo que o padrão.
