Full-stack room listing and rental consulting app with AI-assisted listing generation and a RAG chatbot.
- Frontend: React + Vite + Tailwind CSS
- Backend web API: Java 21 + Spring Boot
- AI service: Python + FastAPI
- Database: MongoDB
- Vector database: Qdrant
- Media storage: Cloudinary, with legacy GridFS/filesystem migration support
- LLM integration: Gemini for listing generation and optional RAG chat generation
- Deployment: Docker Compose
- Auth: token-based user/admin login
- AI listing generator for Facebook/Zalo room posts.
- Floating AI chatbox for 24/7 room consulting.
- RAG pipeline over public room fields.
- Sensitive internal fields such as real address and internal note are excluded from the AI index.
See:
Create a local .env from .env.example, then run:
docker compose -f docker-compose.dev.yml upOpen:
- Frontend:
http://localhost:5173 - Backend API:
http://localhost:8080 - AI service:
http://localhost:8000/health - Qdrant:
http://localhost:6333/dashboard
After rooms already exist in MongoDB, run the admin-only endpoint once to rebuild the vector index:
POST /api/ai/reindex
Authorization: Bearer <token>New or updated rooms are indexed automatically after save.
docker compose up --buildOpen http://localhost:5173.
The project runs without an LLM key by using local hashing embeddings and a local chat fallback:
EMBEDDING_PROVIDER=local_hash
To use Gemini for chat or embeddings:
GEMINI_API_KEY=your_key
GEMINI_CHAT_MODEL=gemini-2.5-flash
EMBEDDING_PROVIDER=gemini
GEMINI_EMBEDDING_MODEL=text-embedding-004
If you change embedding provider or dimension, recreate the Qdrant collection or reset the Docker qdrant-data volume.
backend/ Spring Boot API, auth, rooms, media, AI proxy endpoints
frontend/ React room manager, AI chatbox
ai-service/ Python FastAPI service for embeddings, Qdrant retrieval, RAG chat
docs/ AI architecture and RAG pipeline notes