Ai_GirlFriend/lover/config.py
2026-03-04 12:04:21 +08:00

172 lines
9.0 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
应用配置管理模块
统一管理所有环境变量和应用配置
"""
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"], # 先查找当前目录,再查找父目录
env_file_encoding="utf-8",
case_sensitive=True,
extra="ignore",
)
# 全局配置实例
settings = Settings()
def get_settings() -> Settings:
"""获取配置实例"""
return settings