Skip to content

celestialdust/Browser-Use-Ralph-Mode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

103 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Browser Use - Full-Stack Agent with DeepAgents & Ralph Mode

A complete browser automation system combining LangChain DeepAgents with agent-browser, featuring Ralph Mode for iterative refinement and a Claude-inspired UI.

Browser Use Agent Python 3.11+ Node 18+ License MIT

ralph-mode-ad.mp4

Overview

Browser Use is a full-stack browser automation agent that can:

  • Plan and execute complex multi-step browser tasks
  • Self-correct using Ralph Mode's iterative refinement
  • Control browsers via agent-browser CLI
  • Stream live browser viewport via WebSocket
  • Show thinking in real-time like Claude
  • Request approval for sensitive actions
  • Isolate sessions per conversation thread

Features

DeepAgents Integration

  • Planning & Decomposition: Built-in write_todos tool with parallel vs sequential task identification
  • File System Tools: Manage large context with filesystem
  • Parallel Subagents: Spawn multiple subagents concurrently for independent tasks
  • File-Based Results: Subagents write results to files and return paths to avoid context bloat
  • Long-term Memory: Persistent state across conversations

Skills System

  • Document Skills: PDF, PPTX, DOCX manipulation
  • Browser Skills: Automated browser interactions
  • Skill Creator: Guide for building custom skills
  • Settings Integration: View and manage skills in UI

Memory Management

  • AGENTS.md: Store learned patterns with enforced structure
  • USER_PREFERENCES.md: Store user preferences with standardized sections
  • Diary: Record task completions and learnings
  • Skills: Create reusable workflows

Human-in-the-Loop

  • Guidance Requests: Agent can ask for help when stuck
  • Credential Requests: Secure credential input form in UI
  • Confirmation Dialogs: Approve/reject risky actions
  • Subagent Support: Interrupts from subagents surface to UI

Bash Execution

  • Script Execution: Run Python/Node scripts
  • Package Installation: pip/npm install commands
  • Security Tiers: Auto-approve safe, require approval for others, block dangerous
  • Unified Root: All paths resolve relative to .browser-agent/

Ralph Mode

  • Iterative Refinement: Agent retries with improvements
  • Self-Reflection: Reviews mistakes and adapts approach
  • Persistent Memory: Uses filesystem between iterations
  • Configurable Iterations: Set max attempts per task

Browser Automation

  • Full Browser Control: Navigate, click, fill, type, screenshot
  • Element Refs: Clean @e1 syntax for interactions
  • Session Isolation: Each thread gets its own browser
  • Live Streaming: WebSocket viewport streaming
  • Browserbase Support: Cloud browser infrastructure for anti-detection and serverless deployments

File Artifacts

  • Present Files to User: Agent can create and present files (PDFs, images, documents)
  • File Preview Panel: Side panel for viewing presented files with inline preview
  • Multi-Format Preview: Native preview support for PDF, Markdown, images, text, JSON, CSV, HTML, DOCX, and XLSX files
  • Download Support: One-click download for all artifact types
  • Type Detection: Automatic icon and preview mode based on file type

Subagent Visibility

  • Real-time Status: See active subagents spawned by the main agent
  • Polling-based Updates: Status refreshes via backend polling
  • Status Cards: Visual indicator showing subagent progress

Claude-Style UI

  • Waterfall Thought Process: Hierarchical, nested display of reasoning
  • 3-Panel Layout: Resizable threads, chat, and browser panels
  • Persistent Browser Preview: Right-side panel with live streaming
  • File Preview Panel: Side panel for viewing file artifacts
  • Clean Design: Anthropic-inspired minimal color palette
  • Smooth Animations: 200ms transitions

Sandboxed Browser Execution

All browser tools run in an isolated browser sandbox, so no approval is required for browser actions. The agent can freely navigate, click, fill forms, and execute JavaScript.

Auto-approved browser tools:

  • Navigation: browser_navigate, browser_back, browser_forward, browser_reload
  • Interaction: browser_click, browser_fill, browser_type, browser_press_key
  • Observation: browser_snapshot, browser_screenshot, browser_get_info, browser_console
  • State: browser_is_visible, browser_is_enabled, browser_is_checked, browser_wait
  • Advanced: browser_eval (JavaScript execution), browser_close

Bash commands use a tiered approval system (auto-approve safe commands, block dangerous ones).

Quick Start

Prerequisites

  • Python 3.11+ with uv or pip
  • Node.js 18+ with yarn or npm
  • OpenAI API or Azure OpenAI access
  • agent-browser: npm install -g agent-browser

