# -*- coding: utf-8 -*- """ LLM 模型实例缓存 —— 避免每次请求重复 init_chat_model 直接读取 .env 配置,确保模型字符串带有 provider 前缀(如 openai:), 避免 init_chat_model 根据模型名猜测错误的 provider(如将 deepseek-v4-pro 解析为 ChatDeepSeek 而非 ChatOpenAI)。 """ # Fast 模式模型实例缓存(模块级单例,避免每次请求重复 init_chat_model) # _fast_model: fast_mode=True 使用 SUMMARY_MODEL(低延迟 flash 模型) # _chat_model: fast_mode=False 使用 DEEPAGENT_MODEL(pro 模型) _fast_model = None _chat_model = None def get_chat_model(fast_mode: bool = True): """获取 LangChain ChatModel 实例,用于 Fast 模式直接调用 LLM。 fast_mode=True 时使用 SUMMARY_MODEL(默认 deepseek-v4-flash), 延迟更低,适合直接模板填充任务;fast_mode=False 时使用 DEEPAGENT_MODEL。 模型实例按 mode 分别缓存,后续请求直接复用。 """ global _fast_model, _chat_model if fast_mode and _fast_model is not None: return _fast_model if not fast_mode and _chat_model is not None: return _chat_model from dotenv import dotenv_values from pathlib import Path as _Path from langchain.chat_models import init_chat_model _env_file = _Path(__file__).parent.parent / ".env" _cfg = dotenv_values(str(_env_file)) # Fast 模式优先使用 SUMMARY_MODEL(低延迟),否则 fallback 到 DEEPAGENT_MODEL if fast_mode: model_str = _cfg.get("SUMMARY_MODEL", "") or _cfg.get("DEEPAGENT_MODEL", "openai:gpt-4o") else: model_str = _cfg.get("DEEPAGENT_MODEL", "openai:gpt-4o") base_url = _cfg.get("OPENAI_BASE_URL", "") api_key = _cfg.get("OPENAI_API_KEY", "") timeout_str = _cfg.get("OPENAI_TIMEOUT", "180") # 清理可能带入的引号 api_key = api_key.strip().strip('"').strip("'") if api_key else "" base_url = base_url.strip().strip('"').strip("'") if base_url else "" # 解析超时时间 try: timeout = float(timeout_str.strip()) except (ValueError, TypeError): timeout = 180.0 # 确保模型字符串带有 provider 前缀,否则 init_chat_model 可能猜错 provider if ":" not in model_str: model_str = f"openai:{model_str}" if base_url and api_key: model_instance = init_chat_model( model_str, openai_api_key=api_key, openai_api_base=base_url, temperature=0, timeout=timeout, max_retries=2, ) else: model_instance = init_chat_model(model_str, temperature=0, timeout=timeout, max_retries=2) # 按模式分别缓存 if fast_mode: _fast_model = model_instance else: _chat_model = model_instance return model_instance