| # Express.js Integration Guide | |
| ## Quick Setup for Express Applications | |
| ### 1. Environment Variables | |
| Add to your `.env` file or environment secrets: | |
| ```bash | |
| # Hugging Face Spaces URL (use hyphens, not underscores) | |
| HF_SPACE_URL=https://jatinautonomouslabs-research-ai-assistant-api.hf.space | |
| # Alternative if hyphens don't work | |
| # HF_SPACE_URL=https://jatinautonomouslabs-research_ai_assistant_api.hf.space | |
| ``` | |
| ### 2. Express Code Example | |
| ```javascript | |
| const express = require('express'); | |
| const axios = require('axios'); | |
| const app = express(); | |
| app.use(express.json()); | |
| // Get HF Space URL from environment | |
| const HF_SPACE_URL = process.env.HF_SPACE_URL || | |
| 'https://jatinautonomouslabs-research-ai-assistant-api.hf.space'; | |
| // Health check function | |
| async function checkHFHealth() { | |
| try { | |
| const response = await axios.get(`${HF_SPACE_URL}/api/health`, { | |
| timeout: 5000 | |
| }); | |
| return { | |
| healthy: true, | |
| status: response.data.status, | |
| orchestratorReady: response.data.orchestrator_ready | |
| }; | |
| } catch (error) { | |
| console.error('HF Space health check failed:', error.message); | |
| return { | |
| healthy: false, | |
| error: error.message | |
| }; | |
| } | |
| } | |
| // Initialize HF Space connection | |
| async function initializeHFConnection() { | |
| console.log('[Init] Using HuggingFace Spaces for AI backend...'); | |
| console.log('[Init] Checking Flask API connection...'); | |
| console.log(`[HFSpaces] Flask API: ${HF_SPACE_URL}`); | |
| const health = await checkHFHealth(); | |
| if (health.healthy && health.orchestratorReady) { | |
| console.log('[Init] ✅ Flask API healthy and ready'); | |
| return true; | |
| } else { | |
| console.log('[Init] ✗ Flask API unhealthy:', health.error || 'Orchestrator not ready'); | |
| console.log('[Init] Make sure your HF Space is running'); | |
| console.log(`[Init] URL: ${HF_SPACE_URL}`); | |
| return false; | |
| } | |
| } | |
| // Chat endpoint that proxies to HF Space | |
| app.post('/api/chat', async (req, res) => { | |
| try { | |
| const { message, session_id, user_id, history } = req.body; | |
| // Validate input | |
| if (!message || typeof message !== 'string' || message.trim().length === 0) { | |
| return res.status(400).json({ | |
| success: false, | |
| error: 'Message is required and must be a non-empty string' | |
| }); | |
| } | |
| // Filter out CSS/HTML content (basic check) | |
| if (message.includes('{') && message.includes('}') && message.includes('color:')) { | |
| console.warn('[Chat] Detected potential CSS/HTML content, filtering...'); | |
| return res.status(400).json({ | |
| success: false, | |
| error: 'Please send text messages only, not code or CSS' | |
| }); | |
| } | |
| // Call HF Space API | |
| const response = await axios.post( | |
| `${HF_SPACE_URL}/api/chat`, | |
| { | |
| message: message.trim(), | |
| session_id: session_id, | |
| user_id: user_id || 'anonymous', | |
| history: history || [] | |
| }, | |
| { | |
| timeout: 30000, // 30 second timeout | |
| headers: { | |
| 'Content-Type': 'application/json' | |
| } | |
| } | |
| ); | |
| res.json(response.data); | |
| } catch (error) { | |
| console.error('[Chat] Error:', error.message); | |
| if (error.response) { | |
| // HF Space returned an error | |
| res.status(error.response.status).json({ | |
| success: false, | |
| error: error.response.data.error || error.response.data.message || 'HF Space API error', | |
| details: error.response.data | |
| }); | |
| } else if (error.code === 'ECONNREFUSED' || error.code === 'ETIMEDOUT') { | |
| // Connection error | |
| res.status(503).json({ | |
| success: false, | |
| error: 'HF Space is not reachable. Please check if the space is running.', | |
| url: HF_SPACE_URL | |
| }); | |
| } else { | |
| // Other errors | |
| res.status(500).json({ | |
| success: false, | |
| error: 'Internal server error', | |
| message: error.message | |
| }); | |
| } | |
| } | |
| }); | |
| // Start server | |
| const PORT = process.env.PORT || 5000; | |
| async function startServer() { | |
| // Check HF Space connection on startup | |
| const hfReady = await initializeHFConnection(); | |
| if (!hfReady) { | |
| console.warn('[Init] ⚠ HF Space not reachable'); | |
| console.warn('[Init] Check HF_SPACE_URL in Secrets'); | |
| console.warn('[Init] Make sure your HF Space is running'); | |
| } | |
| app.listen(PORT, () => { | |
| console.log(`[express] serving on port ${PORT}`); | |
| }); | |
| } | |
| startServer(); | |
| ``` | |
| ### 3. Testing the Connection | |
| ```javascript | |
| // Test script | |
| const axios = require('axios'); | |
| async function testConnection() { | |
| const HF_SPACE_URL = process.env.HF_SPACE_URL || | |
| 'https://jatinautonomouslabs-research-ai-assistant-api.hf.space'; | |
| console.log('Testing HF Space connection...'); | |
| console.log(`URL: ${HF_SPACE_URL}`); | |
| // Test 1: Root endpoint | |
| try { | |
| const root = await axios.get(`${HF_SPACE_URL}/`, { timeout: 5000 }); | |
| console.log('✅ Root endpoint:', root.status, root.data); | |
| } catch (e) { | |
| console.log('❌ Root endpoint failed:', e.message); | |
| } | |
| // Test 2: Health endpoint | |
| try { | |
| const health = await axios.get(`${HF_SPACE_URL}/api/health`, { timeout: 5000 }); | |
| console.log('✅ Health endpoint:', health.status, health.data); | |
| } catch (e) { | |
| console.log('❌ Health endpoint failed:', e.message); | |
| } | |
| // Test 3: Chat endpoint | |
| try { | |
| const chat = await axios.post( | |
| `${HF_SPACE_URL}/api/chat`, | |
| { message: 'Hello, test message' }, | |
| { timeout: 10000 } | |
| ); | |
| console.log('✅ Chat endpoint:', chat.status, chat.data.message); | |
| } catch (e) { | |
| console.log('❌ Chat endpoint failed:', e.message); | |
| } | |
| } | |
| testConnection(); | |
| ``` | |
| ### 4. Common Issues and Solutions | |
| #### Issue: 404 Not Found | |
| **Causes:** | |
| - Space is still building (wait 5-15 minutes) | |
| - Wrong URL format (use hyphens, not underscores) | |
| - Space is not public | |
| **Solutions:** | |
| 1. Check Space status: https://huggingface.co/spaces/JatinAutonomousLabs/Research_AI_Assistant_API | |
| 2. Verify URL format: Use `-` (hyphens) not `_` (underscores) | |
| 3. Test both URL formats: | |
| ```bash | |
| # With hyphens (recommended) | |
| curl https://jatinautonomouslabs-research-ai-assistant-api.hf.space/ | |
| # With underscores (if hyphens don't work) | |
| curl https://jatinautonomouslabs-research_ai_assistant_api.hf.space/ | |
| ``` | |
| #### Issue: 503 Service Unavailable | |
| **Cause:** Space is running but API is initializing | |
| **Solution:** Wait 30-60 seconds and retry | |
| #### Issue: CSS/HTML Content in Messages | |
| **Solution:** Add input validation in your Express app: | |
| ```javascript | |
| function isValidMessage(message) { | |
| // Check for CSS patterns | |
| if (message.includes('{') && message.includes('}') && | |
| (message.includes('color:') || message.includes('background:'))) { | |
| return false; | |
| } | |
| // Check for HTML tags | |
| if (/<[^>]+>/.test(message)) { | |
| return false; | |
| } | |
| return true; | |
| } | |
| // Use in your endpoint | |
| if (!isValidMessage(message)) { | |
| return res.status(400).json({ | |
| success: false, | |
| error: 'Please send text messages only, not code or markup' | |
| }); | |
| } | |
| ``` | |
| ### 5. Environment Variables Checklist | |
| Make sure these are set in your Express app's environment: | |
| ```bash | |
| # Required | |
| HF_SPACE_URL=https://jatinautonomouslabs-research-ai-assistant-api.hf.space | |
| # Optional | |
| PORT=5000 | |
| NODE_ENV=production | |
| ``` | |
| ### 6. Monitoring and Logging | |
| Add logging to track HF Space connectivity: | |
| ```javascript | |
| // Periodic health check | |
| setInterval(async () => { | |
| const health = await checkHFHealth(); | |
| if (!health.healthy) { | |
| console.warn('[Monitor] HF Space is down:', health.error); | |
| } | |
| }, 60000); // Check every minute | |
| ``` | |
| --- | |
| ## Quick Reference | |
| **Correct URL Format:** | |
| ``` | |
| https://jatinautonomouslabs-research-ai-assistant-api.hf.space | |
| ``` | |
| **Endpoints:** | |
| - `GET /` - API information | |
| - `GET /api/health` - Health check | |
| - `POST /api/chat` - Chat endpoint | |
| **Test Command:** | |
| ```bash | |
| curl https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/health | |
| ``` | |