1. Clone Repository

git clone <repository-url>
cd Browser-Use

2. Backend Setup

cd browser-use-agent

# Create virtual environment
uv venv
source .venv/bin/activate  # On Windows: .venv\Scripts\activate

# Install dependencies
uv pip install -e .

# Configure environment
cp .env.example .env
# Edit .env with your API credentials

.env configuration (OpenAI):

USE_AZURE=false
OPENAI_API_KEY=your-openai-api-key
OPENAI_MODEL=gpt-5
TEMPERATURE=1.0

.env configuration (Azure OpenAI):

USE_AZURE=true
AZURE_OPENAI_ENDPOINT=https://your-endpoint.openai.azure.com
AZURE_OPENAI_API_KEY=your-api-key-here
OPENAI_API_VERSION=2025-01-01-preview
DEPLOYMENT_NAME=your-gpt-deployment-name
TEMPERATURE=1.0

3. Frontend Setup

cd ../deep-agents-ui

# Configure environment variables (recommended)
cp .env.local.example .env.local
# Edit .env.local with your settings

# Install dependencies
yarn install

# Start development server
yarn dev

4. Start Backend

In a separate terminal:

cd browser-use-agent
source .venv/bin/activate
langgraph dev --port 2024

5. Open UI

Navigate to http://localhost:3000 and start chatting!

Configuration

Backend Configuration

Environment Variables (browser-use-agent/.env):

Variable Description Default
USE_AZURE Use Azure OpenAI true
OPENAI_API_KEY OpenAI API key (when USE_AZURE=false) -
OPENAI_MODEL OpenAI model name gpt-5
AZURE_OPENAI_ENDPOINT Azure OpenAI endpoint -
AZURE_OPENAI_API_KEY Azure OpenAI API key -
DEPLOYMENT_NAME Azure deployment name gsds-gpt-5
TEMPERATURE Model temperature 1.0
REASONING_ENABLED Enable reasoning API true
REASONING_EFFORT Reasoning effort level medium
AGENT_BROWSER_STREAM_PORT Base WebSocket port 9223
USE_CDP Connect to existing Chrome false
CDP_PORT Chrome DevTools port 9222
BROWSERBASE_API_KEY Browserbase API key (for cloud browser) -
BROWSERBASE_PROJECT_ID Browserbase project ID -

Frontend Configuration

Environment Variables (.env.local):

NEXT_PUBLIC_DEPLOYMENT_URL=http://127.0.0.1:2024
NEXT_PUBLIC_ASSISTANT_ID=browser-agent
NEXT_PUBLIC_RALPH_MODE_ENABLED=false
NEXT_PUBLIC_RALPH_MAX_ITERATIONS=5
NEXT_PUBLIC_BROWSER_STREAM_PORT=9223

Usage Examples

Web UI Chat

Simple Navigation:

Navigate to example.com and tell me the main heading

Form Interaction:

Go to https://httpbin.org/forms/post, fill in the customer name
as "John Doe", fill in the telephone as "555-1234", and submit the form

Research Task (Ralph Mode):

Research the latest features in Next.js 15 and create a summary
with the top 3 most important improvements

CLI Usage

# Standard mode
python agent.py --task "Navigate to google.com and search for 'LangChain'"

# Ralph Mode (iterative)
python agent.py --ralph --task "Research browser automation tools" --iterations 5

System Architecture

High-Level Overview

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              FRONTEND (Next.js)                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚   Thread    β”‚  β”‚   Chat Interface β”‚  β”‚       Browser Panel             β”‚ β”‚
β”‚  β”‚   Sidebar   β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚  β”‚             β”‚  β”‚  β”‚ Messages   β”‚  β”‚  β”‚  β”‚   Live Viewport Stream    β”‚  β”‚ β”‚
β”‚  β”‚  - Today    β”‚  β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚  β”‚  β”‚                           β”‚  β”‚ β”‚
β”‚  β”‚  - Yesterdayβ”‚  β”‚  β”‚ β”‚Thought β”‚ β”‚  β”‚  β”‚  β”‚   WebSocket Connection    β”‚  β”‚ β”‚
β”‚  β”‚  - Older    β”‚  β”‚  β”‚ β”‚Process β”‚ β”‚  β”‚  β”‚  β”‚   ws://localhost:9223     β”‚  β”‚ β”‚
β”‚  β”‚             β”‚  β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚  β”‚  β”‚  β”‚                           β”‚  β”‚ β”‚
β”‚  β”‚             β”‚  β”‚  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚  β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚  β”‚             β”‚  β”‚  β”‚ β”‚Tool    β”‚ β”‚  β”‚  β”‚                                 β”‚ β”‚
β”‚  β”‚             β”‚  β”‚  β”‚ β”‚Calls   β”‚ β”‚  β”‚  β”‚  Auto-expand on session start   β”‚ β”‚
β”‚  β”‚             β”‚  β”‚  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚  β”‚  β”‚  Auto-collapse on session end   β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚        15%        β”‚       50%        β”‚              35%                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                    β”‚
                    HTTP/SSE Stream (LangGraph SDK)
                                    β”‚
                                    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         BACKEND (LangGraph + Python)                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚                        LangGraph Server (:2024)                         β”‚β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚β”‚
