// the find
paulpierre/RasaGPT
💬 RasaGPT is the first headless LLM chatbot platform built on top of Rasa and Langchain. Built w/ Rasa, FastAPI, Langchain, LlamaIndex, SQLModel, pgvector, ngrok, telegram
RasaGPT wires together Rasa, LangChain/LlamaIndex, pgvector, FastAPI, and Telegram into a working RAG chatbot with multi-tenancy scaffolding. It's primarily a reference implementation showing how to glue these pieces together, not a production-ready platform. Aimed at developers who want a running starting point rather than assembling all the plumbing themselves.
- The Docker Compose setup genuinely solves real pain points: Rasa on Apple Silicon, ngrok tunnel automation for Telegram webhooks, and correct service startup ordering via wait-for-it.sh.
- Custom pgvector implementation instead of blindly using Langchain's opinionated PGVector class gives you actual schema control, which matters as soon as you have multi-tenant requirements.
- The multi-tenancy data model (Organization → Project → Document → Node) is a reasonable starting schema that most chatbot platforms skip entirely.
- Author is honest about quality: the README explicitly calls it 'far from production code, rife with prompt injection vulnerabilities' and the TODO list is candid about what's missing.
- Pinned to Python 3.9 and uses LlamaIndex's deprecated GPTSimpleVectorIndex—the LlamaIndex API has changed substantially since this was written, so you'll hit import errors immediately without manual dependency archaeology.
- Zero tests (acknowledged in TODO), and the LLM retrieval quality is self-described as 'hit or miss' with fixed 1000-character chunking and basic euclidean distance—this will need significant work before it's useful on real data.
- Requires ngrok for any external access, meaning you're hard-blocked in environments where ngrok is unavailable or prohibited, and the ngrok free tier URL changes on restart, which breaks the Telegram webhook until the rasa-credentials service catches up.
- The index is persisted as a flat index.json file rather than properly in pgvector, making the pgvector integration feel incomplete—you get the vector store plumbing but the actual retrieval path bypasses it.