Ai_GirlFriend/lover/config.py

172 lines
9.0 KiB
Python
Raw Permalink Normal View History

2026-01-31 19:15:41 +08:00
"""
应用配置管理模块
统一管理所有环境变量和应用配置
"""
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(
2026-02-04 19:26:08 +08:00
default="http://127.0.0.1:30100/api/user_basic/get_user_basic",
2026-01-31 19:15:41 +08:00
env="USER_INFO_API",
)
model_config = SettingsConfigDict(
2026-03-04 12:04:21 +08:00
env_file=[".env", "../.env"], # 先查找当前目录,再查找父目录
2026-01-31 19:15:41 +08:00
env_file_encoding="utf-8",
case_sensitive=True,
extra="ignore",
)
# 全局配置实例
settings = Settings()
def get_settings() -> Settings:
"""获取配置实例"""
return settings