docs: C ABI migration campaign plans, handoffs and roadmap

Complete documentation set for the facade migration (B1-R6) and beyond:
facade-migration-roadmap, handoffs v3-v6, R5 guides, R6 cleanup plan,
R7 pure-ABI plan, long-term plans (riir/ai-agent/gtest/ui-redesign),
updated Chinese README draft, UI design mockups, and the Google Test +
struct-typedef rules in CONTRIBUTING.
This commit is contained in:
2026-07-26 22:42:44 +08:00
parent fcf717f6a7
commit c486c853ff
22 changed files with 3482 additions and 4 deletions
+141
View File
@@ -0,0 +1,141 @@
# AI Agent 设计文档(RIIR 拆分后长期规划)
> 本文是 Oak 引入 AI 能力的长期设计,**执行前提是 RIIR 绞杀者拆分完成**
> (见 [`riir.md`](riir.md))。彼时 `liboakengine.so` 已不存在,取而代之的是
> 一组以纯 C ABI 为缝的小动态库。本文面向没有当前对话记忆的执行者,自包含。
>
> **一句话**:把多模态 LLM 当成引擎 C ABI 的**第三个一等消费者**
> (继 oak-cli、oak-render-worker 之后),用 MCP 暴露策展过的工具面,
> 用渲染管线把帧喂回给多模态模型,形成"编辑 → 看图 → 再编辑"的视觉闭环。
---
## 1. 定位与前提
### 1.1 前提(未满足不动工)
- RIIR 拆分战役完成:引擎已拆为 §2.1 的小库;各库导出仅 C 符号;
`oakengine_*` facade 壳稳定且全量测试绿。
- Google Test 已是唯一测试框架;`gtest_discover_tests` 已接入。
- 本文不改动 RIIR 既定的模块划分,只在模块化树上**新增叶子**。
### 1.2 设计铁律(继承自迁移/拆分战役)
1. AI Agent **只经 C ABI** 访问引擎,一行 engine C++ 都不碰;不污染符号边界。
2. Agent 的一切编辑动作**必须可撤销**(undoable 原语),UI 默认"确认后执行"。
3. 不为 AI 发明新的引擎内部机制;工具面是现有 facade/小库的组合。
4. 引擎各模块**不得新增 Qt 依赖、不得新增 QObject 信号/moc 类**。
## 2. 总体架构
### 2.1 在模块化树上的位置
```
app / oak-cli / oak-render-worker / oak-agent / oak-mcp-server
liboakengine-facade(壳:capi + 事件 + init
┌────────┬────────┼─────────┬──────────┐
oaktask oakrender oakplugin oakaudio oakserialize
│ │ │ │ │
└────────┴────┬───┴──────────┴──────────┘
oakmodel(节点图 + 项目模型 + 时间线模型)
┌────────┼─────────┐
oakcodec liboakcore oakbackendGPU 插件)
ffmpeg_bridge
```
**新增三个叶子组件**(与 oak-cli、oak-render-worker 平级,都是纯消费者):
- **`oak-mcp-server`**:把策展过的工具面经 MCP 暴露给任何 LLM 客户端。
- **`oak-agent`**:无头 Agent 运行时(对话编排 + 视觉闭环),供脚本/CI/本地使用。
- **editor AI 面板**app 内的聊天/操作日志/确认界面,与 `oak-agent` 复用同一工具面。
AI 功能**不进入** oakmodel、oakrender 等引擎模块,引擎核心对 AI 无感知。
### 2.2 视觉闭环(本设计的核心)
```
多模态 LLM ──► oak-agent ──► facade/小库执行编辑 ──► 渲染取帧 ──► PNG ──► 回喂 LLM
▲ │
└──────────────── 看图判断(效果/切点/内容定位) ◄───────────────┘
```
- **验证式**:每次编辑后取一帧,LLM 判断"效果对不对"。
- **内容感知式**:沿时间线批量取缩略图拼 contact sheetLLM 扫图定位
"人何时进画面""哪里该切"),Agent 据此下刀——自动粗剪/打点的雏形。
- **连续回放**:经 playback 族起范围播放,按间隔采样帧。
## 3. 工具面(策展,非全量 facade)
**不暴露全部 ~200+ facade 函数**,而是策展约 25 个高层工具,每个是 facade/小库
的组合。`oak-mcp-server` 内部就是一个薄模块,链接 facade 壳与相关小库。
| 工具 | 落到哪个库 | 说明 |
|---|---|---|
| `create_project` / `open_project` / `save_project` | facade 壳 + oakmodel | 工程生命周期 |
| `probe_media` / `import_footage` / `get_media_info` | oakcodec + facade 壳 | 媒体探测与导入 |
| `add_track` / `add_clip` / `trim_clip` / `ripple` / `add_transition` / `add_marker` | oakmodel(经 facade 时间线族) | 时间线编辑 |
| `add_effect(effect_id)` / `set_param` / `set_keyframe` | oakmodel(经 facade node 族) | 节点与关键帧 |
| `apply_lut` / `set_color_transform` | oakmodel + facade color 族 | 调色 |
| `get_frame(time)` / `get_thumbnails(range,n)` / `get_audio_levels` | oakrender + oakbackend | **视觉闭环的取帧口** |
| `export_render(params)` | oaktask + oakcodec | 导出 |
**取帧→PNG 通路**(视觉闭环关键路径):
`get_frame` 经 oakrender 的预览请求得到 RGBA 帧(POD:`宽/高/字节流`),
再经 oakcodec 的 OIIO 编码器出 PNGbase64 后作为图片消息发给 LLM。
缩略图用同一路径降采样,多张拼 contact sheet。
## 4. 协议:MCPModel Context Protocol
工具协议**定为 MCP**,理由:
- render-worker 已在用 **NDJSON over stdin/stdout 的 IPC**——MCP 本质是该模式
的标准化,实现路径一致。
- 暴露成 `oak-mcp-server` 后,**外部 LLM 客户端(Claude Desktop、各类 agent
框架)可直接连接复用**,无需自研对话编排。
- `oak-agent` 与 editor AI 面板都连同一个 MCP server,**一份工具面,多处消费**。
## 5. 模型层
抽象 `LLMProvider` 接口(输入:消息 + 图片;输出:文本 + tool_calls),两个后端:
- **云端**Claude / GPT 多模态(效果优先)。
- **本地**llama.cpp 跑 Qwen-VL / LLaVA 类多模态模型(隐私、离线优先)。
API key 只走环境变量,**绝不写入 config / 工程文件**。无 key 时优雅降级为
"仅本地工具"(仍可用 MCP,但不做对话编排)。
## 6. 安全
- **可撤销**:所有编辑走 undoable 原语;AI 面板提供"撤销整段会话"。
- **确认模式**:默认每次 Agent 动作需用户确认才 apply;可切换自动模式。
- **沙箱会话**:Agent 默认在临时工程中操作,用户接受后才落盘到真实工程。
- **资源**:取帧/扫描限帧率与分辨率上限,防止批量取帧拖垮渲染进程。
## 7. 可测试(与项目风格一致)
1. **Mock LLM server**:录制/回放 tool_call 序列与固定回复,让 Agent loop 在
CI 无 key 无网络跑通(Google Test)。
2. **黄金帧校验**:复用 render-worker 端到端 harness(真实渲染 ≥2 帧 +
像素非全黑 + 一致性断言),验证"Agent 的编辑确实改变了画面"。
3. **会话回放**tool_call + 帧哈希落盘日志,可回放复现、可作测试夹具。
## 8. 里程碑(RIIR 完成后启动)
1. **M1 工具面**`oak-mcp-server`facade → MCP~25 工具)+ 取帧→PNG 通路。
2. **M2 无头闭环**Mock LLM + `oak-agent`,跑通"LLM→工具→取帧→回喂"
CI 可测(无网络)。
3. **M3 AI 面板**:editor 内聊天 + 操作日志 + 确认模式 + 撤销会话。
4. **M4 本地模型与内容感知**llama.cpp provider、时间线扫描打点、自动粗剪。
## 9. 风险与边界(明确不做)
- **不**把 LLM/推理放进 oakmodel 或任何引擎模块(引擎对 AI 无感知)。
- **不**为 AI 绕过 C ABI 直接调 engine C++(边界不污染)。
- **不**把 API key 落盘到工程/config。
- **不**让取帧回路阻塞 GUI 线程(取帧走渲染/后台路径,UI marshal 回主线程)。
- 第三方大模型客户端的接入细节(OAuth、计费、配额)**超出本文范围**,按需另立文档。