from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore") app_name: str = "X2WeChat Studio" openai_api_key: str | None = Field(default=None, alias="OPENAI_API_KEY") openai_base_url: str | None = Field(default=None, alias="OPENAI_BASE_URL") openai_model: str = Field(default="gpt-4.1-mini", alias="OPENAI_MODEL") openai_timeout: float = Field( default=120.0, alias="OPENAI_TIMEOUT", description="HTTP 等待模型单轮响应的最长时间(秒)。通义长文 JSON 建议 120~180", ) openai_max_retries: int = Field( default=0, alias="OPENAI_MAX_RETRIES", description="OpenAI SDK 自动重试次数。为避免单次请求被重试拉长,默认 0。", ) openai_max_output_tokens: int = Field( default=8192, alias="OPENAI_MAX_OUTPUT_TOKENS", description="单次模型输出 token 上限;通义等长文 JSON 需足够大", ) openai_source_max_chars: int = Field(default=5000, alias="OPENAI_SOURCE_MAX_CHARS") ai_soft_accept: bool = Field( default=True, alias="AI_SOFT_ACCEPT", description="质检未通过时仍输出模型洗稿正文(mode=ai,quality_notes 记录问题),仅模型完全失败时用保底稿", ) wechat_appid: str | None = Field(default=None, alias="WECHAT_APPID") wechat_secret: str | None = Field(default=None, alias="WECHAT_SECRET") wechat_author: str = Field(default="AI 编辑部", alias="WECHAT_AUTHOR") wechat_thumb_media_id: str | None = Field( default=None, alias="WECHAT_THUMB_MEDIA_ID", description="草稿图文封面:永久素材 media_id(素材库或 add_material)。与 WECHAT_THUMB_IMAGE_PATH 二选一即可", ) wechat_thumb_image_path: str | None = Field( default=None, alias="WECHAT_THUMB_IMAGE_PATH", description="本地封面图路径(容器内),将自动上传为永久素材;不配则使用内置灰底图上传", ) im_webhook_url: str | None = Field(default=None, alias="IM_WEBHOOK_URL") im_secret: str | None = Field(default=None, alias="IM_SECRET") auth_db_path: str = Field(default="./data/app.db", alias="AUTH_DB_PATH") auth_cookie_name: str = Field(default="x2ws_session", alias="AUTH_COOKIE_NAME") auth_session_ttl_sec: int = Field(default=86400, alias="AUTH_SESSION_TTL_SEC") auth_remember_session_ttl_sec: int = Field(default=604800, alias="AUTH_REMEMBER_SESSION_TTL_SEC") auth_password_reset_key: str | None = Field(default="x2ws-reset-2026", alias="AUTH_PASSWORD_RESET_KEY") settings = Settings()