from __future__ import annotations """项目配置中心:从环境变量或.env读取API密钥、模型参数等敏感配置,通过pydantic-settings统一管理。""" from functools import lru_cache from pathlib import Path from pydantic_settings import BaseSettings,SettingsConfigDict # 项目根目录(app 的上级),用于定位 .env,避免受运行时工作目录(CWD)影响 BASE_DIR = Path(__file__).resolve().parent.parent class Settings(BaseSettings): """ 项目配置: 所有敏感信息从环境变量或.env文件中读取, 不允许直接写死在业务代码中。 """ serpapi_api_key:str = "" amap_api_key:str = "" openai_api_key:str = "" base_url:str = "" model:str = "" request_timeout_seconds:float = 120.0 model_config = SettingsConfigDict( env_file = BASE_DIR / ".env", env_file_encoding = "utf-8", case_sensitive = False, extra = "ignore", ) def require(self, field_name:str)->str: """读取必填配置,缺失时给出明确错误。""" value = getattr(self,field_name,None) if not isinstance(value,str) or not value.strip(): env_name = field_name.upper() raise RuntimeError( f"缺少配置{env_name},请检查项目根目录下的.env文件" ) return value.strip() @lru_cache def get_settings()->Settings: """缓存配置对象,避免反复读取.env。""" return Settings()