{"id":31750160,"url":"https://github.com/inference-gateway/browser-agent","last_synced_at":"2026-07-22T18:31:53.157Z","repository":{"id":315601595,"uuid":"1059375486","full_name":"inference-gateway/browser-agent","owner":"inference-gateway","description":"A2A agent server for browser automation and web testing using Playwright","archived":false,"fork":false,"pushed_at":"2026-07-14T15:20:09.000Z","size":876,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-14T16:28:10.227Z","etag":null,"topics":["a2a","a2a-protocol","a2a-server","browser","browser-automation","golang","google"],"latest_commit_sha":null,"homepage":"https://registry.inference-gateway.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/inference-gateway.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-09-18T11:09:22.000Z","updated_at":"2026-07-14T15:22:08.000Z","dependencies_parsed_at":"2025-10-24T04:25:21.583Z","dependency_job_id":"d72f8f19-ce3c-43bf-b307-825ce33af451","html_url":"https://github.com/inference-gateway/browser-agent","commit_stats":null,"previous_names":["inference-gateway/playwright-agent","inference-gateway/browser-agent"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/inference-gateway/browser-agent","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inference-gateway%2Fbrowser-agent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inference-gateway%2Fbrowser-agent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inference-gateway%2Fbrowser-agent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inference-gateway%2Fbrowser-agent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/inference-gateway","download_url":"https://codeload.github.com/inference-gateway/browser-agent/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/inference-gateway%2Fbrowser-agent/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35773465,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-22T02:00:06.236Z","response_time":124,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["a2a","a2a-protocol","a2a-server","browser","browser-automation","golang","google"],"created_at":"2025-10-09T15:26:59.886Z","updated_at":"2026-07-22T18:31:53.149Z","avatar_url":"https://github.com/inference-gateway.png","language":"Go","funding_links":[],"categories":["🤖 Agents"],"sub_categories":["🌐 Browser \u0026 Web"],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Browser Agent\n\n[![CI](https://github.com/inference-gateway/browser-agent/workflows/CI/badge.svg)](https://github.com/inference-gateway/browser-agent/actions/workflows/ci.yml)\n[![Go Report Card](https://img.shields.io/badge/Go%20Report%20Card-A+-brightgreen?style=flat\u0026logo=go\u0026logoColor=white)](https://goreportcard.com/report/github.com/inference-gateway/browser-agent)\n[![Go Version](https://img.shields.io/badge/Go-1.26.4+-00ADD8?style=flat\u0026logo=go)](https://golang.org)\n[![A2A Protocol](https://img.shields.io/badge/A2A-Protocol-blue?style=flat)](https://github.com/inference-gateway/adk)\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)\n\n**AI agent for browser automation and web testing using Playwright**\n\nA enterprise-ready [Agent-to-Agent (A2A)](https://github.com/inference-gateway/adk) server that provides AI-powered capabilities through a standardized protocol.\n\n\u003c/div\u003e\n\n## Quick Start\n\nThe generated binary is a CLI. `start` boots the A2A server; `--help` and\n`--version` work as you'd expect.\n\n```bash\n# Run the agent\ngo run . start\n\n# Or build and invoke the CLI directly\ntask build\n./bin/browser-agent start\n\n# Or with Docker\ndocker build -t browser-agent .\ndocker run -p 8080:8080 browser-agent\n```\n\n### CLI\n\n| Command | Description |\n|---------|-------------|\n| `browser-agent start` | Start the A2A server (blocks until SIGINT/SIGTERM) |\n| `browser-agent --help` | Show top-level help (and per-subcommand with `\u003ccmd\u003e --help`) |\n| `browser-agent --version` | Print the embedded version and exit |\n\n## Quick Install\n\nAdd this agent to your Inference Gateway CLI:\n\n```bash\ninfer agents add browser-agent http://localhost:8080 \\\n  --oci ghcr.io/inference-gateway/browser-agent:latest \\\n  --run\n```\n\n## Features\n\n- ✅ A2A protocol compliant\n- ✅ AI-powered capabilities\n- ✅ Streaming support\n- ✅ OpenTelemetry instrumentation\n- ✅ Enterprise-ready\n- ✅ Minimal dependencies\n\n## Endpoints\n\n- `GET /.well-known/agent-card.json` - Agent metadata and capabilities\n- `GET /health` - Health check endpoint\n- `POST /a2a` - A2A protocol endpoint\n\n## Available Tools\n\n| Tool | Description | Parameters |\n|------|-------------|------------|\n| `Read` | Read a file from disk. Returns its contents, optionally sliced by line offset/limit. Use this to load SKILL.md bodies on demand. | file_path, offset, limit |\n| `Write` | Write content to a file, creating intermediate directories as needed. Overwrites the file if it already exists. | file_path, content |\n| `Edit` | Replace a unique string in a file with a new value. Errors if old_string is not found or appears more than once. | file_path, old_string, new_string |\n| `Fetch` | Fetch a URL over HTTP(S). Subject to an allowed-domains whitelist and a max-bytes cap; can optionally save the response body to a file inside the configured download_dir (defaults to /tmp). | url, method, save_path, headers |\n| `navigate_to_url` | Navigate to a specific URL and wait for the page to fully load | timeout, url, wait_until |\n| `click_element` | Click on an element identified by selector, text, or other locator strategies | button, click_count, force, selector, timeout |\n| `fill_form` | Fill form fields with provided data, handling various input types | fields, submit, submit_selector |\n| `extract_data` | Extract data from the page using selectors and return structured information | extractors, format |\n| `take_screenshot` | Capture a screenshot of the current page or specific element | full_page, quality, selector, type |\n| `execute_script` | Execute custom JavaScript inside the current page via Playwright's page.evaluate(). The script runs in the browser context, NOT in Node.js: globals like window, document, navigator, fetch and localStorage are available; Node.js built-ins (require, process, __dirname, __filename, fs, path, os, http, https, child_process, etc.) are NOT available and calls to them will be rejected. Use browser/DOM APIs only. The script body is automatically wrapped in an IIFE, so a top-level `return` is valid. Set async=true if the body uses `await`. | args, return_value, script |\n| `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 |\n| `wait_for_condition` | Wait for specific conditions before proceeding with automation | condition, custom_function, selector, state, timeout |\n\n## Examples\n\n| Example | Description |\n|---------|-------------|\n| [End-to-end webapp testing](examples/end-to-end-webapp-testing/) | Ask the agent to verify a web app flow. It navigates to the page, screenshots the rendered DOM to discover selectors, then drives the flow with navigate_to_url, click_element, fill_form, and wait_for_condition, capturing a screenshot at each checkpoint. |\n| [Structured web scraping](examples/structured-web-scraping/) | Point the agent at one or more (optionally paginated) pages. It uses extract_data to pull fields into structured records, normalizes them, and writes a downloadable JSON or CSV artifact via the write tool. |\n| [Authenticated form automation](examples/authenticated-form-automation/) | Hand the agent a multi-step form behind a login. It chains handle_authentication, fill_form, and click_element, waits for the post-submit state with wait_for_condition, and returns a screenshot of the confirmation page. |\n| [Cited deep research](examples/cited-deep-research/) | Give the agent an open-ended question. It plans sub-questions, drives a search engine, cross-references multiple sources with navigate_to_url and extract_data, and writes a cited Markdown report with the write tool. |\n\n## Skills (loaded into the system prompt)\n\n| Skill | Description | Source |\n|-------|-------------|--------|\n| `webapp-testing` | Use this when the user asks to verify, validate, or test a webapp end-to-end. Performs reconnaissance-then-action: navigate, screenshot the rendered DOM, identify selectors, then exercise the flow using navigate_to_url, click_element, fill_form, wait_for_condition, and take_screenshot. | bare scaffold (`skills/webapp-testing.md`) |\n| `web-scraping` | Use this when the user asks to extract structured data from one or more pages. Drives extract_data across paginated URLs, normalizes results, and writes a JSON/CSV artifact via the write tool. | bare scaffold (`skills/web-scraping.md`) |\n| `form-automation` | Use this when the user asks to complete a multi-step form, optionally behind a login. Orchestrates handle_authentication, navigate_to_url, fill_form, click_element, wait_for_condition, and take_screenshot to capture the post-submit confirmation. | bare scaffold (`skills/form-automation.md`) |\n| `deep-research` | Use this when the user asks an open-ended question that needs synthesis from multiple web sources. Plans sub-questions, drives a search engine, visits and cross-references sources via navigate_to_url + extract_data, and writes a cited markdown report with write. | bare scaffold (`skills/deep-research.md`) |\n\n## Documentation\n- [Getting Started](docs/getting-started.md)\n- [Configuration](docs/configuration.md)\n- [Usage](docs/usage.md)\n- [Playwright Service](docs/playwright-service.md)\n\n## Configuration\n\nThe agent is configured via environment variables. Defaults are derived\nfrom `agent.yaml`; see [CONFIGURATIONS.md](CONFIGURATIONS.md) for the\nfull reference of custom and `A2A_*` variables.\n\n## Development\n\n```bash\n# Generate code from ADL\ntask generate\n\n# Run tests\ntask test\n\n# Build the application\ntask build\n\n# Run linter\ntask lint\n\n# Format code\ntask fmt\n```\n\n### Adding Dependencies\n\nThe generator owns the baseline toolchain pins (SDK, server framework,\nlogging, CLI, sandbox utilities). To extend the project without forking\nthe templates, declare extras in `agent.yaml` - every empty list below\nis rendered by `adl init --defaults` precisely so it's discoverable:\n\n| Where | Purpose | Example entry | Rendered into |\n|-------|---------|---------------|---------------|\n| `spec.language.go.vendor.deps` | Runtime Go modules | `github.com/stretchr/testify@v1.10.0` | `go.mod` `require` block |\n| `spec.language.go.vendor.devdeps` | Executable dev tools (Go 1.24 `tool` directive) | `golang.org/x/tools/cmd/stringer@v0.20.0` | `go.mod` `tool` directive |\n| `spec.development.deps` | Cross-cutting sandbox tools (not tied to one language) | `kubectl@1.31.0`, `terraform@1.9.5`, `deno@2.1.4` | Flox `manifest.toml` / devcontainer feature |\n\nEntries use the `\u003cpackage\u003e@\u003cversion\u003e` form. Built-in pins always win on\nconflict; the generator prints a warning and skips the user entry when\nshadowing is attempted. After editing `agent.yaml`, re-run `task generate`\nto refresh the manifests.\n\n### Debugging\n\nUse the [A2A Debugger](https://github.com/inference-gateway/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.\n\n```bash\ndocker run --rm -it --network host ghcr.io/inference-gateway/a2a-debugger:latest --server-url http://localhost:8080 tasks submit \"What are your skills?\"\n```\n\n```bash\ndocker run --rm -it --network host ghcr.io/inference-gateway/a2a-debugger:latest --server-url http://localhost:8080 tasks list\n```\n\n```bash\ndocker run --rm -it --network host ghcr.io/inference-gateway/a2a-debugger:latest --server-url http://localhost:8080 tasks get \u003ctask ID\u003e\n```\n\n## Deployment\n\n### Docker\n\nThe Docker image can be built with custom version information using build arguments:\n\n```bash\ndocker build \\\n  --build-arg VERSION=1.2.3 \\\n  --build-arg AGENT_NAME=\"My Custom Agent\" \\\n  --build-arg AGENT_DESCRIPTION=\"Custom agent description\" \\\n  -t browser-agent:1.2.3 .\n```\n\n**Available Build Arguments:**\n\n- `VERSION` - Agent version (default: `0.7.0`)\n- `AGENT_NAME` - Agent name (default: `browser-agent`)\n- `AGENT_DESCRIPTION` - Agent description (default: `AI agent for browser automation and web testing using Playwright`)\n\nThese values are embedded into the binary at build time using linker flags, making them accessible at runtime without requiring environment variables.\n\n## License\n\nApache 2.0 License - see LICENSE file for details\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finference-gateway%2Fbrowser-agent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finference-gateway%2Fbrowser-agent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finference-gateway%2Fbrowser-agent/lists"}