init biliup-next
This commit is contained in:
156
docs/plugin-system.md
Normal file
156
docs/plugin-system.md
Normal file
@ -0,0 +1,156 @@
|
||||
# Plugin System
|
||||
|
||||
## Goal
|
||||
|
||||
插件系统的目标不是“让任何东西都能热插拔”,而是为未来的能力替换和扩展提供稳定边界。
|
||||
|
||||
优先支持:
|
||||
|
||||
- 转录提供者替换
|
||||
- 歌曲识别提供者替换
|
||||
- 上传器替换
|
||||
- 评论策略替换
|
||||
- 合集策略替换
|
||||
- 输入源扩展
|
||||
|
||||
## Design Principles
|
||||
|
||||
借鉴 OpenClaw 的思路,采用 `manifest-first` + `registry` 设计。
|
||||
|
||||
原则:
|
||||
|
||||
- 插件先注册元信息,再执行运行时代码
|
||||
- 控制面优先读取 manifest 和 schema
|
||||
- 核心系统只依赖抽象接口和 registry
|
||||
- 插件配置必须可校验
|
||||
|
||||
## Plugin Composition
|
||||
|
||||
每个插件由两部分组成:
|
||||
|
||||
### 1. Manifest
|
||||
|
||||
描述插件的元信息和配置能力。
|
||||
|
||||
例如:
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "codex-song-detector",
|
||||
"name": "Codex Song Detector",
|
||||
"version": "0.1.0",
|
||||
"type": "song_detector",
|
||||
"entrypoint": "plugins.codex_song_detector.runtime:register",
|
||||
"configSchema": "plugins/codex_song_detector/config.schema.json",
|
||||
"capabilities": ["song_detect"],
|
||||
"enabledByDefault": true
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Runtime
|
||||
|
||||
真正实现业务逻辑的代码。
|
||||
|
||||
## Registry
|
||||
|
||||
系统启动时统一构建 registry。
|
||||
|
||||
registry 负责:
|
||||
|
||||
- 注册插件能力
|
||||
- 按类型查找实现
|
||||
- 根据配置激活当前 provider
|
||||
|
||||
### Registry Types
|
||||
|
||||
- `ingest_provider`
|
||||
- `transcribe_provider`
|
||||
- `song_detector`
|
||||
- `split_provider`
|
||||
- `publish_provider`
|
||||
- `comment_strategy`
|
||||
- `collection_strategy`
|
||||
|
||||
## Plugin Loading Flow
|
||||
|
||||
```text
|
||||
Discover manifests
|
||||
-> Validate manifests
|
||||
-> Register capabilities in registry
|
||||
-> Load plugin config schema
|
||||
-> Validate plugin config
|
||||
-> Activate runtime implementation
|
||||
```
|
||||
|
||||
## Why Manifest-First
|
||||
|
||||
这样设计有 4 个直接好处:
|
||||
|
||||
- 管理台可以在不执行插件代码时展示插件信息
|
||||
- UI 可以根据 schema 渲染配置表单
|
||||
- 系统可以提前发现缺失字段或不兼容版本
|
||||
- 插件运行失败不会影响元数据层的可见性
|
||||
|
||||
## Suggested Plugin Boundaries
|
||||
|
||||
### Transcribe Provider
|
||||
|
||||
示例:
|
||||
|
||||
- `groq`
|
||||
- `openai`
|
||||
- `local_whisper`
|
||||
|
||||
### Song Detector
|
||||
|
||||
示例:
|
||||
|
||||
- `codex`
|
||||
- `rule_engine`
|
||||
- `custom_llm`
|
||||
|
||||
### Publish Provider
|
||||
|
||||
示例:
|
||||
|
||||
- `biliup_cli`
|
||||
- `bilibili_api`
|
||||
|
||||
### Collection Strategy
|
||||
|
||||
示例:
|
||||
|
||||
- `default_song_collection`
|
||||
- `title_match_full_video`
|
||||
- `manual_binding`
|
||||
|
||||
## Control Plane Integration
|
||||
|
||||
插件系统必须服务于控制面。
|
||||
|
||||
因此管理台至少需要知道:
|
||||
|
||||
- 当前有哪些插件
|
||||
- 每个插件类型是什么
|
||||
- 当前启用的是哪一个
|
||||
- 配置是否有效
|
||||
- 最近一次健康检查结果
|
||||
|
||||
## Restrictions
|
||||
|
||||
为了避免再次走向“任意脚本散落”,插件系统需要约束:
|
||||
|
||||
- 插件不得直接修改核心数据库结构
|
||||
- 插件不得绕过统一配置系统
|
||||
- 插件不得私自写独立日志目录作为唯一状态来源
|
||||
- 插件不得直接互相调用具体实现
|
||||
|
||||
## Initial Strategy
|
||||
|
||||
第一阶段不追求真正的第三方插件生态。
|
||||
|
||||
先实现“内置插件化”:
|
||||
|
||||
- 核心仓库内提供多个 provider
|
||||
- 统一用 manifest + registry 管理
|
||||
- 等边界稳定后,再考虑开放外部插件目录
|
||||
Reference in New Issue
Block a user