Synthesis: An Autonomous Multi-Agent Research Engine
An Autonomous Multi-Agent Research Engine
Ask a question and watch a team of AI agents plan, search, read, cross-check and verify a cited report, live, in an "agent control room." Sub-questions fan out to parallel researchers, a critic flags weak claims, and the report is assembled with inline citations and confidence labels.

- Year
- Apr 2026
- Timeline
- 10 weeks
- Type
- AI
- Status
- Live
4 agent roles
Planner, parallel researchers, synthesizer and critic. The same pipeline also runs fully offline with no API keys, because every dependency has a mock behind the same interface.
Overview
Synthesis applies one rule to language models: don't trust output you can't trace. The product is a live view of the agent graph. A planner breaks your question into sub-questions, a pool of researchers works on each one in parallel (search, fetch, chunk, embed, retrieve), a synthesizer writes a cited report, and a critic checks every claim against its sources. All of it streams to a control room over SSE.
The hard parts
- 01
Multiple researchers run at once, but SSE is a single ordered stream. Merging parallel agents into one timeline without races took the most time.
- 02
A model will write "[3]" after any sentence, so citations had to be verified against the cited text.
- 03
Knowing when all the concurrent producers had finished. Detecting completion under load is harder than it looks.
- 04
Making the offline mode run the same orchestration as the online one, with only the providers swapped.
The approach
Agents never touch React. They emit typed RunEvents onto a many-producer, single-consumer event bus, and the SSE route drains it, so the UI shows only what the graph did. Citation checking is a separate step: the critic re-reads each claim against the passages it cites, labels confidence (supported, single-source or disputed), and can trigger a bounded revise loop. Every capability (LLM, search, embeddings, vector store) is an interface with a real and a mock implementation, selected by environment at the boundary, so the agents only see the interface. An MCP server also exposes the research tools.
Outcome
Give it a question and the lanes fill in real time: tool calls landing, sources registering, a report being written with inline citations, a per-claim confidence ledger and an interactive evidence graph. At the end you get a shareable /run/<id> URL and a token and USD cost meter. Dangling citations are caught and shown, so the confidence labels come from verification and not from the model's own assessment.
What I'd do differently
SSE is one-way, so "stop" is a client-side AbortController and not a server signal. WebSockets would allow real mid-run control. The in-memory vector store works for demos, but pgvector is needed for anything that survives a restart, and the bounded revise loop trades cost against quality without guaranteeing either.
Stack
Like what you see?
Let's build the next one.
Hiring, or have a problem that needs this kind of engineering? I read every message myself.

