DEV Community

Cover image for ResearchMind — AI Research Pipeline with Cross-Session Memory | Backboard Challenges 2026
Batila Amulya
Batila Amulya

Posted on

ResearchMind — AI Research Pipeline with Cross-Session Memory | Backboard Challenges 2026

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
Enter fullscreen mode Exit fullscreen mode

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 memoryclient.add_memory() stores conclusions after every session
  • Cross-thread memory recallmemory="Auto" on add_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
Enter fullscreen mode Exit fullscreen mode

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"]
Enter fullscreen mode Exit fullscreen mode

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"},
)
Enter fullscreen mode Exit fullscreen mode

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.py after 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

python #ai #hackathon #buildinpublic #streamlit #llm #multiagent

Top comments (0)