Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/3rqreqr_opsmate.json
T

1 line
3.6 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{"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"}}}}