| # Flask API Documentation | |
| ## Overview | |
| The Research AI Assistant API provides a RESTful interface for interacting with an AI-powered research assistant. The API uses local GPU models for inference and supports conversational interactions with context management. | |
| **Base URL (HF Spaces):** `https://jatinautonomouslabs-research-ai-assistant-api.hf.space` | |
| **Alternative Base URL:** `https://huggingface.co/spaces/JatinAutonomousLabs/Research_AI_Assistant_API` | |
| **API Version:** 1.0 | |
| **Content-Type:** `application/json` | |
| > **Note:** For Hugging Face Spaces Docker deployments, use the `.hf.space` domain format. The space name is converted to lowercase with hyphens. | |
| ## Features | |
| - 🤖 **AI-Powered Responses** - Local GPU model inference (Tesla T4) | |
| - 💬 **Conversational Context** - Maintains conversation history and user context | |
| - 🔒 **CORS Enabled** - Ready for web integration | |
| - ⚡ **Async Processing** - Efficient request handling | |
| - 📊 **Transparent Reasoning** - Returns reasoning chains and performance metrics | |
| --- | |
| ## Authentication | |
| Currently, the API does not require authentication. However, for production use, you should: | |
| 1. Set `HF_TOKEN` environment variable for Hugging Face model access | |
| 2. Implement API key authentication if needed | |
| --- | |
| ## Endpoints | |
| ### 1. Get API Information | |
| **Endpoint:** `GET /` | |
| **Description:** Returns API information, version, and available endpoints. | |
| **Request:** | |
| ```http | |
| GET / HTTP/1.1 | |
| Host: huggingface.co | |
| ``` | |
| **Response:** | |
| ```json | |
| { | |
| "name": "AI Assistant Flask API", | |
| "version": "1.0", | |
| "status": "running", | |
| "orchestrator_ready": true, | |
| "features": { | |
| "local_gpu_models": true, | |
| "max_workers": 4, | |
| "hardware": "NVIDIA T4 Medium" | |
| }, | |
| "endpoints": { | |
| "health": "GET /api/health", | |
| "chat": "POST /api/chat", | |
| "initialize": "POST /api/initialize", | |
| "context_mode_get": "GET /api/context/mode", | |
| "context_mode_set": "POST /api/context/mode" | |
| } | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - Success | |
| --- | |
| ### 2. Health Check | |
| **Endpoint:** `GET /api/health` | |
| **Description:** Checks if the API and orchestrator are ready to handle requests. | |
| **Request:** | |
| ```http | |
| GET /api/health HTTP/1.1 | |
| Host: huggingface.co | |
| ``` | |
| **Response:** | |
| ```json | |
| { | |
| "status": "healthy", | |
| "orchestrator_ready": true | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - API is healthy | |
| - `orchestrator_ready: true` - Ready to process requests | |
| - `orchestrator_ready: false` - Still initializing | |
| **Example Response (Initializing):** | |
| ```json | |
| { | |
| "status": "initializing", | |
| "orchestrator_ready": false | |
| } | |
| ``` | |
| --- | |
| ### 3. Chat Endpoint | |
| **Endpoint:** `POST /api/chat` | |
| **Description:** Send a message to the AI assistant and receive a response with reasoning and context. | |
| **Request Headers:** | |
| ```http | |
| Content-Type: application/json | |
| ``` | |
| **Request Body:** | |
| ```json | |
| { | |
| "message": "Explain quantum entanglement in simple terms", | |
| "history": [ | |
| ["User message 1", "Assistant response 1"], | |
| ["User message 2", "Assistant response 2"] | |
| ], | |
| "session_id": "session-123", | |
| "user_id": "user-456" | |
| } | |
| ``` | |
| **Request Fields:** | |
| | Field | Type | Required | Description | | |
| |-------|------|----------|-------------| | |
| | `message` | string | ✅ Yes | User's message/question (max 10,000 characters) | | |
| | `history` | array | ❌ No | Conversation history as array of `[user, assistant]` pairs | | |
| | `session_id` | string | ❌ No | Unique session identifier for context continuity | | |
| | `user_id` | string | ❌ No | User identifier (defaults to "anonymous") | | |
| | `context_mode` | string | ❌ No | Context retrieval mode: `"fresh"` (no user context) or `"relevant"` (only relevant context). Defaults to `"fresh"` if not set. | | |
| **Response (Success):** | |
| ```json | |
| { | |
| "success": true, | |
| "message": "Quantum entanglement is when two particles become linked...", | |
| "history": [ | |
| ["Explain quantum entanglement", "Quantum entanglement is when two particles become linked..."] | |
| ], | |
| "reasoning": { | |
| "intent": "educational_query", | |
| "steps": ["Understanding request", "Gathering information", "Synthesizing response"], | |
| "confidence": 0.95 | |
| }, | |
| "performance": { | |
| "response_time_ms": 2345, | |
| "tokens_generated": 156, | |
| "model_used": "mistralai/Mistral-7B-Instruct-v0.2" | |
| } | |
| } | |
| ``` | |
| **Response Fields:** | |
| | Field | Type | Description | | |
| |-------|------|-------------| | |
| | `success` | boolean | Whether the request was successful | | |
| | `message` | string | AI assistant's response | | |
| | `history` | array | Updated conversation history including the new exchange | | |
| | `reasoning` | object | AI reasoning process and confidence metrics | | |
| | `performance` | object | Performance metrics (response time, tokens, model used) | | |
| **Status Codes:** | |
| - `200 OK` - Request processed successfully | |
| - `400 Bad Request` - Invalid request (missing message, empty message, too long, wrong type) | |
| - `500 Internal Server Error` - Server error processing request | |
| - `503 Service Unavailable` - Orchestrator not ready (still initializing) | |
| **Error Response:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Message is required", | |
| "message": "Error processing your request. Please try again." | |
| } | |
| ``` | |
| **Context Mode Feature:** | |
| The `context_mode` parameter controls how user context is retrieved and used: | |
| - **`"fresh"`** (default): No user context is included. Each conversation starts fresh, ideal for: | |
| - General questions requiring no prior context | |
| - Avoiding context contamination | |
| - Faster responses (no context retrieval overhead) | |
| - **`"relevant"`**: Only relevant user context is included based on relevance classification. The system: | |
| - Analyzes all previous interactions for the session | |
| - Classifies which interactions are relevant to the current query | |
| - Includes only relevant context summaries | |
| - Ideal for: | |
| - Follow-up questions that build on previous conversations | |
| - Maintaining continuity within a research session | |
| - Personalized responses based on user history | |
| **Example with Context Mode:** | |
| ```json | |
| { | |
| "message": "Can you remind me what we discussed about quantum computing?", | |
| "session_id": "session-123", | |
| "user_id": "user-456", | |
| "context_mode": "relevant" | |
| } | |
| ``` | |
| --- | |
| ### 4. Initialize Orchestrator | |
| **Endpoint:** `POST /api/initialize` | |
| **Description:** Manually trigger orchestrator initialization (useful if initialization failed on startup). | |
| **Request:** | |
| ```http | |
| POST /api/initialize HTTP/1.1 | |
| Host: huggingface.co | |
| Content-Type: application/json | |
| ``` | |
| **Request Body:** | |
| ```json | |
| {} | |
| ``` | |
| **Response (Success):** | |
| ```json | |
| { | |
| "success": true, | |
| "message": "Orchestrator initialized successfully" | |
| } | |
| ``` | |
| **Response (Failure):** | |
| ```json | |
| { | |
| "success": false, | |
| "message": "Initialization failed. Check logs for details." | |
| } | |
| ``` | |
| **Status Codes:** | |
| - `200 OK` - Initialization successful | |
| - `500 Internal Server Error` - Initialization failed | |
| --- | |
| ### 5. Get Context Mode | |
| **Endpoint:** `GET /api/context/mode` | |
| **Description:** Retrieve the current context retrieval mode for a session. | |
| **Request:** | |
| ```http | |
| GET /api/context/mode?session_id=session-123 HTTP/1.1 | |
| Host: huggingface.co | |
| ``` | |
| **Query Parameters:** | |
| | Parameter | Type | Required | Description | | |
| |-----------|------|----------|-------------| | |
| | `session_id` | string | ✅ Yes | Session identifier | | |
| **Response (Success):** | |
| ```json | |
| { | |
| "success": true, | |
| "session_id": "session-123", | |
| "context_mode": "fresh", | |
| "description": { | |
| "fresh": "No user context included - starts fresh each time", | |
| "relevant": "Only relevant user context included based on relevance classification" | |
| } | |
| } | |
| ``` | |
| **Response Fields:** | |
| | Field | Type | Description | | |
| |-------|------|-------------| | |
| | `success` | boolean | Whether the request was successful | | |
| | `session_id` | string | Session identifier | | |
| | `context_mode` | string | Current mode: `"fresh"` or `"relevant"` | | |
| | `description` | object | Description of each mode | | |
| **Status Codes:** | |
| - `200 OK` - Success | |
| - `400 Bad Request` - Missing `session_id` parameter | |
| - `500 Internal Server Error` - Server error | |
| - `503 Service Unavailable` - Orchestrator not ready or context mode not available | |
| **Error Response:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "session_id query parameter is required" | |
| } | |
| ``` | |
| --- | |
| ### 6. Set Context Mode | |
| **Endpoint:** `POST /api/context/mode` | |
| **Description:** Set the context retrieval mode for a session (fresh or relevant). | |
| **Request Headers:** | |
| ```http | |
| Content-Type: application/json | |
| ``` | |
| **Request Body:** | |
| ```json | |
| { | |
| "session_id": "session-123", | |
| "mode": "relevant", | |
| "user_id": "user-456" | |
| } | |
| ``` | |
| **Request Fields:** | |
| | Field | Type | Required | Description | | |
| |-------|------|----------|-------------| | |
| | `session_id` | string | ✅ Yes | Session identifier | | |
| | `mode` | string | ✅ Yes | Context mode: `"fresh"` or `"relevant"` | | |
| | `user_id` | string | ❌ No | User identifier (defaults to "anonymous") | | |
| **Response (Success):** | |
| ```json | |
| { | |
| "success": true, | |
| "session_id": "session-123", | |
| "context_mode": "relevant", | |
| "message": "Context mode set successfully" | |
| } | |
| ``` | |
| **Response Fields:** | |
| | Field | Type | Description | | |
| |-------|------|-------------| | |
| | `success` | boolean | Whether the request was successful | | |
| | `session_id` | string | Session identifier | | |
| | `context_mode` | string | The mode that was set | | |
| | `message` | string | Success message | | |
| **Status Codes:** | |
| - `200 OK` - Context mode set successfully | |
| - `400 Bad Request` - Invalid request (missing fields, invalid mode) | |
| - `500 Internal Server Error` - Server error or failed to set mode | |
| - `503 Service Unavailable` - Orchestrator not ready or context mode not available | |
| **Error Response:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "mode must be 'fresh' or 'relevant'" | |
| } | |
| ``` | |
| **Usage Notes:** | |
| - The context mode persists for the session until changed | |
| - Setting `mode` to `"relevant"` enables relevance classification, which analyzes all previous interactions to include only relevant context | |
| - Setting `mode` to `"fresh"` disables context retrieval, providing faster responses without user history | |
| - The mode can also be set per-request via the `context_mode` parameter in `/api/chat` | |
| --- | |
| ## Code Examples | |
| ### Python | |
| ```python | |
| import requests | |
| import json | |
| BASE_URL = "https://jatinautonomouslabs-research-ai-assistant-api.hf.space" | |
| # Check health | |
| def check_health(): | |
| response = requests.get(f"{BASE_URL}/api/health") | |
| return response.json() | |
| # Send chat message | |
| def send_message(message, session_id=None, user_id=None, history=None, context_mode=None): | |
| payload = { | |
| "message": message, | |
| "session_id": session_id, | |
| "user_id": user_id or "anonymous", | |
| "history": history or [] | |
| } | |
| if context_mode: | |
| payload["context_mode"] = context_mode | |
| response = requests.post( | |
| f"{BASE_URL}/api/chat", | |
| json=payload, | |
| headers={"Content-Type": "application/json"} | |
| ) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| raise Exception(f"API Error: {response.status_code} - {response.text}") | |
| # Example usage | |
| if __name__ == "__main__": | |
| # Check if API is ready | |
| health = check_health() | |
| print(f"API Status: {health}") | |
| if health.get("orchestrator_ready"): | |
| # Send a message | |
| result = send_message( | |
| message="What is machine learning?", | |
| session_id="my-session-123", | |
| user_id="user-456" | |
| ) | |
| print(f"Response: {result['message']}") | |
| print(f"Reasoning: {result.get('reasoning', {})}") | |
| # Set context mode to relevant for follow-up | |
| import requests | |
| requests.post( | |
| f"{BASE_URL}/api/context/mode", | |
| json={ | |
| "session_id": "my-session-123", | |
| "mode": "relevant", | |
| "user_id": "user-456" | |
| } | |
| ) | |
| # Continue conversation with relevant context | |
| history = result['history'] | |
| result2 = send_message( | |
| message="Can you explain neural networks?", | |
| session_id="my-session-123", | |
| user_id="user-456", | |
| history=history, | |
| context_mode="relevant" | |
| ) | |
| print(f"Follow-up Response: {result2['message']}") | |
| ``` | |
| ### JavaScript (Fetch API) | |
| ```javascript | |
| const BASE_URL = 'https://jatinautonomouslabs-research-ai-assistant-api.hf.space'; | |
| // Check health | |
| async function checkHealth() { | |
| const response = await fetch(`${BASE_URL}/api/health`); | |
| return await response.json(); | |
| } | |
| // Get context mode for a session | |
| async function getContextMode(sessionId) { | |
| const response = await fetch(`${BASE_URL}/api/context/mode?session_id=${sessionId}`); | |
| if (!response.ok) { | |
| throw new Error(`API Error: ${response.status}`); | |
| } | |
| return await response.json(); | |
| } | |
| // Set context mode for a session | |
| async function setContextMode(sessionId, mode, userId = null) { | |
| const payload = { | |
| session_id: sessionId, | |
| mode: mode | |
| }; | |
| if (userId) { | |
| payload.user_id = userId; | |
| } | |
| const response = await fetch(`${BASE_URL}/api/context/mode`, { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json' | |
| }, | |
| body: JSON.stringify(payload) | |
| }); | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(`API Error: ${response.status} - ${error.error || error.message}`); | |
| } | |
| return await response.json(); | |
| } | |
| // Send chat message | |
| async function sendMessage(message, sessionId = null, userId = null, history = [], contextMode = null) { | |
| const payload = { | |
| message: message, | |
| session_id: sessionId, | |
| user_id: userId || 'anonymous', | |
| history: history | |
| }; | |
| if (contextMode) { | |
| payload.context_mode = contextMode; | |
| } | |
| const response = await fetch(`${BASE_URL}/api/chat`, { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json' | |
| }, | |
| body: JSON.stringify(payload) | |
| }); | |
| if (!response.ok) { | |
| const error = await response.json(); | |
| throw new Error(`API Error: ${response.status} - ${error.error || error.message}`); | |
| } | |
| return await response.json(); | |
| } | |
| // Example usage | |
| async function main() { | |
| try { | |
| // Check if API is ready | |
| const health = await checkHealth(); | |
| console.log('API Status:', health); | |
| if (health.orchestrator_ready) { | |
| // Send a message | |
| const result = await sendMessage( | |
| 'What is machine learning?', | |
| 'my-session-123', | |
| 'user-456' | |
| ); | |
| console.log('Response:', result.message); | |
| console.log('Reasoning:', result.reasoning); | |
| // Continue conversation with relevant context | |
| await setContextMode('my-session-123', 'relevant', 'user-456'); | |
| const result2 = await sendMessage( | |
| 'Can you explain neural networks?', | |
| 'my-session-123', | |
| 'user-456', | |
| result.history, | |
| 'relevant' | |
| ); | |
| console.log('Follow-up Response:', result2.message); | |
| // Check current context mode | |
| const modeInfo = await getContextMode('my-session-123'); | |
| console.log('Current context mode:', modeInfo.context_mode); | |
| } | |
| } catch (error) { | |
| console.error('Error:', error); | |
| } | |
| } | |
| main(); | |
| ``` | |
| ### cURL | |
| ```bash | |
| # Check health | |
| curl -X GET "https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/health" | |
| # Get context mode | |
| curl -X GET "https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/context/mode?session_id=my-session-123" | |
| # Set context mode to relevant | |
| curl -X POST "https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/context/mode" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "session_id": "my-session-123", | |
| "mode": "relevant", | |
| "user_id": "user-456" | |
| }' | |
| # Send chat message | |
| curl -X POST "https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/chat" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "message": "What is machine learning?", | |
| "session_id": "my-session-123", | |
| "user_id": "user-456", | |
| "context_mode": "relevant", | |
| "history": [] | |
| }' | |
| # Continue conversation | |
| curl -X POST "https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/chat" \ | |
| -H "Content-Type: application/json" \ | |
| -d '{ | |
| "message": "Can you explain neural networks?", | |
| "session_id": "my-session-123", | |
| "user_id": "user-456", | |
| "history": [ | |
| ["What is machine learning?", "Machine learning is a subset of artificial intelligence..."] | |
| ] | |
| }' | |
| ``` | |
| ### Node.js (Axios) | |
| ```javascript | |
| const axios = require('axios'); | |
| const BASE_URL = 'https://jatinautonomouslabs-research-ai-assistant-api.hf.space'; | |
| // Check health | |
| async function checkHealth() { | |
| const response = await axios.get(`${BASE_URL}/api/health`); | |
| return response.data; | |
| } | |
| // Get context mode | |
| async function getContextMode(sessionId) { | |
| const response = await axios.get(`${BASE_URL}/api/context/mode`, { | |
| params: { session_id: sessionId } | |
| }); | |
| return response.data; | |
| } | |
| // Set context mode | |
| async function setContextMode(sessionId, mode, userId = null) { | |
| const payload = { | |
| session_id: sessionId, | |
| mode: mode | |
| }; | |
| if (userId) payload.user_id = userId; | |
| const response = await axios.post(`${BASE_URL}/api/context/mode`, payload); | |
| return response.data; | |
| } | |
| // Send chat message | |
| async function sendMessage(message, sessionId = null, userId = null, history = [], contextMode = null) { | |
| try { | |
| const payload = { | |
| message: message, | |
| session_id: sessionId, | |
| user_id: userId || 'anonymous', | |
| history: history | |
| }; | |
| if (contextMode) payload.context_mode = contextMode; | |
| const response = await axios.post(`${BASE_URL}/api/chat`, payload, { | |
| headers: { | |
| 'Content-Type': 'application/json' | |
| } | |
| }); | |
| return response.data; | |
| } catch (error) { | |
| if (error.response) { | |
| throw new Error(`API Error: ${error.response.status} - ${error.response.data.error || error.response.data.message}`); | |
| } | |
| throw error; | |
| } | |
| } | |
| // Example usage | |
| (async () => { | |
| try { | |
| const health = await checkHealth(); | |
| console.log('API Status:', health); | |
| if (health.orchestrator_ready) { | |
| // Set context mode to relevant | |
| await setContextMode('my-session-123', 'relevant', 'user-456'); | |
| const result = await sendMessage( | |
| 'What is machine learning?', | |
| 'my-session-123', | |
| 'user-456', | |
| [], | |
| 'relevant' | |
| ); | |
| console.log('Response:', result.message); | |
| // Check current mode | |
| const modeInfo = await getContextMode('my-session-123'); | |
| console.log('Context mode:', modeInfo.context_mode); | |
| } | |
| } catch (error) { | |
| console.error('Error:', error.message); | |
| } | |
| })(); | |
| ``` | |
| --- | |
| ## Error Handling | |
| ### Common Error Responses | |
| #### 400 Bad Request | |
| **Missing Message:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Message is required" | |
| } | |
| ``` | |
| **Empty Message:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Message cannot be empty" | |
| } | |
| ``` | |
| **Message Too Long:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Message too long. Maximum length is 10000 characters" | |
| } | |
| ``` | |
| **Invalid Type:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Message must be a string" | |
| } | |
| ``` | |
| #### 503 Service Unavailable | |
| **Orchestrator Not Ready:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Orchestrator not ready", | |
| "message": "AI system is initializing. Please try again in a moment." | |
| } | |
| ``` | |
| **Solution:** Wait a few seconds and retry, or check the `/api/health` endpoint. | |
| #### 500 Internal Server Error | |
| **Generic Error:** | |
| ```json | |
| { | |
| "success": false, | |
| "error": "Error message here", | |
| "message": "Error processing your request. Please try again." | |
| } | |
| ``` | |
| --- | |
| ## Best Practices | |
| ### 1. Session Management | |
| - **Use consistent session IDs** for maintaining conversation context | |
| - **Generate unique session IDs** per user conversation thread | |
| - **Include conversation history** in subsequent requests for better context | |
| ```python | |
| # Good: Maintains context | |
| session_id = "user-123-session-1" | |
| history = [] | |
| # First message | |
| result1 = send_message("What is AI?", session_id=session_id, history=history) | |
| history = result1['history'] | |
| # Follow-up message (includes context) | |
| result2 = send_message("Can you explain more?", session_id=session_id, history=history) | |
| ``` | |
| ### 2. Error Handling | |
| Always implement retry logic for 503 errors: | |
| ```python | |
| import time | |
| def send_message_with_retry(message, max_retries=3, retry_delay=2): | |
| for attempt in range(max_retries): | |
| try: | |
| result = send_message(message) | |
| return result | |
| except Exception as e: | |
| if "503" in str(e) and attempt < max_retries - 1: | |
| time.sleep(retry_delay) | |
| continue | |
| raise | |
| ``` | |
| ### 3. Health Checks | |
| Check API health before sending requests: | |
| ```python | |
| def is_api_ready(): | |
| try: | |
| health = check_health() | |
| return health.get("orchestrator_ready", False) | |
| except: | |
| return False | |
| if is_api_ready(): | |
| # Send request | |
| result = send_message("Hello") | |
| else: | |
| print("API is not ready yet") | |
| ``` | |
| ### 4. Rate Limiting | |
| - **No explicit rate limits** are currently enforced | |
| - **Recommended:** Implement client-side rate limiting (e.g., 1 request per second) | |
| - **Consider:** Implementing request queuing for high-volume applications | |
| ### 5. Message Length | |
| - **Maximum:** 10,000 characters per message | |
| - **Recommended:** Keep messages concise for faster processing | |
| - **For long content:** Split into multiple messages or summarize | |
| ### 6. Context Management | |
| - **Include history** in requests to maintain conversation context | |
| - **Session IDs** help track conversations across multiple requests | |
| - **User IDs** enable personalization and user-specific context | |
| --- | |
| ## Integration Examples | |
| ### React Component | |
| ```jsx | |
| import React, { useState, useEffect } from 'react'; | |
| const AIAssistant = () => { | |
| const [message, setMessage] = useState(''); | |
| const [history, setHistory] = useState([]); | |
| const [loading, setLoading] = useState(false); | |
| const [sessionId] = useState(`session-${Date.now()}`); | |
| const sendMessage = async () => { | |
| if (!message.trim()) return; | |
| setLoading(true); | |
| try { | |
| const response = await fetch('https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/chat', { | |
| method: 'POST', | |
| headers: { 'Content-Type': 'application/json' }, | |
| body: JSON.stringify({ | |
| message: message, | |
| session_id: sessionId, | |
| user_id: 'user-123', | |
| history: history | |
| }) | |
| }); | |
| const data = await response.json(); | |
| if (data.success) { | |
| setHistory(data.history); | |
| setMessage(''); | |
| } | |
| } catch (error) { | |
| console.error('Error:', error); | |
| } finally { | |
| setLoading(false); | |
| } | |
| }; | |
| return ( | |
| <div> | |
| <div className="chat-history"> | |
| {history.map(([user, assistant], idx) => ( | |
| <div key={idx}> | |
| <div><strong>You:</strong> {user}</div> | |
| <div><strong>Assistant:</strong> {assistant}</div> | |
| </div> | |
| ))} | |
| </div> | |
| <input | |
| value={message} | |
| onChange={(e) => setMessage(e.target.value)} | |
| onKeyPress={(e) => e.key === 'Enter' && sendMessage()} | |
| disabled={loading} | |
| /> | |
| <button onClick={sendMessage} disabled={loading}> | |
| {loading ? 'Sending...' : 'Send'} | |
| </button> | |
| </div> | |
| ); | |
| }; | |
| ``` | |
| ### Python CLI Tool | |
| ```python | |
| #!/usr/bin/env python3 | |
| import requests | |
| import sys | |
| BASE_URL = "https://jatinautonomouslabs-research-ai-assistant-api.hf.space" | |
| class ChatCLI: | |
| def __init__(self): | |
| self.session_id = f"cli-session-{hash(__file__)}" | |
| self.history = [] | |
| def chat(self, message): | |
| response = requests.post( | |
| f"{BASE_URL}/api/chat", | |
| json={ | |
| "message": message, | |
| "session_id": self.session_id, | |
| "user_id": "cli-user", | |
| "history": self.history | |
| } | |
| ) | |
| if response.status_code == 200: | |
| data = response.json() | |
| self.history = data['history'] | |
| return data['message'] | |
| else: | |
| return f"Error: {response.status_code} - {response.text}" | |
| def run(self): | |
| print("AI Assistant CLI (Type 'exit' to quit)") | |
| print("=" * 50) | |
| while True: | |
| user_input = input("\nYou: ").strip() | |
| if user_input.lower() in ['exit', 'quit']: | |
| break | |
| print("Assistant: ", end="", flush=True) | |
| response = self.chat(user_input) | |
| print(response) | |
| if __name__ == "__main__": | |
| cli = ChatCLI() | |
| cli.run() | |
| ``` | |
| --- | |
| ## Response Times | |
| - **Typical Response:** 2-10 seconds | |
| - **First Request:** May take longer due to model loading (10-30 seconds) | |
| - **Subsequent Requests:** Faster due to cached models (2-5 seconds) | |
| **Factors Affecting Response Time:** | |
| - Message length | |
| - Model loading (first request) | |
| - GPU availability | |
| - Concurrent requests | |
| --- | |
| ## Troubleshooting | |
| ### Common Issues | |
| #### 404 Not Found | |
| **Problem:** Getting 404 when accessing the API | |
| **Solutions:** | |
| 1. **Verify the Space is running:** | |
| - Check the Hugging Face Space page to ensure it's built and running | |
| - Wait for the initial build to complete (5-10 minutes) | |
| 2. **Check URL format:** | |
| - ✅ Correct: `https://jatinautonomouslabs-research-ai-assistant-api.hf.space` | |
| - ❌ Wrong: `https://jatinautonomouslabs-research_ai_assistant_api.hf.space` (underscores) | |
| - ✅ Alternative: `https://huggingface.co/spaces/JatinAutonomousLabs/Research_AI_Assistant_API` | |
| 3. **Verify endpoint paths:** | |
| - Health: `GET /api/health` | |
| - Chat: `POST /api/chat` | |
| - Root: `GET /` | |
| 4. **Test with root endpoint first:** | |
| ```bash | |
| curl https://jatinautonomouslabs-research-ai-assistant-api.hf.space/ | |
| ``` | |
| #### 503 Service Unavailable | |
| **Problem:** Orchestrator not ready | |
| **Solutions:** | |
| 1. Wait 30-60 seconds for initialization | |
| 2. Check `/api/health` endpoint | |
| 3. Use `/api/initialize` to manually trigger initialization | |
| #### CORS Errors | |
| **Problem:** CORS errors in browser | |
| **Solutions:** | |
| - The API has CORS enabled for all origins | |
| - If issues persist, check browser console for specific errors | |
| - Ensure you're using the correct base URL | |
| ### Testing API Connectivity | |
| **Quick Health Check:** | |
| ```bash | |
| # Test root endpoint | |
| curl https://jatinautonomouslabs-research-ai-assistant-api.hf.space/ | |
| # Test health endpoint | |
| curl https://jatinautonomouslabs-research-ai-assistant-api.hf.space/api/health | |
| ``` | |
| **Python Test Script:** | |
| ```python | |
| import requests | |
| BASE_URL = "https://jatinautonomouslabs-research-ai-assistant-api.hf.space" | |
| # Test root | |
| try: | |
| response = requests.get(f"{BASE_URL}/", timeout=10) | |
| print(f"Root endpoint: {response.status_code} - {response.json()}") | |
| except Exception as e: | |
| print(f"Root endpoint failed: {e}") | |
| # Test health | |
| try: | |
| response = requests.get(f"{BASE_URL}/api/health", timeout=10) | |
| print(f"Health endpoint: {response.status_code} - {response.json()}") | |
| except Exception as e: | |
| print(f"Health endpoint failed: {e}") | |
| ``` | |
| ## Support | |
| For issues, questions, or contributions: | |
| - **Repository:** [GitHub Repository URL] | |
| - **Hugging Face Space:** [https://huggingface.co/spaces/JatinAutonomousLabs/Research_AI_Assistant_API](https://huggingface.co/spaces/JatinAutonomousLabs/Research_AI_Assistant_API) | |
| --- | |
| ## Changelog | |
| ### Version 1.0 (Current) | |
| - Initial API release | |
| - Chat endpoint with context management | |
| - Health check endpoint | |
| - Local GPU model inference | |
| - CORS enabled for web integration | |
| --- | |
| ## License | |
| This API is provided as-is. Please refer to the main project README for license information. | |