Skip to content

Anotação Agêntica

Avalie agentes de IA no Potato com 15 conversores de formato de traços, 5 tipos de exibição e esquemas prontos para agentes de tool-use, web-browsing, coding e chat. Inclui avaliação por PRM e por rubrica.

Novo na v2.3.0

Agentic annotation: a raw trace is converted, shown as thought, action, and observation cards, annotated at the step and trace level, and exportedHow agentic annotation works

Os agentes de IA são cada vez mais implantados para tarefas complexas de múltiplas etapas: navegar na web, escrever código, chamar APIs e orquestrar subagentes. Mas avaliar se um agente realmente fez a coisa certa exige julgamento humano com uma granularidade que as ferramentas de anotação tradicionais não conseguem oferecer. Um único traço de agente pode conter dezenas de etapas, chamadas de ferramentas, raciocínio intermediário, capturas de tela e decisões de ramificação. Os anotadores precisam ver todo esse contexto, navegá-lo de forma eficiente e fornecer avaliações estruturadas tanto no nível do traço quanto no nível de cada etapa individual.

O sistema de anotação agêntica do Potato resolve isso com quatro capacidades:

  1. 15 conversores de formato de traços que normalizam logs de agentes de qualquer framework principal para um formato unificado
  2. 5 tipos de exibição especializados otimizados para diferentes modalidades de agente (tool-use, navegação web, coding, chat, observação ao vivo)
  3. 9 esquemas de anotação prontos que cobrem as dimensões de avaliação de agentes mais comuns
  4. 4 tipos de anotação feitos sob medida para avaliação avançada: avaliação de trajetória, avaliação por rubrica, comparação pareada e anotação de recompensa de processo

Conversores de Formato de Traços

Os traços de agentes vêm em formatos bastante diferentes dependendo do framework. O Potato traz 15 conversores que os normalizam em uma representação interna unificada. Você especifica o conversor na sua configuração, ou deixa o Potato detectar o formato automaticamente.

Referência de Conversores

ConversorFormato de OrigemCampos-Chave Extraídos
openaiOpenAI Assistants API / function calling logsmessages, tool_calls, function results
anthropicAnthropic Claude tool_use / Messages APIcontent blocks, tool_use, tool_result
swebenchSWE-bench task tracespatch, test results, trajectory
swe_agent_trajectorySWE-Agent trajectory filesthought, action, observation, exit_status
aiderAider pair-programming chat historyturns, edit blocks, edited file paths
otelOpenTelemetry span exports (JSON)spans, attributes, events, parent-child
mcpModel Context Protocol sessionstool definitions, call/response pairs
multi_agentCrewAI / AutoGen / LangGraph multi-agent logsagent roles, delegation, message passing
langchainLangChain callback traceschain runs, LLM calls, tool invocations
langfuseLangFuse observation exportsgenerations, spans, scores
reactReAct-style Thought/Action/Observation logsthought, action, action_input, observation
webarenaWebArena / VisualWebArena trace JSONactions, screenshots, DOM snapshots, URLs
atifAgent Trace Interchange Format (ATIF)steps, observations, metadata
web_agentWeb agent browsing traces (Mind2Web, Computer Use, raw recordings)actions, coordinates, viewport, screenshots
claude_codeClaude Code and other coding-agent session logstool_use blocks, diffs, terminal output

Configuração

Especifique o conversor na configuração do seu projeto:

yaml
instance_display:
  fields:
    - key: task_description
      type: text
      label: "Task"
 
    - key: conversation
      type: agent_trace
      label: "Agent trace"
      span_target: true
      display_options:
        show_step_numbers: true
        show_summary: true
        collapse_observations: false
        step_type_colors:
          thought: "#e8f4fd"
          action: "#fff3e0"
          observation: "#e8f5e9"

Cada linha do arquivo de traços deve ser um objeto JSON contendo o traço bruto do agente. O conversor cuida do resto.

Para traços multiagente em que diferentes agentes usam diferentes frameworks, você pode especificar conversores por agente:

yaml
instance_display:
  fields:
    - key: conversation
      type: dialogue
      label: "Agent trace"
      span_target: true
      display_options:
        show_turn_numbers: true
        alternating_shading: true
        max_height: 600

Detecção Automática

Se você não tiver certeza de qual conversor usar, defina trace_converter: auto:

yaml
instance_display:
  fields:
    - key: trace
      type: web_agent_trace
      label: "Browsing session"
      display_options:
        show_overlays: true
        show_filmstrip: true
        filmstrip_size: 150
        screenshot_max_width: 900
        show_thought: true
        show_element_info: true

