""" 应用配置管理 """ import os from typing import Optional from pydantic_settings import BaseSettings from functools import lru_cache class Settings(BaseSettings): """应用配置""" # 应用基础配置 APP_NAME: str = "Finyx Data AI API" APP_VERSION: str = "1.0.0" DEBUG: bool = os.getenv("DEBUG", "False").lower() == "true" API_V1_PREFIX: str = "/api/v1" # 服务器配置 HOST: str = os.getenv("HOST", "0.0.0.0") PORT: int = int(os.getenv("PORT", 8000)) # CORS 配置 CORS_ORIGINS: list = [ "http://localhost:3000", "http://localhost:8080", "http://127.0.0.1:3000", ] # 大模型 API 配置 # 通义千问 DASHSCOPE_API_KEY: Optional[str] = os.getenv("DASHSCOPE_API_KEY") DASHSCOPE_BASE_URL: str = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation" QWEN_MODEL: str = os.getenv("QWEN_MODEL", "qwen-max") # OpenAI OPENAI_API_KEY: Optional[str] = os.getenv("OPENAI_API_KEY") OPENAI_BASE_URL: str = "https://api.openai.com/v1/chat/completions" OPENAI_MODEL: str = os.getenv("OPENAI_MODEL", "gpt-4") # 文心一言 QIANFAN_ACCESS_KEY: Optional[str] = os.getenv("QIANFAN_ACCESS_KEY") QIANFAN_SECRET_KEY: Optional[str] = os.getenv("QIANFAN_SECRET_KEY") # 硅基流动 (SiliconFlow) SILICONFLOW_API_KEY: Optional[str] = os.getenv("SILICONFLOW_API_KEY") SILICONFLOW_BASE_URL: str = os.getenv( "SILICONFLOW_BASE_URL", "https://api.siliconflow.cn/v1/chat/completions" ) SILICONFLOW_MODEL: str = os.getenv("SILICONFLOW_MODEL", "deepseek-chat") # 视觉大模型配置(用于场景优化接口的图片识别) VISION_MODEL: Optional[str] = os.getenv("VISION_MODEL") VISION_MODEL_BASE_URL: str = os.getenv( "VISION_MODEL_BASE_URL", "https://api.siliconflow.cn/v1/chat/completions" ) # 大模型默认配置 DEFAULT_LLM_MODEL: str = os.getenv("DEFAULT_LLM_MODEL", "qwen-max") DEFAULT_TEMPERATURE: float = float(os.getenv("DEFAULT_TEMPERATURE", "0.3")) LLM_TIMEOUT: int = int(os.getenv("LLM_TIMEOUT", "60")) LLM_MAX_RETRIES: int = int(os.getenv("LLM_MAX_RETRIES", "3")) # 文件上传配置 UPLOAD_DIR: str = os.getenv("UPLOAD_DIR", "uploads/temp") MAX_UPLOAD_SIZE: int = int(os.getenv("MAX_UPLOAD_SIZE", 52428800)) # 50MB ALLOWED_FILE_EXTENSIONS: list = [".xlsx", ".xls", ".doc", ".docx", ".pdf", ".csv"] @property def allowed_extensions(self) -> list: """获取允许的文件扩展名列表""" return self.ALLOWED_FILE_EXTENSIONS # 日志配置 LOG_LEVEL: str = os.getenv("LOG_LEVEL", "INFO") LOG_DIR: str = os.getenv("LOG_DIR", "logs") LOG_FILE: str = os.path.join(LOG_DIR, "app.log") # Redis 配置(可选,用于缓存) REDIS_HOST: Optional[str] = os.getenv("REDIS_HOST") REDIS_PORT: int = int(os.getenv("REDIS_PORT", 6379)) REDIS_DB: int = int(os.getenv("REDIS_DB", 0)) REDIS_PASSWORD: Optional[str] = os.getenv("REDIS_PASSWORD") ENABLE_CACHE: bool = os.getenv("ENABLE_CACHE", "False").lower() == "true" # 缓存配置 CACHE_TTL: int = int(os.getenv("CACHE_TTL", "3600")) # 缓存过期时间(秒),默认 1 小时 CACHE_PREFIX: str = os.getenv("CACHE_PREFIX", "finyx_ai:") # 缓存键前缀 # 监控告警配置 ALERT_TYPE: str = os.getenv("ALERT_TYPE", "none") # 告警类型: email, webhook, none # 邮件告警配置 SMTP_HOST: Optional[str] = os.getenv("SMTP_HOST") SMTP_PORT: int = int(os.getenv("SMTP_PORT", 587)) SMTP_USERNAME: Optional[str] = os.getenv("SMTP_USERNAME") SMTP_PASSWORD: Optional[str] = os.getenv("SMTP_PASSWORD") ALERT_FROM_EMAIL: Optional[str] = os.getenv("ALERT_FROM_EMAIL") ALERT_TO_EMAIL: Optional[str] = os.getenv("ALERT_TO_EMAIL") # Webhook 告警配置 ALERT_WEBHOOK_URL: Optional[str] = os.getenv("ALERT_WEBHOOK_URL") # 告警阈值 ERROR_RATE_THRESHOLD: float = float(os.getenv("ERROR_RATE_THRESHOLD", "0.1")) # 错误率阈值 (10%) RESPONSE_TIME_THRESHOLD: int = int(os.getenv("RESPONSE_TIME_THRESHOLD", "5000")) # 响应时间阈值 (毫秒) ALERT_COOLDOWN: int = int(os.getenv("ALERT_COOLDOWN", "300")) # 告警冷却时间 (秒) class Config: env_file = ".env" case_sensitive = True @lru_cache() def get_settings() -> Settings: """获取配置实例(单例模式)""" return Settings() settings = get_settings()