β”‚  β”‚  β”‚ State Manager β”‚  β”‚ Checkpoint DB  β”‚  β”‚    Thread Isolation        β”‚ β”‚β”‚
β”‚  β”‚  β”‚               β”‚  β”‚   (SQLite)     β”‚  β”‚                            β”‚ β”‚β”‚
β”‚  β”‚  β”‚ - messages    β”‚  β”‚                β”‚  β”‚  thread_id β†’ browser_sessionβ”‚ β”‚β”‚
β”‚  β”‚  β”‚ - todos       β”‚  β”‚  Persistent    β”‚  β”‚  thread_id β†’ memory_context β”‚ β”‚β”‚
β”‚  β”‚  β”‚ - files       β”‚  β”‚  across        β”‚  β”‚  thread_id β†’ checkpoint     β”‚ β”‚β”‚
β”‚  β”‚  β”‚ - browser     β”‚  β”‚  restarts      β”‚  β”‚                            β”‚ β”‚β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β”‚                                    β”‚                                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                         DeepAgents Graph                               β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚  β”‚
β”‚  β”‚  β”‚  Plan   │───▢│ Execute  │───▢│ Reflect  │───▢│ Ralph Iteration β”‚   β”‚  β”‚
β”‚  β”‚  β”‚(Todos)  β”‚    β”‚ (Tools)  β”‚    β”‚(Memory)  β”‚    β”‚   (if enabled)  β”‚   β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚  β”‚
β”‚  β”‚       β”‚              β”‚               β”‚                   β”‚            β”‚  β”‚
β”‚  β”‚       β–Ό              β–Ό               β–Ό                   β–Ό            β”‚  β”‚
β”‚  β”‚  write_todos   Browser Tools   AGENTS.md          Max iterations      β”‚  β”‚
β”‚  β”‚               + Bash Tools    USER_PREFS.md       then return         β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                    β”‚                                         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                     β”‚
                    subprocess (agent-browser CLI)
                                     β”‚
                                     β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         BROWSER LAYER (agent-browser)                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚                      Chromium Instance (Headless)                       β”‚β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚β”‚
β”‚  β”‚  β”‚   Page Control    β”‚  β”‚  Element Refs      β”‚  β”‚  Screencast Stream β”‚ β”‚β”‚
β”‚  β”‚  β”‚                   β”‚  β”‚                    β”‚  β”‚                    β”‚ β”‚β”‚
β”‚  β”‚  β”‚  - navigate(url)  β”‚  β”‚  @e1, @e2, @e3...  β”‚  β”‚  JPEG frames β†’     β”‚ β”‚β”‚
β”‚  β”‚  β”‚  - click(@ref)    β”‚  β”‚  from snapshot -i  β”‚  β”‚  WebSocket :9223   β”‚ β”‚β”‚
β”‚  β”‚  β”‚  - fill(@ref)     β”‚  β”‚                    β”‚  β”‚                    β”‚ β”‚β”‚
β”‚  β”‚  β”‚  - screenshot()   β”‚  β”‚  Valid per page    β”‚  β”‚  30fps streaming   β”‚ β”‚β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow

User Input                                                    Browser Viewport
    β”‚                                                               β–²
    β–Ό                                                               β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”   HTTP POST    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   subprocess   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Next.js β”‚ ─────────────▢ β”‚  LangGraph  β”‚ ────────────▢  β”‚  agent-browser  β”‚
