Domify-Academy-Bot / BACKEND_README.md
Domify's picture
Upload 35 files
93c19dc verified
# Domify Academy Super Bot - Backend Documentation
## Overview
The backend is built with **Node.js + Express + tRPC** and integrates with **NVIDIA APIs** for LLM and image generation. It provides a robust, scalable foundation for the Grok-inspired AI chatbot.
---
## Architecture
```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Frontend (React) β”‚
β”‚ (Ask | Imagine mode switcher) β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚ tRPC API calls
β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Backend (Node.js + Express) β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ tRPC Routers β”‚ β”‚
β”‚ β”‚ β”œβ”€ chat.send β”‚ β”‚
β”‚ β”‚ β”œβ”€ imagine.generate β”‚ β”‚
β”‚ β”‚ └─ search.online β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ LLM Engine β”‚ β”‚
β”‚ β”‚ β”œβ”€ Llama-3 70B (primary) β”‚ β”‚
β”‚ β”‚ β”œβ”€ Fallback models β”‚ β”‚
β”‚ β”‚ └─ Reasoning generation β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Image Generation β”‚ β”‚
β”‚ β”‚ β”œβ”€ SDXL β”‚ β”‚
β”‚ β”‚ β”œβ”€ Flux β”‚ β”‚
β”‚ β”‚ └─ Video conversion β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚ β”‚
β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚ β”‚ Middleware β”‚ β”‚
β”‚ β”‚ β”œβ”€ Rate limiting β”‚ β”‚
β”‚ β”‚ β”œβ”€ Request logging β”‚ β”‚
β”‚ β”‚ β”œβ”€ Caching β”‚ β”‚
β”‚ β”‚ └─ Error handling β”‚ β”‚
β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
β”‚
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β–Ό β–Ό β–Ό
MySQL NVIDIA API DuckDuckGo
(DB) (LLM/IMG) (Search)
```
---
## Key Features
### 1. LLM Integration with Smart Fallback
**Primary Model**: Llama-3 70B
**Fallback Chain**: Llama-2 70B β†’ Mistral Large β†’ Llama-3 8B
```typescript
// Automatic fallback if primary model is busy
const response = await generateResponseWithReasoning(
userPrompt,
searchResults,
enableThinking
);
```
### 2. DeepSeek-Style Reasoning
Generate internal thought process before final answer:
```typescript
// With reasoning enabled
const { reasoning, response } = await generateResponseWithReasoning(
"What is quantum computing?",
undefined,
true // enableThinking
);
```
### 3. Rate Limiting
Token bucket algorithm prevents API abuse:
- **30 requests/minute** per user
- **5 burst requests** allowed
- **Automatic cleanup** of old buckets
```typescript
const { allowed, remainingTokens } = checkRateLimit(userId, "chat");
if (!allowed) {
// Rate limit exceeded
}
```
### 4. Search Integration
DuckDuckGo search for "Search Online" mode:
```typescript
const results = await searchOnline("latest AI news", 5);
const formatted = formatSearchResults(results);
```
### 5. Database Management
Conversation history, messages, images, and feedback stored in MySQL:
```typescript
// Save a message
await saveMessage(conversationId, "assistant", content, reasoning);
// Get conversation history
const messages = await getConversationMessages(conversationId);
```
### 6. Google Sheets Integration
Log feedback for analytics:
```typescript
await logFeedbackToSheets({
userId,
rating: "like",
comment: "Great response!",
timestamp: new Date().toISOString()
});
```
---
## API Endpoints (tRPC Procedures)
### Chat Procedures
#### `chat.send` (Protected)
Send a message and get a response.
**Input:**
```typescript
{
prompt: string; // User message
enableSearch: boolean; // Enable web search
enableThinking: boolean; // Enable reasoning
history: Array<{ // Conversation history
role: "user" | "assistant";
content: string;
}>;
}
```
**Output:**
```typescript
{
success: boolean;
response: string; // LLM response
reasoning: string; // Internal thoughts
model: string; // Model used
tokensUsed: number; // Token count
}
```
### Image Generation Procedures
#### `imagine.generate` (Protected)
Generate an image from a prompt.
**Input:**
```typescript
{
prompt: string; // Image description
}
```
**Output:**
```typescript
{
success: boolean;
imageUrl: string; // Generated image URL
prompt: string;
}
```
### Search Procedures
#### `search.online` (Public)
Search the web using DuckDuckGo.
**Input:**
```typescript
{
query: string; // Search query
maxResults: number; // Max results (default: 5)
}
```
**Output:**
```typescript
{
success: boolean;
results: Array<{
title: string;
url: string;
snippet: string;
}>;
}
```
---
## Database Schema
### Users Table
```sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
openId VARCHAR(64) UNIQUE NOT NULL,
email VARCHAR(320),
name TEXT,
tier VARCHAR(50) DEFAULT 'free',
role ENUM('user', 'admin') DEFAULT 'user',
ipAddress VARCHAR(45),
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
### Conversations Table
```sql
CREATE TABLE conversations (
id INT PRIMARY KEY AUTO_INCREMENT,
userId INT NOT NULL,
title TEXT,
mode ENUM('ask', 'imagine') DEFAULT 'ask',
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
```
### Messages Table
```sql
CREATE TABLE messages (
id INT PRIMARY KEY AUTO_INCREMENT,
conversationId INT NOT NULL,
role ENUM('user', 'assistant') NOT NULL,
content LONGTEXT NOT NULL,
reasoning TEXT,
metadata JSON,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
### Images Table
```sql
CREATE TABLE images (
id INT PRIMARY KEY AUTO_INCREMENT,
userId INT NOT NULL,
conversationId INT,
prompt TEXT NOT NULL,
url TEXT NOT NULL,
metadata JSON,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
### Feedback Table
```sql
CREATE TABLE feedback (
id INT PRIMARY KEY AUTO_INCREMENT,
userId INT NOT NULL,
messageId INT,
imageId INT,
rating ENUM('like', 'dislike') NOT NULL,
comment TEXT,
createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
---
## File Structure
```
server/
β”œβ”€β”€ llm.ts # LLM engine with NVIDIA integration
β”œβ”€β”€ search.ts # DuckDuckGo search integration
β”œβ”€β”€ rateLimit.ts # Rate limiting middleware
β”œβ”€β”€ db.ts # Database helper functions
β”œβ”€β”€ googleSheets.ts # Google Sheets logging
β”œβ”€β”€ middleware.ts # Industrial-standard middleware
β”œβ”€β”€ routers.ts # tRPC procedure definitions
└── _core/
β”œβ”€β”€ index.ts # Server entry point
β”œβ”€β”€ context.ts # tRPC context
β”œβ”€β”€ trpc.ts # tRPC setup
β”œβ”€β”€ llm.ts # Built-in LLM helper
β”œβ”€β”€ imageGeneration.ts # Built-in image generation
└── env.ts # Environment variables
```
---
## Environment Variables
### Required
| Variable | Description |
|----------|-------------|
| `DATABASE_URL` | MySQL connection string |
| `NVIDIA_API_KEY` | NVIDIA API key |
| `JWT_SECRET` | Session token secret |
### Optional
| Variable | Description | Default |
|----------|-------------|---------|
| `GOOGLE_SHEETS_API_KEY` | Google Sheets API key | (disabled) |
| `GOOGLE_SHEETS_ID` | Google Sheet ID | (disabled) |
| `RATE_LIMIT_REQUESTS` | Requests per minute | 30 |
| `RATE_LIMIT_WINDOW` | Rate limit window (seconds) | 3600 |
---
## Industrial-Standard Features
### 1. Caching
In-memory cache for frequently accessed data:
```typescript
cacheManager.set("key", data, 300); // 5 minute TTL
const cached = cacheManager.get("key");
```
### 2. Performance Monitoring
Track operation durations:
```typescript
performanceMonitor.record("llm_call", 1234); // ms
const stats = performanceMonitor.getStats("llm_call");
```
### 3. Request Logging
Automatic request/response logging with performance metrics.
### 4. Error Handling
Comprehensive error handling with proper HTTP status codes.
### 5. Health Checks
Endpoint for monitoring application health:
```
GET /api/health
```
Response:
```json
{
"status": "healthy",
"uptime": 3600,
"database": "connected",
"cache": "active",
"memoryUsage": 256
}
```
### 6. Security Headers
Automatic security headers on all responses:
- `X-Content-Type-Options: nosniff`
- `X-Frame-Options: DENY`
- `X-XSS-Protection: 1; mode=block`
- `Strict-Transport-Security: max-age=31536000`
---
## Development
### Local Setup
```bash
# Install dependencies
pnpm install
# Set up environment variables
cp .env.example .env
# Edit .env with your values
# Run database migrations
pnpm run db:push
# Start development server
pnpm run dev
```
### Testing
```bash
# Run tests
pnpm run test
# Watch mode
pnpm run test:watch
```
### Type Checking
```bash
# Check TypeScript
pnpm run check
```
---
## Deployment
See `DEPLOYMENT.md` for complete deployment instructions.
### Quick Deploy to Hugging Face
```bash
# 1. Create a new Space on Hugging Face
# 2. Push code to the Space repository
git push origin main
# 3. Set environment variables in Space settings
# 4. Hugging Face automatically builds and deploys
```
---
## Monitoring
### Logs
Check application logs in Hugging Face Space:
```
Logs tab β†’ Filter by date/time β†’ Search for errors
```
### Metrics
Monitor key metrics:
- **Response time**: Average LLM response time
- **Error rate**: Percentage of failed requests
- **Cache hit rate**: Percentage of cached responses
- **Database performance**: Query execution time
### Alerts
Set up alerts for:
- High error rate (>5%)
- Slow responses (>5s)
- Database connection failures
- Memory usage >80%
---
## Troubleshooting
### Issue: "Rate limit exceeded"
**Cause**: User has exceeded request limit
**Solution**:
1. Wait for rate limit window to reset
2. Upgrade user tier for higher limits
3. Adjust `RATE_LIMIT_REQUESTS` if needed
### Issue: "NVIDIA API error"
**Cause**: Invalid API key or quota exceeded
**Solution**:
1. Verify `NVIDIA_API_KEY` is correct
2. Check NVIDIA API dashboard for quota
3. Wait for quota reset or upgrade plan
### Issue: "Database connection failed"
**Cause**: Invalid connection string or network issue
**Solution**:
1. Verify `DATABASE_URL` format
2. Check database is running and accessible
3. Verify firewall rules allow connection
### Issue: "Out of memory"
**Cause**: Memory leak or insufficient resources
**Solution**:
1. Restart the application
2. Review recent code changes
3. Upgrade Space compute resources
---
## Best Practices
1. **Always use rate limiting** to prevent abuse
2. **Cache frequently accessed data** to improve performance
3. **Log all errors** for debugging and monitoring
4. **Use environment variables** for configuration
5. **Validate user input** before processing
6. **Handle errors gracefully** with proper HTTP status codes
7. **Monitor performance** and optimize bottlenecks
8. **Keep dependencies updated** for security
---
## Support
For issues or questions:
1. Check logs in Hugging Face Space
2. Review `DEPLOYMENT.md` for deployment issues
3. Check `ARCHITECTURE.md` for design details
4. Contact NVIDIA support for API issues
---
## License
MIT License - See LICENSE file for details