O Potato inspeciona os 10 primeiros traços e seleciona o conversor que melhor corresponde com base nas assinaturas dos campos. Um aviso é registrado se a confiança ficar abaixo de 80%, caso em que você deve especificar o conversor explicitamente.

Conversores Personalizados

Se o seu framework de agente não estiver na lista, você pode escrever um conversor em Python:

python
# converters/my_converter.py
from potato.agentic.base_converter import BaseTraceConverter
 
class MyConverter(BaseTraceConverter):
    name = "my_framework"
 
    def convert(self, raw_trace: dict) -> dict:
        steps = []
        for entry in raw_trace["log"]:
            steps.append({
                "type": entry.get("kind", "action"),
                "content": entry["text"],
                "timestamp": entry.get("ts"),
                "metadata": entry.get("extra", {}),
            })
        return {"steps": steps}

Registre-o na configuração:

yaml
instance_display:
  fields:
    - key: steps
      type: coding_trace
      label: "Coding session"
      span_target: true
      display_options:
        diff_view: unified
        show_file_tree: true
        show_reasoning: true
        terminal_theme: dark
        collapse_long_outputs: true
        max_output_lines: 50

Tipos de Exibição

Depois que os traços são convertidos, o Potato os renderiza usando um dos cinco tipos de exibição especializados. Cada um é otimizado para uma modalidade de agente diferente.

1. Exibição de Traço de Agente

A exibição padrão para agentes que usam ferramentas (OpenAI function calling, Anthropic tool_use, ReAct, LangChain, etc.). Renderiza cada etapa como um cartão com codificação por cores conforme o tipo de etapa.

yaml
instance_display:
  fields:
    - key: messages
      type: interactive_chat
      label: "Conversation"
      display_options:
        show_turn_numbers: true
        alternating_shading: true

Recursos:

  • Cartões de etapa com borda esquerda colorida indicando o tipo (pensamento, ação, observação, erro)
  • Seções recolhíveis para observações longas ou saídas de ferramentas (limiar configurável)
  • Formatação de JSON para argumentos de chamadas de ferramentas e respostas estruturadas
  • Realce de sintaxe para blocos de código nas observações
  • Linha do tempo de etapas na barra lateral mostrando o traço completo de relance
  • Navegação salto-para-etapa para traços longos

2. Exibição de Traço de Agente Web

Feita sob medida para agentes de navegação web (WebArena, VisualWebArena, gravações brutas de navegador). Renderiza capturas de tela com sobreposições SVG mostrando onde o agente clicou, digitou ou rolou.

yaml
instance_display:
  fields:
    - key: screenshots
      type: gallery
      label: "Screenshots"
      display_options:
        layout: horizontal
        thumbnail_size: 300
        zoomable: true

Recursos:

  • Galeria de capturas de tela com visualização em tamanho real e zoom
  • Sobreposições SVG mostrando alvos de clique (círculos vermelhos), regiões de entrada de texto (destaques azuis) e direções de rolagem
  • Visão em tira de filme na parte inferior mostrando todas as capturas como miniaturas para navegação rápida
  • Descrição da ação abaixo de cada captura (ex.: "Clicar no botão 'Add to Cart'")
  • Barra de URL mostrando a URL da página atual em cada etapa
  • Comparação antes/depois para etapas que modificam o conteúdo da página

3. Exibição de Chat Interativo

Para avaliar agentes conversacionais e chatbots. Suporta dois submodos: chat ao vivo, em que os anotadores interagem com o agente em tempo real, e revisão de traço, em que os anotadores avaliam uma conversa gravada.

yaml
annotation_schemes:
  - annotation_type: radio
    name: task_success
    description: "Did the agent complete the task?"
    labels:
      - name: success
        tooltip: "Fully completed correctly"
      - name: partial
        tooltip: "Partially completed, or completed with errors"
      - name: failure
        tooltip: "Not completed"
    sequential_key_binding: true
 
  - annotation_type: likert
    name: efficiency
    description: "How efficient was the agent's path?"
    size: 5
    min_label: "Very inefficient"
    max_label: "Optimal"
 
  - annotation_type: radio
    name: safety
    description: "Did the agent take any unsafe action?"
    labels:
      - name: safe
      - name: minor_concern
      - name: major_violation

O modo de revisão de traço renderiza uma conversa gravada com contagem de tokens e latência por mensagem opcionais. Os anotadores podem avaliar turnos individuais ou a conversa inteira.

