120 lines
4.5 KiB
Python
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()
|