""" 应用配置管理模块 统一管理所有环境变量和应用配置 """ from typing import Optional from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """应用配置类""" # ===== 应用基础配置 ===== APP_NAME: str = Field(default="LOVER", env="APP_NAME") APP_ENV: str = Field(default="development", env="APP_ENV") # development/production DEBUG: bool = Field(default=True, env="DEBUG") # ===== 数据库配置 ===== DATABASE_URL: str = Field( default="mysql+pymysql://root:password@localhost:3306/lover?charset=utf8mb4", env="DATABASE_URL", description="数据库连接字符串" ) DB_POOL_SIZE: int = Field(default=10, env="DB_POOL_SIZE") DB_POOL_MAX_OVERFLOW: int = Field(default=20, env="DB_POOL_MAX_OVERFLOW") # ===== 微信小程序配置 ===== WECHAT_APP_ID: str = Field(default="", env="WECHAT_APP_ID") WECHAT_APP_SECRET: str = Field(default="", env="WECHAT_APP_SECRET") # ===== JWT/认证配置 ===== JWT_SECRET_KEY: str = Field(default="your-secret-key-change-in-production", env="JWT_SECRET_KEY") JWT_ALGORITHM: str = Field(default="HS256", env="JWT_ALGORITHM") JWT_ACCESS_TOKEN_EXPIRE_MINUTES: int = Field(default=60*24*7, env="JWT_ACCESS_TOKEN_EXPIRE_MINUTES") # 7天 # ===== OSS 对象存储配置 (阿里云/腾讯云) ===== OSS_PROVIDER: str = Field(default="aliyun", env="OSS_PROVIDER") # aliyun/tencent/aws # 阿里云 OSS ALIYUN_OSS_ACCESS_KEY_ID: str = Field(default="", env="ALIYUN_OSS_ACCESS_KEY_ID") ALIYUN_OSS_ACCESS_KEY_SECRET: str = Field(default="", env="ALIYUN_OSS_ACCESS_KEY_SECRET") ALIYUN_OSS_BUCKET_NAME: str = Field(default="", env="ALIYUN_OSS_BUCKET_NAME") ALIYUN_OSS_ENDPOINT: str = Field(default="", env="ALIYUN_OSS_ENDPOINT") ALIYUN_OSS_CDN_DOMAIN: Optional[str] = Field(default=None, env="ALIYUN_OSS_CDN_DOMAIN") # 腾讯云 COS TENCENT_COS_SECRET_ID: str = Field(default="", env="TENCENT_COS_SECRET_ID") TENCENT_COS_SECRET_KEY: str = Field(default="", env="TENCENT_COS_SECRET_KEY") TENCENT_COS_BUCKET: str = Field(default="", env="TENCENT_COS_BUCKET") TENCENT_COS_REGION: str = Field(default="", env="TENCENT_COS_REGION") TENCENT_COS_CDN_DOMAIN: Optional[str] = Field(default=None, env="TENCENT_COS_CDN_DOMAIN") # ===== AI 大模型配置 ===== # LLM 聊天模型 LLM_PROVIDER: str = Field(default="openai", env="LLM_PROVIDER") # openai/azure/zhipu/qwen LLM_API_BASE: Optional[str] = Field(default=None, env="LLM_API_BASE") LLM_MODEL: str = Field(default="gpt-3.5-turbo", env="LLM_MODEL") LLM_TEMPERATURE: float = Field(default=0.8, env="LLM_TEMPERATURE") LLM_MAX_TOKENS: int = Field(default=2000, env="LLM_MAX_TOKENS") # AI 绘图模型 IMAGE_GEN_PROVIDER: str = Field(default="stability", env="IMAGE_GEN_PROVIDER") # stability/midjourney/dalle IMAGE_GEN_API_KEY: str = Field(default="", env="IMAGE_GEN_API_KEY") IMAGE_GEN_API_BASE: Optional[str] = Field(default=None, env="IMAGE_GEN_API_BASE") IMAGE_GEN_MODEL: str = Field(default="wan2.5-t2i-preview", env="IMAGE_GEN_MODEL") IMAGE_GEN_SIZE: Optional[str] = Field(default="960*1280", env="IMAGE_GEN_SIZE") # 宽*高,wan2.5 支持自定义 DASHSCOPE_API_KEY: Optional[str] = Field(default=None, env="DASHSCOPE_API_KEY") WAN26_ASYNC: bool = Field(default=True, env="WAN26_ASYNC") # wan2.6 默认使用异步任务 VISION_MODEL: str = Field(default="qwen3-vl-flash", env="VISION_MODEL") TRYON_MODEL: str = Field(default="aitryon", env="TRYON_MODEL") IMAGE_QUALITY_MODEL: str = Field(default="animate-anyone-detect-gen2", env="IMAGE_QUALITY_MODEL") VIDEO_GEN_MODEL: str = Field(default="wan2.2-i2v-flash", env="VIDEO_GEN_MODEL") VIDEO_GEN_RESOLUTION: str = Field(default="480P", env="VIDEO_GEN_RESOLUTION") VIDEO_GEN_DURATION: int = Field(default=5, env="VIDEO_GEN_DURATION") SING_MERGE_MAX_CONCURRENCY: int = Field(default=2, env="SING_MERGE_MAX_CONCURRENCY") EMO_MAX_CONCURRENCY: int = Field(default=1, env="EMO_MAX_CONCURRENCY") EMO_MIN_SEGMENT_SECONDS: int = Field(default=6, env="EMO_MIN_SEGMENT_SECONDS") # ===== 语音通话(ASR/LLM/TTS) ===== VOICE_CALL_ASR_MODEL: str = Field(default="paraformer-realtime-v2", env="VOICE_CALL_ASR_MODEL") VOICE_CALL_ASR_SAMPLE_RATE: int = Field(default=16000, env="VOICE_CALL_ASR_SAMPLE_RATE") VOICE_CALL_TTS_FORMAT: str = Field(default="mp3", env="VOICE_CALL_TTS_FORMAT") # mp3 / pcm VOICE_CALL_MAX_HISTORY: int = Field(default=20, env="VOICE_CALL_MAX_HISTORY") VOICE_CALL_TTS_MODEL: str = Field(default="cosyvoice-v2", env="VOICE_CALL_TTS_MODEL") VOICE_CALL_TTS_VOICE: str = Field(default="longxiaochun_v2", env="VOICE_CALL_TTS_VOICE") VOICE_CALL_IDLE_TIMEOUT: int = Field(default=60, env="VOICE_CALL_IDLE_TIMEOUT") # 秒,无音频则断开 VOICE_CALL_REQUIRE_PTT: bool = Field(default=False, env="VOICE_CALL_REQUIRE_PTT") # 是否要求按住说话 # TTS 语音合成 TTS_PROVIDER: str = Field(default="azure", env="TTS_PROVIDER") # azure/aliyun/tencent TTS_API_KEY: str = Field(default="", env="TTS_API_KEY") TTS_REGION: Optional[str] = Field(default=None, env="TTS_REGION") # ===== Redis 配置 (可选,用于缓存/队列) ===== REDIS_ENABLED: bool = Field(default=False, env="REDIS_ENABLED") REDIS_HOST: str = Field(default="localhost", env="REDIS_HOST") REDIS_PORT: int = Field(default=6379, env="REDIS_PORT") REDIS_PASSWORD: Optional[str] = Field(default=None, env="REDIS_PASSWORD") REDIS_DB: int = Field(default=0, env="REDIS_DB") # ===== 短信服务配置 (用于验证码) ===== SMS_PROVIDER: str = Field(default="aliyun", env="SMS_PROVIDER") # aliyun/tencent SMS_ACCESS_KEY_ID: str = Field(default="", env="SMS_ACCESS_KEY_ID") SMS_ACCESS_KEY_SECRET: str = Field(default="", env="SMS_ACCESS_KEY_SECRET") SMS_SIGN_NAME: str = Field(default="", env="SMS_SIGN_NAME") SMS_TEMPLATE_CODE: str = Field(default="", env="SMS_TEMPLATE_CODE") # ===== 微信支付配置 ===== WECHAT_PAY_MCHID: str = Field(default="", env="WECHAT_PAY_MCHID") WECHAT_PAY_API_V3_KEY: str = Field(default="", env="WECHAT_PAY_API_V3_KEY") WECHAT_PAY_SERIAL_NO: str = Field(default="", env="WECHAT_PAY_SERIAL_NO") WECHAT_PAY_PRIVATE_KEY_PATH: Optional[str] = Field(default=None, env="WECHAT_PAY_PRIVATE_KEY_PATH") WECHAT_PAY_NOTIFY_URL: str = Field(default="", env="WECHAT_PAY_NOTIFY_URL") # ===== 业务配置 ===== # 每日对话限制 DAILY_CHAT_LIMIT_FREE: int = Field(default=20, env="DAILY_CHAT_LIMIT_FREE") # 初始资源配置 INITIAL_IMAGE_GEN_LIMIT: int = Field(default=10, env="INITIAL_IMAGE_GEN_LIMIT") INITIAL_VIDEO_GEN_LIMIT: int = Field(default=3, env="INITIAL_VIDEO_GEN_LIMIT") INITIAL_VOICE_CALL_MINUTES: int = Field(default=5, env="INITIAL_VOICE_CALL_MINUTES") # 账户注销冷静期(天) ACCOUNT_DELETE_COOLDOWN_DAYS: int = Field(default=15, env="ACCOUNT_DELETE_COOLDOWN_DAYS") # ===== 内容安全配置 ===== CONTENT_CHECK_ENABLED: bool = Field(default=True, env="CONTENT_CHECK_ENABLED") # ===== 聊天与长记忆配置 ===== CHAT_LIMIT_DAILY: int = Field(default=80, env="CHAT_LIMIT_DAILY") CHAT_RECENT_WINDOW: int = Field(default=30, env="CHAT_RECENT_WINDOW") CHAT_SUMMARY_TRIGGER_MSGS: int = Field(default=30, env="CHAT_SUMMARY_TRIGGER_MSGS") CHAT_SUMMARY_TRIGGER_TOKENS: int = Field(default=6000, env="CHAT_SUMMARY_TRIGGER_TOKENS") CHAT_FACT_MAX_ROWS: int = Field(default=50, env="CHAT_FACT_MAX_ROWS") CHAT_CONTEXT_MAX_TOKENS: int = Field(default=12000, env="CHAT_CONTEXT_MAX_TOKENS") CHAT_STREAMING_DEFAULT: bool = Field(default=True, env="CHAT_STREAMING_DEFAULT") INNER_VOICE_DEFAULT: bool = Field(default=False, env="INNER_VOICE_DEFAULT") CHAT_REPLY_MAX_CHARS: int = Field(default=0, env="CHAT_REPLY_MAX_CHARS") # ===== 向量数据库配置 (用于 AI 记忆) ===== VECTOR_DB_ENABLED: bool = Field(default=False, env="VECTOR_DB_ENABLED") VECTOR_DB_TYPE: str = Field(default="chromadb", env="VECTOR_DB_TYPE") # chromadb/pinecone/milvus VECTOR_DB_HOST: Optional[str] = Field(default=None, env="VECTOR_DB_HOST") VECTOR_DB_PORT: Optional[int] = Field(default=None, env="VECTOR_DB_PORT") # ===== 日志配置 ===== LOG_LEVEL: str = Field(default="INFO", env="LOG_LEVEL") LOG_FILE_PATH: Optional[str] = Field(default="logs/app.log", env="LOG_FILE_PATH") # 用户信息拉取接口(FastAdmin 提供) USER_INFO_API: str = Field( default="http://127.0.0.1:30100/api/user_basic/get_user_basic", env="USER_INFO_API", ) model_config = SettingsConfigDict( env_file=".env", env_file_encoding="utf-8", case_sensitive=True, extra="ignore", ) # 全局配置实例 settings = Settings() def get_settings() -> Settings: """获取配置实例""" return settings