O modo de chat ao vivo conecta os anotadores a um agente em execução por meio do Sistema de Proxy de Agente (veja abaixo). Os anotadores conversam com o agente e, em seguida, anotam a conversa resultante.

4. Exibição de Traço de Coding

Feita sob medida para sessões de agentes de coding (Claude Code, Aider, SWE-Agent). Renderiza diffs de código com realce de sintaxe, saída de terminal em blocos escuros e leituras de arquivos com números de linha.

yaml
  - annotation_type: multiselect
    name: mast_errors
    description: "Select every failure mode observed in this trace"
    labels:
      - name: disobey_task_spec
        tooltip: "Does not follow the task specification"
      - name: step_repetition
        tooltip: "Repeats the same action unnecessarily"
      - name: loss_of_history
        tooltip: "Forgets prior context"
      - name: unaware_of_termination
        tooltip: "Does not recognize when to stop"
      - name: fail_to_clarify
        tooltip: "Fails to ask for needed clarification"
      - name: task_derailment
        tooltip: "Goes off track from the main task"
      - name: reasoning_action_mismatch
        tooltip: "Reasoning contradicts the action taken"
      - name: premature_termination
        tooltip: "Stops before the task is complete"
      - name: incomplete_verification
        tooltip: "Does not verify the result"
      - name: no_errors
        tooltip: "No errors observed"

Recursos:

  • Visão de diff unificada com realce vermelho/verde para operações de edição
  • Blocos de terminal escuros para a saída de comandos bash/shell
  • Blocos de código com numeração de linha para operações de leitura de arquivos
  • Barra lateral com árvore de arquivos mostrando todos os arquivos tocados durante a sessão
  • Saídas longas recolhíveis para conteúdo verboso de terminal ou de arquivo

Veja Anotação de Agente de Coding para a referência completa.

5. Exibição de Agente ao Vivo

Observação em tempo real de agentes de IA com controles para intervenção humana. Suporta agentes de navegação web e agentes de coding.

yaml
  - annotation_type: span
    name: hallucination_spans
    description: "Mark claims the trace does not support"
    labels:
      - name: hallucination
        tooltip: "Claim not grounded in the observations"
      - name: incorrect_fact
        tooltip: "Factually incorrect statement"

Recursos:

  • Streaming em tempo real das ações do agente via Server-Sent Events
  • Pausar/Retomar o agente entre etapas
  • Enviar instruções para redirecionar o agente no meio da tarefa
  • Assumir o controle manual
  • Reverter para qualquer ponto de verificação anterior (agentes de coding usam pontos de verificação baseados em git)
  • Ramificar e reproduzir a partir de qualquer ponto de verificação com instruções diferentes

Veja Avaliação de Agente ao Vivo e Agente de Coding ao Vivo para detalhes de configuração.


Tipos de Anotação Avançados

Além das avaliações por turno e dos esquemas prontos, o Potato inclui quatro tipos de anotação feitos sob medida para avaliação estruturada de agentes.

Avaliação de Trajetória (trajectory_eval)

Localização de erros por etapa com taxonomias de erros hierárquicas e pontuação de severidade. Cada etapa recebe uma nota de correção, um tipo de erro, um nível de severidade e uma justificativa opcional. Um contador de pontuação corrente é decrementado conforme a severidade.

yaml
display_options:
  show_turn_numbers: true
  per_turn_ratings:
    speakers: ["Agent (Action)"]
    schema_name: "action_correctness"
    scheme:
      type: likert
      size: 3
      labels: ["Wrong", "Right"]

Veja a publicação de blog sobre avaliação de trajetória para um guia completo.

Avaliação por Rubrica (rubric_eval)

Avaliação multicritério em grade no estilo MT-Bench. Defina critérios personalizados e uma escala de avaliação. Os anotadores avaliam cada critério de forma independente.

yaml
display_options:
  per_turn_ratings:
    speakers: ["Agent (Action)"]
    schemes:
      - schema_name: action_correctness
        scheme:
          type: likert
          size: 3
          labels: ["Wrong", "Right"]
      - schema_name: reasoning_quality
        scheme:
          type: likert
          size: 5
          labels: ["Poor", "Excellent"]

Veja o tutorial de avaliação por rubrica para instruções de configuração.

Comparação Pareada

Compare dois traços de agente lado a lado com três modos:

  • Binário: clique para selecionar A ou B (com empate opcional)
  • Escala: controle deslizante de "A muito melhor" a "B muito melhor"
  • Multidimensão: A/B/empate independentes por dimensão, com justificativa obrigatória
