A multi-agent business assistant that loads only the tools it needs.
Live demo · Open source

- ~3000 → <1000tokens of tool context per request
- 5graph roles: guardrails, chat, planner, executor, summariser
- SSElive tokens, tool activity and plan status
Why I built it
the problem, minus the buzzwordsA business assistant needs a lot of tools: document search, invoice parsing, spreadsheet reads and writes, analysis. Sending every tool schema with every request bloats the prompt, costs more and makes the model pick the wrong tool more often.
At the same time, simple questions shouldn’t go through a heavy planning loop, and long tasks shouldn’t leave the user staring at a spinner.
How it works
a langgraph state machine with routing- Guardrails1
Validates the request before anything expensive runs.
#gate
- Chat or Planner2
Conversational questions answer directly; multi-step tasks get a plan.
#router
- Tool discovery3
Tool metadata lives in a vector DB; only the relevant tools are loaded for this step.
#qdrant
- Executor4
Runs tools: RAG over user documents, OCR, Google Sheets. Can interrupt to ask a clarifying question.
#tools
- Summariser5
Condenses results; every stage streams progress to the UI over SSE.
#output
- +Document RAG in Qdrant is filtered per user, so no one retrieves someone else’s files.
- +Ingestion handles PDFs, text, invoices, contracts and image-based documents via multimodal OCR.
Built with React, FastAPI, LangGraph, Qdrant, MongoDB, Zustand, SSE.
Decisions I made
and why. mostly why.1.Retrieve tools like documents
Instead of hard-coding which tools each agent sees, tool descriptions are embedded and searched at runtime. Adding a new tool means indexing it, not editing prompts, and context dropped from ~3000 to under 1000 tokens.
2.Two paths: chat and plan
Routing simple questions straight to a chat node keeps them fast and cheap. Only real multi-step work pays for planner + executor.
3.Interrupts over guessing
When a request is ambiguous (which sheet? which month?), the graph pauses with a LangGraph interrupt and asks, instead of hallucinating an answer.
4.Stream everything
Long workflows stream tokens, tool calls and planner status over SSE into a Zustand store, so the user sees what the agent is doing while it works.


