# Config System ## Design Goal 配置系统不是辅助功能,而是新系统的控制面基础设施。 目标: - 所有运行参数有统一来源 - 配置可被严格校验 - 配置可被 UI、CLI、文件三种方式修改 - 配置变更可审计 - 无效配置不得直接污染运行态 ## Design Principles 借鉴 OpenClaw 的做法,配置系统采用 `schema-first` 设计。 核心原则: - 所有配置项必须先声明在 schema 中 - 所有模块只能通过配置服务读取配置 - UI 表单由 schema 驱动渲染 - 保存前必须校验 - 校验失败不允许生效 - 配置有版本和变更记录 ## Config Sources ### 1. Default Config 系统默认值,由代码内置或默认配置文件提供。 ### 2. Active Config 当前生效的正式配置。 建议位置: - `biliup-next/config/settings.json` ### 3. Staged Config 用户在 UI 或 CLI 中提交、但尚未生效的待校验配置。 建议位置: - `biliup-next/config/settings.staged.json` ### 4. Schema 定义配置结构、类型、默认值、枚举范围、校验规则和 UI 元信息。 建议位置: - `biliup-next/config/settings.schema.json` ## Config Flow ```text User edits config -> Write staged config -> Validate against schema -> Run dependency checks -> If valid: promote to active -> If invalid: keep current active config ``` ## Validation Layers ### 1. Schema Validation 检查: - 类型 - 必填字段 - 枚举值 - 数值范围 - 字段格式 ### 2. Semantic Validation 检查: - 路径是否存在 - 可执行文件是否可用 - season id 是否合法 - 依赖组合是否冲突 ### 3. Runtime Validation 检查: - provider 是否可初始化 - 凭证是否存在 - 外部连接是否可用 ## Suggested Config Groups ### runtime - `workspace_dir` - `database_path` - `log_level` - `scan_interval_seconds` ### paths - `stage_dir` - `backup_dir` - `session_dir` - `cookies_file` - `upload_config_file` ### ingest - `provider` - `min_duration_seconds` - `ffprobe_bin` - `yt_dlp_cmd` - `allowed_extensions` ### transcribe - `provider` - `groq_api_key` - `max_file_size_mb` - `ffmpeg_bin` ### song_detect - `provider` - `codex_cmd` - `qwen_cmd` - `poll_interval_seconds` ### split - `ffmpeg_bin` - `poll_interval_seconds` ### publish - `provider` - `biliup_path` - `cookie_file` - `retry_count` - `retry_schedule_minutes` - `retry_backoff_seconds` ### comment - `enabled` - `max_retries` - `base_delay_seconds` - `poll_interval_seconds` ### collection - `enabled` - `season_id_a` - `season_id_b` - `allow_fuzzy_full_video_match` - `append_collection_a_new_to_end` - `append_collection_b_new_to_end` ## UI Strategy 管理台不手写业务表单,而是由 schema 驱动生成配置界面。 每个配置项除了类型信息,还应有: - `title` - `description` - `group` - `ui:widget` - `ui:secret` - `ui:order` 这样可以让配置页面和底层配置保持同源。 ## Audit Trail 每次配置变更都应记录: - 修改人 - 修改时间 - 修改前值 - 修改后值 - 校验结果 - 是否已生效 ## Non-Goals - 不追求兼容任意格式的配置文件 - 不允许模块私自定义一份独立配置入口 - 不允许 UI 和代码维护两套不同的字段定义