Building GUI Automation Agents with Vision-Language Models: A Complete Implementation Guide

Vision-language models enable autonomous GUI automation by combining screenshot perception with structured reasoning in a continuous Perceive→Think→Act loop.

The bojieli/ai-agent-book repository provides a production-ready framework for building GUI automation agents with vision-language models, implementing the Computer-Use architecture detailed in Chapter 9. This system allows autonomous agents to perceive desktop and browser environments through screenshots, reason about interface elements, and execute precise mouse and keyboard actions without brittle DOM selectors.

The Perceive-Think-Act Architecture

The core implementation follows a strict Perceive → Think → Act loop, as documented in [book-en/chapter9.md](https://github.com/bojieli/ai-agent-book/blob/main/book-en/chapter9.md). This architecture enables agents to operate any graphical interface through visual understanding rather than predefined API integrations.

Perception Layer

The agent captures the current visual state through screenshots. In chapter8/gaia-experience/AWorld/aworld/config/conf.py, the use_vision boolean flag toggles visual input processing:


# From chapter8/gaia-experience/AWorld/aworld/config/conf.py

use_vision: bool = True  # Enables screenshot capture for multimodal processing

When enabled, the system captures the desktop or browser window state as an image buffer for downstream processing.

Multimodal Reasoning

The vision-language model receives both the screenshot and task instruction, generating structured action plans. In chapter8/gaia-experience/AWorld/aworld/agents/llm_agent.py, the agent extracts images from observations when use_vision is active:


# Image extraction logic from llm_agent.py

if self.settings.use_vision:
    screenshot = observation.screenshot
    # Packaged into multimodal message for the LLM

The model outputs textual reasoning alongside concrete action descriptions (e.g., "click button #5") formatted as JSON.

Action Execution

Generated actions dispatch to OS-level tools. The chapter8/gaia-experience/AWorld/aworlddistributed/aworldspace/agents/playwright_agent.py implementation builds computer tool payloads and calls execution services:


# Payload construction for computer tool

computer_action = {
    "type": "mouse_move",
    "x": 400,
    "y": 300
}

This layer communicates with the operating system via pyautogui-style commands or headless browsers through the Chrome DevTools Protocol.

Feedback Integration

After execution, the system waits for UI stabilization, captures a new screenshot, and repeats the loop until task completion. This iterative process continues until the agent's internal finished flag indicates success.

Implementation Components

Action Space Definition

The computer tool in chapter8/browser-use-rpa/browser-use/agent/service.py defines the complete action vocabulary:

  • Mouse operations: move, click, drag
  • Keyboard inputs: type text, key combinations
  • Viewport control: scroll, wait, screenshot

This standardized interface abstracts underlying OS differences, allowing the same agent to control both native applications and web browsers.

Visual Grounding Strategies

The repository implements two complementary approaches in chapter8/browser-use-rpa/browser-use/agent/prompts.py:

  1. Set-of-Mark: Pixel-based segmentation that overlays numerical markers on UI elements
  2. Structured Element Indexing: DOM and Accessibility tree enumeration for web contexts

These strategies solve the visual grounding problem—teaching the model which screen coordinates correspond to specific interface elements.

Model Provider Integration

The agentbook/providers/openrouter.py module handles multimodal API calls:

  • Sends base64-encoded screenshots alongside text prompts
  • Parses JSON responses to extract action sequences
  • Supports OpenRouter-hosted models including GPT-4o and Claude 3.5 Sonnet

Vision-Enabled vs. Text-Only Operation

The framework supports graceful degradation when vision is unavailable. The use_vision flag propagates through the entire stack:

  • Vision-enabled: Multimodal models process pixel data for desktop automation and complex visual interfaces
  • Vision-disabled: Agents rely on DOM extraction (browser_use tools) and accessibility trees, suitable for structured web pages

Toggle this behavior in any agent configuration:

settings = Settings(
    task="Search for AI research papers",
    use_vision=True,  # Set False for DOM-only operation

)

Practical Implementation Examples

Desktop Automation with AworldGUIAgent

For native OS automation, instantiate AworldGUIAgent from chapter8/gaia-experience/AWorld/examples/osworld/aworldAgent/agent.py:

from aworldAgent.agent import AworldGUIAgent
from aworldAgent.settings import Settings

settings = Settings(
    task="Open the terminal and list the files in the home directory",
    model="gpt-4o-mini",
    use_vision=True,
)
agent = AworldGUIAgent(settings)

while not agent.is_done():
    agent.step()

The step() method implements the complete Perceive-Think-Act cycle, automatically capturing screenshots when use_vision=True.

Web Automation with Browser-Use

For browser-based tasks, use the high-level Agent class from chapter8/browser-use-rpa/browser-use/agent/agent.py:

from browser_use.agent import Agent
from browser_use.settings import Settings
from browser_use.models import OpenRouterModel

model = OpenRouterModel(name="anthropic/claude-3.5-sonnet")
settings = Settings(
    task="Search arXiv for 'large language models' and click the first result",
    model=model,
    use_vision=True,
)

agent = Agent(settings)

while not agent.finished:
    agent.run_one_step()

This implementation builds multimodal messages via prompts.get_user_message(use_vision=True) and parses returned computer tool actions.

Fallback to DOM-Only Mode

When visual processing is unnecessary or unavailable, disable vision for faster execution:

settings = Settings(
    task="Open a new tab and navigate to https://example.com",
    model=model,
    use_vision=False,  # Relies on DOM/Accessibility tree

)
agent = Agent(settings)
agent.run_until_done()

In this mode, browser_use.prompts.get_user_message skips screenshot embedding and uses structural page data instead.

Low-Level Computer Tool Access

For direct control without the agent loop, invoke the ComputerTool directly from chapter8/browser-use-rpa/browser-use/agent/service.py:

from browser_use.tools.computer import ComputerTool

tool = ComputerTool()
action = {
    "type": "mouse_move",
    "x": 400,
    "y": 300,
}
tool.run(action)  # Executes immediately

This bypasses LLM reasoning for deterministic automation scripts.

Summary

  • Architecture: The bojieli/ai-agent-book implements a Perceive→Think→Act loop that combines screenshot capture with vision-language model reasoning for robust GUI automation.
  • Key Components: Action spaces defined in service.py, visual grounding in prompts.py, and model integration through openrouter.py create a complete automation stack.
  • Flexibility: The use_vision flag allows seamless switching between multimodal (screenshot-based) and text-only (DOM-based) operation modes.
  • Entry Points: Use AworldGUIAgent for desktop automation and Agent for web tasks, with direct ComputerTool access available for low-level control.

Frequently Asked Questions

How does the Perceive-Think-Act loop work in GUI automation?

The loop begins with perception (capturing a screenshot), followed by thinking (the vision-language model analyzing the image and generating an action plan), and concludes with acting (executing mouse/keyboard commands via the computer tool). After each action, the system captures a new screenshot and repeats until the task completes, as implemented in chapter8/gaia-experience/AWorld/aworld/agents/llm_agent.py and chapter8/browser-use-rpa/browser-use/agent/agent.py.

What is the difference between Set-of-Mark and Structured Element Indexing?

Set-of-Mark overlays numerical markers on UI elements in screenshots, allowing the model to reference specific coordinates (e.g., "click button #5"). Structured Element Indexing uses the DOM or Accessibility tree for web pages, providing hierarchical element IDs without visual processing. Both strategies are defined in chapter8/browser-use-rpa/browser-use/agent/prompts.py and solve the visual grounding problem for different interface types.

How do I toggle vision mode in the ai-agent-book implementation?

Set the use_vision boolean in your Settings configuration. When True, agents in chapter8/gaia-experience/AWorld/aworld/agents/llm_agent.py extract images from observations and send them to multimodal models. When False, the system relies on text-only observations like DOM trees, as configured in chapter8/gaia-experience/AWorld/aworld/config/conf.py.

Which models work best with the Computer-Use agent implementation?

The repository supports any OpenRouter-compatible multimodal model, with anthropic/claude-3.5-sonnet and gpt-4o-mini being primary choices. These models process the screenshot-and-text prompts sent via agentbook/providers/openrouter.py and return structured JSON actions that the computer tool parses and executes.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →