# 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 "
🎯 Relevant Skills:
Machine Learning Python" ``` #### 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: | Interactions: "` #### 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.*