config.py 1.5 KB

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