β”‚   UI    β”‚                β”‚   Server    β”‚                β”‚      CLI        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β–²                            β”‚                               β”‚
    β”‚         SSE Stream         β”‚                               β”‚
    β”‚  (messages, todos, tools,  β”‚                               β”‚
    β”‚   thought, browser_session)β”‚                               β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                               β”‚
                                                                 β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
    β”‚  WebSocket Stream (ws://localhost:9223)
    β”‚  - JPEG frames (base64)
    β”‚  - viewport metadata
    β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  BrowserPanel   β”‚
β”‚  Live Preview   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Component Interactions

Frontend Components

page.tsx (Main Layout)
    β”‚
    β”œβ”€β”€ ChatProvider (Context)
    β”‚   └── useChat hook
    β”‚       β”œβ”€β”€ LangGraph SDK client
    β”‚       β”œβ”€β”€ Thread state management
    β”‚       β”œβ”€β”€ Message streaming
    β”‚       β”œβ”€β”€ Browser session detection
    β”‚       └── Error handling
    β”‚
    β”œβ”€β”€ ThreadList
    β”‚   β”œβ”€β”€ SWR infinite loading
    β”‚   β”œβ”€β”€ Time-based grouping
    β”‚   └── Interrupt count badge
    β”‚
    β”œβ”€β”€ ChatInterface
    β”‚   β”œβ”€β”€ ChatMessage[]
    β”‚   β”‚   β”œβ”€β”€ ThoughtProcess (waterfall display)
    β”‚   β”‚   β”œβ”€β”€ ToolCallBox (collapsible)
    β”‚   β”‚   └── SubAgentIndicator
    β”‚   β”œβ”€β”€ TodoList (grouped by status)
    β”‚   β”œβ”€β”€ FileExplorer
    β”‚   └── InputArea
    β”‚
    └── ChatWithBrowserPanel
        β”œβ”€β”€ ResizablePanel (chat)
        └── ResizablePanel (browser)
            └── BrowserPanelContent
                └── WebSocket β†’ img[src=base64]

Backend Components

browser_agent.py (Graph Definition)
    β”‚
    β”œβ”€β”€ create_browser_agent()
    β”‚   └── create_deep_agent()
    β”‚       β”œβ”€β”€ Planning node (write_todos)
    β”‚       β”œβ”€β”€ Execution node (tools)
    β”‚       β”œβ”€β”€ Reflection node (memory)
    β”‚       └── Subagent spawning (task tool)
    β”‚
    β”œβ”€β”€ Tools
    β”‚   β”œβ”€β”€ BROWSER_TOOLS (tools.py)
    β”‚   β”‚   β”œβ”€β”€ browser_navigate, browser_back, browser_forward, browser_reload
    β”‚   β”‚   β”œβ”€β”€ browser_click, browser_fill, browser_type, browser_press_key
    β”‚   β”‚   β”œβ”€β”€ browser_snapshot, browser_screenshot, browser_console
    β”‚   β”‚   β”œβ”€β”€ browser_is_visible, browser_is_enabled, browser_is_checked
    β”‚   β”‚   └── browser_wait, browser_eval, browser_close, browser_get_info
    β”‚   β”‚
    β”‚   β”œβ”€β”€ BASH_TOOLS (bash_tool.py)
    β”‚   β”‚   └── bash_execute (with security tiers)
    β”‚   β”‚
    β”‚   β”œβ”€β”€ HUMAN_TOOLS (human_loop.py)
    β”‚   β”‚   β”œβ”€β”€ request_human_guidance
    β”‚   β”‚   β”œβ”€β”€ request_credentials
    β”‚   β”‚   └── request_confirmation
    β”‚   β”‚
    β”‚   β”œβ”€β”€ REFLECTION_TOOLS (reflection.py)
    β”‚   β”‚   └── reflect_on_session
    β”‚   β”‚
    β”‚   └── present_file (present_file.py)
    β”‚       └── Present generated files to user
    β”‚
    └── State (state.py)
        β”œβ”€β”€ messages: BaseMessage[]
        β”œβ”€β”€ todos: Todo[]
        β”œβ”€β”€ files: dict
        β”œβ”€β”€ browser_session: BrowserSession
        β”œβ”€β”€ current_thought: ThoughtProcess
        β”œβ”€β”€ presented_files: List[PresentedFile]
        β”œβ”€β”€ active_subagents: Dict[str, SubagentStatus]
        └── pending_subagent_interrupts: List[SubagentInterrupt]

Filesystem Architecture

The .browser-agent/ directory serves as the unified root for all agent operations:

.browser-agent/                    # Agent's "home directory"
β”‚
β”œβ”€β”€ artifacts/                     # Generated outputs
β”‚   β”œβ”€β”€ file_outputs/             # User-requested files (PDFs, CSVs, etc.)
β”‚   β”œβ”€β”€ screenshots/              # Browser screenshots
β”‚   └── tool_outputs/             # Large tool results
β”‚
β”œβ”€β”€ memory/                        # Persistent memory
β”‚   β”œβ”€β”€ AGENTS.md                 # Learned patterns (website, task, error recovery)
β”‚   β”œβ”€β”€ USER_PREFERENCES.md       # User preferences and settings
β”‚   └── diary/                    # Session completion logs
β”‚
β”œβ”€β”€ skills/                        # Reusable skill definitions
β”‚   β”œβ”€β”€ agent-browser/            # Browser automation skill
β”‚   β”œβ”€β”€ pdf.md                    # PDF manipulation
β”‚   β”œβ”€β”€ pptx.md                   # PowerPoint creation
β”‚   └── docx.md                   # Word document handling
β”‚
β”œβ”€β”€ checkpoints/                   # LangGraph state persistence
β”‚   └── browser_agent.db          # SQLite checkpoint database
β”‚
└── traces/                        # Debug traces (optional)

Path Resolution:

Both the DeepAgents FilesystemBackend and bash_execute tool use .browser-agent/ as root:

# DeepAgents FilesystemBackend
write_file("/artifacts/report.pdf", content)  # β†’ .browser-agent/artifacts/report.pdf

# bash_execute (cwd defaults to .browser-agent/)
bash_execute("python artifacts/script.py")    # Runs from .browser-agent/

State Management

Thread Isolation

Each conversation thread maintains isolated state:

thread_id = "abc-123"

# Isolated per thread:
- Browser session (sessionId, streamUrl, isActive)
- LangGraph checkpoint (messages, todos, files)
- WebSocket port (9223 + hash(thread_id) % 100)

# Shared across threads:
- Memory files (AGENTS.md, USER_PREFERENCES.md)
- Skills definitions
- Configuration

State Flow

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     LangGraph State                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  messages: BaseMessage[]                                   β”‚  β”‚
β”‚  β”‚    - HumanMessage (user input)                            β”‚  β”‚
β”‚  β”‚    - AIMessage (agent response + tool_calls)              β”‚  β”‚
β”‚  β”‚    - ToolMessage (tool results)                           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  todos: Todo[]                                             β”‚  β”‚
β”‚  β”‚    - content: string                                       β”‚  β”‚
β”‚  β”‚    - status: "pending" | "in_progress" | "completed"       β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  browser_session: BrowserSession | null                    β”‚  β”‚
β”‚  β”‚    - sessionId: string (thread_id)                        β”‚  β”‚
β”‚  β”‚    - streamUrl: string (ws://localhost:9223)              β”‚  β”‚
β”‚  β”‚    - isActive: boolean                                     β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  current_thought: ThoughtProcess | null                    β”‚  β”‚
β”‚  β”‚    - content: string (streaming)                          β”‚  β”‚
β”‚  β”‚    - isComplete: boolean                                   β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                              β”‚
                              β”‚ Checkpoint on each node
                              β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚   SQLite DB     β”‚
                    β”‚  (persistent)   β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

WebSocket Streaming Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  agent-browser  β”‚                      β”‚    Frontend     β”‚
β”‚    (backend)    β”‚                      β”‚  BrowserPanel   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                                        β”‚
         β”‚  Start screencast                      β”‚
         β”‚  on browser_navigate                   β”‚
         β–Ό                                        β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     WebSocket      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Screencast     β”‚ ─────────────────▢ β”‚   WebSocket     β”‚
β”‚  Server :9223   β”‚   JPEG frames      β”‚   Client        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   (base64)         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚                                        β”‚
         β”‚  Frame message:                        β”‚
         β”‚  {                                     β”‚
         β”‚    type: "frame",                      β”‚
         β”‚    data: "base64...",                  β”‚
         β”‚    metadata: {                         β”‚
         β”‚      deviceWidth,                      β”‚
         β”‚      deviceHeight,                     β”‚
         β”‚      ...                               β”‚
         β”‚    }                                   β”‚
         β”‚  }                                     β”‚
         β”‚                                        β–Ό
         β”‚                              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
         β”‚                              β”‚  <img src=      β”‚
         β”‚                              β”‚   data:image/   β”‚
         β”‚                              β”‚   jpeg;base64>  β”‚
         β”‚                              β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
         β”‚
         β”‚  On browser_close:
         β”‚  - Stop screencast
         β”‚  - Close WebSocket
         β”‚  - Frontend auto-collapses panel
         β–Ό

Interrupt Flow (Human-in-the-Loop)

Agent encounters need for human input
                β”‚
                β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  langgraph.types.interrupt({        β”‚
β”‚    type: "guidance" | "credentials" β”‚
β”‚          | "confirmation",          β”‚
β”‚    question: "...",                 β”‚
β”‚    context: "..."                   β”‚
β”‚  })                                 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β”‚ Stream interrupted state
                   β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Frontend detects interrupt         β”‚
β”‚  stream.interrupt !== null          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Render appropriate UI:             β”‚
β”‚  - HumanLoopInterrupt (guidance)    β”‚
β”‚  - CredentialsForm (credentials)    β”‚
β”‚  - ConfirmationDialog (confirm)     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β”‚ User responds
                   β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  resumeInterrupt(response)          β”‚
β”‚  β†’ stream.submit(response)          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                   β”‚
                   β”‚ Graph resumes
                   β–Ό
        Agent continues execution

Project Structure

Browser-Use/
β”œβ”€β”€ browser-use-agent/          # Python Backend (DeepAgents)
β”‚   β”œβ”€β”€ browser_use_agent/     # Core agent package
β”‚   β”‚   β”œβ”€β”€ browser_agent.py   # Main agent + Ralph Mode
β”‚   β”‚   β”œβ”€β”€ configuration.py   # Azure OpenAI config
β”‚   β”‚   β”œβ”€β”€ tools.py          # Browser automation tools
β”‚   β”‚   β”œβ”€β”€ bash_tool.py      # Bash execution with security tiers
β”‚   β”‚   β”œβ”€β”€ human_loop.py     # Human-in-the-loop tools
β”‚   β”‚   β”œβ”€β”€ subagent_interrupt.py  # Subagent interrupt forwarding
β”‚   β”‚   β”œβ”€β”€ state.py          # State definitions
β”‚   β”‚   β”œβ”€β”€ prompts.py        # System prompts + memory management
β”‚   β”‚   β”œβ”€β”€ reflection.py     # Memory read/write tools
β”‚   β”‚   β”œβ”€β”€ storage/          # Checkpoint and config
β”‚   β”‚   β”œβ”€β”€ skills/           # Skill loader
β”‚   β”‚   └── utils.py          # StreamManager
β”‚   β”œβ”€β”€ agent.py              # CLI entry point
β”‚   └── langgraph.json        # LangGraph config
β”‚
β”œβ”€β”€ deep-agents-ui/            # Next.js Frontend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”‚   β”œβ”€β”€ api/skills/       # Skills API route
β”‚   β”‚   β”‚   β”œβ”€β”€ components/       # UI components
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ChatInterface.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ChatMessage.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ BrowserPanel.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ThoughtProcess.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ToolCallBox.tsx
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ThreadList.tsx
β”‚   β”‚   β”‚   β”‚   └── ...
β”‚   β”‚   β”‚   β”œβ”€β”€ hooks/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ useChat.ts    # Main chat hook
β”‚   β”‚   β”‚   β”‚   └── useThreads.ts # Thread list hook
β”‚   β”‚   β”‚   β”œβ”€β”€ providers/
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ ChatProvider.tsx
β”‚   β”‚   β”‚   β”‚   └── ClientProvider.tsx
β”‚   β”‚   β”‚   └── types/
β”‚   β”‚   └── components/ui/        # shadcn/ui components
β”‚   └── .env.local.example
β”‚
β”œβ”€β”€ .browser-agent/            # Agent memory and artifacts
β”‚   β”œβ”€β”€ artifacts/            # Generated files
β”‚   β”œβ”€β”€ memory/               # Persistent memory
β”‚   β”œβ”€β”€ skills/               # Skill definitions
β”‚   └── checkpoints/          # State persistence
β”‚
β”œβ”€β”€ agent.md                  # Technical reference
β”œβ”€β”€ CLAUDE.md                 # AI assistant instructions
└── README.md                 # This file

Documentation

  • Backend README - Python agent details
  • agent.md - Technical reference & implementation
  • Skills: .browser-agent/skills/ - PDF, PPTX, DOCX, browser automation

External Resources


Built with DeepAgents and agent-browser

About

This project is a full-stack browser automation system that integrates LangChain DeepAgents with iterative Ralph Mode refinement to autonomously execute and self-correct complex web tasks.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors