import support.settings as settings from langchain_anthropic import ChatAnthropic from langchain_google_genai import ChatGoogleGenerativeAI from langchain_huggingface import ChatHuggingFace, HuggingFaceEndpoint from langchain_openai import ChatOpenAI def create_model(model_name: str, api_keys: dict): """Factory function to create model instances based on model name.""" # OpenAI models if model_name.startswith("gpt-"): if model_name == "gpt-4.1-nano": return ChatOpenAI( model=model_name, temperature=0, timeout=None, max_retries=1, streaming=True, api_key=api_keys['OPENAI_API_KEY'] ) else: reasoning = { "effort": "low", # 'low', 'medium', or 'high' "summary": "auto", # 'detailed', 'auto', or None } return ChatOpenAI( model=model_name, temperature=0, timeout=None, max_retries=1, streaming=True, reasoning=reasoning, api_key=api_keys['OPENAI_API_KEY'] ) # Google models elif model_name.startswith("gemini-"): return ChatGoogleGenerativeAI( model=model_name, temperature=0, timeout=None, max_retries=1, streaming=True, include_thoughts=True, api_key=api_keys['GOOGLE_API_KEY'] ) # Anthropic models elif model_name.startswith("claude-"): if model_name in ["claude-sonnet-4-5-20250929", "claude-3-7-sonnet-20250219"]: return ChatAnthropic( model=model_name, temperature=1, timeout=None, max_retries=1, streaming=True, api_key=api_keys['ANTHROPIC_API_KEY'], thinking={"type": "enabled", "budget_tokens": 1024}, ) else: return ChatAnthropic( model=model_name, temperature=0, timeout=None, max_retries=1, streaming=True, api_key=api_keys['ANTHROPIC_API_KEY'] ) elif model_name in ["openai/gpt-oss-120b", "deepseek-ai/DeepSeek-V3.1", "Qwen/Qwen3-235B-A22B-Instruct-2507", "openai/gpt-oss-20b", "moonshotai/Kimi-K2-Thinking", "deepseek-ai/DeepSeek-R1"]: provider_dict = { "openai/gpt-oss-120b": "novita", "deepseek-ai/DeepSeek-V3.1": "novita", "Qwen/Qwen3-235B-A22B-Instruct-2507": "novita", "openai/gpt-oss-20b": "together", "moonshotai/Kimi-K2-Thinking": "together", "deepseek-ai/DeepSeek-R1": "novita" } llm = HuggingFaceEndpoint( repo_id=model_name, task="text-generation", provider=provider_dict[model_name], streaming=True, temperature=0, top_p=0, huggingfacehub_api_token=api_keys['HUGGINGFACEHUB_API_TOKEN'], max_new_tokens=1600 ) return ChatHuggingFace(llm=llm, verbose=True) else: raise ValueError(f"Unknown model: {model_name}")