79 lines
3.5 KiB
Python
79 lines
3.5 KiB
Python
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 = "AI发糕"
|
||
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_image_model: str = Field(
|
||
default="gpt-image-1",
|
||
alias="OPENAI_IMAGE_MODEL",
|
||
description="用于海报生成的图像模型",
|
||
)
|
||
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="本地封面图路径(容器内),将自动上传为永久素材;不配则使用内置灰底图上传",
|
||
)
|
||
poster_image_size: str = Field(
|
||
default="1024x1536",
|
||
alias="POSTER_IMAGE_SIZE",
|
||
description="AI 海报生成尺寸(OpenAI images.generate size)",
|
||
)
|
||
poster_max_images: int = Field(
|
||
default=6,
|
||
alias="POSTER_MAX_IMAGES",
|
||
description="单次自动生成海报上限(首段跳过后生效)",
|
||
)
|
||
poster_upload_max_bytes: int = Field(
|
||
default=950000,
|
||
alias="POSTER_UPLOAD_MAX_BYTES",
|
||
description="上传微信 uploadimg 前压缩目标字节数,预留余量避免超 1MB 限制",
|
||
)
|
||
|
||
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()
|