Files
video-gen/video-gen-api/app/config.py
T
2026-06-02 14:28:26 +08:00

105 lines
3.4 KiB
Python

from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")
APP_NAME: str = "VideoGen API"
APP_VERSION: str = "1.0.0"
DEBUG: bool = False
SECRET_KEY: str = "change-me"
DATABASE_URL: str = "sqlite+aiosqlite:///./videogen.db"
REDIS_URL: str = "" # Leave empty to disable Redis (rate limiting, captcha)
JWT_ALGORITHM: str = "HS256"
JWT_EXPIRE_MINUTES: int = 1440
JWT_EXPIRE_REMEMBER_MINUTES: int = 10080
SEEDANCE_API_KEY: str = ""
SEEDANCE_API_BASE: str = "https://ark.cn-beijing.volces.com/api/v3"
SEEDANCE_CALLBACK_URL: str = ""
LLM_API_BASE: str = "https://api.openai.com/v1"
LLM_API_KEY: str = ""
LLM_MODEL: str = "gpt-4o"
LLM_MOCK: bool = True
ENCRYPTION_KEY: str = "changeme-32bytes-base64-key-here!!"
# SMS settings
SMS_API_URL: str = ""
SMS_API_KEY: str = ""
SMS_SIGN_NAME: str = "VideoGen"
SMS_TEMPLATE_CODE: str = "SMS_001"
SMS_MOCK: bool = True
# Payment settings
WECHAT_MCH_ID: str = ""
WECHAT_API_KEY: str = ""
WECHAT_CERT_PATH: str = ""
ALIPAY_APP_ID: str = ""
ALIPAY_PRIVATE_KEY: str = ""
ALIPAY_PUBLIC_KEY: str = ""
PAYMENT_MOCK: bool = True
STORAGE_TYPE: str = "local"
STORAGE_LOCAL_PATH: str = "./storage/generate/videos"
STORAGE_IMAGE_LOCAL_PATH: str = "./storage/generate/images"
STORAGE_VIDEO_COVER_LOCAL_PATH: str = "./storage/generate/covers"
UPLOAD_LOCAL_PATH: str = "./storage/uploads"
# 本地视频封面截帧配置。
# 说明:
# - FFMPEG_BIN 为空时自动从系统 PATH 查找 ffmpeg / ffmpeg.exe。
# - VIDEO_COVER_TIMEOUT_SECONDS 必须较短,避免 ffmpeg 异常卡住下载 worker。
FFMPEG_BIN: str = ""
VIDEO_COVER_SEEK_TIME: str = "00:00:01"
VIDEO_COVER_FALLBACK_SEEK_TIME: str = "00:00:00"
VIDEO_COVER_WIDTH: int = 720
VIDEO_COVER_TIMEOUT_SECONDS: int = 15
VIDEO_COVER_FORMAT: str = "jpg"
CAPTCHA_ENABLED: bool = True
BASE_URL: str = "http://ceshi.apiforeign.minzhong.cn"
CORS_ORIGINS: list[str] = ["*"]
RATE_LIMIT_ENABLED: bool = True
# ChatAPI async generation pipeline settings
CELERY_BROKER_URL: str = ""
CELERY_RESULT_BACKEND: str = ""
CHATAPI_REQUEST_TIMEOUT_SECONDS: int = 120
CHATAPI_VIDEO_FPS: float = 0.5
CHATAPI_ASYNC_MAX_RETRIES: int = 3
CHATAPI_ASYNC_RETRY_BACKOFF_SECONDS: int = 30
CHATAPI_ASYNC_POLL_INTERVAL_SECONDS: int = 30
CHATAPI_ASYNC_IMAGE_DEADLINE_MINUTES: int = 10
CHATAPI_ASYNC_VIDEO_DEADLINE_MINUTES: int = 30
# Distributed provider concurrency limits. 0 means disabled/no-op.
ARK_CHAT_PROMPT_MAX_CONCURRENCY: int = 20
ARK_IMAGE_CREATE_MAX_CONCURRENCY: int = 10
ARK_VIDEO_CREATE_MAX_CONCURRENCY: int = 10
ARK_IMAGE_POLL_MAX_CONCURRENCY: int = 50
ARK_VIDEO_POLL_MAX_CONCURRENCY: int = 50
RESULT_DOWNLOAD_MAX_CONCURRENCY: int = 10
PROVIDER_LIMIT_WAIT_TIMEOUT_SECONDS: float = 30.0
PROVIDER_LIMIT_TOKEN_TTL_SECONDS: int = 600
CELERY_DB_POOL_SIZE: int = 1
CELERY_DB_MAX_OVERFLOW: int = 1
CELERY_DB_POOL_TIMEOUT: int = 30
CELERY_DB_POOL_RECYCLE: int = 1800
RESOURCE_SIGN_SECRET: str = "resource-signature-secret-key-for-API-authentication"
RESOURCE_SIGN_EXPIRE_SECONDS: int = 60
RESOURCE_SIGN_ARG_EXPIRE: str = "exp"
RESOURCE_SIGN_ARG_SIGNATURE: str = "sign"
settings = Settings()