Spaces:
Sleeping
Sleeping
| import os | |
| from typing import List, Dict, Any | |
| def validate_token() -> bool: | |
| """ | |
| Validate that the HF_TOKEN token is available | |
| Returns: | |
| bool: True if token exists, False otherwise | |
| """ | |
| token = os.getenv("HF_TOKEN") | |
| return token is not None and len(token) > 0 | |
| def format_chat_history(history: List[Dict[str, Any]], current_message: str) -> List[Dict[str, str]]: | |
| """ | |
| Format chat history for the Hugging Face API | |
| Args: | |
| history: Chat history from Gradio Chatbot component (type="messages") | |
| current_message: Current user message | |
| Returns: | |
| List of formatted message dictionaries | |
| """ | |
| messages = [] | |
| # Add system message | |
| messages.append({ | |
| "role": "system", | |
| "content": "You are a helpful, friendly, and knowledgeable assistant. Provide clear and accurate responses." | |
| }) | |
| # Add conversation history | |
| # Ensure history is a list of dictionaries with 'role' and 'content' keys | |
| if history and isinstance(history, list): | |
| for message in history: | |
| if isinstance(message, dict): | |
| role = message.get("role", "") | |
| content = message.get("content", "") | |
| # Only add valid messages | |
| if role in ["user", "assistant"] and content: | |
| messages.append({ | |
| "role": role, | |
| "content": content | |
| }) | |
| # Add current message | |
| if current_message: | |
| messages.append({ | |
| "role": "user", | |
| "content": current_message | |
| }) | |
| return messages | |
| def sanitize_input(text: str) -> str: | |
| """ | |
| Sanitize user input to prevent injection attacks | |
| Args: | |
| text: Input text to sanitize | |
| Returns: | |
| Sanitized text | |
| """ | |
| # Remove potentially harmful characters | |
| harmful_chars = ['<', '>', '&', '"', "'", '`', '$', '|', ';'] | |
| for char in harmful_chars: | |
| text = text.replace(char, '') | |
| return text.strip() | |
| def validate_model_provider(model: str, provider: str) -> tuple[bool, str]: | |
| """ | |
| Validate model and provider names | |
| Args: | |
| model: Model name | |
| provider: Provider name | |
| Returns: | |
| Tuple of (is_valid, error_message) | |
| """ | |
| if not model or not model.strip(): | |
| return False, "Model name cannot be empty" | |
| if not provider or not provider.strip(): | |
| return False, "Provider name cannot be empty" | |
| # Basic validation - allow alphanumeric, hyphens, underscores, and dots | |
| import re | |
| model_pattern = r'^[a-zA-Z0-9._-]+$' | |
| provider_pattern = r'^[a-zA-Z0-9._-]+$' | |
| if not re.match(model_pattern, model): | |
| return False, "Invalid model name format" | |
| if not re.match(provider_pattern, provider): | |
| return False, "Invalid provider name format" | |
| return True, "" | |
| def format_error_message(error: Exception) -> str: | |
| """ | |
| Format error messages for user display | |
| Args: | |
| error: Exception object | |
| Returns: | |
| User-friendly error message | |
| """ | |
| error_str = str(error) | |
| # Common error patterns and user-friendly messages | |
| if "token" in error_str.lower(): | |
| return "Authentication error. Please check your Hugging Face token." | |
| elif "rate limit" in error_str.lower(): | |
| return "Rate limit exceeded. Please try again later." | |
| elif "model" in error_str.lower() and "not found" in error_str.lower(): | |
| return "Model not found. Please check the model name." | |
| elif "provider" in error_str.lower() and "not found" in error_str.lower(): | |
| return "Provider not found. Please check the provider name." | |
| elif "unexpected keyword argument 'provider'" in error_str.lower(): | |
| return "Provider parameter not supported in this API version. Try using provider/model format." | |
| else: | |
| return f"An error occurred: {error_str}" |