I Built a Multi-Agent AI Research Pipeline in 2 Days — Here's Every Error I Hit
I just submitted ResearchMind to the Backboard Challenges Hackathon. This is the honest build log — what I built, how it works, and the 11 errors that almost stopped me.
What Is ResearchMind?
Type a research topic. Three AI agents collaborate and produce a polished academic research brief with real APA citations. Download it as a PDF. Come back next week — it remembers everything you've researched.
Live: https://researchmind-production-04c7.up.railway.app
GitHub: https://github.com/Amulya631/ResearchMind
The Architecture
Input Topic
│
▼
┌─────────────────────────────────────┐
│ Stage 1 — Planner (Gemini Flash) │
│ Reads memory → generates subtasks │
└──────────────────┬──────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Stage 2 — Summarizer (Gemini Flash)│
│ 5–8 APA-cited facts per subtask │
└──────────────────┬──────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Stage 3 — Synthesizer (Claude Haiku│
│ Polished brief + References section│
└──────────────────┬──────────────────┘
│
▼
Saved to Backboard Cross-Session Memory
Backboard Features Used
- Multi-assistant architecture — 3 permanent assistants with distinct system prompts
- Multi-model routing — Gemini 2.5 Flash for speed, Claude Haiku for synthesis quality
-
Persistent memory —
client.add_memory()stores conclusions after every session -
Cross-thread memory recall —
memory="Auto"onadd_message()triggers automatic recall
The Tech Stack
Backboard SDK v1.5.13
Streamlit 1.32
Google Gemini 2.5 Flash
Anthropic Claude Haiku
fpdf2 (PDF generation)
Railway (deployment)
Python 3.12
11 Errors I Hit (And Fixed)
The hackathon guide was written for an older SDK version. Here's every error I encountered:
Error 1 — streamlit: command not recognized
Windows PATH issue. Fix: python -m streamlit run app.py
Error 2 — 'dict' object has no attribute 'role'
SDK v1.5.13 returns messages as dicts, not objects.
# Wrong
m.role, m.content
# Right
m["role"], m["content"]
Error 3 — Documents still being indexed
asyncio.sleep(3) was too short. Fixed with a polling loop.
Error 4 — BackboardServerError on every Synthesizer call
6 stuck documents from test runs overloading the RAG system. delete_assistant_document() doesn't exist in v1.5.13. Solution: deleted and recreated the assistant, then switched to inline content passing instead of document upload.
Error 5 — NameError: tmp_path not defined
Orphaned os.unlink(tmp_path) left after removing the upload block.
Error 6 — Invisible input text
CSS specificity conflict with Streamlit's internal theme. Fixed with !important and solid background colors.
Error 7 — SyntaxError: unterminated string literal
Apostrophe in you've inside a single-quoted Python string.
Error 8 — assistants.py --update crash
force_update=True was applied to the Planner even though its prompt hadn't changed.
Error 9 — FPDFUnicodeEncodingException
Em dash — outside Helvetica's Latin-1 range. Fixed with a clean() function that maps Unicode to ASCII equivalents.
Error 10 — FPDFException: Not enough horizontal space
20mm margins were too wide on Railway's environment. Reduced to 10mm, added dynamic line coordinates, and a safe_write() helper that catches individual line errors.
Error 11 — Topic chip wrapping to two lines
Double-width emoji ⚛️ (U+269B + U+FE0F variation selector) consuming full column width. Replaced with single-width ⚛ and restructured to a 3+2 chip layout.
The Feature That Makes It Different
The cross-session memory is what separates this from a standard chatbot.
await client.add_memory(
assistant_id=planner_id,
content=(
f"Completed research on: '{query}'.\n"
f"Subtasks covered: {', '.join(subtasks)}.\n"
f"Key conclusions: {brief[:600]}"
),
metadata={"topic": query, "type": "research_session"},
)
Next session, memory="Auto" on add_message() automatically retrieves this — and the Planner's system prompt tells it to skip already-covered subtasks. Knowledge compounds over time instead of starting from zero every run.
What I'd Do Differently
- Skip document upload entirely from day one inline content passing is more reliable
- Run
python -m py_compile app.pyafter every change on Windows - Test on the deployment environment early PDF rendering behaved differently on Railway vs local
Try It
🚀 Live: https://researchmind-production-04c7.up.railway.app
💻 GitHub: https://github.com/Amulya631/ResearchMind
Feedback is welcome! especially if you're also building on Backboard.
Built by Batila Amulya—GCP Cloud Engineer & Gen AI enthusiast
Top comments (0)