Skip to content
Guides5 min read

Evaluating Computer-Use Agents, Step by Step

Evaluate computer-use and GUI agents step by step in Potato by judging each action, checking click grounding on the screenshot, and reviewing each tool call.

Potato Team

Evaluating a computer-use agent means checking, at each step, whether the action was right and whether the click landed on the element it named. Task success on its own hides the click that hit the wrong button but advanced anyway, and the action that was right by luck.

A computer-use agent, also called a GUI or OS agent, sees the screen as pixels or a DOM and acts through the same controls a person has. At each step it reads a screenshot, decides on an action, and clicks. Benchmarks such as OSWorld, ScreenSpot, and AndroidWorld score task completion automatically. Automatic scoring is cheap and worth running, but it cannot tell you why a run failed or catch the lucky pass, and human step review covers both. Potato reviews these runs with a purpose-built GUI-trajectory surface and a tool-call review, both configured in YAML.

Anatomy of one computer-use step: screenshot, action, verdict, and click groundingJudge the action and whether the click landed on the element it named

Step-level judgments in a GUI trajectory

Each step pairs a screenshot (what the agent saw) with an action (what it did). You judge the action, and when the step carries click coordinates, you check the grounding marker that Potato draws on the screenshot. A review covers three judgments:

  • Action correctness: correct, wrong element, wrong action, or hallucinated.
  • Click grounding: whether the coordinates landed on the element the action named.
  • Outcome: whether the run finished the task, and the step at which it first went wrong.

A computer-use step with an action verdict and a click-grounding markerReview each step: action correctness plus click grounding on the screenshot

The scheme sets the four action verdicts:

yaml
annotation_schemes:
  - annotation_type: gui_trajectory
    name: gui_review
    description: "For each step: was the action correct and did the click land right?"
    steps_key: steps
    screenshot_key: screenshot
    action_key: action
    coord_space: normalized
    verdict_options: [correct, wrong_element, wrong_action, hallucinated]

Each step supplies screenshot, action, and optional x/y (or a nested click: {x, y}). Task-level scoring can pass a run with a grounding error in it. A model can output the right action label while clicking ten pixels off the target, and if the run still reaches the goal screen, a pass/fail on the final screen does not record the miss.

First-divergence labels for failed runs

The first wrong step matters more than the final result because you would fix or train against it. A run that fails at step 9 because step 3 misread a dialog is really a step-3 problem, and labeling it at step 9 teaches the wrong lesson. Catching the first divergence is the same idea behind process reward models, where a signal at every step localizes the error instead of collapsing the whole trajectory into one number.

Per-call review of tool calls

GUI agents also call tools and functions, which fail in their own ways when the agent picks the wrong tool for the right intent or passes malformed arguments to the right tool. The tool_call_review schema pulls each call out of the trace and gives it a card with the tool name and pretty-printed arguments, so you judge the calls one at a time as correct, wrong tool, or wrong arguments, as in BFCL v4 and MCPMark.

Per-call verdicts on each tool call in a traceJudge every tool call: right tool and correct arguments

Leaving verdict_options unset gives those three verdicts. If call order matters for your agent, uncomment the line to add wrong_order as a fourth:

yaml
annotation_schemes:
  - annotation_type: tool_call_review
    name: tool_review
    description: "Judge each tool call: right tool? correct arguments?"
    steps_key: steps
    # verdict_options: [correct, wrong_tool, wrong_args, wrong_order]

Potato extracts tool calls at render time from each step's tool_calls or tool_call field, or from a step that names a tool or sets action_type: tool, so you can review a trajectory that mixes UI clicks and API calls on both axes in one task.

Runnable examples and your own data

Each surface ships a runnable example with sample data under examples/agent-traces/ in the Potato repository. The examples are not part of the PyPI package, so clone the repository to run one:

bash
git clone https://github.com/davidjurgens/potato.git
cd potato && pip install -r requirements.txt
python potato/flask_server.py start examples/agent-traces/gui-trajectory/config.yaml -p 8000

The last command serves the GUI-trajectory example at http://localhost:8000.

Your own data drops in as a list of steps, each with a screenshot URL or data-URI and an action string. For broader web agents that work from rendered pages rather than raw screenshots, see Web-Agent Evaluation.

Further reading

References

  • Xie, T., Zhang, D., Chen, J., et al. (2024). OSWorld: Benchmarking Multimodal Agents for Open-Ended Tasks in Real Computer Environments. Neural Information Processing Systems (NeurIPS). https://arxiv.org/abs/2404.07972
  • Cheng, K., Sun, Q., Chu, Y., et al. (2024). SeeClick: Harnessing GUI Grounding for Advanced Visual GUI Agents. Proceedings of the 62nd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers). https://doi.org/10.18653/v1/2024.acl-long.505
  • Rawles, C., Clinckemaillie, S., Chang, Y., et al. (2024). AndroidWorld: A Dynamic Benchmarking Environment for Autonomous Agents. arXiv preprint. https://arxiv.org/abs/2405.14573
  • Wu, Z., Liu, X., Zhang, X., et al. (2025). MCPMark: A Benchmark for Stress-Testing Realistic and Comprehensive MCP Use. arXiv preprint. https://arxiv.org/abs/2509.24002