Agent Team v0.1 · local-first · MIT
Open-source AI team · one request in, verified artifacts out

An AI team that ships real work — with a conversation you can follow.

Type one request. A Master plans, a Researcher, a Builder and a Reviewer actually do the work, and you get the files plus the real bot-to-bot messages, a timeline, and checks bound to each revision. Nothing is narrated after the fact.

For developers who ship with AI but won't sign off on work they can't audit.
No API key needed with Claude Code · or Claude API / OpenAI-compatible / Ollama · MIT

59-second intro · narrated

Watch the whole flow.

Type a request, watch real messages land in the chat as each bot finishes, click a revision to see who made it and which check it passed, then read the final report built from evidence.

Disclosure: the screen recording drives the real UI and runtime with the scripted test provider (no LLM calls, labelled “FAKE PROVIDER” in the header) so the sequence is deterministic and free. Narration is synthesized speech. 日本語版はこちら. No timing edits in the recording. Raw, un-narrated walkthrough: demo.mp4 · demo.gif. With a real connection the same screens are fed by live model calls; the run header shows the model the provider actually reported and the measured cost.

The screen you'll live in

Real work, readable at full size.

The run view is the product. Not a chat window with avatars: a team column, immutable artifact revisions, and a chat that only shows delivered messages.

Run view: team column, artifact revisions with hashes, delivered messages 1 2 3 4
1Team: each bot's model, connection and prompt hash; tasks with status and attempt count.
2Artifacts: r1, r2… with SHA-256, media type, who published it and from which task.
3Chat: only send_message deliveries, with purpose and reply_to. No acknowledgements.
4Trace: for the selected revision, the publish event, the check it passed or failed, the review, the message that asked for a fix.
How it works

Master proposes. The runtime checks. Bots do real work.

1

One request → a checked plan

The Master turns your request into deliverables, recorded assumptions and a task DAG. The runtime validates schema, cycles, owners, tools, write scopes and limits before anything runs. Reversible choices are recorded as assumptions instead of questions back to you.

2

Independent bots, real delivery

Each bot has its own conversation state, mailbox, task scope, tools and workspace. send_message really delivers to the recipient; a question wakes the other bot to answer. Files become immutable, hashed artifact revisions.

3

Verify, revise, report from evidence

The Reviewer runs checks against a specific revision. Fail → the Builder revises → re-review, up to a limit. The final report is compiled from the event log; the model’s summary can’t upgrade “started” to “done”.

The part you'll remember

Open a deliverable, walk back to why.

Every artifact revision links to the events that produced it: the handoff it was built from, the check it passed or failed, the review verdict, the message that asked for a fix. The chat below is not a transcript written after the fact — each line is a delivered message.

researcherbuilder handoff t1
brief.md r1 is ready. Pricing could not be confirmed — leave it out.
builderresearcher question t2
Who is the target audience?
researcherbuilder answer re: msg_…
Independent developers.
reviewerbuilder finding index.html r1
index.html r1: viewport meta is missing. Please fix and republish.

Then: builder publishes index.html r2 → reviewer runs html_basic on r2 → pass → task accepted. Replay never calls a model. Fork from any checkpoint with a different model for one bot and compare.

Run view: team, artifact revisions, chat
Team · artifact revisions with hashes · real chat
Timeline of events
Timeline: seq, actor, action, outcome
Final report from evidence
Final report compiled from evidence
Per-bot model, connection and prompt settings
Per-bot model, endpoint, locked prompts
Why not just “N bots in a chat room”

Fewer messages, more evidence.

ConcernTypical multi-bot demoAgent Team
ChatBots narrate to each other; the log is the productOnly request / question / answer / handoff / finding / decision. Acknowledgements don't wake a model.
ContextEveryone reads the whole history every turnA worker gets its task, input artifact refs and its own inbox. Full logs stay searchable, not re-sent.
Verification“Tests started” becomes “tests passed” in the summaryChecks are events bound to a revision hash. Reports are compiled from those events.
PermissionsPrompt says “don't”Tool scope, write scope, budget reservation, approvals and cancellation are enforced by the runtime.
Model choiceOne model, one keyPer-bot connection, model, effort and prompt (lockable). Configured vs. provider-reported model both shown. No silent fallbacks.
CostUnknown until the billBudget reserved per call, unknown prices refuse to start, spend shown live.
Quickstart

Five commands. Bring one API key.

git clone https://github.com/FORIFOR/Multibot && cd Multibot
cd backend && uv venv .venv --python 3.12
uv pip install --python .venv/bin/python -e '.[dev]'
cd ../frontend && pnpm install && pnpm build && cd ../backend
export ANTHROPIC_API_KEY=sk-ant-…   # reference only; never written to disk
.venv/bin/agentteam serve            # http://127.0.0.1:8787

First run: open Settings → Probe. It makes one tiny real call to confirm tool calling and JSON-schema output on the model you picked, then unlocks the Start button. Placeholder models and unknown prices refuse to start with a structured reason.

Works with Claude (official SDK), any OpenAI-compatible chat endpoint, and local Ollama. Each bot can override the endpoint and model.

Full README → · What's verified →

Evidence, not a promise

A real run, end to end.

On 2026-09-13 the same request in the demo was run for real through the local Claude Code CLI (no API key). Every number below is read from the run's own event log, which is committed to the repo.

RequestJapanese launch page + 3 social-post drafts from a product description; stop before publishing
Model (reported by provider)claude-opus-5 via claude_cli
PlanMaster chose 1 builder task + 1 reviewer task; skipped the researcher (nothing to research). 8 recorded assumptions incl. “no prices, no invented numbers, placeholder URLs only”.
Deliverablesindex.html r1 (14 KB, single file), posts.md r1, HANDOFF.md r1, final-report.md
Verification10 programmatic checks (html_basic, markdown_basic, text_contains, text_not_contains) → all pass; reviewer verdict 6/6 pass, plus 4 optional findings sent back as a real message
Messages2 delivered: builder → reviewer handoff, reviewer → builder finding
Usage39 model turns · 35 tool calls · $1.66 list-price equivalent · 18 min 37 s wall clock
Statuscompleted

Files: generated index.html · posts.md · final report · 77-event log (JSONL). Earlier runs are there too: run 1 finished partial and exposed a reviewer bug (fixed); runs 2–3 hit limits that were then tuned. Nothing was edited by hand.

Landing page generated by the real run
What the Builder shipped: the top of the generated landing page (unedited).

Also verified

  • 39 deterministic tests: DAG validation, real delivery with Q&A, review → revise → re-review, budget reservation, approvals with hash/nonce, cancel → resume, fork, redaction, SSRF guard, sandbox write confinement, SSE cursor replay, event-schema conformance.
  • Capability probe through the CLI: tool calling via MCP and JSON-schema output, model reported claude-opus-5.
  • macOS seatbelt sandbox: no network, no writes outside the task workspace.

Still open

  • One request, four runs so far; no benchmark. Plans differ between runs (2 vs 3 tasks) because the Master decides. Prompts are original seeds.
  • The Anthropic API and OpenAI-compatible drivers are implemented and unit-tested but have not had a live run yet.
  • No Docker sandbox; the non-macOS backend is not an isolation boundary and says so in every result.