finyx_data_ai/app/core/config.py
2026-01-11 07:48:19 +08:00

120 lines
4.5 KiB
Python

"""
应用配置管理
"""
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()