yaml
  - annotation_type: multirate
    name: step_ratings
    description: "Rate each step"
    options_from_data: step_summaries
    labels: ["Incorrect", "Questionable", "Correct"]

Veja o guia de comparação pareada para os três modos.

Anotação de Recompensa de Processo

Anotação binária de correção por etapa, otimizada para treinar modelos de recompensa de processo. Dois modos: primeiro-erro (clique na primeira etapa errada, o restante é marcado automaticamente) e por etapa (avalie cada uma de forma independente).

yaml
  - annotation_type: trajectory_eval
    name: step_eval
    description: "Mark each step and classify any error"
    steps_key: steps
    step_text_key: content
    error_types:
      - name: reasoning
        subtypes:
          - logical_error
          - incorrect_assumption
      - name: action
        subtypes:
          - wrong_tool
          - wrong_arguments
          - premature_termination
    severities:
      - name: minor
        weight: -1
      - name: major
        weight: -5
    show_score: true

Veja Anotação de Recompensa de Processo para a referência completa.


Avaliações por Turno

Para avaliações de diálogo e de múltiplas etapas, muitas vezes você precisa de avaliações em turnos individuais em vez de (ou além de) o traço geral. O Potato suporta anotação por turno para qualquer tipo de exibição.

yaml
  - annotation_type: rubric_eval
    name: agent_rubric
    description: "Rate this run on each criterion"
    scale_points: 5
    scale_labels: ["Very poor", "Poor", "Acceptable", "Good", "Excellent"]
    criteria:
      - name: correctness
        description: "Did the agent produce the correct result?"
      - name: efficiency
        description: "Did the agent take an efficient path?"
      - name: safety
        description: "Did the agent avoid unsafe actions?"
    show_overall: true

As avaliações por turno aparecem em linha ao lado de cada cartão de etapa. O bloco conditional permite exibir perguntas de acompanhamento apenas quando certas avaliações são selecionadas, mantendo a interface limpa.

Formato de Saída por Turno

As anotações por turno são salvas com índices de etapa:

json
{
  "id": "trace_042",
  "annotations": {
    "overall_quality": 3,
    "step_correctness": {
      "0": "Correct",
      "1": "Correct",
      "2": "Incorrect",
      "3": "Correct"
    },
    "step_explanation": {
      "2": "The agent searched for the wrong product name"
    }
  }
}

Sistema de Proxy de Agente

Para tarefas de avaliação ao vivo em que os anotadores interagem com um agente em tempo real, o Potato fornece uma camada de proxy de agente. O proxy fica entre a interface de anotação e o backend do agente, registrando a conversa completa para revisão posterior.

yaml
  - annotation_type: pairwise
    name: agent_comparison
    description: "Which run was better?"
    mode: multi_dimension
    items_key: runs
    labels: ["Agent A", "Agent B"]
    dimensions:
      - name: correctness
        description: "Which result is correct?"
        allow_tie: true
      - name: efficiency
        description: "Which took the shorter path?"
        allow_tie: true

Tipos de Proxy

O proxy OpenAI encaminha mensagens para uma API compatível com OpenAI:

yaml
  - annotation_type: process_reward
    name: step_rewards
    description: "Click the first step where the agent went wrong"
    mode: first_error
    steps_key: steps
    step_text_key: content

O proxy HTTP encaminha mensagens para qualquer endpoint HTTP (seu próprio servidor de agente):

yaml
live_agent:
  endpoint_type: anthropic_vision   # or openai_vision, ollama_vision
  max_steps: 30
  step_delay: 1.0
  history_window: 5
  timeout: 60
  viewport:
    width: 1280
    height: 720
  system_prompt: "Complete the task using the browser."
  ai_config:
    model: claude-sonnet-4-20250514
    api_key: ${ANTHROPIC_API_KEY}
    max_tokens: 4096
    temperature: 0.3
 
instance_display:
  fields:
    - key: task
      type: live_agent
      label: "Live session"
      display_options:
        show_controls: true
        allow_instructions: true
        allow_takeover: true
        show_overlays: true

O proxy echo devolve a mensagem do usuário (útil para testes e desenvolvimento de UI):

yaml
agent_proxy:
  type: openai
  model: "gpt-4o"
  api_key: ${OPENAI_API_KEY}
  system_prompt: "You are a helpful customer service agent."
  temperature: 0.7
  max_tokens: 1024
 
  sandbox:
    max_steps: 20
    max_session_seconds: 600
    rate_limit_per_minute: 10
    request_timeout_seconds: 60

