172 lines
8.9 KiB
Python
172 lines
8.9 KiB
Python
"""
|
||
应用配置管理模块
|
||
统一管理所有环境变量和应用配置
|
||
"""
|
||
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://192.168.1.164: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
|