AI agent for browser automation and web testing using Playwright
A enterprise-ready Agent-to-Agent (A2A) server that provides AI-powered capabilities through a standardized protocol.
# Run the agent
go run .
# Or with Docker
docker build -t browser-agent .
docker run -p 8080:8080 browser-agent- ✅ A2A protocol compliant
- ✅ AI-powered capabilities
- ✅ Streaming support
- ✅ Production ready
- ✅ Minimal dependencies
GET /.well-known/agent-card.json- Agent metadata and capabilitiesGET /health- Health check endpointPOST /a2a- A2A protocol endpoint
| Skill | Description | Parameters |
|---|---|---|
navigate_to_url |
Navigate to a specific URL and wait for the page to fully load | timeout, url, wait_until |
click_element |
Click on an element identified by selector, text, or other locator strategies | button, click_count, force, selector, timeout |
fill_form |
Fill form fields with provided data, handling various input types | fields, submit, submit_selector |
extract_data |
Extract data from the page using selectors and return structured information | extractors, format |
take_screenshot |
Capture a screenshot of the current page or specific element | full_page, quality, selector, type |
execute_script |
Execute custom JavaScript code in the browser context | args, return_value, script |
handle_authentication |
Handle various authentication scenarios including basic auth, OAuth, and custom login forms | login_url, password, password_selector, submit_selector, type, username, username_selector |
wait_for_condition |
Wait for specific conditions before proceeding with automation | condition, custom_function, selector, state, timeout |
Configure the agent via environment variables:
The following custom configuration variables are available:
| Category | Variable | Description | Default |
|---|---|---|---|
| Browser | BROWSER_ARGS |
Args configuration | [--disable-blink-features=AutomationControlled --disable-features=VizDisplayCompositor --no-first-run --disable-default-apps --disable-extensions --disable-plugins --disable-sync --disable-translate --hide-scrollbars --mute-audio --no-zygote --disable-background-timer-throttling --disable-backgrounding-occluded-windows --disable-renderer-backgrounding --disable-ipc-flooding-protection] |
| Browser | BROWSER_DATA_DIR |
Data_dir configuration | /tmp/playwright/artifacts |
| Browser | BROWSER_ENGINE |
Engine configuration | chromium |
| Browser | BROWSER_HEADER_ACCEPT |
Header_accept configuration | text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 |
| Browser | BROWSER_HEADER_ACCEPT_ENCODING |
Header_accept_encoding configuration | gzip, deflate, br |
| Browser | BROWSER_HEADER_ACCEPT_LANGUAGE |
Header_accept_language configuration | en-US,en;q=0.9 |
| Browser | BROWSER_HEADER_CONNECTION |
Header_connection configuration | keep-alive |
| Browser | BROWSER_HEADER_DNT |
Header_dnt configuration | 1 |
| Browser | BROWSER_HEADER_UPGRADE_INSECURE_REQUESTS |
Header_upgrade_insecure_requests configuration | 1 |
| Browser | BROWSER_HEADLESS |
Headless configuration | true |
| Browser | BROWSER_SESSION_TIMEOUT |
Session_timeout configuration | 2m |
| Browser | BROWSER_STEALTH_MODE |
Stealth_mode configuration | false |
| Browser | BROWSER_USER_AGENT |
User_agent configuration | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 |
| Browser | BROWSER_VIEWPORT_HEIGHT |
Viewport_height configuration | 1080 |
| Browser | BROWSER_VIEWPORT_WIDTH |
Viewport_width configuration | 1920 |
| Browser | BROWSER_XVFB_DISPLAY |
Xvfb_display configuration | :99 |
| Browser | BROWSER_XVFB_ENABLED |
Xvfb_enabled configuration | false |
| Browser | BROWSER_XVFB_SCREEN_RESOLUTION |
Xvfb_screen_resolution configuration | 1920x1080x24 |
| Category | Variable | Description | Default |
|---|---|---|---|
| Server | A2A_PORT |
Server port | 8080 |
| Server | A2A_DEBUG |
Enable debug mode | false |
| Server | A2A_AGENT_URL |
Agent URL for internal references | http://localhost:8080 |
| Server | A2A_STREAMING_STATUS_UPDATE_INTERVAL |
Streaming status update frequency | 1s |
| Server | A2A_SERVER_READ_TIMEOUT |
HTTP server read timeout | 120s |
| Server | A2A_SERVER_WRITE_TIMEOUT |
HTTP server write timeout | 120s |
| Server | A2A_SERVER_IDLE_TIMEOUT |
HTTP server idle timeout | 120s |
| Server | A2A_SERVER_DISABLE_HEALTHCHECK_LOG |
Disable logging for health check requests | true |
| Agent Metadata | A2A_AGENT_CARD_FILE_PATH |
Path to agent card JSON file | .well-known/agent-card.json |
| LLM Client | A2A_AGENT_CLIENT_PROVIDER |
LLM provider (openai, anthropic, azure, ollama, deepseek) |
`` |
| LLM Client | A2A_AGENT_CLIENT_MODEL |
Model to use | `` |
| LLM Client | A2A_AGENT_CLIENT_API_KEY |
API key for LLM provider | - |
| LLM Client | A2A_AGENT_CLIENT_BASE_URL |
Custom LLM API endpoint | - |
| LLM Client | A2A_AGENT_CLIENT_TIMEOUT |
Timeout for LLM requests | 30s |
| LLM Client | A2A_AGENT_CLIENT_MAX_RETRIES |
Maximum retries for LLM requests | 3 |
| LLM Client | A2A_AGENT_CLIENT_MAX_CHAT_COMPLETION_ITERATIONS |
Max chat completion rounds | 10 |
| LLM Client | A2A_AGENT_CLIENT_MAX_TOKENS |
Maximum tokens for LLM responses | 4096 |
| LLM Client | A2A_AGENT_CLIENT_TEMPERATURE |
Controls randomness of LLM output | 0.7 |
| Capabilities | A2A_CAPABILITIES_STREAMING |
Enable streaming responses | true |
| Capabilities | A2A_CAPABILITIES_PUSH_NOTIFICATIONS |
Enable push notifications | false |
| Capabilities | A2A_CAPABILITIES_STATE_TRANSITION_HISTORY |
Track state transitions | false |
| Task Management | A2A_TASK_RETENTION_MAX_COMPLETED_TASKS |
Max completed tasks to keep (0 = unlimited) | 100 |
| Task Management | A2A_TASK_RETENTION_MAX_FAILED_TASKS |
Max failed tasks to keep (0 = unlimited) | 50 |
| Task Management | A2A_TASK_RETENTION_CLEANUP_INTERVAL |
Cleanup frequency (0 = manual only) | 5m |
| Storage | A2A_QUEUE_PROVIDER |
Storage backend (memory or redis) |
memory |
| Storage | A2A_QUEUE_URL |
Redis connection URL (when using Redis) | - |
| Storage | A2A_QUEUE_MAX_SIZE |
Maximum queue size | 100 |
| Storage | A2A_QUEUE_CLEANUP_INTERVAL |
Task cleanup interval | 30s |
| Artifacts | ARTIFACTS_ENABLE |
Enable artifacts support | false |
| Artifacts | ARTIFACTS_SERVER_HOST |
Artifacts server host | localhost |
| Artifacts | ARTIFACTS_SERVER_PORT |
Artifacts server port | 8081 |
| Artifacts | ARTIFACTS_STORAGE_PROVIDER |
Storage backend (filesystem or minio) |
filesystem |
| Artifacts | ARTIFACTS_STORAGE_BASE_PATH |
Base path for filesystem storage | ./artifacts |
| Artifacts | ARTIFACTS_STORAGE_BASE_URL |
Override base URL for direct downloads | (auto-generated) |
| Artifacts | ARTIFACTS_STORAGE_ENDPOINT |
MinIO/S3 endpoint URL | - |
| Artifacts | ARTIFACTS_STORAGE_ACCESS_KEY |
MinIO/S3 access key | - |
| Artifacts | ARTIFACTS_STORAGE_SECRET_KEY |
MinIO/S3 secret key | - |
| Artifacts | ARTIFACTS_STORAGE_BUCKET_NAME |
MinIO/S3 bucket name | artifacts |
| Artifacts | ARTIFACTS_STORAGE_USE_SSL |
Use SSL for MinIO/S3 connections | true |
| Artifacts | ARTIFACTS_RETENTION_MAX_ARTIFACTS |
Max artifacts per task (0 = unlimited) | 5 |
| Artifacts | ARTIFACTS_RETENTION_MAX_AGE |
Max artifact age (0 = no age limit) | 168h |
| Artifacts | ARTIFACTS_RETENTION_CLEANUP_INTERVAL |
Cleanup frequency (0 = manual only) | 24h |
| Authentication | A2A_AUTH_ENABLE |
Enable OIDC authentication | false |
# Generate code from ADL
task generate
# Run tests
task test
# Build the application
task build
# Run linter
task lint
# Format code
task fmtUse the A2A Debugger to test and debug your A2A agent during development. It provides a web interface for sending requests to your agent and inspecting responses, making it easier to troubleshoot issues and validate your implementation.
docker run --rm -it --network host ghcr.io/inference-gateway/a2a-debugger:latest --server-url http://localhost:8080 tasks submit "What are your skills?"docker run --rm -it --network host ghcr.io/inference-gateway/a2a-debugger:latest --server-url http://localhost:8080 tasks listdocker run --rm -it --network host ghcr.io/inference-gateway/a2a-debugger:latest --server-url http://localhost:8080 tasks get <task ID>The Docker image can be built with custom version information using build arguments:
# Build with default values from ADL
docker build -t browser-agent .
# Build with custom version information
docker build \
--build-arg VERSION=1.2.3 \
--build-arg AGENT_NAME="My Custom Agent" \
--build-arg AGENT_DESCRIPTION="Custom agent description" \
-t browser-agent:1.2.3 .Available Build Arguments:
VERSION- Agent version (default:0.4.3)AGENT_NAME- Agent name (default:browser-agent)AGENT_DESCRIPTION- Agent description (default:AI agent for browser automation and web testing using Playwright)
These values are embedded into the binary at build time using linker flags, making them accessible at runtime without requiring environment variables.
MIT License - see LICENSE file for details