{"repo": "3rqreqr/opsmate", "files": {"app/agent/llm_factory.py": {"4758de4e2e1a7b0f7c07c01e33ab03b347cc9f0a": {"t": 1785747511.7023058, "n": 3084, "h": "f36857cb9fb47300", "c": "\"\"\"\nLLM 工厂\n统一管理通义千问 / DeepSeek / OpenAI 等多 LLM 提供商\n\"\"\"\nfrom typing import Optional\n\nfrom langchain_openai import ChatOpenAI\nfrom langchain_core.language_models import BaseChatModel\n\n# 验证 ChatOpenAI 是 BaseChatModel 的子类\nprint(issubclass(ChatOpenAI, BaseChatModel)) # 输出: True\n\n# 创建实例示例\nllm = ChatOpenAI(\n model=\"gpt-3.5-turbo\",\n temperature=0.7,\n api_key=\"your-api-key-here\"\n)\n\n# 检查类型\nprint(isinstance(llm, BaseChatModel)) # 输出: True\n\nfrom app.core.config import settings\nfrom loguru import logger\n\n\nclass LLMFactory:\n \"\"\"LLM 实例工厂\"\"\"\n\n # 各提供商的默认 Base URL\n PROVIDER_CONFIGS = {\n \"dashscope\": {\n \"base_url\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"api_key_env\": \"DASHSCOPE_API_KEY\",\n \"default_model\": \"qwen-plus\",\n },\n \"deepseek\": {\n \"base_url\": \"https://api.deepseek.com\",\n \"api_key_env\": \"DEEPSEEK_API_KEY\",\n \"default_model\": \"deepseek-chat\",\n },\n \"openai\": {\n \"base_url\": \"https://api.openai.com/v1\",\n \"api_key_env\": \"OPENAI_API_KEY\",\n \"default_model\": \"gpt-4o-mini\",\n },\n }\n\n _instances: dict = {}\n\n @classmethod\n def get_chat_model(\n cls,\n model: Optional[str] = None,\n temperature: Optional[float] = None,\n max_tokens: Optional[int] = None,\n provider: Optional[str] = None,\n ) -> BaseChatModel:\n \"\"\"获取 Chat Model 实例(带缓存)\"\"\"\n provider = provider or settings.LLM_PROVIDER\n model = model or settings.LLM_MODEL\n temperature = temperature if temperature is not None else settings.LLM_TEMPERATURE\n max_tokens = max_tokens or settings.LLM_MAX_TOKENS\n\n cache_key = f\"{provider}:{model}:{temperature}\"\n if cache_key in cls._instances:\n return cls._instances[cache_key]\n\n config = cls.PROVIDER_CONFIGS.get(provider)\n if config is None:\n logger.warning(f\"未知的 LLM 提供商: {provider},使用 dashscope 兜底\")\n config = cls.PROVIDER_CONFIGS[\"dashscope\"]\n provider = \"dashscope\"\n\n # 获取 API Key\n api_key = getattr(settings, config[\"api_key_env\"], None)\n if not api_key:\n logger.warning(\n f\"未设置 {config['api_key_env']},\"\n f\"请在 .env 中配置或设置环境变量\"\n )\n\n base_url = settings.LLM_BASE_URL or config[\"base_url\"]\n\n llm = ChatOpenAI(\n model=model,\n api_key=api_key or \"sk-placeholder\", # LangChain 要求非空\n base_url=base_url,\n temperature=temperature,\n max_tokens=max_tokens,\n streaming=False,\n )\n\n cls._instances[cache_key] = llm\n logger.info(f\"LLM 实例创建: provider={provider}, model={model}\")\n return llm\n\n @classmethod\n def clear_cache(cls):\n \"\"\"清空实例缓存\"\"\"\n cls._instances.clear()\n\n\ndef get_llm(\n model: Optional[str] = None,\n temperature: Optional[float] = None,\n) -> BaseChatModel:\n \"\"\"快捷获取 LLM 实例\"\"\"\n return LLMFactory.get_chat_model(model=model, temperature=temperature)\n"}}}}