Esquemas de Anotação Prontos

O Potato traz 9 esquemas de anotação projetados especificamente para avaliação de agentes. Use-os diretamente ou como ponto de partida para seus próprios esquemas.

EsquemaTipoDescrição
agent_task_successradioSucesso/falha binário com opção de crédito parcial
agent_step_correctnessper_turn_rating (radio)Avaliações por etapa: correto/incorreto/desnecessário
agent_error_taxonomyper_turn_rating (multiselect)Taxonomia de erros de 12 categorias (ferramenta errada, alucinação, loop, etc.)
agent_safetyradio + textDetecção de violações de segurança com escala de severidade
agent_efficiencylikertAvaliar se o agente seguiu um caminho eficiente
agent_instruction_followinglikertAvaliar a aderência à instrução original do usuário
agent_explanation_qualitylikertAvaliar a qualidade do raciocínio/explicações do agente
agent_web_action_correctnessper_turn_rating (radio)Avaliação por etapa de ações web (alvo correto, tipo de ação correto)
agent_conversation_qualitymultirateQualidade de chat multidimensional (utilidade, precisão, tom, segurança)

Carregue um esquema pronto pelo nome:

yaml
agent_proxy:
  type: http
  url: "https://my-agent.example.com/chat"
  headers:
    Authorization: "Bearer ${AGENT_API_KEY}"
  message_key: message
  response_key: response
  session_id_key: session_id
  send_history: true
  history_key: messages

Ou combine presets com esquemas personalizados:

yaml
agent_proxy:
  type: echo
  responses:
    - "Thanks, let me look into that."
    - "I have found your order."

Exemplo Completo: Avaliando um Agente ReAct

Aqui está uma configuração completa para avaliar traços de agente no estilo ReAct com avaliações por etapa:

yaml
annotation_task_name: "ReAct Agent Evaluation"
task_dir: "."
 
data_files:
  - "data/traces.jsonl"
 
item_properties:
  id_key: trace_id
  text_key: task_description
 
instance_display:
  fields:
    - key: task_description
      type: text
      label: "Task"
 
    - key: conversation
      type: agent_trace
      label: "Agent trace"
      span_target: true
      display_options:
        show_step_numbers: true
        show_summary: true
        collapse_observations: true
        step_type_colors:
          thought: "#e8f4fd"
          action: "#fff3e0"
          observation: "#e8f5e9"
 
annotation_schemes:
  - annotation_type: radio
    name: task_success
    description: "Did the agent complete the task?"
    labels:
      - name: success
      - name: partial
      - name: failure
    sequential_key_binding: true
 
  - annotation_type: likert
    name: efficiency
    description: "How efficient was the agent's path?"
    size: 5
    min_label: "Very inefficient"
    max_label: "Optimal"
 
  - annotation_type: multiselect
    name: mast_errors
    description: "Select every failure mode observed"
    labels:
      - name: step_repetition
      - name: task_derailment
      - name: reasoning_action_mismatch
      - name: premature_termination
      - name: no_errors
 
  - annotation_type: text
    name: failure_reason
    description: "If the agent failed, describe what went wrong"
    rows: 3
    label_requirement:
      required: false
 
output_annotation_dir: "annotation_output/"
export_annotation_format: jsonl
 
user_config:
  allow_all_users: true

Dados de entrada de exemplo (data/react_traces.jsonl):

json
{
  "trace_id": "react_001",
  "task_description": "Find the population of Tokyo and compare it to New York City",
  "trace": [
    {"type": "thought", "content": "I need to find the population of both cities. Let me search for Tokyo first."},
    {"type": "action", "content": "search", "action_input": "Tokyo population 2024"},
    {"type": "observation", "content": "Tokyo has a population of approximately 13.96 million in the city proper..."},
    {"type": "thought", "content": "Now I need to find New York City's population."},
    {"type": "action", "content": "search", "action_input": "New York City population 2024"},
    {"type": "observation", "content": "New York City has a population of approximately 8.34 million..."},
    {"type": "thought", "content": "Tokyo (13.96M) has about 67% more people than NYC (8.34M)."},
    {"type": "action", "content": "finish", "action_input": "Tokyo has ~13.96 million people vs NYC's ~8.34 million, making Tokyo about 67% larger by population."}
  ]
}

Inicie o servidor:

bash
potato start config.yaml -p 8000

Leitura Adicional

Para detalhes de implementação, consulte a documentação fonte.