|
| 1 | +--- |
| 2 | +layout: default |
| 3 | +title: Foragent |
| 4 | +description: An A2A-native browser agent for .NET |
| 5 | +--- |
| 6 | + |
| 7 | +# Foragent |
| 8 | + |
| 9 | +**An A2A-native browser agent for .NET.** Other agents delegate browser |
| 10 | +work to Foragent rather than reasoning about DOM selectors, login flows, |
| 11 | +or session management themselves. |
| 12 | + |
| 13 | +Foragent is built on the [RockBot framework](https://github.com/MarimerLLC/rockbot) |
| 14 | +and uses [Microsoft.Playwright](https://playwright.dev/dotnet/) for browser |
| 15 | +automation. It speaks the |
| 16 | +[Agent2Agent (A2A) protocol](https://google.github.io/A2A/) over RabbitMQ |
| 17 | +and HTTP. |
| 18 | + |
| 19 | +> ⚠️ **Early development.** APIs change without notice. External |
| 20 | +> contributions are not yet open — see [Contributing](#contributing) below. |
| 21 | +
|
| 22 | +--- |
| 23 | + |
| 24 | +## Why Foragent exists |
| 25 | + |
| 26 | +Agents that need to "just use a website" — read a page, fill a form, |
| 27 | +post an update — usually end up re-inventing a brittle mix of HTTP |
| 28 | +scraping, selector heuristics, and credential handling. Foragent |
| 29 | +centralizes that work behind a small A2A surface so the rest of your |
| 30 | +agent fleet can stay focused on their own jobs. |
| 31 | + |
| 32 | +The design principles are laid out in the |
| 33 | +[specification]({{ '/foragent-specification' | relative_url }}): |
| 34 | + |
| 35 | +- **Task-level capabilities, not action-level.** Callers ask for |
| 36 | + *"post this update to bsky"*, not *"click the button with aria-label X"*. |
| 37 | +- **One shared browser, one fresh context per task.** Isolation comes |
| 38 | + from the context boundary, not from spinning up new browsers. |
| 39 | +- **Credentials stay inside the process.** Callers reference them by |
| 40 | + id; Foragent resolves them locally and never returns their values. |
| 41 | +- **Multi-tenant from day one.** Tenant identity comes from the A2A |
| 42 | + caller, not from request payloads. |
| 43 | +- **Learning substrate.** Successful tasks write reusable skills that |
| 44 | + prime future planning; a daily dream loop consolidates them. |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## Usage scenarios |
| 49 | + |
| 50 | +Foragent is aimed at other agents, not end users. Typical callers: |
| 51 | + |
| 52 | +- **Social posting.** A personal assistant agent asks Foragent to |
| 53 | + publish an update to a site it has credentials for. |
| 54 | +- **Site monitoring.** A research or ops agent asks Foragent to check |
| 55 | + a page and report back structured results. |
| 56 | +- **Form submission at scale.** A workflow agent hands Foragent a |
| 57 | + learned form schema plus a batch of rows; Foragent submits each one |
| 58 | + and streams per-row progress. |
| 59 | +- **One-off browser tasks.** A generalist agent describes an intent |
| 60 | + in natural language; Foragent's planner drives the browser |
| 61 | + step-by-step under a strict host allowlist. |
| 62 | + |
| 63 | +The current advertised capabilities are: |
| 64 | + |
| 65 | +| Capability | What it does | |
| 66 | +|---|---| |
| 67 | +| `browser-task` | LLM-planned, multi-step browser work against an allowlist of hosts | |
| 68 | +| `learn-form-schema` | Scan a form and persist a typed schema for later reuse | |
| 69 | +| `execute-form-batch` | Submit a batch of rows against a learned (or inline) form schema | |
| 70 | + |
| 71 | +See [capabilities]({{ '/capabilities' | relative_url }}) for the full |
| 72 | +contract, inputs, and examples. |
| 73 | + |
| 74 | +--- |
| 75 | + |
| 76 | +## Getting started |
| 77 | + |
| 78 | +The fastest path is the end-to-end dev harness at the repo root: |
| 79 | + |
| 80 | +```bash |
| 81 | +git clone https://github.com/MarimerLLC/foragent.git |
| 82 | +cd foragent |
| 83 | +docker compose up --build |
| 84 | +``` |
| 85 | + |
| 86 | +That brings up RabbitMQ, Foragent (HTTP A2A on `http://localhost:5210`), |
| 87 | +and a RockBot agent seeded to know about Foragent as an A2A peer. The |
| 88 | +agent-card is published at |
| 89 | +`http://localhost:5210/.well-known/agent-card.json`; the authenticated |
| 90 | +JSON-RPC endpoint is `POST http://localhost:5210/` with header |
| 91 | +`X-Api-Key: rockbot-calls-foragent`. A curl-based smoke test is at the |
| 92 | +top of `docker-compose.yml`. |
| 93 | + |
| 94 | +For local builds without Docker: |
| 95 | + |
| 96 | +```bash |
| 97 | +dotnet restore |
| 98 | +dotnet build --configuration Release |
| 99 | +dotnet test --configuration Release |
| 100 | +``` |
| 101 | + |
| 102 | +Target framework is **.NET 10**. Foragent requires an LLM — configure |
| 103 | +`ForagentLlm:Endpoint`, `ModelId`, and `ApiKey` (see |
| 104 | +[architecture]({{ '/architecture' | relative_url }}) for the full |
| 105 | +configuration surface). |
| 106 | + |
| 107 | +--- |
| 108 | + |
| 109 | +## Resources |
| 110 | + |
| 111 | +**In this repo:** |
| 112 | + |
| 113 | +- [Specification]({{ '/foragent-specification' | relative_url }}) — the |
| 114 | + governing design document (v0.2) |
| 115 | +- [Architecture]({{ '/architecture' | relative_url }}) — how the pieces |
| 116 | + fit together |
| 117 | +- [Capabilities]({{ '/capabilities' | relative_url }}) — what Foragent |
| 118 | + exposes over A2A |
| 119 | +- [Credentials]({{ '/credentials' | relative_url }}) — how credentials |
| 120 | + are modeled and resolved |
| 121 | +- [Framework feedback]({{ '/framework-feedback' | relative_url }}) — |
| 122 | + observations pushed back to the RockBot framework |
| 123 | + |
| 124 | +**On GitHub:** |
| 125 | + |
| 126 | +- [Source on GitHub](https://github.com/MarimerLLC/foragent) |
| 127 | +- [Issues](https://github.com/MarimerLLC/foragent/issues) — bug reports |
| 128 | + and feature suggestions are welcome |
| 129 | +- [RockBot framework](https://github.com/MarimerLLC/rockbot) — the |
| 130 | + agent framework Foragent is built on |
| 131 | + |
| 132 | +--- |
| 133 | + |
| 134 | +## Contributing |
| 135 | + |
| 136 | +Foragent is in early development and is **not yet accepting external |
| 137 | +code contributions** — see |
| 138 | +[CONTRIBUTING.md](https://github.com/MarimerLLC/foragent/blob/main/CONTRIBUTING.md). |
| 139 | + |
| 140 | +In the meantime, the most useful things outside contributors can do are: |
| 141 | + |
| 142 | +- Open an [issue](https://github.com/MarimerLLC/foragent/issues) to |
| 143 | + report a bug or suggest a capability |
| 144 | +- Read the [specification]({{ '/foragent-specification' | relative_url }}) |
| 145 | + and push back on anything that looks wrong |
| 146 | + |
| 147 | +--- |
| 148 | + |
| 149 | +## License |
| 150 | + |
| 151 | +MIT — see [LICENSE](https://github.com/MarimerLLC/foragent/blob/main/LICENSE). |
0 commit comments