| # Research AI Assistant - API Documentation | |
| **Version:** 1.0.0 | |
| **Base URL:** `https://huggingface.co/spaces/JatinAutonomousLabs/Research_AI_Assistant` | |
| **API Type:** Gradio Client API | |
| **Last Updated:** December 2024 | |
| --- | |
| ## Table of Contents | |
| 1. [Overview](#overview) | |
| 2. [Getting Started](#getting-started) | |
| 3. [Authentication](#authentication) | |
| 4. [API Endpoints](#api-endpoints) | |
| 5. [Error Handling](#error-handling) | |
| 6. [Code Examples](#code-examples) | |
| 7. [Integration Guide](#integration-guide) | |
| 8. [Testing](#testing) | |
| 9. [Rate Limits & Best Practices](#rate-limits--best-practices) | |
| 10. [Support & Troubleshooting](#support--troubleshooting) | |
| --- | |
| ## Overview | |
| The Research AI Assistant provides a RESTful-like API interface through Gradio's client library. All endpoints are accessible via the `gradio_client` Python package or HTTP requests. | |
| ### Key Features | |
| - **Chat Interface**: Interactive conversation with AI assistant | |
| - **Session Management**: Create and manage conversation sessions | |
| - **Context Control**: Toggle between fresh and relevant context modes | |
| - **Preferences**: Save and manage user preferences | |
| - **Settings Control**: Toggle UI settings panel | |
| ### Response Format | |
| All endpoints return data in standardized formats: | |
| - **Chat endpoints**: Return tuples matching Gradio component outputs | |
| - **Other endpoints**: Return strings or dictionaries | |
| - **Errors**: Return standardized error messages with metadata | |
| --- | |
| ## Getting Started | |
| ### Installation | |
| ```bash | |
| pip install gradio_client | |
| ``` | |
| ### Basic Setup | |
| ```python | |
| from gradio_client import Client | |
| # Initialize client | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| # Or for private spaces (requires HF token) | |
| client = Client( | |
| "JatinAutonomousLabs/Research_AI_Assistant", | |
| hf_token="your_hf_token_here" | |
| ) | |
| ``` | |
| --- | |
| ## Authentication | |
| ### Public Space Access | |
| Public spaces require no authentication: | |
| ```python | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| ``` | |
| ### Private Space Access | |
| For private spaces, pass your Hugging Face token: | |
| ```python | |
| client = Client( | |
| "JatinAutonomousLabs/Research_AI_Assistant", | |
| hf_token=os.getenv("HF_TOKEN") | |
| ) | |
| ``` | |
| ### Token Management | |
| 1. Get token from: https://huggingface.co/settings/tokens | |
| 2. Store securely (environment variables recommended) | |
| 3. Never commit tokens to version control | |
| --- | |
| ## User Management | |
| ### Base User | |
| - `Admin_J` is the base/default API user | |
| - Used when no `user_id` is provided or invalid format is provided | |
| ### Dynamic User Creation | |
| The API supports dynamic user creation - any valid format `user_id` is automatically accepted and created in the database. | |
| **Valid Format:** | |
| - Alphanumeric characters + underscore only | |
| - Length: 1-50 characters | |
| - Pattern: `^[a-zA-Z0-9_]{1,50}$` | |
| - Examples: `User123`, `External_API`, `MyUser_2024`, `API_Client_01` | |
| **Auto-Creation:** | |
| - New users are automatically inserted into the `user_contexts` database table on first use | |
| - No manual user registration required | |
| - User information is maintained by the backend database | |
| **Validation:** | |
| - Valid formats are accepted and auto-created | |
| - Invalid formats default to `Admin_J` | |
| - Database automatically maintains user information | |
| ### UI Restriction | |
| - The HuggingFace Spaces UI is restricted to `ADMINONLY` user only | |
| - Dynamic user creation is available **only via API calls** | |
| - UI users cannot use dynamic user IDs | |
| --- | |
| ## API Endpoints | |
| ### 1. Chat Handler - `/safe_gpu_chat_handler` | |
| Process user messages and get AI responses. | |
| #### Endpoint Details | |
| - **API Name:** `/safe_gpu_chat_handler` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Main chat interface that processes user messages and returns AI responses with metadata | |
| #### Request Parameters | |
| | Parameter | Type | Required | Default | Description | | |
| |-----------|------|----------|---------|-------------| | |
| | `message` | `str` | Yes | - | User message (max 10,000 characters) | | |
| | `history` | `list[dict]` | No | `[]` | Chat history in Gradio format | | |
| | `user_id` | `str` | No | `"Admin_J"` | User identifier. Base user is `Admin_J`. Any valid format user_id (alphanumeric + underscore, 1-50 chars) is accepted and automatically created in the database. | | |
| | `session_text` | `str` | No | `"Session: ... \| User: ... \| Interactions: 0"` | Session information string | | |
| #### Response Structure | |
| Returns a tuple of **7 elements**: | |
| ```python | |
| ( | |
| chatbot_history, # list[dict] - Updated chat history | |
| message_input, # str - Empty string (cleared after send) | |
| reasoning_data, # dict - Chain of thought and reasoning | |
| performance_data, # dict - Agent trace, token count, timing | |
| context_data, # dict - Session context, interaction ID | |
| session_info, # str - Updated session information | |
| skills_html # str - HTML for identified skills display | |
| ) | |
| ``` | |
| #### Response Format Details | |
| **1. `chatbot_history` (list[dict])** | |
| ```python | |
| [ | |
| { | |
| "role": "user", | |
| "content": "What is machine learning?" | |
| }, | |
| { | |
| "role": "assistant", | |
| "content": "Machine learning is a subset of artificial intelligence..." | |
| } | |
| ] | |
| ``` | |
| **2. `reasoning_data` (dict)** | |
| ```python | |
| { | |
| "chain_of_thought": { | |
| "step_1": { | |
| "hypothesis": "User intent classification", | |
| "evidence": ["Keywords detected", "Context analyzed"], | |
| "confidence": 0.85, | |
| "reasoning": "Intent identified as information_request" | |
| } | |
| }, | |
| "confidence_calibration": { | |
| "overall_confidence": 0.85, | |
| "calibration_method": "temperature_scaling" | |
| } | |
| } | |
| ``` | |
| **3. `performance_data` (dict)** | |
| ```python | |
| { | |
| "agent_trace": [ | |
| {"agent": "intent_recognition", "duration": 0.234, "status": "success"}, | |
| {"agent": "response_synthesis", "duration": 1.456, "status": "success"} | |
| ], | |
| "token_count": 1250, | |
| "processing_time": 2.34, | |
| "confidence_score": 0.85, | |
| "agents_used": ["intent_recognition", "response_synthesis"] | |
| } | |
| ``` | |
| **4. `context_data` (dict)** | |
| ```python | |
| { | |
| "interaction_id": "uuid-string", | |
| "session_id": "abc12345", | |
| "timestamp": "2024-12-28T10:30:00", | |
| "warnings": [], | |
| "context_mode": "relevant" | |
| } | |
| ``` | |
| **5. `session_info` (str)** | |
| ```python | |
| "Session: abc12345 | User: Admin_J | Interactions: 5" | |
| ``` | |
| **6. `skills_html` (str)** | |
| ```html | |
| "<div class='skills-header'>🎯 Relevant Skills:</div> | |
| <span class='skill-tag high-confidence'>Machine Learning</span> | |
| <span class='skill-tag medium-confidence'>Python</span>" | |
| ``` | |
| #### Code Example | |
| ```python | |
| from gradio_client import Client | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| # Make chat request (using base Admin_J user) | |
| result = client.predict( | |
| message="Explain quantum computing in simple terms", | |
| history=[], | |
| user_id="Admin_J", | |
| session_text="Session: abc12345 | User: Admin_J | Interactions: 0", | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| # Make chat request (using dynamic user - auto-created) | |
| result = client.predict( | |
| message="What is machine learning?", | |
| history=[], | |
| user_id="MyNewUser_123", # New user - automatically created in DB | |
| session_text="Session: abc12345 | User: MyNewUser_123 | Interactions: 0", | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| # Unpack results | |
| chatbot_history, message_input, reasoning, performance, context, session_info, skills = result | |
| # Access response | |
| latest_message = chatbot_history[-1]["content"] | |
| print(f"Assistant: {latest_message}") | |
| # Access metadata | |
| processing_time = performance.get("processing_time", 0) | |
| print(f"Response time: {processing_time:.2f}s") | |
| ``` | |
| #### Validation Rules | |
| - **Message**: Must be non-empty string, max 10,000 characters | |
| - **User ID**: | |
| - Base user: `Admin_J` (default) | |
| - Dynamic users: Any alphanumeric + underscore format (1-50 characters) | |
| - New users are automatically created in the database on first use | |
| - Invalid formats default to `Admin_J` | |
| - Format validation: `^[a-zA-Z0-9_]{1,50}$` | |
| - **History**: Must be list (empty list if None) | |
| - **Session Text**: Format: `"Session: <8-char-id> | User: <user_id> | Interactions: <count>"` | |
| #### Error Responses | |
| If validation fails or processing errors occur: | |
| ```python | |
| { | |
| "error": "Message cannot be empty" # or other error message | |
| } | |
| ``` | |
| Error responses maintain the same tuple structure with error information in metadata fields. | |
| --- | |
| ### 2. New Session - `/new_session` | |
| Create a new conversation session. | |
| #### Endpoint Details | |
| - **API Name:** `/new_session` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Creates a new session ID and initializes it in the database | |
| #### Request Parameters | |
| | Parameter | Type | Required | Default | Description | | |
| |-----------|------|----------|---------|-------------| | |
| | `user_id` | `str` | No | `"Admin_J"` | User identifier. Base user is `Admin_J`. Any valid format user_id is accepted and automatically created in the database. | | |
| #### Response | |
| Returns a single string: | |
| ```python | |
| "Session: abc12345 | User: Admin_J | Interactions: 0" | |
| ``` | |
| #### Code Example | |
| ```python | |
| result = client.predict( | |
| user_id="Admin_J", | |
| api_name="/new_session" | |
| ) | |
| session_info = result | |
| print(session_info) # "Session: xyz67890 | User: Admin_J | Interactions: 0" | |
| ``` | |
| #### Behavior | |
| - Generates new 8-character hexadecimal session ID | |
| - Validates and normalizes user_id (defaults to `Admin_J` if invalid) | |
| - Auto-creates new users in database on first use | |
| - Initializes session in database via context_manager | |
| - Returns formatted session info string | |
| - Continues execution even if database initialization fails | |
| --- | |
| ### 3. Update Session Info - `/update_session_info` | |
| Update session metadata (typically called when user changes). | |
| #### Endpoint Details | |
| - **API Name:** `/update_session_info` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Updates session information, typically when user_id changes | |
| #### Request Parameters | |
| | Parameter | Type | Required | Default | Description | | |
| |-----------|------|----------|---------|-------------| | |
| | `user_id` | `str` | No | `"Admin_J"` | New user identifier. Base user is `Admin_J`. Any valid format user_id is accepted and automatically created in the database. | | |
| | `session_text` | `str` | No | `"Session: ... \| User: ... \| Interactions: 0"` | Current session text | | |
| #### Response | |
| Returns updated session info string: | |
| ```python | |
| "Session: abc12345 | User: Admin_J | Interactions: 5" | |
| ``` | |
| #### Code Example | |
| ```python | |
| result = client.predict( | |
| user_id="Admin_J", | |
| session_text="Session: abc12345 | User: Admin_J | Interactions: 3", | |
| api_name="/update_session_info" | |
| ) | |
| updated_session = result | |
| print(updated_session) # "Session: abc12345 | User: Admin_J | Interactions: 3" | |
| ``` | |
| #### Important Notes | |
| - **Session Continuity**: Never generates new session ID | |
| - **Interaction Count**: Fetches actual count from database | |
| - **Preservation**: Returns original session_text if parsing fails | |
| --- | |
| ### 4. Toggle Settings - `/toggle_settings` | |
| Toggle the settings panel visibility. | |
| #### Endpoint Details | |
| - **API Name:** `/toggle_settings` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Toggles the settings panel visibility state | |
| #### Request Parameters | |
| None required. | |
| #### Response | |
| Returns Gradio update object (handled internally by client). | |
| #### Code Example | |
| ```python | |
| client.predict( | |
| api_name="/toggle_settings" | |
| ) | |
| ``` | |
| #### Behavior | |
| - Uses global state tracking (`_settings_panel_visible`) | |
| - Toggles between visible/hidden states | |
| - Falls back to visible on error | |
| --- | |
| ### 5. Toggle Settings from Nav - `/toggle_settings_from_nav` | |
| Toggle settings panel from mobile navigation. | |
| #### Endpoint Details | |
| - **API Name:** `/toggle_settings_from_nav` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Same as `/toggle_settings` but triggered from mobile nav | |
| #### Request Parameters | |
| None required. | |
| #### Response | |
| Returns Gradio update object. | |
| #### Code Example | |
| ```python | |
| client.predict( | |
| api_name="/toggle_settings_from_nav" | |
| ) | |
| ``` | |
| --- | |
| ### 6. Handle Mode Change - `/handle_mode_change` | |
| Change context mode (Fresh or Relevant). | |
| #### Endpoint Details | |
| - **API Name:** `/handle_mode_change` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Updates the context mode for the current session | |
| #### Request Parameters | |
| | Parameter | Type | Required | Default | Description | | |
| |-----------|------|----------|---------|-------------| | |
| | `mode` | `Literal['fresh', 'relevant']` | Yes | `"fresh"` | Context mode: `'fresh'` = no user context, `'relevant'` = only relevant context | | |
| | `session_id_text` | `str` | Yes | `"Session: ... \| User: ... \| Interactions: 0"` | Session information string | | |
| #### Response | |
| Returns status message string: | |
| ```python | |
| "*Current: Fresh Context*" # or "*Current: Relevant Context*" | |
| ``` | |
| #### Code Example | |
| ```python | |
| result = client.predict( | |
| mode="relevant", | |
| session_id_text="Session: abc12345 | User: Admin_J | Interactions: 3", | |
| api_name="/handle_mode_change" | |
| ) | |
| status = result | |
| print(status) # "*Current: Relevant Context*" | |
| ``` | |
| #### Mode Descriptions | |
| - **`fresh`**: Each response generated without user context from previous sessions | |
| - **`relevant`**: System identifies and includes only relevant past discussions related to current topic | |
| #### Validation | |
| - Invalid mode values default to `'fresh'` | |
| - Returns error message if session ID extraction fails | |
| --- | |
| ### 7. Save Preferences - `/save_preferences` | |
| Save user preferences to database. | |
| #### Endpoint Details | |
| - **API Name:** `/save_preferences` | |
| - **Method:** POST (via Gradio client) | |
| - **Description:** Saves user preferences with database persistence | |
| #### Request Parameters | |
| | Parameter | Type | Required | Default | Description | | |
| |-----------|------|----------|---------|-------------| | |
| | `param_0` | `bool` | No | `True` | Show reasoning chain | | |
| | `param_1` | `bool` | No | `False` | Show agent execution trace | | |
| | `param_2` | `Literal['Fast', 'Balanced', 'Thorough']` | No | `"Balanced"` | Response speed preference | | |
| | `param_3` | `bool` | No | `True` | Enable context caching | | |
| #### Response | |
| Returns status dictionary: | |
| ```python | |
| { | |
| "status": "success", # or "partial" if cache-only | |
| "message": "Preferences saved" | |
| } | |
| ``` | |
| #### Code Example | |
| ```python | |
| result = client.predict( | |
| param_0=True, # show_reasoning | |
| param_1=False, # show_agent_trace | |
| param_2="Fast", # response_speed | |
| param_3=True, # cache_enabled | |
| api_name="/save_preferences" | |
| ) | |
| status = result["status"] | |
| message = result["message"] | |
| ``` | |
| #### Preferences Schema | |
| Preferences are stored as JSON: | |
| ```json | |
| { | |
| "show_reasoning": true, | |
| "show_agent_trace": false, | |
| "response_speed": "Fast", | |
| "cache_enabled": true, | |
| "timestamp": "2024-12-28T10:30:00.123456" | |
| } | |
| ``` | |
| #### Storage | |
| - **Primary**: Database table `user_preferences` | |
| - **Fallback**: In-memory cache (if database unavailable) | |
| - **Scope**: Session-specific or global (if no session_id) | |
| --- | |
| ## Error Handling | |
| ### Error Response Format | |
| All endpoints return standardized error information: | |
| ```python | |
| # Chat endpoints - errors in metadata | |
| { | |
| "error": "Error message here", | |
| "type": "validation_error" | "processing_error" | "database_error" | |
| } | |
| # Other endpoints - error strings or error dictionaries | |
| "*Error: Invalid session information*" | |
| ``` | |
| ### Error Types | |
| #### 1. Validation Errors | |
| **Cause**: Invalid input parameters | |
| **HTTP Equivalent**: 400 Bad Request | |
| **Recovery**: Fix input parameters and retry | |
| ```python | |
| # Example | |
| { | |
| "error": "Message cannot be empty", | |
| "type": "validation_error" | |
| } | |
| ``` | |
| #### 2. Processing Errors | |
| **Cause**: Internal processing failures | |
| **HTTP Equivalent**: 500 Internal Server Error | |
| **Recovery**: Retry request, check system status | |
| ```python | |
| # Example | |
| { | |
| "error": "Processing error: LLM API timeout", | |
| "type": "processing_error" | |
| } | |
| ``` | |
| #### 3. Database Errors | |
| **Cause**: Database connection or query failures | |
| **HTTP Equivalent**: 503 Service Unavailable | |
| **Recovery**: System falls back to in-memory cache, retry if needed | |
| ```python | |
| # Example | |
| { | |
| "error": "Failed to save preferences to database", | |
| "type": "database_error", | |
| "fallback": "saved_to_cache" | |
| } | |
| ``` | |
| ### Error Handling Best Practices | |
| ```python | |
| from gradio_client import Client | |
| import time | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| def safe_chat_request(message, history, max_retries=3): | |
| """Chat request with retry logic""" | |
| for attempt in range(max_retries): | |
| try: | |
| result = client.predict( | |
| message=message, | |
| history=history, | |
| user_id="Admin_J", | |
| session_text="Session: abc12345 | User: Admin_J | Interactions: 0", | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| # Check for errors in metadata | |
| if isinstance(result[3], dict) and "error" in result[3]: | |
| error_msg = result[3]["error"] | |
| if "timeout" in error_msg.lower() and attempt < max_retries - 1: | |
| time.sleep(2 ** attempt) # Exponential backoff | |
| continue | |
| raise Exception(error_msg) | |
| return result | |
| except Exception as e: | |
| if attempt == max_retries - 1: | |
| raise | |
| time.sleep(2 ** attempt) | |
| raise Exception("Max retries exceeded") | |
| ``` | |
| --- | |
| ## Code Examples | |
| ### Complete Integration Example | |
| ```python | |
| from gradio_client import Client | |
| import os | |
| from typing import List, Dict, Optional | |
| class ResearchAIAssistant: | |
| """Wrapper class for Research AI Assistant API""" | |
| def __init__(self, hf_token: Optional[str] = None): | |
| """Initialize client""" | |
| self.client = Client( | |
| "JatinAutonomousLabs/Research_AI_Assistant", | |
| hf_token=hf_token or os.getenv("HF_TOKEN") | |
| ) | |
| self.session_info = None | |
| self.user_id = "Admin_J" | |
| self.chat_history = [] | |
| def create_session(self, user_id: str = "Admin_J") -> str: | |
| """Create new session""" | |
| self.user_id = user_id | |
| self.session_info = self.client.predict( | |
| user_id=user_id, | |
| api_name="/new_session" | |
| ) | |
| self.chat_history = [] | |
| return self.session_info | |
| def send_message(self, message: str) -> Dict: | |
| """Send message and get response""" | |
| if not self.session_info: | |
| self.create_session() | |
| result = self.client.predict( | |
| message=message, | |
| history=self.chat_history, | |
| user_id=self.user_id, | |
| session_text=self.session_info, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| # Unpack results | |
| history, _, reasoning, performance, context, session_info, skills = result | |
| # Update state | |
| self.chat_history = history | |
| self.session_info = session_info | |
| return { | |
| "response": history[-1]["content"] if history else "", | |
| "reasoning": reasoning, | |
| "performance": performance, | |
| "context": context, | |
| "skills": skills | |
| } | |
| def set_context_mode(self, mode: str) -> str: | |
| """Change context mode""" | |
| if not self.session_info: | |
| raise ValueError("No active session") | |
| result = self.client.predict( | |
| mode=mode, | |
| session_id_text=self.session_info, | |
| api_name="/handle_mode_change" | |
| ) | |
| return result | |
| def save_preferences(self, **preferences) -> Dict: | |
| """Save user preferences""" | |
| return self.client.predict( | |
| param_0=preferences.get("show_reasoning", True), | |
| param_1=preferences.get("show_agent_trace", False), | |
| param_2=preferences.get("response_speed", "Balanced"), | |
| param_3=preferences.get("cache_enabled", True), | |
| api_name="/save_preferences" | |
| ) | |
| # Usage | |
| assistant = ResearchAIAssistant(hf_token="your_token") | |
| # Create session | |
| session = assistant.create_session(user_id="Admin_J") | |
| print(f"Session created: {session}") | |
| # Set context mode | |
| assistant.set_context_mode("relevant") | |
| print("Context mode set to relevant") | |
| # Send message | |
| response = assistant.send_message("Explain machine learning") | |
| print(f"Response: {response['response']}") | |
| print(f"Processing time: {response['performance'].get('processing_time', 0):.2f}s") | |
| # Save preferences | |
| assistant.save_preferences( | |
| show_reasoning=True, | |
| response_speed="Fast", | |
| cache_enabled=True | |
| ) | |
| ``` | |
| ### Async Integration Example | |
| ```python | |
| import asyncio | |
| from gradio_client import Client | |
| async def async_chat_request(message: str, history: List, session_text: str): | |
| """Async wrapper for chat requests""" | |
| loop = asyncio.get_event_loop() | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| # Run in thread pool to avoid blocking | |
| result = await loop.run_in_executor( | |
| None, | |
| lambda: client.predict( | |
| message=message, | |
| history=history, | |
| user_id="Admin_J", | |
| session_text=session_text, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| ) | |
| return result | |
| # Usage | |
| async def main(): | |
| result = await async_chat_request( | |
| message="Hello", | |
| history=[], | |
| session_text="Session: abc12345 | User: Admin_J | Interactions: 0" | |
| ) | |
| print(result[0][-1]["content"]) | |
| asyncio.run(main()) | |
| ``` | |
| --- | |
| ## Integration Guide | |
| ### Step 1: Install Dependencies | |
| ```bash | |
| pip install gradio_client requests | |
| ``` | |
| ### Step 2: Initialize Client | |
| ```python | |
| from gradio_client import Client | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| ``` | |
| ### Step 3: Create Session | |
| ```python | |
| session_info = client.predict( | |
| user_id="Admin_J", | |
| api_name="/new_session" | |
| ) | |
| ``` | |
| ### Step 4: Send Messages | |
| ```python | |
| result = client.predict( | |
| message="Your question here", | |
| history=[], | |
| user_id="Admin_J", | |
| session_text=session_info, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| chatbot_history, _, reasoning, performance, context, session_info, skills = result | |
| ``` | |
| ### Step 5: Handle Context Mode | |
| ```python | |
| # Switch to relevant context mode | |
| client.predict( | |
| mode="relevant", | |
| session_id_text=session_info, | |
| api_name="/handle_mode_change" | |
| ) | |
| ``` | |
| ### Step 6: Save Preferences | |
| ```python | |
| client.predict( | |
| param_0=True, | |
| param_1=False, | |
| param_2="Balanced", | |
| param_3=True, | |
| api_name="/save_preferences" | |
| ) | |
| ``` | |
| --- | |
| ## Testing | |
| ### Unit Test Example | |
| ```python | |
| import unittest | |
| from gradio_client import Client | |
| class TestResearchAIAssistant(unittest.TestCase): | |
| def setUp(self): | |
| self.client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| self.session_info = None | |
| def test_create_session(self): | |
| """Test session creation""" | |
| result = self.client.predict( | |
| user_id="Admin_J", | |
| api_name="/new_session" | |
| ) | |
| self.assertIsInstance(result, str) | |
| self.assertIn("Session:", result) | |
| self.session_info = result | |
| def test_chat_message(self): | |
| """Test chat message processing""" | |
| if not self.session_info: | |
| self.test_create_session() | |
| result = self.client.predict( | |
| message="Hello", | |
| history=[], | |
| user_id="Admin_J", | |
| session_text=self.session_info, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| self.assertEqual(len(result), 7) | |
| self.assertIsInstance(result[0], list) # history | |
| self.assertIsInstance(result[2], dict) # reasoning | |
| def test_context_mode_change(self): | |
| """Test context mode change""" | |
| if not self.session_info: | |
| self.test_create_session() | |
| result = self.client.predict( | |
| mode="relevant", | |
| session_id_text=self.session_info, | |
| api_name="/handle_mode_change" | |
| ) | |
| self.assertIn("Context", result) | |
| if __name__ == '__main__': | |
| unittest.main() | |
| ``` | |
| ### Integration Test Example | |
| ```python | |
| def test_full_conversation_flow(): | |
| """Test complete conversation flow""" | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| # 1. Create session | |
| session = client.predict(user_id="Admin_J", api_name="/new_session") | |
| assert "Session:" in session | |
| # 2. Set context mode | |
| client.predict(mode="relevant", session_id_text=session, api_name="/handle_mode_change") | |
| # 3. Send messages | |
| history = [] | |
| for message in ["Hello", "What is AI?", "Explain further"]: | |
| result = client.predict( | |
| message=message, | |
| history=history, | |
| user_id="Admin_J", | |
| session_text=session, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| history = result[0] | |
| session = result[5] # Updated session info | |
| # 4. Verify conversation context | |
| assert len(history) == 6 # 3 user + 3 assistant messages | |
| # 5. Save preferences | |
| prefs = client.predict( | |
| param_0=True, | |
| param_1=False, | |
| param_2="Fast", | |
| param_3=True, | |
| api_name="/save_preferences" | |
| ) | |
| assert prefs["status"] in ["success", "partial"] | |
| print("✅ All integration tests passed") | |
| ``` | |
| --- | |
| ## Rate Limits & Best Practices | |
| ### Rate Limits | |
| Currently, there are **no explicit rate limits** enforced. However, best practices: | |
| - **Chat Requests**: Limit to 1-2 requests per second per session | |
| - **Session Creation**: No strict limit, but avoid rapid session creation | |
| - **Preference Updates**: Limit to reasonable frequency (not per-request) | |
| ### Best Practices | |
| #### 1. Session Management | |
| ```python | |
| # ✅ Good: Reuse sessions | |
| session = create_session() | |
| for message in messages: | |
| send_message(message, session) | |
| # ❌ Bad: Create new session for each message | |
| for message in messages: | |
| session = create_session() # Don't do this | |
| send_message(message, session) | |
| ``` | |
| #### 2. Error Handling | |
| ```python | |
| # ✅ Good: Handle errors gracefully | |
| try: | |
| result = send_message(message) | |
| except Exception as e: | |
| logger.error(f"Request failed: {e}") | |
| # Implement retry or fallback | |
| # ❌ Bad: Ignore errors | |
| result = send_message(message) # No error handling | |
| ``` | |
| #### 3. Context Mode | |
| ```python | |
| # ✅ Good: Set mode once at session start | |
| set_context_mode("relevant") # Once per session | |
| send_message("Question 1") | |
| send_message("Question 2") # Mode persists | |
| # ❌ Bad: Change mode frequently | |
| set_context_mode("fresh") | |
| send_message("Q1") | |
| set_context_mode("relevant") # Unnecessary switching | |
| send_message("Q2") | |
| ``` | |
| #### 4. Message Length | |
| ```python | |
| # ✅ Good: Reasonable message length | |
| message = "Your question here" # < 1000 chars typically | |
| # ❌ Bad: Extremely long messages | |
| message = "A" * 10000 # Max allowed but not recommended | |
| ``` | |
| --- | |
| ## Support & Troubleshooting | |
| ### Common Issues | |
| #### 1. Connection Errors | |
| **Symptom**: `ConnectionError` or timeout | |
| **Solution**: | |
| ```python | |
| # Add retry logic | |
| import time | |
| max_retries = 3 | |
| for attempt in range(max_retries): | |
| try: | |
| result = client.predict(...) | |
| break | |
| except Exception as e: | |
| if attempt < max_retries - 1: | |
| time.sleep(2 ** attempt) | |
| else: | |
| raise | |
| ``` | |
| #### 2. Invalid Session ID | |
| **Symptom**: `ValueError: Could not extract session_id` | |
| **Solution**: Ensure session_text format is correct: | |
| ``` | |
| "Session: abc12345 | User: Admin_J | Interactions: 0" | |
| ``` | |
| #### 3. Empty Responses | |
| **Symptom**: Response tuple contains empty strings | |
| **Possible Causes**: | |
| - LLM API timeout | |
| - Invalid message format | |
| - System overload | |
| **Solution**: Check `performance_data` for error information | |
| #### 4. Preferences Not Saving | |
| **Symptom**: Preferences return "partial" status | |
| **Cause**: Database unavailable, using cache fallback | |
| **Solution**: Preferences still work via cache, database will sync when available | |
| ### Debugging Tips | |
| #### Enable Detailed Logging | |
| ```python | |
| import logging | |
| logging.basicConfig(level=logging.DEBUG) | |
| # Client will show detailed request/response logs | |
| ``` | |
| #### Check Response Metadata | |
| ```python | |
| result = client.predict(...) | |
| reasoning = result[2] # Check for errors | |
| performance = result[3] # Check processing info | |
| context = result[4] # Check session context | |
| ``` | |
| #### Validate Session Info | |
| ```python | |
| session_info = "Session: abc12345 | User: Admin_J | Interactions: 0" | |
| # Validate format | |
| import re | |
| match = re.search(r'Session: ([a-f0-9]{8})', session_info) | |
| if not match: | |
| raise ValueError("Invalid session format") | |
| ``` | |
| --- | |
| ## API Versioning | |
| ### Current Version: 1.0.0 | |
| - **Base URL**: Stable (Hugging Face Spaces URL) | |
| - **Endpoint Names**: Stable | |
| - **Response Formats**: Stable | |
| - **Parameters**: Backward compatible additions only | |
| ### Version History | |
| - **v1.0.0** (2024-12-28): Initial stable release with all endpoints | |
| ### Breaking Changes Policy | |
| - Major version increments indicate breaking changes | |
| - Deprecated endpoints will be announced 30 days in advance | |
| - Old endpoint versions maintained for compatibility | |
| --- | |
| ## Additional Resources | |
| ### Documentation | |
| - **Implementation Details**: See `API_ENDPOINTS_IMPLEMENTATION_COMPLETE.md` | |
| - **Application Features**: See `APPLICATION_FEATURES_REPORT.md` | |
| - **Context Management**: See `CONTEXT_RELEVANCE_IMPLEMENTATION_MILESTONE.md` | |
| ### Support Channels | |
| - **GitHub Issues**: [Repository Link] | |
| - **Email Support**: [Support Email] | |
| - **Documentation**: [Documentation Link] | |
| ### Changelog | |
| See `CHANGELOG.md` for detailed change history. | |
| --- | |
| ## Appendix | |
| ### A. Complete Request/Response Examples | |
| #### Chat Request (Complete) | |
| ```python | |
| from gradio_client import Client | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| # Full request | |
| result = client.predict( | |
| message="What are the applications of quantum computing?", | |
| history=[ | |
| {"role": "user", "content": "Hello"}, | |
| {"role": "assistant", "content": "Hello! How can I help you?"} | |
| ], | |
| user_id="Admin_J", | |
| session_text="Session: abc12345 | User: Admin_J | Interactions: 1", | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| # Response unpacking | |
| history = result[0] | |
| reasoning = result[2] | |
| performance = result[3] | |
| context = result[4] | |
| session_info = result[5] | |
| skills = result[6] | |
| print(f"Latest response: {history[-1]['content']}") | |
| print(f"Processing time: {performance.get('processing_time', 0):.2f}s") | |
| print(f"Tokens used: {performance.get('token_count', 0)}") | |
| ``` | |
| ### B. Session Lifecycle Example | |
| ```python | |
| # 1. Initialize | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| session = None | |
| history = [] | |
| # 2. Create session | |
| session = client.predict(user_id="Admin_J", api_name="/new_session") | |
| print(f"Created: {session}") | |
| # 3. Set context mode | |
| client.predict(mode="relevant", session_id_text=session, api_name="/handle_mode_change") | |
| # 4. Conversation loop | |
| for i in range(3): | |
| user_message = input("You: ") | |
| result = client.predict( | |
| message=user_message, | |
| history=history, | |
| user_id="Admin_J", | |
| session_text=session, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| history = result[0] | |
| session = result[5] # Updated session with interaction count | |
| print(f"Assistant: {history[-1]['content']}") | |
| print(f"Session: {session}") | |
| # 5. Save preferences | |
| client.predict( | |
| param_0=True, | |
| param_1=False, | |
| param_2="Balanced", | |
| param_3=True, | |
| api_name="/save_preferences" | |
| ) | |
| ``` | |
| ### C. Error Recovery Patterns | |
| ```python | |
| def robust_chat_request(message, history, session_info, max_retries=3): | |
| """Chat request with comprehensive error handling""" | |
| client = Client("JatinAutonomousLabs/Research_AI_Assistant") | |
| for attempt in range(max_retries): | |
| try: | |
| result = client.predict( | |
| message=message, | |
| history=history, | |
| user_id="Admin_J", | |
| session_text=session_info, | |
| api_name="/safe_gpu_chat_handler" | |
| ) | |
| # Check for errors in response | |
| if isinstance(result[3], dict) and "error" in result[3]: | |
| error = result[3]["error"] | |
| if attempt < max_retries - 1 and "timeout" in error.lower(): | |
| time.sleep(2 ** attempt) | |
| continue | |
| raise Exception(error) | |
| return result | |
| except ConnectionError as e: | |
| if attempt < max_retries - 1: | |
| time.sleep(2 ** attempt) | |
| continue | |
| raise | |
| except Exception as e: | |
| if attempt < max_retries - 1: | |
| time.sleep(1) | |
| continue | |
| raise | |
| raise Exception("Max retries exceeded") | |
| ``` | |
| --- | |
| **Document End** | |
| *For questions or issues, please refer to the Support section above.* | |