| 
							 | 
						""" | 
					
					
						
						| 
							 | 
						This module handles the creation of API clients for the application. | 
					
					
						
						| 
							 | 
						It includes the logic for instantiating the Hugging Face InferenceClient | 
					
					
						
						| 
							 | 
						and the Tavily Search client. | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						The get_inference_client function is critical for enabling the "user-pays" | 
					
					
						
						| 
							 | 
						model in a Hugging Face Space. It prioritizes the API token of the logged-in | 
					
					
						
						| 
							 | 
						user, ensuring their account is billed for inference costs. | 
					
					
						
						| 
							 | 
						""" | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						import os | 
					
					
						
						| 
							 | 
						from typing import Optional | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						from huggingface_hub import InferenceClient | 
					
					
						
						| 
							 | 
						from tavily import TavilyClient | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						HF_TOKEN = os.getenv('HF_TOKEN') | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						def get_inference_client(model_id: str, provider: str = "auto", user_token: Optional[str] = None) -> InferenceClient: | 
					
					
						
						| 
							 | 
						    """ | 
					
					
						
						| 
							 | 
						    Creates and returns a Hugging Face InferenceClient. | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						    This function implements the "user-pays" logic. It prioritizes using the token | 
					
					
						
						| 
							 | 
						    provided by the logged-in user (`user_token`). If that is not available, | 
					
					
						
						| 
							 | 
						    it falls back to the Space owner's token (`HF_TOKEN`). | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						    Args: | 
					
					
						
						| 
							 | 
						        model_id (str): The ID of the model to be used (e.g., "mistralai/Mistral-7B-Instruct-v0.2"). | 
					
					
						
						| 
							 | 
						        provider (str): The specific inference provider (e.g., "groq"). Defaults to "auto". | 
					
					
						
						| 
							 | 
						        user_token (Optional[str]): The API token of the logged-in user, passed from the Gradio app. | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						    Returns: | 
					
					
						
						| 
							 | 
						        InferenceClient: An initialized client ready for making API calls. | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    Raises: | 
					
					
						
						| 
							 | 
						        ValueError: If no API token can be found (neither from the user nor the environment). | 
					
					
						
						| 
							 | 
						    """ | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    token_to_use = user_token or HF_TOKEN | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    if not token_to_use: | 
					
					
						
						| 
							 | 
						        raise ValueError( | 
					
					
						
						| 
							 | 
						            "Cannot proceed without an API token. " | 
					
					
						
						| 
							 | 
						            "Please log into Hugging Face, or ensure the HF_TOKEN environment secret is set for this Space." | 
					
					
						
						| 
							 | 
						        ) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    if model_id == "moonshotai/Kimi-K2-Instruct": | 
					
					
						
						| 
							 | 
						        provider = "groq" | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						     | 
					
					
						
						| 
							 | 
						    return InferenceClient( | 
					
					
						
						| 
							 | 
						        provider=provider, | 
					
					
						
						| 
							 | 
						        api_key=token_to_use | 
					
					
						
						| 
							 | 
						    ) | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						 | 
					
					
						
						| 
							 | 
						TAVILY_API_KEY = os.getenv('TAVILY_API_KEY') | 
					
					
						
						| 
							 | 
						tavily_client = None | 
					
					
						
						| 
							 | 
						
 | 
					
					
						
						| 
							 | 
						if TAVILY_API_KEY: | 
					
					
						
						| 
							 | 
						    try: | 
					
					
						
						| 
							 | 
						        tavily_client = TavilyClient(api_key=TAVILY_API_KEY) | 
					
					
						
						| 
							 | 
						    except Exception as e: | 
					
					
						
						| 
							 | 
						         | 
					
					
						
						| 
							 | 
						        print(f"Warning: Failed to initialize Tavily client. Web search will be unavailable. Error: {e}") | 
					
					
						
						| 
							 | 
						        tavily_client = None |