config.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. """配置管理模块"""
  2. import os
  3. from pathlib import Path
  4. from typing import List
  5. from pydantic_settings import BaseSettings
  6. from dotenv import load_dotenv
  7. # 加载环境变量
  8. # 首先尝试加载当前目录的.env
  9. load_dotenv()
  10. # 然后尝试加载HelloAgents的.env(如果存在)
  11. helloagents_env = Path(__file__).parent.parent.parent.parent / "HelloAgents" / ".env"
  12. if helloagents_env.exists():
  13. load_dotenv(helloagents_env, override=False) # 不覆盖已有的环境变量
  14. class Settings(BaseSettings):
  15. """应用配置"""
  16. # 应用基本配置
  17. app_name: str = "HelloAgents智能旅行助手"
  18. app_version: str = "1.0.0"
  19. debug: bool = False
  20. # 服务器配置
  21. host: str = "localhost"
  22. port: int = 8000
  23. # SSL/HTTPS配置
  24. ssl_enabled: bool = False
  25. ssl_certfile: str = ""
  26. ssl_keyfile: str = ""
  27. # CORS配置 - 使用字符串,在代码中分割
  28. cors_origins: str = "http://localhost:5173,http://localhost:3000,http://127.0.0.1:5173,http://127.0.0.1:3000,https://localhost:5173,https://localhost:3000,https://127.0.0.1:5173,https://127.0.0.1:3000"
  29. # 高德地图API配置
  30. amap_api_key: str = ""
  31. # Unsplash API配置
  32. unsplash_access_key: str = ""
  33. unsplash_secret_key: str = ""
  34. # LLM配置 (从环境变量读取,由HelloAgents管理)
  35. openai_api_key: str = ""
  36. openai_base_url: str = "https://api.openai.com/v1"
  37. openai_model: str = "gpt-4"
  38. # 日志配置
  39. log_level: str = "INFO"
  40. class Config:
  41. env_file = ".env"
  42. case_sensitive = False
  43. extra = "ignore" # 忽略额外的环境变量
  44. def get_cors_origins_list(self) -> List[str]:
  45. """获取CORS origins列表"""
  46. return [origin.strip() for origin in self.cors_origins.split(',')]
  47. def get_ssl_certfile(self) -> str:
  48. """获取SSL证书路径(相对于项目根目录解析)"""
  49. if not self.ssl_certfile:
  50. return ""
  51. path = Path(self.ssl_certfile)
  52. return str(path) if path.is_absolute() else str(Path(__file__).parent.parent / self.ssl_certfile)
  53. def get_ssl_keyfile(self) -> str:
  54. """获取SSL密钥路径(相对于项目根目录解析)"""
  55. if not self.ssl_keyfile:
  56. return ""
  57. path = Path(self.ssl_keyfile)
  58. return str(path) if path.is_absolute() else str(Path(__file__).parent.parent / self.ssl_keyfile)
  59. # 创建全局配置实例
  60. settings = Settings()
  61. def get_settings() -> Settings:
  62. """获取配置实例"""
  63. return settings
  64. # 验证必要的配置
  65. def validate_config():
  66. """验证配置是否完整"""
  67. errors = []
  68. warnings = []
  69. if not settings.amap_api_key:
  70. errors.append("AMAP_API_KEY未配置")
  71. # HelloAgentsLLM会自动从LLM_API_KEY读取,不强制要求OPENAI_API_KEY
  72. llm_api_key = os.getenv("LLM_API_KEY") or os.getenv("OPENAI_API_KEY")
  73. if not llm_api_key:
  74. warnings.append("LLM_API_KEY或OPENAI_API_KEY未配置,LLM功能可能无法使用")
  75. if errors:
  76. error_msg = "配置错误:\n" + "\n".join(f" - {e}" for e in errors)
  77. raise ValueError(error_msg)
  78. if warnings:
  79. print("\n⚠️ 配置警告:")
  80. for w in warnings:
  81. print(f" - {w}")
  82. return True
  83. # 打印配置信息(用于调试)
  84. def print_config():
  85. """打印当前配置(隐藏敏感信息)"""
  86. print(f"应用名称: {settings.app_name}")
  87. print(f"版本: {settings.app_version}")
  88. print(f"服务器: {settings.host}:{settings.port}")
  89. protocol = "https" if settings.ssl_enabled else "http"
  90. print(f"高德地图API Key: {'已配置' if settings.amap_api_key else '未配置'}")
  91. print(f"SSL/HTTPS: {'已启用' if settings.ssl_enabled else '未启用'}")
  92. print(f"协议: {protocol.upper()}")
  93. # 检查LLM配置
  94. llm_api_key = os.getenv("LLM_API_KEY") or os.getenv("OPENAI_API_KEY")
  95. llm_base_url = os.getenv("LLM_BASE_URL") or settings.openai_base_url
  96. llm_model = os.getenv("LLM_MODEL_ID") or settings.openai_model
  97. print(f"LLM API Key: {'已配置' if llm_api_key else '未配置'}")
  98. print(f"LLM Base URL: {llm_base_url}")
  99. print(f"LLM Model: {llm_model}")
  100. print(f"日志级别: {settings.log_level}")