A multilingual AI-powered chatbot for administrative support services. Built with TypeScript for type safety and enterprise-grade architecture.
- RAG Architecture - Retrieval Augmented Generation for accurate responses
- AI-Powered Responses - Google Gemini AI integration
- Vector Database - Qdrant for semantic search of FAQs
- Semantic Search - Find relevant FAQs by meaning, not just keywords
- Multilingual Support - English & German with easy language switching
- TypeScript - Full type safety across frontend and backend
- Modal Chat Interface - Bottom-right floating chat window
- Typing Effect - Natural conversation flow
- Auto-scroll - Latest messages always visible
- Responsive Design - Works on all screen sizes
- Fallback Mechanism - Rule-based responses when AI is unavailable
- About AVA & Services
- Document Management & Requirements
- Appointment Scheduling
- Process & Timelines
- Pricing & Payment
- Data Protection & Security (GDPR Compliant)
- Contact & Support
- React 19 + Vite
- TypeScript
- Tailwind CSS v4
- Axios
- Lucide React (Icons)
- Node.js + Express
- TypeScript
- Google Gemini AI (gemini-3-flash-preview)
- Google Gemini Embeddings (gemini-embedding-001)
- Qdrant Vector Database
- CORS enabled
- Retry logic for API reliability
faq-chatbot/
├── server/
│ ├── data/
│ │ └── avaFaqData.ts # Multilingual FAQ knowledge base
│ ├── routes/
│ │ └── chat.ts # Chat endpoint handler
│ ├── services/
│ │ └── vectorService.ts # Vector database operations
│ ├── utils/
│ │ └── helpers.ts # Helper functions (FAQ matching, context building)
│ ├── server.ts # Express server setup
│ ├── test-vector.ts # Vector database test script
│ ├── tsconfig.json # TypeScript configuration
│ ├── .env # API keys
│ ├── .env.example # Environment template
│ └── package.json
├── client/
│ ├── public/
│ │ └── favicon.svg # Chat icon favicon
│ ├── src/
│ │ ├── components/
│ │ │ ├── Home/
│ │ │ │ ├── Home.tsx
│ │ │ │ └── index.js
│ │ │ └── ChatModal/
│ │ │ ├── ChatModal.tsx
│ │ │ ├── ChatHeader.tsx
│ │ │ ├── LanguageSelector.tsx
│ │ │ ├── MessageList.tsx
│ │ │ ├── ChatInput.tsx
│ │ │ └── index.js
│ │ ├── App.tsx # Main app with state management
│ │ ├── main.tsx
│ │ └── index.css
│ ├── tsconfig.json # TypeScript configuration
│ ├── tsconfig.node.json # TypeScript Node config
│ └── package.json
└── README.md
- Node.js (v18+)
- Docker & Docker Compose
- Google Gemini API Key
docker-compose up -d qdrantQdrant runs on http://localhost:6333
cd server
npm install
# Create .env file
echo "GEMINI_API_KEY=your_api_key_here" > .env
echo "QDRANT_URL=http://localhost:6333" >> .env
npm run devServer runs on http://localhost:6001
cd client
npm install
npm run devFrontend runs on http://localhost:5173
- Open
http://localhost:5173in your browser - Click the floating chat button (bottom-right) or "Launch Assistant"
- Select your preferred language (English/German)
- Start chatting with AVA!
POST /api/chat
{
"message": "What documents do I need?",
"language": "en"
}Response:
{
"message": "Required documents usually include...",
"timestamp": "2026-02-07T20:00:00.000Z"
}The chatbot uses RAG architecture to provide accurate, context-aware responses:
- Retrieval - Searches vector database for relevant FAQs using semantic similarity
- Augmentation - Builds context with top 3 most relevant FAQs
- Generation - AI generates response based on retrieved context
This ensures responses are grounded in your actual FAQ data, not just AI's general knowledge.
Uses Qdrant to store FAQ embeddings and perform semantic similarity search. Finds relevant FAQs by meaning, not just keyword matching.
When Gemini AI is unavailable (quota exceeded, network error), the system automatically falls back to rule-based keyword matching using the FAQ database, ensuring users always get answers.
Users can switch between English and German anytime by clicking the language indicator in the chat header.
Bot responses appear character-by-character for a natural conversation feel.
Chat automatically scrolls to show the latest message. Scroll up to view conversation history.
API calls automatically retry up to 3 times if the service is overloaded.
GEMINI_API_KEY=your_google_gemini_api_key
PORT=6001
QDRANT_URL=http://localhost:6333See GEMINI_SETUP.md for API key setup instructions.
-
Copy the key
-
Paste it in
server/.env:GEMINI_API_KEY=your_actual_key_here -
Restart the server
- More languages (French, Spanish, Italian)
- Voice input/output
- File upload for documents
- Appointment booking integration
- Admin dashboard for FAQ management
- Analytics & conversation insights
- Export chat history