← back to all projects
project no. 2

A multi-agent business assistant that loads only the tools it needs.

Live demo · Open source

BizAssist screenshot
~3000 → <1000 tokens of context
  • ~3000 → <1000
    tokens of tool context per request
  • 5
    graph roles: guardrails, chat, planner, executor, summariser
  • SSE
    live tokens, tool activity and plan status

Why I built it

the problem, minus the buzzwords

A 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
  1. Guardrails1

    Validates the request before anything expensive runs.

    #gate

  2. Chat or Planner2

    Conversational questions answer directly; multi-step tasks get a plan.

    #router

  3. Tool discovery3

    Tool metadata lives in a vector DB; only the relevant tools are loaded for this step.

    #qdrant

  4. Executor4

    Runs tools: RAG over user documents, OCR, Google Sheets. Can interrupt to ask a clarifying question.

    #tools

  5. 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. 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. 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. 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. 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.

Screens

proof it exists
BizAssist landing page
BizAssist chat assistant
Document management
Google Sheets integration and model settings
next up (you’ve come this far)
SmartKiranaBot →
Running a kirana store’s inventory, billing and khata from Telegram.