移植自 mac-agent-os 的 mediacrawler_adapter:不起子进程、不开页面,用浏览器里那份
登录态直接调抖音 Web 接口。产物键名照抄 store/douyin,所以 ingest 那条链路一个字不用改。
**目前能用的(真环境实测,非推断)**:
profile/other : 200, 7075 字节 —— 博主主页指标(粉丝/获赞/作品数/昵称)
aweme/detail : 200, 45425 字节 —— 单条作品详情(含点赞/评论/收藏/分享)
**目前不能用的:作品列表 `aweme/post`。** 两个互相独立的原因:
1. 这个接口被抖音单独升级成了真校验:不带 x-tt-argus 回 403「Uifid Not Found」,
带上 dummy 值回 200 + **空 body**。也就是说「头在不在」骗得过,「真校验」过不了。
同一套头打 profile/other 和 aweme/detail 都是通的 —— 抖音是挑着接口加保护的,
挑中的恰好是「批量拉作品列表」这个最敏感的动作。
2. 改走页面截获也不行:CDP 浏览器打开博主主页会落到「验证码中间页」(当天大量探测的
代价,过几小时要重测)。
所以现在的边界是:**已知作品的指标刷新能做,自动发现新作品做不了**。
**排查中控住变量后得到的两条事实**(都写进注释了):
· `Accept` / `Accept-Language` / `Referer` 才是主页接口能返回真数据的原因 —— 只有
UA+client hints+Cookie 时是 200 但仅 121 字节的空壳,补上这三个头变 7074 字节。
(我先前猜的 sec-ch-ua 不是关键。)
· 因此 UA 与 client hints 必须**成套地取自同一个浏览器**,所以 BrowserIdentity 一次
从 CDP 取齐 cookie + UA + hints,而不是各自写死。
「200 + 空 body 必须当场报错」也是刻意写死的:放过去它会在下游变成「这个博主没作品」,
把一次失败伪装成一条正常结果 —— 爬虫那条路正是这么栽的,还被翻译成「账号被封」。
测试 +11:cookie 解析、请求头成套性(含 uifid 缺失/回退)、产物键名与 store 对齐、
以及 _get 的三条失败路径(空 body / 403 带网关原话 / 正常返回)。
2029 lines
142 KiB
Markdown
2029 lines
142 KiB
Markdown
# AgentOS 项目变更日志
|
||
|
||
## [4.24.0] - 2026-10-03
|
||
|
||
### 🔄 新模块:人物置换(Wan2.2-Animate 接入视频工厂)
|
||
|
||
- **独立包** `05_tools/09_ave/scripts/person_swap/`(api / preprocess / service 三件套)
|
||
- **后端** `routes/person_swap.py`:6 个路由 `/api/person-swap/*`(状态/任务/上传/取消/受控文件服务)
|
||
- **前端** `views/person-swap.js` → 视频工厂「🔄 人物置换」:状态条 + 上传进度 + 任务轮询 + 成片下载
|
||
- **API 全链路校准(实测)**:两步式上传(`getPolicy` → OSS 直传);模型真名 **`wan2.2-animate-mix`**;
|
||
字段 `input.image_url` / `input.video_url` / `parameters.mode`;**std ¥0.6/秒 · pro ¥0.9/秒**
|
||
- **任务队列**:SQLite + 后台单 worker + 失败自动重试 + **月度费用护栏**
|
||
- **相对独立**:不占养号槽位(不经过 command_bus),独立队列与预算
|
||
|
||
### 🎙 声音链路(音频先行 + 对口型 + 分轨 + 音效)
|
||
|
||
- **音频先行**(`dubbing.pre_synthesize`):先合成台词音频 → 按音频**真实时长**调整镜头时长
|
||
(口型与节奏对得上的前提);音频存 `pre_audio/` 供后续复用,不重复 TTS
|
||
- **对口型**(百炼 **VideoRetalk** · ¥0.08/秒 · **1800 秒免费额度**):
|
||
仅对「**有台词 + 有出场人物**」的镜头做;音频复用先行产物;参考图取角色资产;失败自动退回原片段
|
||
- **声音分轨**:台词轨(与画面绑定)+ **旁白轨**(独立输出,避免重复混入主轨)
|
||
- **音效链路**:`load_sfx_assets` / `match_sfx` / `mix_segment(sfx_items)` 按 `at_second` **精确插入**
|
||
- **画面跟随音频对齐**(`composer/align.py`):音频变速会变调、画面变速无损 → **剪画面**;
|
||
对口型镜头跳过;变速比超 ±1.5x 跳过
|
||
- **一步到位**:出片完成自动配音混流 → `final_muxed.mp4`
|
||
|
||
### 🎨 去 AI 感体系
|
||
|
||
- **风格包**(`composer/realism.py`):9 种拍摄风格 —— 自拍第一人称 / 手持 Vlog / 伪纪录片 /
|
||
访谈纪实 / 电影感 / 商业棚拍 / 2D 动画 / 3D 动画 / 产品广告(每种含设备·光线·机位·质感·情绪·负面词)
|
||
- **反 AI 感**(`realism_boost`):3 档;**strong 档自动剔除「4K/超清/无瑕/大师作品」等反真实词**
|
||
(研究结论:这类词是"塑料感"的头号来源)
|
||
- **20 位真实导演风格库**(`composer/director_styles.py`):斯皮尔伯格 / 稀奇柯克 / 库布里克 /
|
||
黑泽明 / 塔可夫斯基 / 王家卫 / 诺兰 / 芬奇 / 维伦纽瓦 / 毕赣 / 张艺谋 / 侯孝贤 / 朴赍郁 / 马力克 等
|
||
—— 与拍摄风格**独立叠加**(风格 = 设备质感;导演 = 镜头语言与叙事逻辑)
|
||
- **参考图按景别分配**:特写/近景用**角色图**(保脸);全景/空镜用**场地图**(保环境)
|
||
- **研究归档**:`05_tools/09_ave/docs/realism/`(21 篇方法论原文)+ `PLANS/REALISM_GUIDE.md`
|
||
(来源:muse-video-skill「参考图优于文字描述」· lanshu-awesome-ai-video-kit · DirectorSKILL 等)
|
||
|
||
### 🔧 基础能力治理
|
||
|
||
- **能力清单对账**:修正 5 处「清单 ≠ 实际」;新增 `frame_chain` / `voice_lock` 登记(代码早已实现却未登记)
|
||
- **能力体检脚本** `capability_doctor.py`:静态核对 impl 文件 / api_key 配置 / 状态一致性,揪出"名不副实"
|
||
- **首尾帧衔接接线**(`chain_from_prev`):`kling_video.generate_video(tail_image_path=)` 透传 +
|
||
新增 `composer/frames.py`(本地 ffmpeg 抽首/尾帧,零成本)
|
||
- **多角色一致性**:导演「多角色同框纪律」(避免同框露脸 → 正反打/过肩/中远景)+ 逐镜头 `cast_in_shot` 标注
|
||
- **出片质检** `composer/qa.py`:接触印相表(抽帧拼图,一眼核对口型 / 跨镜人脸一致性)
|
||
- **任务持久化 + 续跑**:任务状态落 `job.json`;重启后标记 `interrupted`;**续跑复用已生成镜头**(不重复扣费)
|
||
|
||
### 🐛 修复(均为实测定位的真 bug)
|
||
|
||
- **Pexels 素材搜索一直 403**:代码缺 `User-Agent`(key 本身可用)→ 现已可用(3879 条竖屏素材)
|
||
- **音效库上传 404**:`AssetStore.create()` 的 id 优先级写反(写成 name 优先 → 传入 id 被忽略)
|
||
- **影棚词污染提示词**:资产描述里的「柔光箱/85mm/纯灰色背景」被注入导演 → 新增清理 + 丢弃空壳标签
|
||
- **过度清理 bug**:正则 `\w` 匹配中文 → 正常描述被误清空
|
||
- **参考图解析不认演员表**:多角色分镜全部退化为文生视频(人脸随机)
|
||
- **TTS 长期不可用**(三个真根因):模型名无效(`cosyvoice-v3.5-plus` 不存在,应为 `v3-flash`)/
|
||
`instruction` 参数触发 `418` / 路径少一层
|
||
- **可灵时长档位阈值错**:7→5.2(原 6 秒镜头只生成 5 秒 → 拼接穿帮)
|
||
- **写死的假 ffprobe**:`~/.local/bin/ffprobe` 是 ffmpeg 的软链 → 新增身份校验 + stderr 解析兜底
|
||
|
||
### ⚠️ 已知限制
|
||
|
||
- 可灵只接受**一张**输入图 → 「角色参考图(保人脸)」与「上一镜尾帧(保连续)」**二选一**(现优先保人脸)
|
||
- 图生视频的**多角色同框**只能保主角人脸(配角不保)
|
||
- 音效库暂缺「倒吸一口气」「叹气」素材
|
||
- **前端改动需硬刷新**(`Cmd+Shift+R`):视图按 chunk 加载
|
||
|
||
|
||
## [4.23.1] - 2026-10-02
|
||
|
||
### 生成前审核「全链条」推广(角色生成器 / 导演创作 / 流程画布)
|
||
|
||
承接 4.23.0(资产参考图),把「**生成前看到将发送的内容**」推广到其余所有生成入口:
|
||
|
||
- **🎨 角色生成器**(`char-gen.js`)
|
||
- 点「生成」→ 审核面板显示**完整提示词**(**可编辑**)+ 视角 / 引擎 / 张数 / 费用
|
||
- 确认后带 `prompt_override` 生成(后端**优先用编辑后的提示词**)
|
||
- **🎬 导演创作 · 生成成片**(`ave-director.js`)
|
||
- 出片前审核面板列出**每个镜头的完整提示词** + 能力 / 引擎 / 是否绑角色 + 费用明细
|
||
- **🎞️ 流程画布 · 运行**(`workflow.js`)
|
||
- 运行前审核面板列出**各生成节点的配置参数** + 镜头上限 + 费用
|
||
- 并提示:具体镜头提示词由上游「分镜」节点在运行时组装 → 可先去「导演创作」预览
|
||
- **🌐 全局挂载**(`inline.js`):`window.openGenerateReview` —— 任何视图都能用同一个审核面板
|
||
- **后端**(`routes/ave_assets.py`):生成接口支持 `prompt_override`(用户改过的提示词优先)
|
||
- **流程状态**:新增「就绪」(`ready`)徽章 —— 表示**等待全部上游节点完成**
|
||
|
||
### 修复
|
||
|
||
- 补上缺失的 `_sbSetVfx()` 定义(此前 HTML 有引用但**无函数定义** → 选特效下拉会报错)
|
||
|
||
## [4.23.0] - 2026-10-02
|
||
|
||
### 🔍 生成前「内容审核」(不再只有费用提示)+ 通用审核组件
|
||
|
||
**用户反馈(关键)**:"只告诉我有费用、却不告诉我传了什么,那不叫审核,那叫通知" + "我要看到传给大模型的是什么"
|
||
|
||
**新增通用组件** `frontend/src/views/gen-review.js` → `openGenerateReview(opts)`
|
||
- 可复用的「生成前审核面板」:显示将发送的**完整内容**(可编辑)+ 参数 + 费用
|
||
- 支持:多字段编辑 · 参数表格 · **来源字段**折叠展示 · 提示说明 · 确认/取消
|
||
- 所有生成入口统一用它 → 交互一致,"每一步前面都能调整"
|
||
|
||
**首批接入:🎨 资产参考图生成**(用户点名的链路)
|
||
- **原问题**:点「AI 生成」直接调接口,提示词由后端组装,**前端完全看不到**(只有"有费用"的确认框)
|
||
- **新增后端接口** `POST /{kind}/{aid}/preview-image-prompt`(**纯计算,零费用**)
|
||
返回:完整提示词 + 自动组装版本 + 供应商/尺寸/槽位 + 费用提示 + **来源字段**
|
||
- **前端改造**(`assets-common.js`):
|
||
- 点「🎨 AI 生成」→ 先调 preview → 弹**审核面板**(提示词可直接编辑)
|
||
- 面板提示:"描述不够具体时先回去补字段再生成"(引导提高质量)
|
||
- 点「✅ 确认生成」才真正调生成接口(**传用户编辑后的提示词**)
|
||
- 审核组件未加载时**兜底**:确认框里也**显示完整提示词**(不再只讲费用)
|
||
|
||
**实测**(场景「病房-302」→ 生成「全景」参考图):
|
||
```
|
||
供应商: 可灵(Kling) | 尺寸: 9:16 | 槽位: wide
|
||
费用: 可灵图片按张计费(约 ¥0.2~0.5/张)
|
||
|
||
📝 将发送给模型的完整提示词:
|
||
场景空间:病房-302,靠窗有一张病床,床头柜放水杯,窗外能看到医院走廊,
|
||
空间类型:医院单人病房,光源状态:日光灯偏冷,窗外自然光,
|
||
材质要点:白色墙面、浅灰地板、金属床架,全景广角,真实空间摄影,自然透视,无人物,高清
|
||
|
||
来源字段: {name, space_type, lighting, materials, description}
|
||
```
|
||
|
||
### 📋 生成入口审核现状盘点(供后续推广)
|
||
|
||
| 生成入口 | 之前 | 现在 |
|
||
|:--|:--|:--|
|
||
| 🎨 资产参考图生成 | ❌ 只有费用确认 | ✅ **完整提示词可编辑** |
|
||
| 角色生成器 | 🟡 有实时预览,生成确认框不带提示词 | ⏳ 待接入 |
|
||
| 导演创作 · 生成成片 | 🟡 有"预览方案",确认框不显示提示词 | ⏳ 待接入 |
|
||
| 流程画布 · 运行 | 🟡 只有费用确认 | ⏳ 待接入 |
|
||
| 评论/讨论生成 | 🟡 生成后可见,生成前无预览 | ⏳ 待接入 |
|
||
|
||
## [4.22.1] - 2026-10-02
|
||
|
||
### 🔴 修复:变速(慢动作/快进)音轨丢失 + 前端接线
|
||
|
||
**用户反馈**:"慢动作也做出来,就是音频不见了" —— 用户报告正确 ✓
|
||
|
||
**真根因**(`composer/speed_ramp.py` 的 ffmpeg filter 图非法):
|
||
- `_build_atempo_filter()` 返回 `[0:a]atempo=0.5[a]`(**自带**输入/输出标签)
|
||
- 但调用处又拼了一个 `[a]` → `setpts=2.0*PTS[v];[0:a]atempo=0.5[a][a]` ❌
|
||
- → ffmpeg 报 filter 图错误,音频编码 **0 字节**,输出只剩画面
|
||
(`-shortest` 让结果看起来像"原片复制")
|
||
|
||
**修复**:去掉多余的 `[a]`(af 已自带标签)
|
||
|
||
**实测**(用有音轨的成片,源 12.46 秒):
|
||
|
||
| 变速 | 结果 | 音轨 |
|
||
|:--|:--|:--|
|
||
| 0.5x 慢动作 | 12.46s → **24.93s**(正好 2 倍) | ✅ 有音轨 |
|
||
| 2.0x 快进 | 12.46s → **6.22s**(正好一半) | ✅ 有音轨 |
|
||
| 1.0x 正常 | 保持原样 | — |
|
||
|
||
**前端接线**(让变速真正可用):
|
||
- 分镜卡片加「**速度**」下拉(1x / 0.5x 慢动作 / 0.25x 超慢 / 2x 快进)
|
||
- 新增 `_sbSetSpeed()`(写 `shot.speed.factor`)→ 执行器读它并调 `speed_ramp`
|
||
- **补上缺失的 `_sbSetVfx()`**(此前 HTML 引用了但未定义 → 特效下拉会报错)
|
||
|
||
**变速是零成本**(纯本地 FFmpeg,不调 AI)✓
|
||
|
||
## [4.22.0] - 2026-10-02
|
||
|
||
### ✨ 视频特效接入(可灵运镜控制)+ vfx 能力分层调研
|
||
|
||
**背景**:用户问"视频特效要不要接入" —— 做了调研并落地可立即用的部分。
|
||
|
||
**实现:运镜类特效 → 可灵 `camera_control`**
|
||
- `KlingVideoClient.build_camera_control()`:特效类型 → 可灵运镜参数
|
||
- 🌀 环绕运镜 → `{type: simple, config: {horizontal: 6}}`
|
||
- ⏱️ 子弹时间 → `{type: simple, config: {roll: 5}}`
|
||
- 🐢 慢动作 → `{type: simple, config: {vertical: 3}}`
|
||
- 🔍 焦点锁定 → `{type: simple, config: {zoom: 4}}`
|
||
- + 可灵官方预设 4 种:⬇️ 下摇后拉 / ⬆️ 前推上摇 / ↩️ 左转前推 / ↪️ 右转前推
|
||
- `generate_video()` 新增 `vfx_type` / `vfx_params` → 提交任务时带 `camera_control`
|
||
- 分镜卡片:生成能力选「✨ 视频特效」时**出现特效下拉**(8 种);也可从「镜头语言」的"环绕/推/拉"自动映射
|
||
- 「本镜头将用」显示具体特效名(如 `✨ 视频特效(🌀 环绕运镜)· 引擎:可灵运镜控制 camera_control`)
|
||
|
||
**实测**(Playwright 端到端):
|
||
```
|
||
分镜卡片 6 个 / 每卡片 6 个下拉
|
||
设为 vfx → 特效下拉出现(8 选项)
|
||
选「环绕运镜」→ 文案带出特效名 ✓
|
||
无 console 错误 ✓
|
||
```
|
||
|
||
### 📌 vfx 能力分层(重要结论)
|
||
|
||
**可灵本身没有「子弹时间 / 真慢动作」的专用能力** —— 视频接口只有 `camera_control`(运镜,8 种预设)。所以特效分三层:
|
||
|
||
| 类型 | 实现 | 状态 |
|
||
|:--|:--|:--|
|
||
| **运镜类**(环绕 / 推拉 / 焦点锁定 / 子弹时间近似) | 可灵 `camera_control` | ✅ **本次已接入** |
|
||
| **变速类**(真慢动作 / 速度斜坡) | 本地 **FFmpeg**(`composer/speed_ramp.py`) | 🟡 已有实现,待接入(**零成本**) |
|
||
| **复杂视觉特效**(变形 / 粒子 / 风格化) | **ComfyUI 工作流**(本地部署 / RunningHub 云端) | ⚪ 未接入(需选路线) |
|
||
|
||
## [4.21.0] - 2026-10-02
|
||
|
||
### 分镜镜头加「生成能力」下拉(手动覆盖自动判定)—— 补上之前漏做的 ①
|
||
|
||
**背景**:用户此前提出的「分镜里加能力选择下拉」被误判为"已有"(当时把"镜头类型下拉"当成了能力选择),
|
||
实际缺:**没有「自动」选项**、**没有「图生视频」选项**(只能靠绑角色自动触发,无法手动指定)。
|
||
|
||
- **数据层**:`Shot` 新增 `generation_capability`(`""` = 自动判定;可填 `text_to_video` / `image_to_video` / `vfx` / `comfyui`)
|
||
- **前端**(`ave-director.js`):
|
||
- 镜头卡片新增**第 2 个下拉**「生成能力」:⚙️ 自动判定 / 🎬 文生视频 / 🖼️ 图生视频 / ✨ 视频特效 / 🧩 ComfyUI
|
||
- 手动指定时**下拉边框高亮**(一眼看出哪些镜头被手动改过)
|
||
- `_capOfShot()` 改为**优先读手动指定**,为空才走自动判定(类型 + 是否绑角色)
|
||
- 「本镜头将用」实时反映(选"图生视频"但未绑角色会提示"将退化为文生视频")
|
||
- **后端**:`_cap_for_shot()`(预览接口用)同步支持手动覆盖
|
||
- **执行器**(`composer/pipeline.py::_generate_shot`)**真正按它生成**:
|
||
- `image_to_video` 或(自动 + 绑角色)→ **图生视频**(自动取角色参考图)
|
||
- `_resolve_character_ref()`:优先标准槽位(front / front_face / portrait / side / full),否则取任意存在的图
|
||
- 指定图生视频但取不到参考图 → **明确警告并退化为文生视频**(不静默失败)
|
||
- 实测:
|
||
- 后端:4 个镜头分别指定 自动/文生/图生/特效 → 能力判定**逐一正确** ✓
|
||
- 参考图解析:`找回的2张生成图 → ref_gen1.png` · `中国 → ref_front.jpg` · 不存在的角色 → 空 ✓
|
||
- 前端:6 卡片 × 6 下拉 / 5 个能力选项 / 切换后「本镜头将用」实时更新 / 无 console 错误 ✓
|
||
|
||
|
||
## [4.20.0] - 2026-10-02
|
||
|
||
### 费用防护完善:单价可配置 + 弹框显示完整费用明细
|
||
|
||
**用户反馈**:"弹框没显示金额" + "加一个我估计的输入框,算钱显示出来,默认 0.6 元/秒" + "我要加一个设置费用的地方"
|
||
|
||
- **新增「设置 → 💰 费用」分组**:
|
||
- 可灵单价(元/秒,默认 **0.6** = Kling 3.0 无声 720P)
|
||
- 单次运行镜头上限(默认 5,费用硬保护)
|
||
- **弹框改为完整明细**(原来单价硬编码、金额可能不显示):
|
||
- 生成节点数 / 每节点镜头数 / 总秒数 / 单价 / 预估费用
|
||
- 两处都加:① 流程画布运行前 ② 导演创作「生成成片」前
|
||
- 实测:弹框含「预估费用 / 单价 / 具体金额」三项全通过
|
||
|
||
### 计费口径澄清
|
||
|
||
**可灵 Kling 3.0 官方价:¥0.6/秒**(无声 720P 档)
|
||
- **5 秒镜头 = ¥3**(不是 ¥5);10 秒镜头 = ¥6
|
||
- 用户设置 0.6 元/秒是**正确**的
|
||
|
||
|
||
## [4.18.3] - 2026-10-02
|
||
|
||
### 「生产记录」升级为统一产物中心(按完整流程分组 + 全部产物可播放)
|
||
|
||
**用户反馈**:跑了多次,产物散在文件系统里,页面上看不到,只能靠问才知道文件在哪
|
||
|
||
- **后端新增** `GET /api/ave/artifacts`:扫描 `runtime/ave/` 下**所有**视频产物
|
||
(`renders/` 看板出片 + `workflow/` 流程各节点)→ 时间倒序 + **可播放 URL**
|
||
- **后端新增分组** `group=true`(默认):按**流程**分组(`workflow/<run_id>` / `renders/<job_id>`)
|
||
- 每组含:`final`(成片,优先 final_muxed)+ `items`(全部产物含中间)+ `count` + `total_mb`
|
||
- `stage` 分类:final(成片)/ concat(拼接未混流)/ shot(生成原始)/ deai(去AI化后)/ norm(规范化)/ other
|
||
- **前端「生产记录」页**:
|
||
- **每组一张卡片**:成片播放器 + 流程名 + 产物数 + 总大小 + 时间
|
||
- 「**▸ 查看该流程全部产物(N)**」→ 展开该流程的**所有文件**(阶段标注 + 大小 + ▶ 单独播放)
|
||
- 「显示中间产物」开关(控制是否显示无成片的纯中间流程)
|
||
- 实测:渲染 **6 组流程卡片 / 7 个可播放成片**,无 console 错误 ✓
|
||
|
||
|
||
## [4.19.0] - 2026-10-02
|
||
|
||
### 资产注入(「提前喂给导演」)+ 分镜卡片显示生成能力
|
||
|
||
**用户问题**:"导演生成分镜时要用到资源库里的场景/道具/产品,这些怎么进去?是生成分镜后再分配,还是生成时就喂给导演?"
|
||
|
||
**答案:提前喂(已实现)** —— 在**生成分镜之前**把资产**详情**注入导演提示词
|
||
|
||
- **机制**:`*_id`(资产引用)+ `*_context`(详情文本)
|
||
- `storyboard/generate` 收到 `location_id`/`character_id` 等 → **自动从资产库查详情** → 填入 `*_context`
|
||
- 导演提示词改用 `*_context`(详情)而非 ID → 画面描述**具体**
|
||
- **实测(关键验证)**:
|
||
- 建场地「病房-302」(space_type=医院单人病房 · lighting=日光灯偏冷 · materials=白色墙面、浅灰地板、金属床架)
|
||
- 生成分镜 → 画面:*「病房-302内景,靠窗的病床整洁铺着白色床单,**床头柜**上放着透明水杯…**日光灯**偏冷的光线洒在**白色墙面**上…**窗外**自然光…**浅灰**地板」*
|
||
- **5 个场地特征词全部命中** ✓(此前只会写泛泛的"我在病房里")
|
||
- **提示词改造**(v5.2 + legacy 两个导演):新增「资产设定(★必须严格使用,不要自己另编;同一资产在所有镜头中保持一致)」段落
|
||
- **schema**:`GlobalAnchors` 新增 `character_context` / `location_context` / `product_context` / `props_context`
|
||
|
||
### 分镜卡片显示「本镜头将用」
|
||
|
||
- 每个镜头卡片显示:**⚡ 本镜头将用:{能力} · 引擎:{模型}**
|
||
- 判定规则:`vfx`→特效 · `comfyui`→工作流 · `3d_character`→3D 渲染 · `talking_head`→口播/口型 · **绑角色→图生视频(保一致性)** · 否则→文生视频
|
||
- 未接入的能力明确标注"(未接入,生成时会跳过)",不假装可用
|
||
|
||
## [4.18.5] - 2026-10-02
|
||
|
||
### 阿里 API Key 轮换(用户提供新 Key)+ pre-commit hook 补漏
|
||
|
||
**用户操作**:提供新的阿里 API Key(`sk-ws-…` 格式,旧 Key 已泄露)
|
||
|
||
**验证与替换**:
|
||
- 新 Key **三个接口全部通过**:OpenAI 兼容接口 ✅ · DashScope 原生接口 ✅ · 模型列表(**518 个模型**)✅
|
||
- **TTS 实测成功**:用新 Key 生成 3.19 秒音频(49.9KB)✅
|
||
- **已替换**(走配置页接口):旧 Key **自动归档**(标记「被替换」,可一键回滚)· 文件权限 `600` · 不进 git
|
||
- 端到端复验:从**配置中心**读 Key 跑 TTS → 成功(59.7KB)✅
|
||
|
||
**🔒 pre-commit hook 补漏(重要)**:
|
||
- 原模式 `sk-[A-Za-z0-9]{20,}` **匹配不到**新版 key(`sk-ws-` 含 `.` 和 `-`,只匹配到 `sk-ws` 4 字符)
|
||
- 已补 `sk-ws-[A-Za-z0-9._-]{20,}` 模式 → **实测拦截成功**(提交含新 key 被阻止 + 脱敏显示)
|
||
|
||
## [4.18.4] - 2026-10-02
|
||
|
||
### API 配置页补全(13 → 24 项)+ 阿里 Key 核对
|
||
|
||
**用户反馈**:"服务 → 🔑 API 配置 里没找到阿里的 key,是不是不全?把现在有的都补全,注意保密"
|
||
|
||
**排查结论**:配置页白名单只有 **13 项**,而本机 `local.yaml` 实际有 **24 项** → **缺 11 项**
|
||
|
||
**补全的 11 项**:
|
||
- 🔊 **火山 TTS**:`volcano.app_id`(**TTS 必需**)· `volcano.api_key` · `volcano.access_key_id` · `volcano.secret_access_key` · `volcano.tts_model`
|
||
- 🔊 **阿里 TTS**:`aliyun.cosyvoice_model`(**TTS 模型名,关键**)
|
||
- 👁️ 阿里:`aliyun.wan_model`(人物置换模型)
|
||
- 🎨 可灵:`kling.base_url` · `kling.auth_type`
|
||
- 🖼️ Pexels:`pexels.rate_limit`
|
||
- 🤖 LLM:`llm.volc_ark_key`
|
||
|
||
**核对结论(用户问的阿里 Key)**:
|
||
- 本机 `aliyun.api_key`(脱敏 `sk-7e62…2c3a`)与用户提供的 Key **前 8 / 后 5 位完全一致** → **确认为同一个** ✅
|
||
- 实测:**Key 有效且余额正常**(充值已到账)✅
|
||
|
||
**保密**:接口仍只返回**脱敏值**(前 4 + 后 4),完整 Key 只存本机 `600` 权限文件、不进 git ✓
|
||
|
||
**新增「TTS 配置校验」**(`_test_aliyun_tts`,**零费用**):
|
||
- 校验 DashScope Key 有效性 + CosyVoice 模型名格式(**不实际生成音频**,不消耗 TTS 额度)
|
||
- 绑在「阿里百炼 API Key」的 🧪 测试上 → 点一下即知 TTS 是否就绪
|
||
- 实测:`✅ Key 有效 · 模型名 cosyvoice-v3.5-plus-bailian-7a1d40`
|
||
|
||
**TTS 实测通过**(用户充值后验证):阿里 CosyVoice 生成 2.8 秒音频(43.8KB),耗时 2.1 秒 ✓
|
||
|
||
## [4.18.3] - 2026-10-02
|
||
|
||
### 资产引用改为「下拉选择」(不再手输 ID)—— 全局锚点 + 角色库联动
|
||
|
||
**用户反馈**:"导演创作里面使用角色还需要手动输入角色 ID、地点 ID,应该做成下拉框直接从资源库选;其他的是不是都有这个问题?已有底座了,使用时就该直接下拉选择"
|
||
|
||
**排查结果**:
|
||
- `ave-director.js`:**全局锚点**(角色 ID / 地点 ID)是**手输框** → **要改** ✓
|
||
- `characters.js`:`_chUse` 用 `alert` 告诉用户"节点里填 character_id = xxx"(**让用户手抄**)→ **要改** ✓
|
||
- `ave-capabilities.js`:只是字段名中文映射表 → 不用改 ✓
|
||
|
||
**改动**:
|
||
- **导演创作页「⚙️ 全局锚点」**三个 ID 输入框 → **资源库下拉**
|
||
- 👤 角色(从角色库)· 🏞️ 地点/场景(从场景库)· 📦 产品(从产品库)· 🎲 种子(保持输入)
|
||
- 显示格式:`名称(id)`,值 = id(执行器按 id 取资产)
|
||
- 页面加载时自动拉取资源库填充;载入已保存分镜时**自动回填选中**
|
||
- **角色库「🔗 使用」按钮**:不再让用户手抄 ID → **写入 localStorage + 跳转导演页并自动预选该角色**
|
||
|
||
**实测**:
|
||
```
|
||
角色下拉: 3 选项((不使用角色)/ 找回的2张生成图 / 中国)
|
||
地点下拉: 2 选项((不指定地点)/ 病房)
|
||
产品下拉: 2 选项((无)/ 奶茶)
|
||
无 console 错误 ✓
|
||
```
|
||
|
||
## [4.18.2] - 2026-10-02
|
||
|
||
### 生产记录改为「按流程分组」展示(一次完整流程 = 一个卡片,可展开看全部产物)
|
||
|
||
**用户需求**:"按一次成片、也就是一个完整流程算一个;我需要再去看一个流程里面的全部产物 —— 这样就不会显示很多重复的,还能保留中间的我来调整"
|
||
|
||
- **后端** `/api/ave/artifacts` 新增 `group` 参数(**默认 True**):按**流程**分组
|
||
- 分组键:`workflow/<run_id>` 或 `renders/<job_id>` → **一次完整流程 = 一组**
|
||
- 每组含:`final`(成片,优先 `final_muxed`)+ `items`(该流程**全部产物**含中间)+ `count` + `total_mb`
|
||
- `stage` 分类:`final`(成片)/ `concat`(拼接未混流)/ `shot`(生成原始)/ `deai`(去AI化后)/ `norm`(规范化)/ `other`
|
||
- **前端**「生产记录」页:
|
||
- **每组一张卡片**:成片播放器 + 流程名 + 产物数 + 总大小 + 时间
|
||
- 「**▸ 查看该流程全部产物(N)**」按钮 → 展开该流程的**所有文件**(含中间产物,每行带阶段标注 + 大小 + ▶ 单独播放)
|
||
- 顶部「显示中间产物」开关:控制是否显示**没有成片的纯中间产物流程**
|
||
- 实测:**7 个流程组**(共 31 个文件)—— 不再是 31 个平铺文件,重复感消失
|
||
|
||
## [4.18.1] - 2026-10-02
|
||
|
||
### 修复:生产记录「视频变多且重复」的误解 —— 产物列表混入中间文件
|
||
|
||
**用户反馈**:"视频又多了,很多是重复的;后端不是加了控制吗?为什么还会生产视频?又花钱了吗?"
|
||
|
||
**排查结论(关键澄清)**:
|
||
|
||
- **没有额外花钱**:可灵视频任务 **22 条**(与之前完全一致)、图片 **30 条**(一致)→ **今天新增 0 条**
|
||
- 所有可灵调用均发生在 **10-01**(最新 20:50),**今天(10-02)未触发任何生成**
|
||
- **"视频变多"的真相**:`/api/ave/artifacts` 扫描 `runtime/ave/` 下**所有 mp4**。而**一次流程产生一条产物链**:
|
||
`shot_01.mp4`(生成原始)→ `deai_01.mp4`(去 AI 化)→ `norm_01.mp4`(规范化)
|
||
→ `final.mp4`(拼接)→ `final_muxed.mp4`(混流成片)
|
||
→ 共 31 个文件,看着"多且重复",**其实只有 7 个是真成片**,其余是**本地 ffmpeg 处理**的中间产物(**不花钱**)
|
||
|
||
**修复**:
|
||
- 后端 `/api/ave/artifacts` 新增 `only_final` 参数(**默认 True**)+ `stage` 分类标注
|
||
(`final` / `concat` / `deai` / `norm` / `shot` / `other`)
|
||
- 前端「生产记录」页:**默认只显示真成片**;勾选「显示中间产物」才展开全部
|
||
- 实测:默认视图 **7 个成片**(清晰不重复);全量 31 个(含中间产物)
|
||
|
||
## [4.18.0] - 2026-10-02
|
||
|
||
### 资产「锁定 + 版本记录」机制(角色一致性保障)+ 修复详情面板看不到参考图
|
||
|
||
**用户需求**:"角色如果开始使用就要锁定,生成时的提示词和种子数就要固定记下来,还有用的哪个模型都要记住,为了版本说明用"
|
||
|
||
**① 锁定机制**
|
||
- 数据字段:`locked` / `locked_at` / `locked_reason` / `locked_by` / `unlock_history`
|
||
- **自动锁定**:首次被流程引用(`bump_usage`)→ 自动锁定 ✓
|
||
- **手动锁定 / 解锁**:`POST /{kind}/{aid}/lock`、`/unlock`(解锁需填原因,记入 `unlock_history`)
|
||
- **锁定保护** `LOCK_PROTECTED_FIELDS`:`reference_images` / `generation_history` / `active_version` / `consistency_seed` / `voice`
|
||
→ 锁定时修改这些字段**会被拒绝**并给出明确提示
|
||
- **仍允许**:锁定后追加**新版本图**(新槽位名),只是不能覆盖已有槽位
|
||
|
||
**② 版本记录(`generation_history`)**
|
||
- 每次生成记录:**版本号 / 时间 / 提示词 / 负面提示词 / seed / 引擎 / 模型 / 槽位 / 文件 / 参数**
|
||
- 同时更新 `active_version` / `last_generation` / `consistency_seed`(供后续生成保持一致)
|
||
- 查询接口:`GET /{kind}/{aid}/history`
|
||
|
||
**③ 修复:详情面板"参考图都没有"**
|
||
- 根因:详情面板只渲染**固定 4 个槽位**(front / side / back / full),而实际槽位是 `gen1` / `gen2` / `portrait`…
|
||
- 修复:**动态列出所有已存在槽位** + 补齐未填的标准槽位
|
||
|
||
**前端**:详情面板新增「🔒 锁定状态条」(含原因/时间/解锁按钮)+「📌 生成历史」(版本 / 引擎 / 模型 / seed / 提示词)
|
||
|
||
实测:锁定 → 覆盖被拒(提示明确)→ 解锁 ✓ · 详情面板 2 张图加载成功 ✓
|
||
|
||
## [4.17.0] - 2026-10-02
|
||
|
||
### 角色生成器:**补上缺失的组装预览接口** + 即梦引擎 + 提示词清理
|
||
|
||
**排查结论(重要)**:
|
||
- 前端 `char-gen.js` **早已有**完整的「标签页 + 实时提示词预览」实现(347 行,含图片结果展示、费用确认)
|
||
- 但它调用的 `POST /characters/assemble-prompt` **后端不存在** → 实时预览**一直静默失败**(404)
|
||
- **本次补上该接口** → 实时预览真正可用
|
||
|
||
**本次实际新增/修复**:
|
||
|
||
- ✅ **`POST /api/ave/assets/characters/assemble-prompt`**(纯计算,**不生成、不扣费**)→ 前端实时预览用
|
||
- ✅ **即梦引擎**(`_seedream_generate`):火山方舟 Seedream 4.0 / 5.0,支持文生图 / 图生图(`ref_image`)
|
||
- 引擎下拉加即梦(密钥 `volcano.ark_api_key`)
|
||
- ⚠️ 模型需先在**火山方舟控制台 → 开通管理**开通;错误提示会明确告知 + 给出可用模型名
|
||
- ✅ **提示词清理** `_polish_prompt()` / `_empty_label_set()`:去掉空字段标签残留(`鼻梁。身穿。神色。`)
|
||
- 做法:从 `CHAR_LAYERS` 收集层/字段中文标签 + 组装器固定前缀词 → 精确替换「标签。」
|
||
- ⚠️ 踩坑:变长 look-behind `(?<=。|^)` 在 Python `re` 中非法(`look-behind requires fixed-width pattern`)→ 改用捕获组 / 标签集合
|
||
|
||
### 修复:找回用户"丢失"的 2 张生成图
|
||
|
||
- 图**生成成功了**(可灵任务 `934648689544040491` / `934648911431073867` 均 succeed,22:48/22:49)
|
||
- 但**存本地时崩溃**(`CharacterStore.kind_dir` 缺失)→ 图只留在可灵服务器
|
||
- 已下载到 `agent-local/runtime/ave/generated_images/`(870KB / 1297KB)并入库角色「找回的2张生成图」
|
||
|
||
## [4.16.1] - 2026-10-02
|
||
|
||
### 🔴 重大修复:本机 `ffprobe` 实为 `ffmpeg` 符号链接 → 全项目媒体探测**静默失败**
|
||
|
||
**背景**:优化"去 AI 化体积膨胀"时发现码率读取**始终返回兜底值** —— 深挖发现:
|
||
|
||
```
|
||
~/.local/bin/ffprobe -> ~/.local/bin/ffmpeg ← 竟然是符号链接!
|
||
```
|
||
|
||
**本机根本没装 ffprobe**,调用 `ffprobe -show_entries ...` 实际在调 `ffmpeg` → 报
|
||
`Unrecognized option` → **所有 ffprobe 调用静默失败**。
|
||
|
||
**影响面(严重)**:
|
||
|
||
| 模块 | 后果 |
|
||
|:--|:--|
|
||
| `beat_sync.py`(**卡点合成**) | 取时长失败 → **固定返回假值 30 秒** → 节拍对齐全错 |
|
||
| `hybrid.py`(**混合合成**) | 同上 |
|
||
| `speed_ramp.py`(变速) | 同上 |
|
||
| `ffmpeg.py`(视频尺寸探测) | 尺寸取不到 → 走目标尺寸兜底(可能裁切异常) |
|
||
| `lipsync.py` / `exporter.py` / `wan2_2.py` / `bgm_download.py` | 时长 / 校验失败 |
|
||
|
||
**修复**:`lib/ffmpeg.py` 新增**兼容探测函数**(用 `ffmpeg -i` 解析 —— 完全可用):
|
||
- `probe_info(path)` → `{duration, bitrate_kbps, size_bytes, has_audio, has_video, width, height}`
|
||
- `probe_duration(path)` · `has_audio_stream(path)`
|
||
- 批量替换 **7 处** `ffprobe` 调用(beat_sync / hybrid / speed_ramp / ffmpeg / lipsync / bgm_download / exporter / wan2_2)
|
||
|
||
**实测**:`_get_duration()` 从假值 **30.0 秒 → 真实 8.00 秒** ✓
|
||
|
||
**附带收益(去 AI 化体积)**:`de_ai` 的 CRF 改为**按源码率自适应**
|
||
(< 3000 kbps → CRF 27 / < 6000 → 25 / 否则 23)
|
||
实测:`norm_01` 2.03 → **1.25 MB(↓38%)** · `norm_02` 1.34 → **1.04 MB(↓22%)**
|
||
|
||
## [4.16.0] - 2026-10-02
|
||
|
||
### 新增:🎬 分镜可视化编辑(镜头语言**下拉选择**)
|
||
|
||
**背景**(用户反馈):"如果分镜的内容不合适,我怎么调呢?怎么才能追加?"
|
||
|
||
**原状**:分镜表可改**文字**(画面描述/台词/情绪/时长/类型),但**镜头语言是自由文本**(`近景 / 平视 / 固定 / 浅`)→ 不规范、易写错。
|
||
|
||
- **镜头语言改为 4 个下拉**(改了**直接影响生成提示词**):
|
||
|
||
| 字段 | 选项 |
|
||
|:--|:--|
|
||
| **景别** | 特写 · 近景 · 中近景 · 中景 · 中全 · 全景 · 远景 |
|
||
| **机位** | 平视 · 略俯 · 俯视 · 略仰 · 仰视 · 过肩 |
|
||
| **运动** | 固定 · 推 · 拉 · 摇 · 移 · 跟 · 环绕 · 升降 |
|
||
| **景深** | 极浅 · 浅 · 中 · 深 |
|
||
|
||
- 未选时显示灰色占位(如「景别」),选了变亮 ✓
|
||
- 实测:6 卡片 × 5 下拉 = **30 个**,选项数 6/8/7/9/5,**无 console 错误** ✓
|
||
|
||
**分镜的调整 / 追加方式(完整清单)**:
|
||
|
||
| 操作 | 方式 |
|
||
|:--|:--|
|
||
| 改画面/台词/情绪 | 直接编辑输入框 |
|
||
| **改镜头语言** | **下拉选**(本次新增) |
|
||
| 改时长 / 类型 | 数字框 / 下拉 |
|
||
| **追加镜头** | 「➕ 添加镜头」按钮 |
|
||
| 删除镜头 | ✕ |
|
||
| 调顺序 | ↑ / ↓ |
|
||
| 重生成单镜头 | 🔄 重生成(LLM 只重出这个镜头) |
|
||
| 整体重来 | 改故事 / 选项 → 「生成分镜」 |
|
||
| 修改已有分镜 | 改完点「💾 保存」 |
|
||
|
||
## [4.15.8] - 2026-10-02
|
||
|
||
### 优化:BGM 选择器**优先读资产库**(「🎵 BGM 库」上传的音频可直接被流程选用)
|
||
|
||
**背景**:发现 BGM 有**两套数据互不相通** ——
|
||
- `music_selector` 的 `music_library.yaml`(有元数据,但 `assets/bgm/` 无实际音频文件)
|
||
- 资产库「🎵 BGM 库」(用户在页面上传的音频)
|
||
→ 结论:**用户在资产库上传的 BGM 不会被流程用到**
|
||
|
||
**修复**:`_impl_music_select` 改为**两级查找**
|
||
1. **优先读资产库**(`AssetStore("bgm")`):按 `name` / `mood` / `tags` 过滤 + **扫描目录找真实音频文件**(mp3/wav/m4a/aac/flac/ogg)
|
||
2. **回落内置音乐库**(原 `music_library.yaml` 逻辑)
|
||
|
||
- 产物新增 `source` 字段(`资产库` / `内置音乐库`),便于排查
|
||
- 错误提示改为可操作:「到『🎵 BGM 库』上传音频(上传后会自动被选择器读到)」
|
||
|
||
**实测**:无资产库 BGM 时正确回落,并给出明确指引 ✓
|
||
|
||
## [4.15.7] - 2026-10-02
|
||
|
||
### 优化:Pexels 素材**并行下载**(实测提速明显)
|
||
|
||
**背景**:`basic_dub` 模板实测时素材下载耗时过长(5 段超 5 分钟仍未完成)。
|
||
|
||
**根因**:`search_videos()` 的下载循环是**串行**(逐个 `httpx.get` + 一次性读入内存)。
|
||
|
||
**修复**:改为**并行下载**(`ThreadPoolExecutor`,最多 4 路)
|
||
- 先「选取候选」(过滤时长 + 挑文件)→ 再**并行下载**(`as_completed` 收集结果)
|
||
|
||
**实测**:**5 段素材 71.2 秒完成**(此前串行超 5 分钟未完成)✓
|
||
- 分辨率优选同时生效(4 段 1080x1920 + 1 段 1080x2048)
|
||
- 个别视频无 1080p 版本时回落,由 `_normalize_clip()` 统一规格兜底
|
||
|
||
## [4.15.6] - 2026-10-02
|
||
|
||
### 修复:审核门(`audit_gate`)**切断数据流**(下游拿不到上游文本/分镜)
|
||
|
||
**背景**:实测 `audit_gate` 暂停/继续时发现 —— 暂停恢复正常,但**下游节点失败**:
|
||
`字幕生成需要上游分镜(含台词)或文本`。
|
||
|
||
**根因**:`audit_gate` 通过后只写入 `{"approved": True}`,**没有透传上游产物** →
|
||
数据流断在审核门(下游的 `ctx["inputs"]` 为空)。
|
||
|
||
**修复**(两处):
|
||
1. `_run_node()` 的 `audit_gate` 分支:`auto_approve` 直接通过时**合并上游产物**到输出
|
||
2. `resume()`:暂停恢复时**遍历入边、把上游 context 合并进审核门产物**(+ `approved` 标记)
|
||
|
||
**实测**:
|
||
```
|
||
n1 script → success
|
||
n2 audit_gate → paused ⏸️ → resume → completed(approved: true + 透传 text)✓
|
||
n3 subtitle → success(生成 2 段字幕)✓
|
||
整体: completed · 无错误
|
||
```
|
||
|
||
## [4.15.5] - 2026-10-02
|
||
|
||
### 新增:卡点变速 / 口播+卡点**混合合成**接入(此前只做普通拼接)
|
||
|
||
**背景**:审计发现 `composer/beat_sync.py`(**674 行** — 节拍检测 + 能量感知 + 帧锁定变速)与
|
||
`composer/hybrid.py`(人声静音锚点 + BGM 能量变速)**都已实现,但没接进执行器** ——
|
||
「卡点视频」「口播+卡点混合」模板实际只做了**普通拼接,没有卡点/混合效果**。
|
||
|
||
- **`_impl_video_concat` 新增合成模式分支**(按 `cfg.compose_mode`):
|
||
|
||
| 模式 | 行为 |
|
||
|:--|:--|
|
||
| (默认)`simple` | 拼接 → 去 AI 化 → 混流(人声 / BGM / 字幕) |
|
||
| **`beat_sync`** | 调 `compose_beat_sync()`:**BGM 节拍检测 → 素材分组 → 帧锁定变速卡点** |
|
||
| **`hybrid`** | 调 `compose_hybrid()`:**人声静音锚点 + BGM 能量变速 → 帧锁定拼接** |
|
||
|
||
- **两个模板启用**:`beat_sync` 模板 output → `compose_mode: "beat_sync"`;`hybrid_dub` → `compose_mode: "hybrid"`
|
||
- **顺带修复**:这两个模板的素材节点**缺关键词**(上游是 `style` 透传节点 → 无文本 → 素材搜索失败)
|
||
→ 补默认关键词(`城市 生活` / `生活 日常`,用户可改)
|
||
|
||
## [4.15.4] - 2026-10-02
|
||
|
||
### 修复:素材版成片体积失控(Pexels 原始素材未规范化)
|
||
|
||
**背景**:用 `basic_dub` 模板端到端实测(脚本 → TTS → 素材 → BGM → 合成)**5 节点全部 success** ✓
|
||
但成片 **37.9 MB**(明显偏大)。
|
||
|
||
**根因**(实测素材参数对比):
|
||
|
||
| 项 | Pexels 原始素材 | 应统一为 |
|
||
|:--|:--|:--|
|
||
| 分辨率 | `1080x2048`(非 9:16) | `1080x1920` |
|
||
| 像素格式 | **`yuv444p`**(4:4:4,体积大) | `yuv420p` |
|
||
| 帧率 | 25 fps | 30 fps |
|
||
| 时长 | **23 秒 / 17 秒**(超长片段) | ≤ 8 秒 |
|
||
|
||
→ 直接拼接 = 5 段原始素材原样累加 = 37.9 MB
|
||
|
||
**修复**:新增 `StoryboardPipeline._normalize_clip()`
|
||
- 拼接前**统一规格**:缩放裁切到目标分辨率 · 转 `yuv420p` · 统一 30fps · **裁到最长 8 秒**
|
||
- 接入 `render_from_clips()`:每片段 **先规范化 → 再去 AI 化 → 再拼接**
|
||
- 对**所有来源**生效(Pexels 素材 / 可灵生成 / 混合)
|
||
|
||
**实测**(同一批素材):**37.8 MB → 15.82 MB(缩小 2.4 倍)**,规格统一为 1080x1920 / yuv420p / 30fps ✓
|
||
|
||
## [4.15.3] - 2026-10-02
|
||
|
||
### 修复:3 个流程模板"跑不通"(缺画面来源 + 旧默认值)
|
||
|
||
**背景**:审计 6 个流程模板时发现 3 个**结构不完整**(用户点到会失败)。
|
||
|
||
| 模板 | 问题 | 修复 |
|
||
|:--|:--|:--|
|
||
| **数字人口播** | ① `voice_id` 是**旧模型名**(`cosyvoice-v3.5-plus`,会覆盖配置里的正确 model → TTS 失败)② `lip_sync` 走**透传节点**(口型未接)③ **无画面来源** → output 必失败 | 删掉旧 voice_id(用配置默认)· **补 `storyboard` + `model` 节点**(人物画面生成)· 描述标注"当前以可灵生成人物画面替代专用数字人 API" |
|
||
| **口播+卡点混合** | ① 同上旧 voice_id ② **无画面来源** | 删掉旧 voice_id · **补 `material` 素材节点**(4 段竖屏) |
|
||
| **卡点视频** | ① `mood: upbeat`(**音乐库无此风格** → 选择失败)② **无画面来源** | `mood` 改空(走热门)· **补 `material` 素材节点**(5 段) |
|
||
|
||
**复核结果(6 个模板全部完整)**:
|
||
```
|
||
✅ 基础口播 5节点 | 能力4 | 画面源有 | 跳过0 | 断边0
|
||
✅ 卡点视频 5节点 | 能力3 | 画面源有 | 跳过0 | 断边0
|
||
✅ 角色叙事 8节点 | 能力4 | 画面源有 | 跳过0 | 断边0
|
||
✅ 数字人口播 6节点 | 能力4 | 画面源有 | 跳过0 | 断边0
|
||
✅ 口播+卡点 5节点 | 能力3 | 画面源有 | 跳过0 | 断边0
|
||
✅ 短剧创作 12节点 | 能力7 | 画面源有 | 跳过0 | 断边0
|
||
```
|
||
|
||
## [4.15.2] - 2026-10-02
|
||
|
||
### 新增:补齐 2 个能力实现(`script_generate` 剧本改编 + `person_swap` 人物置换)
|
||
|
||
**背景**:能力审计发现这两个"注册了但执行器没接" → 流程里对应节点会**跳过**。
|
||
|
||
- **`script_generate`(剧本改编)** → 接入 `CAP_IMPLS`
|
||
- 故事/主题 → **结构化口播脚本**(LLM):分段 + 口语化旁白 + **每段配「画面提示」**
|
||
- 约束:开头有钩子 · 结尾有行动号召 · 保留原始信息不编造
|
||
- 实测:`我住院第三天,做了痔疮微创手术…` → **3 段脚本**
|
||
```
|
||
① 我住院第三天了,刚做完痔疮微创手术,说真的,没你们想的那么可怕。
|
||
【画面:穿着病号服躺在病床上,对着镜头说话,床头挂着输液瓶】
|
||
② 今天宋佳主任来查房,说我恢复得挺好,就叮嘱我一句——别久坐。
|
||
【画面:医生查房的背影或侧影,或病房走廊推镜头】
|
||
③ 所以有这毛病的朋友,别拖,早看早好,真的少遭罪。
|
||
【画面:坐在病床边认真对着镜头说,最后定格在病房窗外】
|
||
```
|
||
- **`person_swap`(人物置换)** → 接入 `CAP_IMPLS`
|
||
- 参考图(可直接取**角色资产的参考图**)+ 源视频 → 调百炼 `wan2.2-animate-mix` 换人
|
||
- **费用确认硬拦截**(按秒计费,需 `confirm_cost`)
|
||
- 参考图解析:节点 `ref_image` 配置,或自动从指定角色的 `reference_images` 取
|
||
|
||
**执行器已接入能力:8 → 10 个**
|
||
|
||
## [4.15.1] - 2026-10-02
|
||
|
||
### 修复:分镜"刷新后找不回"(缺「打开已保存分镜」入口)
|
||
|
||
**背景**:分镜生成后保存在后端(`runtime/ave/storyboards/`),但**前端没有打开的入口** → 刷新页面后只能重新生成(浪费 LLM 调用)。
|
||
|
||
- **后端补接口** `GET /api/ave/storyboards/{project_id}`(返回完整分镜,含 shots)
|
||
- **前端加「📂 打开已保存分镜」下拉**(显示 标题 · 镜头数 · 时长,可随时切回历史分镜)
|
||
- **页面打开时自动载入最新一个**(刷新后不丢)
|
||
- 实测:下拉 4 项 · 自动载入 `vid_20261001_215445`(6 镜头)· 分镜表渲染 6 卡片 · 无 console 错误 ✓
|
||
|
||
## [4.15.0] - 2026-10-02
|
||
|
||
### 新增:分镜→成片「过程透明化」(预览提示词 + 能力 + 中文拍摄风格)
|
||
|
||
**背景**(用户反馈):"点生成成片就直接生成了,但每个镜头用什么内容、提示词长什么样、用什么基础能力,我都没看到 —— 是不是缺东西?"
|
||
|
||
**确认缺口(用户判断正确)**:分镜表只展示画面描述/镜头契约,而**编译后的生成提示词、所用能力/引擎、参数**全部不可见;点"生成成片"直接进黑盒。
|
||
|
||
#### ① 新增「🎬 预览生成方案」按钮(**纯预览,零费用**)
|
||
|
||
- 新接口 `POST /api/ave/storyboard/preview-prompts`:**只做提示词组装与能力判定,不调用生成**
|
||
- 每个镜头展示:**生成能力** · **引擎/模型**(可灵 kling-v3)· **参数**(时长/画幅)· **是否绑定角色参考图** · **完整提示词**(六模块结构 376~424 字)
|
||
- 实测:6 镜头分镜 → 逐镜头显示提示词与能力 ✓
|
||
|
||
#### ② 拍摄风格**中文化** + 扩充到 6 种(含**自拍 / 第一人称**)
|
||
|
||
| 值 | 中文标签 |
|
||
|:--|:--|
|
||
| `documentary_realism` | 伪纪录片 · 真实自然(像随手拍的生活记录) |
|
||
| `cinematic` | 电影感 · 考究构图 |
|
||
| `vlog_handheld` | 手持 Vlog · 第一视角(边走边拍) |
|
||
| `studio_clean` | 棚拍干净 · 商业感 |
|
||
| **`selfie_pov`** | **手机自拍 · 第一人称(举着手机自己拍自己)** |
|
||
| `interview_doc` | 访谈纪实 · 半身对镜(像接受采访) |
|
||
|
||
#### ③ 能力判定逻辑(`_cap_for_shot`)
|
||
|
||
| 镜头类型 | 使用能力 |
|
||
|:--|:--|
|
||
| `talking_head` | 口播/口型(当前以图生视频 + 后期口型替代) |
|
||
| `vfx` | 视频特效(运镜/慢动作) |
|
||
| `comfyui` | ComfyUI 工作流(面部/风格控制) |
|
||
| 绑定了 `character_id` | **图生视频**(用角色参考图保住人脸一致性) |
|
||
| 其他 | 文生视频 |
|
||
|
||
**已知待补(用户提出,待确认/接入)**:
|
||
1. **4 种导演系统只接了 2 个**(legacy + v5.2)—— 另 2 种(clip-storyboard / Seedance / OpenDirector)待接入
|
||
2. **人脸表情 / 口型**暂无专用能力(`talking_head` 目前走图生视频替代)
|
||
3. **自拍/第一人称**已加拍摄风格选项,待实测生成效果
|
||
|
||
## [4.14.0] - 2026-10-02
|
||
|
||
### 修复 + 增强:角色生成器**恢复结构化字段**(10 层 61 项)+ 视角 / 引擎可选
|
||
|
||
**背景**(用户反馈):"原来有很多提醒我输入的关键词(眼睛类型、鼻子…),你现在直接变成 AI 提示词,那些都用不到了?我描述不全,AI 扩写能扩全吗?"
|
||
|
||
**根因**:上一版把角色生成器简化成"一句话 + AI 扩写",**废弃了原有的分层字段体系**(设计倒退)。
|
||
|
||
#### ① 恢复结构化字段(10 主层 + 4 子层 = 61 项,44 个下拉)
|
||
|
||
- 新接口 `GET /api/ave/assets/character-layers`:直接读 `character_generator.prompt_assembler` 的 **CHAR_LAYERS**(**复用既有设计,不重写**)
|
||
|
||
| 层 | 项数 | 示例字段 |
|
||
|:--|:--|:--|
|
||
| 🆔 核心身份 | 5 | 角色名 · 性别 · 年龄 · 种族/地域 · 世界观/时代 |
|
||
| 🗿 面部轮廓 | 4 | 脸型 · 下颌线 · 颧骨 · 额头 |
|
||
| 👁️ 五官细节 | 4 子层 14 项 | **眼型/瞳孔色/大小/眼神** · 眉型/状态/眉色 · **鼻梁/鼻头/鼻翼** · 唇型/唇色 |
|
||
| 💇 头发 | 5 | 发型 · 发色 · 长度 … |
|
||
| ✨ 皮肤与妆容 | 7 | 肤色 · 质感 · 妆容 … |
|
||
| 🏋️ 体型与姿态 | 5 | — |
|
||
| 👔 服装与配饰 | 7 | — |
|
||
| 😊 神态与表情 | 5 | — |
|
||
| 📸 光线与镜头 | 5 | — |
|
||
| 🌄 背景与场景 | 4 | — |
|
||
|
||
- **44 个下拉选择**(有预设选项,不用自己想)+ 17 个文本输入 → 大部分直接选 ✓
|
||
|
||
#### ② 视角可选(5 种)+ ③ 引擎可选
|
||
|
||
- 视角:`正面定妆照` / `全身照` / `多视角九宫格` / `场景照` / `表情特写`
|
||
- 引擎:当前 `可灵(Kling)`(图片额度需单独充值),其他引擎预留
|
||
|
||
#### ④ 流程
|
||
|
||
填字段(**都可选填**)→ 👁 预览提示词 → 选视角/引擎 → 🎨 生成(**弹费用确认**)→ **自动入库角色库**
|
||
|
||
- 提示词由后端 `CharacterPromptSystem.build_prompt(variant=...)` 组装 —— **复用 813 行既有实现**
|
||
- 🔴 修复路由冲突:`/character-layers` 被 `/{kind}` 通配路由抢走(返回空)→ 移到通配路由**之前**
|
||
- 实测:**10 层 + 61 字段(44 下拉)+ 5 视角 + 引擎选择**渲染正常,无 console 错误 ✓
|
||
|
||
### 「AI 扩写」的正确定位(架构澄清)
|
||
|
||
**字段是主体,AI 扩写是补充**:用户填关键设定(大范围),AI 在此**基础上**补细节;
|
||
而不是让 AI 凭空想象(那会偏离用户意图)。
|
||
- `prompt_assembler.build_prompt()` 按字段**精确组装**(保真)
|
||
- `characters-helper/expand-direction`(LLM)保留为**可选辅助**(想不起细节时用)
|
||
|
||
## [4.13.1] - 2026-10-02
|
||
|
||
### 新增:🛡️ 生成操作**后端强制确认**(防止任何入口绕过前端确认框)
|
||
|
||
**背景**(用户强烈反馈):"所有需要调用大模型生成的内容,特别是视频的,**你必须弹出来提醒我**" —— 之前只有前端确认框,**用 API / 脚本直接调用可以绕过**。
|
||
|
||
- **后端硬拦截**(`workflows.py::_impl_text_to_video`):调用可灵**之前**检查 `confirm_cost`,未显式传 `true` 直接拒绝(**在扣费前拦住**)
|
||
- **全局开关**:环境变量 `AVE_ALLOW_GENERATION=0` → **完全禁止生成**(想彻底锁死费用时用)
|
||
- **参数链路打通**:`/api/workflow/run` → `start_run(confirm_cost=)` → `runner` → `ctx` → 能力实现
|
||
- **前端**:用户在费用预估框点「确定」后才传 `confirm_cost: true`
|
||
- 实测:含生成节点但不传确认 → **failed + 明确提示**(**零成本验证,未调用可灵**)✓
|
||
|
||
### 📌 行为准则(AI 操作侧,本次事件的根本改进)
|
||
|
||
**任何会产生真实费用的操作(可灵生成、大模型批量调用、素材下载等),必须先向用户说明预计花费并等待确认,不得自行发起。**
|
||
—— 本次"12 条测试视频"与"反复跑流程"引发的费用担忧,根因是执行方未先确认额度。
|
||
|
||
## [4.13.0] - 2026-10-02
|
||
|
||
### 新增:🔔 全局任务通知 + 🎬 统一产物中心(生成结果**主动可见**)
|
||
|
||
**背景**(用户反馈):跑了 12 次生成,"我都不知道文件在哪,生成完不是应该有个通知吗?" —— 产物散落文件系统、页面上看不到、也没有主动提示。
|
||
|
||
#### ① 统一产物中心(`📋 生产记录` 页)
|
||
|
||
- 新接口 `GET /api/ave/artifacts`:扫描 `runtime/ave/` 下**所有**视频产物
|
||
(`renders/` 看板出片 + `workflow/` 流程各节点产物),按时间倒序 + **可直接播放的 URL**
|
||
- 前端新增「**🎬 全部生成产物**」区块:网格布局 + **每条带播放器**(9:16 适配),显示 时间/大小/来源/节点/文件名
|
||
- 实测:页面渲染 **17 个可播放视频**(今天的全部产物),无 console 错误
|
||
|
||
#### ② 全局任务通知(在任何页面都能收到)
|
||
|
||
- `inline.js` 加**全局通知器**:每 8 秒轮询「流程 runs」+「出片 renders」→ 发现**新完成** →
|
||
右上角 **toast**(✅ 成功 / ❌ 失败),带「**🎬 查看产物**」按钮直接跳转
|
||
- 首轮只登记「**完成已超 60 秒的历史**」(避免刷屏);**刚完成的仍会通知**(覆盖"页面打开时任务刚好结束")
|
||
- 流程画布 / 导演创作页在各自轮询里也会弹 toast(双保险)
|
||
|
||
#### 🔧 踩坑修复(3 个,都由实测发现)
|
||
|
||
1. **toast 函数被 tree-shake**:`showToast` 原定义在按需加载的 `productions.js` → 首页拿不到
|
||
→ 移到 `inline.js`(全局模块)
|
||
2. **通知器被 tree-shake**:纯 IIFE `(function(){...})()` 被 Rollup 判定无副作用而移除(产物里搜不到)
|
||
→ 改为 `window.initGlobalNotifier = function(){...}; window.initGlobalNotifier();`
|
||
3. **状态登记时序 Bug**:`seen.add()` 在状态检查**之前** → 首次见到 `running` 就登记,完成时被跳过
|
||
→ 改为**只在终态时登记**
|
||
|
||
- 实测:从「外部 API 触发任务」到「页面弹通知」全链路通过(含边界:页面加载 1.8 秒内启动任务也能收到)
|
||
|
||
## [4.12.3] - 2026-10-02
|
||
|
||
### 新增:🛡️ 生成类操作的**费用防护**(前端确认 + 后端硬上限)
|
||
|
||
**背景**:验证阶段连续生成了 12 条测试视频(60.5 秒),事后才发现消耗 —— 正式使用前应有拦截。
|
||
|
||
- **前端(运行前确认)**:点「▶️ 运行」时,若流程含视频生成节点,先弹出**费用预估确认**:
|
||
```
|
||
🎬 即将调用可灵生成视频
|
||
· 生成节点:1 个
|
||
· 每个最多 3 镜头(5 秒/镜头)
|
||
· 合计约 3 个镜头 = 15 秒
|
||
· 预估费用 ≈ ¥9.0 起(按 ¥0.6/秒 保守估,实际可能更高)
|
||
确认开始?(这会产生真实费用)
|
||
```
|
||
- **后端(硬上限 + 日志)**:
|
||
- 单次运行生成镜头数**硬上限 5**(`AVE_MAX_SHOTS_PER_RUN` 可调,超限直接拒绝并说明原因)
|
||
- 生成前日志打印预估:`💰 将调用可灵生成 N 个镜头(约 N×5 秒,按 ¥0.6/秒 估 ≈ ¥X)`
|
||
- 目的:避免「误点运行 → 大量扣费」;跑生成类流程时必须**明确知情**
|
||
|
||
## [4.12.2] - 2026-10-02
|
||
|
||
### 修复:旧角色生成器污染已废弃的 registry.yaml(意外写入)
|
||
|
||
**背景**:提交时发现工作区有 6 项意外改动 —— `character_registry/registry.yaml` 被写入**垃圾数据**(`【身份_2145`)+ 4 个自动备份
|
||
|
||
- **根因**:点旧「角色生成器」(`inline.js` / `c2_remote.js` 仍调 `/api/characters/generate-from-direction`,该路由在 **`app.py:420`**)→ 链路调 `character_generator.pipeline` → **`AssetRegistrar._save_registry()` 写入 `registry.yaml`**
|
||
- 而 registry **早已废弃**(账号/角色归属以 `ORACLE.yaml` 为准,见 CONSTITUTION 规则 3)→ 写入即污染仓库
|
||
- **修复**:
|
||
1. **`AssetRegistrar._save_registry()` 加开关** —— 默认**不再写入**,仅 `AVE_WRITE_REGISTRY=1` 时写(并打印提示)
|
||
2. `.gitignore` 加入 `character_registry/backups/`(自动备份不再入库)
|
||
3. **回滚**被污染的两个文件 + 删除 4 个垃圾备份
|
||
- 实测:调用 `_save_registry()` → 输出「registry.yaml 已废弃,跳过写入」且文件未被改动 ✓
|
||
|
||
**说明**:旧接口(`/api/characters/*`)保留(`c2_remote.js` 仍调用),但**不再污染 registry**;新流程(角色生成器重写版)走 `/api/ave/assets/*` ✓
|
||
|
||
## [4.12.1] - 2026-10-02
|
||
|
||
### 优化:其余资产页补齐字段建议(产品 / 道具 / 服装)
|
||
|
||
- **产品库**:`must_keep`(必保特征)→ **datalist**,8 个建议(logo 位置与大小 / 包装主色 / 瓶身盒型形状 / 标签字体 / 开盖方式 / 整体比例 / 材质质感 / 品牌色带);「一致性种子」加说明文案
|
||
- **道具库**:`structure`(结构/比例)→ **datalist**,8 个建议(长约 20cm / 可开合 / 金属拉丝质感 / 木质纹理 / 透明材质 / 便携小巧 / 大件醒目 / 带文字标识)
|
||
- **服装库**:`material`(材质)→ **datalist**,12 个建议(纯棉 / 麻料 / 真丝 / 羊毛 / 牛仔 / 皮革 / 针织 / 化纤 / 绸缎 / 灯芯绒 / 雪纺 / PU 皮)
|
||
- 实测:产品库 1 datalist + **4 个「🎨 AI 生成」按钮**(正/侧/细节/手持)· 道具库 1 + 3 · 服装库 1 + 3,**无 console 错误**
|
||
|
||
**至此资产库 10 类全部具备**:字段下拉/建议 + 上传 + **AI 生成参考图**
|
||
|
||
## [4.12.0] - 2026-10-02
|
||
|
||
### 新增:资产库「AI 生成参考图」(文生图)+ 字段下拉建议
|
||
|
||
**背景**(用户反馈):角色库/场景库的参考图只能手动上传,没有"自动生成";且场景的「光源状态/材质要点」等字段是空白输入框,不知道怎么填。
|
||
|
||
- **🎭 角色生成器重构**(原版调用**不存在的** `/api/characters/*` 接口 → "角色生成失败")
|
||
- 新流程:填角色名 + 一句话想法 → **✨ AI 扩展提示词**(LLM 生成完整定妆照描述)→ **🎨 生成并存入角色库**
|
||
- 新接口 `POST /api/ave/assets/characters-helper/expand-direction`(LLM 扩展)
|
||
- 实测扩展效果:`40岁女性医生,温和专业` → **"…面部轮廓柔和大方,眼神沉静有亲和力,深色利落短发齐耳,身穿整洁白色医生大褂,内搭浅蓝色衬衫,胸前挂工作证,神态从容温和…真实摄影风格,纯色浅灰背景,自然柔和光线,半身定妆照,高清质感"** ✓
|
||
- 失败时**不丢数据**:角色已创建,提示"可到角色库重试生成或直接上传"
|
||
- 生成哪张可选:半身定妆照 / 正面全身 / 侧面 / 背面 / 全身
|
||
|
||
- **🎨 AI 生成参考图**(后端 + 前端)
|
||
- 新接口 `POST /api/ave/assets/{kind}/{aid}/generate-image`:按资产字段**自动组装提示词** → 调可灵文生图 → 轮询 → **下载存入该槽位**(`ref_{slot}.png`)
|
||
- 支持 10 类资产(角色/场景/真实场地/产品/道具/服装…),各类型的提示词模板不同(角色=定妆照构图;场景=空间+光源+材质;产品=多角度+必选特征)
|
||
- 前端:**每个参考图槽位旁新增「🎨 AI 生成」按钮**(已有图时显示"覆盖",含 30~90 秒 loading 提示)
|
||
- 也支持传入自定义 `prompt` 覆盖自动组装
|
||
- **🔴 修复:可灵图片模型名**:`kling-v1` 图片模型**已停用**(`code 1203`)→ 改用 **`kling-v3`**(与视频同一模型名)
|
||
- 实测:`kling-v3` 提交通过 → 提示「**图片额度不足(1102)**,视频额度与图片额度分开计费」→ 需为图片单独充值
|
||
- **字段下拉建议**(`assets-common.js` 新增 `datalist` 类型 = **可下拉选也可自由填**)
|
||
- 场景库:光源状态(10 个预设)· 材质要点(10 个)· 空间拓扑(8 个)—— 全部带 placeholder 示例
|
||
- 实测:详情页 3 个 datalist + 1 个 select + **3 个「🎨 AI 生成」按钮** 渲染正常,无 console 错误
|
||
- **关于「角色生成器」**:其调用的 `/api/characters/*` 接口在后端**不存在**(旧前端残留)→ 导致"角色生成失败"。已改用「角色库 → 🎨 AI 生成」路径(见下版改造)
|
||
|
||
## [4.11.10] - 2026-10-02
|
||
|
||
### 新增:停止运行中的流程(⏹ 停止)—— 补齐运维能力
|
||
|
||
**背景**:实测时 material 节点长时间卡住(旧逻辑中文搜 Pexels + 4K 下载),**只能靠重启 Dashboard 清理**(会丢失全部运行记录)—— 缺"停止"能力
|
||
|
||
- **执行器** `WorkflowRunner.cancel(run_id)`:标记 `cancelled` → 执行器**在节点边界检查并退出**(已完成节点的产物保留)
|
||
- **接口** `POST /api/workflow/runs/{run_id}/cancel`
|
||
- **前端**:运行区新增「**⏹ 停止**」按钮(红色 + 确认框)
|
||
- 实测:启动 → 请求停止 → 状态变为 `cancelled` ✓(当前节点执行完即退出)
|
||
|
||
## [4.11.9] - 2026-10-02
|
||
|
||
### 修复:Pexels 中文关键词搜不到 + 4K 大文件下载慢(实测发现)
|
||
|
||
**背景**:用户配置 Pexels key 后首次使用,中文关键词「医院 走廊」搜索长时间无结果
|
||
|
||
- **根因 1(翻译失效)**:`_translate_query` 只是**静态词典替换**(`ZH_TO_EN` 仅覆盖几十个词),"走廊"等未收录 → 中文直接丢给 Pexels → 命中率极低 → 多轮回落累积耗时
|
||
- **修复**:改为**两级翻译** —— ① 静态词典(快、零成本)→ ② 词典未完全覆盖时**用 LLM 翻译**(DeepSeek)
|
||
- 实测:`医院 走廊` → **`Hospital corridor`**(命中 4 个候选)✓
|
||
- **根因 2(下载慢)**:`_pick_best_file` 按「分辨率越高越好」打分 → 选中 **4K(2160x3840,13MB+)** → 下载慢
|
||
- **修复**:改为**优选 ~1080x1920**(标准竖屏,够用且下载快;4K 扣分)
|
||
- 实测:下载 1080x1920(5.4MB / 6.6MB)✓
|
||
- **根因 3(回落轮数无上限)**:关键词回落可能很多轮 → **修复**:限制**最多 3 轮**
|
||
- **附带发现(环境)**:macOS 系统代理(`127.0.0.1:7892`)会让 python urllib 的 **localhost 请求也走代理 → 502**(curl 不读系统代理所以正常)→ 调试脚本需禁用代理(`ProxyHandler({})` 或 `no_proxy`)
|
||
|
||
### ✅ 完整链路验证成功(用户配置 Pexels + 阿里充值后)
|
||
|
||
```
|
||
run wf_17ccb6dc8ce3 → completed(**20 秒**,5 节点全部 success)
|
||
n1 script → n2 material(Pexels) → n3 tts(阿里) → n4 subtitle → n5 output(混流)
|
||
|
||
成片 final_muxed.mp4:3.21 MB / 12.46 秒 / 1080x1920 @30fps
|
||
· Video: h264 ✓
|
||
· Audio: aac 22050Hz ✓(**有声音**)
|
||
· 字幕已烧录(3 段,时间轴与语音对齐)
|
||
产物链:voice.wav(TTS)→ subtitles.ass → deai(去AI化)→ final.mp4 → **final_muxed.mp4**
|
||
```
|
||
|
||
**「脚本 → 素材 → 配音 → 字幕 → 成片」完整口播视频全自动生成已打通** ✓
|
||
|
||
## [4.11.8] - 2026-10-01
|
||
|
||
### 维护:能力注册表状态校准(让「能力库」页反映真实现状)
|
||
|
||
- **`lipsync`(对口型)**:
|
||
- providers 修正为**实际实现** —— 代码用的是 **fal.ai(Kling Lipsync)**,原注册表误写为火山/D-ID
|
||
- 新增 `key_ref: fal.api_key`(未配置)+ note 说明
|
||
- status:`ready → partial`(依赖未配置的 fal key)
|
||
- **`de_ai`(去 AI 化)**:`planned → ready`(已实现且被合成节点自动调用,补 `consumer` 字段)
|
||
- **`subtitle`(字幕生成)**:`partial → ready`(已接入执行器第 8 个能力,补 `consumer` 字段)
|
||
- 状态分布:**ready 20 / partial 2 / planned 3**
|
||
- partial:`person_swap`(百炼欠费)· `lipsync`(fal key 未配)
|
||
- planned:`comfyui_workflow` · `vfx_apply` · `character_3d`(尚未实现)
|
||
|
||
**能力依赖一览(需配 key 的)**:`llm.api_key`(DeepSeek,已配)· `kling.api_key`(已配)· `aliyun.api_key`(**欠费**)· `volcano.voice_app_key` / `ark_api_key` · `pexels.api_key`(**未配**)· `fal.api_key`(**未配**)
|
||
|
||
## [4.11.7] - 2026-10-01
|
||
|
||
### 修复:TTS 失败提示不明(`Connection is already closed` 掩盖真实原因)
|
||
|
||
- **背景**:完整口播流程实测时 TTS 节点失败,报错只有 `Connection is already closed`,看不出真实原因
|
||
- **根因(实测定位)**:**阿里百炼账号欠费** —— 底层 websocket 实际返回
|
||
`error_code: "Arrearage"` / `"Access denied, please make sure your account is in good standing."`,
|
||
但被 websockets 库的通用异常掩盖(之前 TTS 成功是因额度尚在)
|
||
- 影响范围:**TTS(阿里 CosyVoice)+ 人物置换(同账号百炼)**
|
||
- **修复**(`voice_synthesizer/aliyun.py`):把异常翻译成可操作提示
|
||
- `Arrearage` → 「**账号欠费** —— 到阿里云控制台充值后重试」
|
||
- `Connection is already closed` → 「连接被关闭:① 欠费 ② Key 无效/过期 ③ 网络中断 → 去「🔑 API 配置 → 🧪 测试」验证账号状态」
|
||
- `Unauthorized / 401` → 「鉴权失败 → 更新 API Key」
|
||
- 实测:提示现在明确指向欠费原因 ✓
|
||
|
||
**🔴 用户待办**:阿里百炼账号充值(同时解锁 TTS 与人物置换)
|
||
|
||
## [4.11.6] - 2026-10-01
|
||
|
||
### 升级:合成节点支持「视频 + 人声 + BGM + 字幕」混流(口播线真正闭环)
|
||
|
||
- **`_impl_video_concat` 升级**(`workflows.py`):
|
||
- ① 画面:上游片段 → 去 AI 化 → 拼接
|
||
- ② **混流**:自动收集上游 **TTS 人声**(`audio_path`)+ **BGM**(`path`,相对路径自动解析)+ **字幕**(`subtitle_path`)→ 输出带声音、带字幕的成片
|
||
- 混流失败时**降级返回纯画面成片**(不阻断流程,附提示)
|
||
- 产物新增:`has_voice` / `has_bgm` / `has_subtitle` / `muxed`
|
||
- **新增混流方法** `StoryboardPipeline.mux_final()`(`composer/pipeline.py`)
|
||
- 字幕**烧录**(`-vf ass=...`)· 人声主音轨 · BGM 压低 + 淡入淡出 + `amix` 混合
|
||
- **🔴 踩坑修复(实测发现)**:本机 **ffmpeg 6.0 在「视频重编码(libx264) + 音频映射」同一命令里会静默丢音频** —— 输出流声明了 `aac` 但编码 **0 字节**(`-c:v copy` 时才正常保留)
|
||
- 定位:3 个变体测试(无 `-pix_fmt` / 带 `-pix_fmt` / 加 `aresample`)**全部丢音轨**;换 `-c:v copy` 立即正常
|
||
- **修复**:改用**两步法** —— 第 1 步视频(烧字幕/重编码,`-an` 无音频)→ 第 2 步以 `-c:v copy` 混入音频
|
||
- 并加**音轨存在性校验**(防静默丢音轨,缺失即明确报错)
|
||
- 实测:成片 + TTS + 字幕 → 混流输出 **0.62MB**,含 **Video(yuv420p 720x1280) + Audio(aac 22050Hz)** ✓ 字幕已烧录
|
||
|
||
**已接入执行器的能力(8 个)** + **混流输出** —— 口播视频完整链路打通
|
||
|
||
## [4.11.5] - 2026-10-01
|
||
|
||
### 新增:字幕生成能力接入执行器(第 8 个能力)
|
||
|
||
- **`subtitle` 接入** `CAP_IMPLS`(`workflows.py`):
|
||
- 复用 `composer/ffmpeg.py::create_subtitles`(生成 **ASS 字幕**,竖屏 1080x1920 自适应字号/边距)
|
||
- **两种来源**:① **上游分镜**(按镜头台词 + 时间轴自动累加)② **纯文本**(按句切分,约 5 字/秒估算时长)
|
||
- 分辨率优先级:节点配置 > 分镜输出规格 > 默认 1080x1920
|
||
- 产物:`subtitle_path` + 段数 + 格式
|
||
- **命名统一**:能力 id 对齐能力注册表(`subtitle`;原映射误写成 `subtitle_generate`)
|
||
- 实测:`script → subtitle` → **success**,生成 3 段 ASS 字幕(含样式头 + 事件表)✓
|
||
|
||
**已接入执行器的能力(8 个)**:分镜规划 · 提示词生成 · 视频生成(可灵)· 视频合成 · TTS 语音 · 素材搜索 · BGM 选择 · **字幕生成**
|
||
|
||
## [4.11.4] - 2026-10-01
|
||
|
||
### 新增:BGM 选择能力接入执行器(第 7 个能力)
|
||
|
||
- **`music_select` 接入** `CAP_IMPLS`(`workflows.py`):
|
||
- 复用 `music_selector.BGMSelector`(本地音乐库 `music_library.yaml`)
|
||
- 选择方式:**关键词搜索**(`keyword`)> **按风格**(`style`/`mood`,库内取值:治愈 / 燃系 / 舒缓 / 宏大)> **默认热门**(trending)
|
||
- **文件存在性校验**:优先返回音频文件真实存在的条目;全都不存在时给出明确提示(避免下游合成才发现)
|
||
- 产物:`bgm`(选中条目)+ `path` + `style` + `bpm` + `candidates`(候选列表)
|
||
- **改进**:BGM 节点默认 `mood` 由 `upbeat`(库中无此风格)改为**空** → 默认走「热门」,开箱可用
|
||
- 实测:`bgm(style=治愈)` → **success**(命中 2 条)✓
|
||
|
||
**已接入执行器的能力(7 个)**:分镜规划 · 提示词生成 · 视频生成(可灵)· 视频合成 · TTS 语音 · 素材搜索 · **BGM 选择**
|
||
|
||
## [4.11.3] - 2026-10-01
|
||
|
||
### 新增:素材搜索能力接入执行器(第 6 个能力)
|
||
|
||
- **`material_search` 接入** `CAP_IMPLS`(`workflows.py`):
|
||
- 复用 `material_producer/pexels/search.py::search_videos`(含**中文自动翻译为英文** + **3 轮回落搜索**提升命中率 + portrait 竖屏优先)
|
||
- 关键词来源:节点 `query`/`keywords` 配置 或 **上游文本**
|
||
- 参数:`count`(数量)· `min_duration`(最短时长)· `orientation`(portrait / landscape / square)
|
||
- 产物:`clips`(本地文件路径)+ `materials`(含时长/尺寸/原始链接)
|
||
- 实测:`script → material` 流程 → n1 文本透传 success · n2 **明确报错**「Pexels API Key 未配置 → 去 🔑 API 配置」(**框架正确**,配置后即自动可用)
|
||
|
||
**⚠️ 需配置**:Pexels API Key(`pexels.api_key`,免费申请 pexels.com/api)—— 配好后口播线即可自动配画面素材。
|
||
|
||
**已接入执行器的能力(6 个)**:分镜规划 · 提示词生成 · 视频生成(可灵)· 视频合成 · **TTS 语音** · **素材搜索**
|
||
|
||
## [4.11.2] - 2026-10-01
|
||
|
||
### 新增:TTS 合成能力接入执行器(口播线的关键一环打通)
|
||
|
||
- **`tts_generate` 接入** `CAP_IMPLS`(`workflows.py`):
|
||
- 支持**火山豆包 TTS**(`voice_synthesizer/volcano.py`)与**阿里 CosyVoice**(`voice_synthesizer/aliyun.py`)
|
||
- **未指定供应商时自动选可用的**:火山(需 `access_token`)> 阿里(需 `api_key`)—— 都没有时给出明确指引
|
||
- 文本来源:本次节点 `text` 配置 或 **上游透传文本**(`script`/`story_prototype` 节点的内容)
|
||
- 产物:`audio_path`(写入 run 产物目录)+ 字数
|
||
- **修复 2 个真实问题**:
|
||
1. **火山 TTS 报 400**:代码里的 AK/SK 签名是**简化版 basic auth**(非火山真实签名),且 `appid` 传空 → 现在**明确提示**"需配 access_token(或改用阿里)",不再静默失败
|
||
2. **阿里 TTS 返回空**:节点默认 `voice_id`(旧模型名 `cosyvoice-v3.5-plus`)**覆盖了配置里的正确 model**(带项目 ID)→ 改为**配置优先**
|
||
- **产物透传补全**(`app.py`):`audio_path` / `char_count` / `provider` / `model` / `prompt` 加入摘要字段
|
||
- **前端**:节点产物预览新增**音频播放器**(显示文件名与字数)
|
||
- 实测:`script → tts` 流程 → **completed**,生成 **92KB 语音文件** ✓(阿里 CosyVoice)
|
||
|
||
## [4.11.1] - 2026-10-01
|
||
|
||
### 新增:流程入口页全部落地(占位页 → 一键加载模板到画布)
|
||
|
||
- **7 个流程入口页**(原为「待实现」占位)全部替换为**可用入口**:
|
||
| 入口 | 模板 | 节点数 | 预估成本 |
|
||
|:--|:--|:--|:--|
|
||
| 🎭 短剧创作 | `short_drama` | 12 | ¥15-50 |
|
||
| 🎙️ 基础口播 | `basic_dub` | 5 | ¥2-5 |
|
||
| 🥁 卡点视频 | `beat_sync` | 4 | ¥1-3 |
|
||
| 📖 角色叙事 | `character_narrative` | 8 | ¥10-25 |
|
||
| 👤 数字人口播 | `digital_human` | 4 | ¥3-8 |
|
||
| 🎞️ 口播+混剪 | `hybrid_dub` | 4 | — |
|
||
| ➕ 新建流程 | (空白画布) | — | — |
|
||
- **共享入口组件** `views/flow-entry.js`:展示**流程步骤链预览** + 预估成本 + 使用提示 → 点「▶️ 开始」**把模板加载到流程画布**
|
||
- 实现:写 `localStorage.wf_pending_template` → 切到 `workflow` 视图 → 画布加载时读取并自动展开模板(`workflow.js` 配合)
|
||
- 实测:短剧创作入口显示「12 个节点 + 完整步骤链 + 开始按钮」→ 点击后**画布自动加载 12 个节点** ✓ 无 console 错误
|
||
- 说明:菜单里**不再有"待实现"占位页**(视频工厂相关页面全部可用)
|
||
|
||
## [4.11.0] - 2026-10-01
|
||
|
||
### 新增(P2):编排通电 —— 工作流执行器**真跑**(节点逐个执行 + 产物预览 + 重做)
|
||
|
||
**背景**:`WorkflowRunner._execute()` 此前只做拓扑排序后把节点标记 `completed`,**没有任何节点真执行** —— 这是「点开工作流不跑」的根因。本次按 `PLANS/VIDEO_FACTORY_MASTER.md` 附录 E 完成执行器。
|
||
|
||
- **节点 → 能力映射**(`NODE_TO_CAPABILITY`):9 类能力节点绑定真实能力;5 类输入/参数节点(`script`/`story_prototype`/`strategy`/`style`/`character`)**透传**
|
||
- **能力实现**(`CAP_IMPLS`,4 个已接入):
|
||
- `storyboard_plan` → 导演系统(默认 v5.2)生成统一分镜 Schema
|
||
- `prompt_gen` → 六模块提示词编译器
|
||
- `text_to_video` → 可灵 `kling-v3` 逐镜头生成(受「镜头数」限制,**控制试跑成本**)
|
||
- `video_concat` → 去 AI 化 + 拼接成片(复用 `composer/pipeline.py`)
|
||
- 其余能力(tts / material / bgm / subtitle…)→ **明确输出 `skipped` + 原因**(不假装成功)
|
||
- **执行器重写**(`WorkflowRunner`):
|
||
- 逐节点执行 + **产物存 run context** + 上游产物自动注入下游(自动识别 storyboard / clips / prompts)
|
||
- 配置合并:**能力默认值 ← 节点 config**
|
||
- `audit_gate` → **暂停**(`paused`),等人工「⏩ 继续」
|
||
- 失败即停 + 错误明确指向节点;支持 `from_node`(从某节点起跑下游)与 `resume`(暂停恢复)
|
||
- **后端接口**:`GET /api/workflow/runs` 返回**真实运行**(原为硬编码空数组);`GET .../{run_id}` 带产物摘要;新增 `.../resume`、`.../redo/{node_id}`、`.../artifacts`
|
||
- **前端画布**(`views/workflow.js`):
|
||
- 节点**状态徽章**(完成/执行中/失败/跳过/待审核,颜色区分)
|
||
- 运行区新增「**镜头数**」输入(控制生成成本)+「⏩ 继续」按钮
|
||
- 配置面板底部:**执行状态** + **产物摘要**(含**视频预览**)+「🔄 重做此节点」+「▶️ 从此起跑下游」
|
||
- 运行后**自动轮询**(3 秒)刷新状态
|
||
- 实测:
|
||
- **框架**(零成本):`basic_dub` → script 透传 success · tts/material/bgm **明确 skipped** · output 因无上游 failed(原因清晰)✓
|
||
- **真实流程**(`script → storyboard → model → output`,限 1 镜头):n1 success → n2 **分镜生成成功** → n3 **可灵生成中** ✓
|
||
|
||
## [4.10.7] - 2026-10-01
|
||
|
||
### 修复:素材库重做(旧接口 → 通用资产组件)+ 补 `materials` 资产类型
|
||
|
||
- **修复 1(语义)**:`assets.js` 原调 `/api/assets`(矩阵养号时代旧接口),标题还是「📦 资产库」
|
||
→ 重写为「🖼️ 素材库」(通用资产组件驱动,`kind=materials`)
|
||
- 字段:类型(图片/视频/音频/其他)· 来源(自己上传/采集/AI 生成/客户提供)· 描述 + 素材文件上传预览
|
||
- 定位区分:素材库是**文件级素材**(无业务字段);结构化资产(角色/场景/产品)带业务字段(如 `must_keep`)
|
||
- **修复 2(400 错误)**:后端 `ASSET_DIRS` 白名单缺 `materials` → 素材库请求全部 400 → 已补
|
||
- 实测:页面正常渲染(搜索/筛选/空态说明)· **无 console 错误**
|
||
|
||
## [4.10.6] - 2026-10-01
|
||
|
||
### 新增:✨ 特效预设(资产库最后一块 —— 9 类资产全部就位)
|
||
|
||
- `views/ave-vfx-presets.js`(复用通用资产组件,配置驱动)
|
||
- **特效类型**:子弹时间 / 环绕运镜 / 慢动作 / 焦点锁定 / 自定义
|
||
- **字段**:运镜参数(可灵 `camera_control` 六轴 horizontal/vertical/pan/tilt/roll/zoom)· 提示词后缀 · 建议时长 · 效果预览图
|
||
- 规范依据:《DCS 说明书 v2.0》第八节(特效运镜库)
|
||
- **资产库至此 9 类全部可用**:🧑 角色 · 🏞️ 场景 · 🏙️ 真实场地 · 📦 产品 · 🧰 道具 · 👗 服装 · 🔊 音色 · 🎵 BGM · 💥 音效 · ✨ 特效预设
|
||
- 实测:页面正常渲染(搜索 / 筛选 / 空态说明)· 无 console 错误
|
||
|
||
## [4.10.5] - 2026-10-01
|
||
|
||
### 新增:⚙️ 视频工厂设置(全局默认:去AI化 / 输出规格 / 渲染)
|
||
|
||
- **设置页** `views/ave-settings.js` + 后端 `GET/POST /api/ave/settings`
|
||
- **🎨 去 AI 化**:启用开关 · 模糊 sigma · 颗粒强度 · 饱和度偏移 · 色温 · 输出 CRF(每项带说明与默认值提示)
|
||
- **📐 输出规格**:分辨率(竖屏/方形/横屏)· 帧率 · 码率
|
||
- **⚡ 渲染**:并发出片数 · 可灵默认模型 · 单镜头时长
|
||
- 保存 / 恢复默认 · 页面显示配置文件路径
|
||
- 存储:`agent-local/tools/ave/config/settings.yaml`(本机生效、不进 git)
|
||
- 后端实现要点:**白名单键**(防写入未知字段)+ **按分组深度合并**(只改传入的项,其余保留)
|
||
- 实测:GET 返回默认值 ✓ · POST 保存(blur 0.4→0.6 / 并发 3→2)✓ · 读回正确且其他项未动 ✓ · 文件落盘 ✓ · 恢复默认 ✓
|
||
|
||
## [4.10.4] - 2026-10-01
|
||
|
||
### 新增:能力中心补齐(🔌 供应商管理 + 🧪 能力试跑)+ 密钥状态修复
|
||
|
||
- **🔌 供应商管理页**(`views/ave-providers.js`)
|
||
- 按能力汇总**所有可选供应商**:🟢 默认标记 / ✅⚠️ 密钥状态 / 模型名 / 密钥字段(如 `kling.api_key`)
|
||
- 分类筛选 · 一键「设为默认」· 顶部指引(密钥去哪配、参数去哪改)
|
||
- 实测:25 个能力、**39 个供应商**(密钥已配 18)、6 个分类
|
||
- **🧪 能力试跑页**(`views/ave-test-cap.js` + 后端 `POST /api/ave/capabilities/{id}/test`)
|
||
- **先「🔍 预检」后「▶️ 真跑」**:预检**零费用**(解析将用的供应商/模型/合并参数/密钥状态),确认无误再真跑(二次确认 + 费用提示)
|
||
- 真跑已接入:文本/图片 → 视频(可灵);其余能力返回"预检通过 + 实现未接入(附实现位置)"
|
||
- 实测:预检正常显示供应商/模型/参数/密钥状态;`text_to_video` → 可灵 kling-v3
|
||
- **产物预览接口** `GET /api/ave/file?path=`(**仅限 ave 产物/资产目录**,防目录穿越 —— 实测 `/etc/passwd` 被拒 403)
|
||
- **🔴 修复:密钥状态误判为未配置**(`capabilities/__init__.py`)
|
||
- 根因:代码读 `api_key_ref` 字段,而 `capabilities.yaml` 里用的是 **`key_ref`** → 全部返回"未配置"
|
||
- 修复:兼容两种字段名 → 实测 **27 个需密钥的供应商中 18 个已配**(可灵/火山/百炼 ✅)
|
||
|
||
## [4.10.3] - 2026-10-01
|
||
|
||
### 调研:可灵模型清单核对(图片 vs 视频)—— 图片接口报错疑同因
|
||
|
||
排查「图片接口报 1102 余额不足、但视频接口可用」时,核对官方定价页得到的**模型清单**:
|
||
|
||
| 类别 | 可用模型(官方定价页) | 计费 | 我们的状态 |
|
||
|:--|:--|:--|:--|
|
||
| **图片** | **Kling Image 3.0 / 3.0 Omni**(文生图+图生图,1K/2K,omni 支持 4K)· **Kling Image O1** · **Kling Image 2.1**(文生图 4 积分 / 图生图 8 积分 / 多图参考 16 积分) | 8 积分(¥0.2)/张 | ⚠️ **API `model_name` 待确认**(旧的 `kling-v1` 图片模型已停用 —— 与视频 `kling-v1`→`kling-v3` 是同类问题) |
|
||
| **视频** | **Kling 3.0 / 3.0 Turbo / 3.0 Omni**(含动作控制、有声/无声)· Avatar(数字人) | 0.6~3.0 积分/秒 | ✅ **已用 `kling-v3` 验证可用**(19 条任务记录) |
|
||
| 其他 | 动作控制 · 对口型 · Avatar 数字人 · 虚拟试穿(新版)· 文生音效 / 视频生音效 / 音色定制 | 按次/按秒 | ⚪ 待接入(可扩展能力注册表) |
|
||
|
||
**结论与待办**:
|
||
- 图片接口的 1102 报错**很可能也是模型名过期**(与视频同因,非余额)—— 官方文档为 SPA,`model_name` 参数值未能抓取;**未做试错调用(避免扣费)**
|
||
- **角色定妆照生成**(`character_sheet.py` / 资产库"生成"入口)需先确认图片 `model_name`(建议用官方控制台或 Dashboard「🔑 API 配置 → 🧪 测试」确认后填入)
|
||
- 视频侧另有 **Avatar(数字人)** 与 **对口型** 能力可扩展 —— 正好对应流程里的「数字人口播」
|
||
|
||
## [4.10.2] - 2026-10-01
|
||
|
||
### 新增(P3 续):资产库全类型落地(8 类资产页 + 配置驱动通用组件)
|
||
|
||
- **通用资产组件** `views/assets-common.js`(418 行,配置驱动)
|
||
- 一套 UI 覆盖全部资产类型:搜索(防抖)+ 筛选(按类型自定义)+ 排序 + **卡片/表格视图**(记忆)+ **详情抽屉**(编辑字段 + 上传参考图/音频 + 删除 + 引用提示)
|
||
- 各资产页只需约 25 行配置(`kind` / `refKeys` 参考图槽 / `filters` 筛选项 / `editFields` 编辑字段)
|
||
- 音频类资产(音色/BGM/音效)自动无图槽、提供音频上传与播放
|
||
- **8 类资产页面**(按《DCS 说明书 v2.0》第五节字段规范配置)
|
||
| 资产 | 参考图槽 | 特有字段 |
|
||
|:--|:--|:--|
|
||
| 🏞️ 场景库 | 全景/细节/光线 | 空间类型 · 光源状态 · 材质要点 · 空间拓扑 |
|
||
| 🏙️ 真实场地 | 全景/细节/光线 | 地址 · 实拍要点 |
|
||
| 📦 产品库 | 正/侧/细节/手持 | 类别 · **must_keep 必保特征** · 一致性种子 |
|
||
| 🧰 道具库 | 正/侧/细节 | 持用状态 · 新旧状态 · 结构比例 · 可见面 |
|
||
| 👗 服装库 | 正/背/细节 | 季节 · 材质 · 关联角色 |
|
||
| 🔊 音色库 | (音频) | 性别 · 来源 · **供应商音色 ID** |
|
||
| 🎵 BGM 库 | (音频) | 情绪 · 节奏 · 时长 · 版权 |
|
||
| 💥 音效库 | (音频) | 类别 · 时长 · 建议插入位置 |
|
||
- 后端 `ave_assets.py` 已支持全部 10 类资产(无需改动)
|
||
- 实测:8 个页面全部正常渲染(标题/统计/搜索/筛选/视图切换/空态说明)· 新建场景 → 详情抽屉(3 上传槽 + 各字段)· 无 console 错误
|
||
|
||
## [4.10.1] - 2026-10-01
|
||
|
||
### 新增(P3):资源库落地 —— 角色库完整实现(数据层 + 接口 + 前端)
|
||
|
||
按《DCS 说明书 v2.0》第五节目录规范实现,替代旧的 `character_registry`(单 yaml、无筛选、无分类)。
|
||
|
||
- **数据层** `09_ave/scripts/assets_manager/__init__.py`
|
||
- `AssetStore`:通用资产仓库(列表/搜索/筛选/排序/CRUD/上传文件/软删除到 `_trash/`)
|
||
- `CharacterStore`:角色特化 + 统计(按类型/用途/有音色)
|
||
- `migrate_from_registry()`:旧 14 角色 → 新目录结构(保留全部原字段)
|
||
- **目录规范**(按 DCS 第五节):`agent-local/tools/ave/assets/characters/{id}/`(`meta.json` + `ref_*.png` + `voice_sample.mp3`)
|
||
- **后端接口** `routes/ave_assets.py`(10 端点,支持 10 类资产)
|
||
- `GET/POST/PATCH/DELETE /api/ave/assets/{kind}[/{aid}]`
|
||
- `GET .../stats` · `POST .../{aid}/file`(上传)· `GET .../{aid}/file/{name}`(预览,防目录穿越)
|
||
- `POST /api/ave/assets/migrate`(迁移旧数据)
|
||
- `{kind}` = characters / locations / real_locations / products / props / wardrobe / voices / bgm / sfx / vfx_presets
|
||
- **前端角色库** `views/characters.js`(138 → 404 行,完全重做)
|
||
- **搜索**(名字/标签/描述,防抖 300ms)+ **筛选**(类型/用途/标签/有音色)+ **排序**(最近更新/名字/使用次数)
|
||
- **卡片视图 / 表格视图**(记忆用户选择)
|
||
- **详情抽屉**:编辑(名字/类型/用途/标签/描述)+ **上传参考图**(正/侧/背/全身)+ **上传音色** + 删除 + 引用提示
|
||
- **新建角色** → 创建后直接打开详情补图
|
||
- 实测:迁移 14 角色 ✓ · 搜索「程序」命中「阿远」✓ · 筛选 type=anime ✓ · 详情抽屉(5 个图/上传元素 + 音色区)✓ · 无 console 错误
|
||
|
||
## [4.10.0] - 2026-10-01
|
||
|
||
### 重构(P1):视频工厂菜单按新架构重组(一级 4 块 / 二级具体项)
|
||
|
||
**背景**:架构对齐用户设计文档后,此前"资产/创作/编排/配置"四组平铺的结构不符合实际心智(导演创作只是一条流程;人物置换也是流程不是资产)。本次按 `PLANS/VIDEO_FACTORY_MASTER.md` 第二节重组。
|
||
|
||
- **新菜单结构**(`nav-menu.js`,单点定义)
|
||
- `📦 视频工厂 · 资源库`(12 项):角色库 · 角色生成器 · **场景库** · **真实场地** · **道具库** · **产品库** · **服装库** · 素材库 · **音色库** · **BGM 库** · **音效库** · **特效预设**
|
||
- `🎞️ 视频工厂 · 流程`(10 项):导演创作 ★ · **短剧创作** · **基础口播** · **卡点视频** · **角色叙事** · **数字人口播** · **口播+混剪** · 人物置换 · 流程画布 · **新建流程**
|
||
- `🧩 视频工厂 · 能力中心`(3 项):能力配置 · **供应商管理** · **能力试跑**
|
||
- `📊 视频工厂 · 运营`(4 项):生产记录 · **费用统计** · **历史操作** · **设置**
|
||
- (原「视频·资产/创作/编排/配置」四组已移除;`工作流` 改名「流程画布」,`能力库` 改名「能力配置」)
|
||
- **20 个占位页**(P1 骨架):新建页面先占位,明确标注「待实现」+ **规划内容**(按 DCS 文档第五/七节与用户需求),指向架构文档
|
||
- **视图注册**:`view-registry.js` 注册 20 个新视图
|
||
- 实测:菜单 4 组渲染正常 · 占位页全部可打开(标题 + 规划内容)· 无 console 错误
|
||
|
||
**说明**:本次**只动菜单/入口,不碰任何逻辑**。P3(资源库落地)与 P2(流程通电)随后按序进行。
|
||
|
||
## [4.9.8] - 2026-10-01
|
||
|
||
### 文档:视频工厂架构重构 v2.0(按实际使用需求重新梳理,纠正此前的结构错误)
|
||
|
||
- **新增 `PLANS/VIDEO_FACTORY_MASTER.md`**(**唯一权威架构文档**,289 行)
|
||
- **三层模型**:流程(做事入口)· 能力(零件,可替换/可配模型)· 资产(原料库)
|
||
- **纠正此前的结构错误**:
|
||
- 「导演创作」是**一条流程**(不是独立板块,与口播/卡点/短剧同级)
|
||
- 「人物置换」也是**一条流程**(选人→换人),不属于资产
|
||
- 「工作流」= 流程本身(画布是流程的编辑/查看形式)
|
||
- 菜单不按"资产/创作/编排"平铺,改按「流程 / 能力 / 资产 / 辅助」四大块
|
||
- **流程清单 8 条**(6 条原有 + 导演创作 + 人物置换),每条标注现状与待修
|
||
- **执行与审查机制**(用户核心需求):逐步模式 / 自动模式 · 每节点产物预览(文本可编辑 / 音频图视频可播放重做)· 改配置后「🔄 重做」· 「从某节点起重跑下游」
|
||
- **节点配置体系**:能力默认值 → 流程级 → 节点级(三来源全暴露)· 供应商 + 模型独立下拉 · 节点可「替换能力」
|
||
- 后端 6 层架构 + 现有代码映射(复用/改造/重写)+ **P1~P7 改造计划**
|
||
- **归档旧文档** → `90_archive/video_factory_docs_20261001/`(含归档说明,标注失效部分与仍可参考部分)
|
||
- **现状确认(重要)**:`workflows.py` 的 6 条流程模板**结构完整**(15 种节点定义、画布 UI、节点配置面板),但 `WorkflowRunner._execute()` **只做拓扑排序后标记 completed**,**没有任何节点真正执行** —— 这是"点开工作流不跑"的根因,P2 阶段重写执行器
|
||
|
||
## [4.9.7] - 2026-10-01
|
||
|
||
### 新增:可灵 Webhook 回调支持(验签 + 自动转存产物)
|
||
|
||
**参考**:可灵官方回调协议文档(`klingai.com/document-api/api/get-started/callbacks`)
|
||
|
||
- **验签模块** `09_ave/scripts/lib/kling_webhook.py`
|
||
- 按官方规范实现:签名串 `{webhook-id}.{webhook-timestamp}.{rawBody}`,密钥 `base64Decode(secret 去 whsec_ 前缀)`,签名 `base64(HMAC-SHA256(key, 签名串))`
|
||
- **常量时间比较**(`hmac.compare_digest`)防时序攻击 · **±5 分钟时间窗**防重放 · 支持多签名头(`v1,a v1,b` 任一匹配)
|
||
- `parse_callback()`:解析回调 body(`id`/`status`(submitted|processing|**succeeded**|failed)/`outputs[]`)
|
||
- secret 来源:环境变量 `KLING_WEBHOOK_SECRET` > `agent-local/.../local.yaml → kling.webhook_secret`
|
||
- **回调端点**(`routes/ave.py`)
|
||
- `POST /api/ave/kling/callback`:验签(失败 401)→ 解析 → 落盘 `agent-local/runtime/ave/callbacks/<task_id>.json` → **后台自动转存产物**(因官方提示生成资源 **30 天后清理**)
|
||
- `GET /api/ave/kling/callbacks`:最近回调记录(排查用)
|
||
- `GET /api/ave/kling/webhook-info`:配置状态(脱敏,不回显 secret)
|
||
- **配置页新增字段**:`kling.webhook_secret`(可在 Dashboard → 🔑 API 配置 管理)
|
||
- **安全**:secret 仅存 `agent-local/tools/ave/config/local.yaml`(**600 权限、不进 git**,已核验)
|
||
- 实测:验签 6 项自测全过(正确通过/篡改拒绝/过期拒绝/多签名/解析)+ 端点 3 项(合法 200 / 错误签名 401 / 缺头 401)全过
|
||
|
||
⚠️ **使用前提**:可灵服务器需能访问回调地址(**需公网可达**)。当前 Dashboard 在局域网(192.168.31.102)+ Tailscale(100.111.43.6,私有网络)→ 可灵无法直连;如需启用 webhook:路由器端口映射本机公网 IP,或用 `tailscale funnel` 暴露。**在此之前继续用轮询(已稳定工作,不依赖回调)**。
|
||
|
||
## [4.9.6] - 2026-10-01
|
||
|
||
### 新增:六模块提示词编译器(整合成熟方法论)+ 合格成片确认闭环
|
||
|
||
- **六模块提示词编译器**(`composer/pipeline.py::build_shot_prompt` 重写)
|
||
- 按 **ai-film-skills / produce-ai-video / `references/storyboard-prompt-compiler.md`** 的母提示词方法论重构
|
||
- 六模块结构:**① 生成任务**(时长/类型/画幅/机位方式)· **② 主要主体**(角色/服装/动作/表演)· **③ 场景状态**(地点/光源依据/镜头语言/道具)· **④ 情绪目标** · **⑤ 视觉风格**(拍摄风格 + **负向约束**:不要运镜特效痕迹/AI 塑料质感/字幕水印/快速变焦)· **⑥ 分段脚本**(景别/机位/摄影机/景深/光学/画面动作/台词)
|
||
- 实测:v5.2 分镜 → 每镜头提示词约 470~530 字(原为逗号拼接的短句),信息完整度显著提升
|
||
- **交付状态闭环**:新增 `POST /api/ave/storyboard/render/{job_id}/review`
|
||
- 用户确认「已完整播放审查」→ 交付状态由「候选成片」升级为「**合格成片**」
|
||
- 校验:任务未完成(400)/ 存在失败镜头(400)/ 任务不存在(404)
|
||
- 前端:候选成片(无失败)后显示「✅ 我已完整看过(标记合格成片)」按钮
|
||
- 严格遵循方法论:**未经完整播放审查不得称合格**
|
||
- **方法论库入库**:`ai-film-skills` 的 **129 个 `references/`** 文档(六模块编译器 · 设计记忆协议 · 摄影设计引擎 · 合格成片验收 · 十二项完成门 · 构图与轴线 · 运镜诊断 …)
|
||
|
||
## [4.9.5] - 2026-10-01
|
||
|
||
### 优化:逐镜头**并发生成**(出片提速 3.4 倍)+ 体积再降
|
||
|
||
- **⚡ 并发生成**:`StoryboardPipeline.render(max_workers=3)` 默认 3 路并发调用生成引擎
|
||
- **实测:3 镜头出片 6.5 分钟 → 1.9 分钟(提速 3.4 倍)**
|
||
- 并发结果**按镜头序号归位**(`clips_by_idx` + 锁),保证成片顺序与分镜一致(实测片段顺序 01→02→03 ✓)
|
||
- 单镜头失败不影响其他镜头(互不阻塞)
|
||
- **📦 体积优化叠加**:并发测试成片 **3.2 MB**(对比优化前 39.6 MB,**缩小 12 倍**)
|
||
- CRF 23 + 并发 = 单段约 1.0~1.3 MB(原 11.9~14.3 MB)
|
||
- **交付状态生效**:并发测试返回「候选成片 | 已生成拼接,尚未完整播放审查」✓(诚实标注,未夸大为合格)
|
||
|
||
## [4.9.4] - 2026-10-01
|
||
|
||
### 新增:看板「一键出片」闭环(前端 → 后端 → 生成 → 成片)+ 去 AI 化体积优化
|
||
|
||
- **🎬 前端一键出片**(`views/ave-director.js`)
|
||
- 分镜表新增「🎥 生成成片」按钮(原为占位,点击无反应)→ **真实出片**
|
||
- 确认框显示镜头数与预计耗时 → 启动后**进度条 + 实时日志**(generate / deai / concat 每步状态)
|
||
- 完成后显示**交付状态徽章** + 成片路径 + 段数/时长;失败显示原因与失败镜头清单
|
||
- 修复命名冲突:原 `_sbRender()`(渲染分镜表,模块内)与出片函数重名 → 出片改名 `_sbRenderVideo`,并撤销 3 处误改调用
|
||
- **后端出片接口**(`routes/ave.py`,3 个端点)
|
||
- `POST /api/ave/storyboard/render`:**后台线程**执行出片(分镜 dict 或 project_id),立即返回 `job_id`
|
||
- `GET /api/ave/storyboard/render/{job_id}`:进度轮询(进度数组 + 状态 + 成片路径 + 交付状态)
|
||
- `GET /api/ave/renders`:出片历史
|
||
- 产物落盘:`agent-local/runtime/ave/renders/<job_id>/`(含各镜头片段 + 去AI化片段 + final.mp4)
|
||
- **🔧 去 AI 化体积优化**:`DEFAULT_CRF 18 → 23`
|
||
- 实测:同一镜头 `3.16MB → 0.97MB`(**不再是"去AI化后膨胀 4 倍",反而缩到 1/3**,视觉几乎无差)
|
||
- **交付状态三级标注**(整合 produce-ai-video 验收方法论)
|
||
- `Storyboard` 新增 `delivery_status` / `delivery_note`
|
||
- `合格成片`(全镜头成功 + 已完整播放审查)/ `候选成片`(可播放但有失败镜头或未经审查)/ `未完成/待验证`
|
||
- **诚实原则**:未经完整播放审查的成片一律标为「候选成片」,不夸大为合格
|
||
- 实测:看板接口启动 → 后台出片 1 镜头 → 进度 6 步实时更新 → 成片落盘 `final.mp4`(968KB / 5 秒)✓ 无失败
|
||
|
||
## [4.9.3] - 2026-10-01
|
||
|
||
### 新增 + 重大修复:可灵视频生成引擎接入(找出"不能用"的真正原因:模型名过期)
|
||
|
||
- **🔴 根因(重要)**:可灵 **`kling-v1` / `kling-v1-5` / `kling-v1-6` / `kling-v2` / `kling-v2-1` / `kling-v2-master` 均已停用或不支持**(`code:1203` / `1201`),
|
||
**可用模型是 `kling-v3`** → 这是"充值了却用不了"的真正原因(**不是余额问题**)
|
||
- 实测:`kling-v3` 提交成功(`code:0`)→ 任务 6 次轮询后 `succeed` → **5.04 秒视频生成成功、下载 4.65MB**
|
||
- **可灵视频生成能力** `05_tools/09_ave/scripts/capabilities/kling_video.py`(新增,222 行)
|
||
- `KlingVideoClient`:文生视频(`/v1/videos/text2video`)/ 图生视频(`/v1/videos/image2video`)+ 任务轮询 + 下载
|
||
- 鉴权:`api_key`(Bearer)优先 → `access_key + secret_key`(JWT HS256)回退
|
||
- **错误分类明确**:余额不足(1102)/ 鉴权失败(1101)/ 模型停用(1203)分别给出可操作提示
|
||
- 下载兼容:签名 URL(含 `cacheKey`)免鉴权优先,401/403 时带鉴权重试
|
||
- **接入流水线**:`composer/pipeline.py::_generate_shot()` 默认调用可灵引擎;新增 `build_shot_prompt()`(分镜 → 生成提示词:画面 + 镜头契约 + 情绪 + 全局锚点 + 去AI化倾向)、`_aspect_ratio()`(按输出分辨率推断 9:16 / 16:9)
|
||
- **能力注册表更新**:`text_to_video` / `image_to_video` / `text_to_image` 的 kling 模型名 → **`kling-v3`**;`text_to_video` 状态 `planned → ready`,补 impl 与实测来源
|
||
- **外加:ai-film-skills 完整技能包入库**(Apache-2.0)
|
||
- **18 个技能包**(324KB)下载入库 `09_ave/skills/ai-film-skills/skills/`
|
||
- 重点包:`ai-short-drama-production`(11KB AI 短剧制作)· `produce-ai-video`(8.4KB 视频制作)· `character-asset` / `scene-asset` / `prop-asset`(15KB/15KB/13KB 资产规范)· `director-agent`(10.8KB)· `ai-storyboard-director`(6.5KB v5.2 分镜)· 7 个题材风格包(cyberpunk/epic/fantasy/horror/noir/romance/wuxia)· 2 个数据包
|
||
- 仓库根文档:`SKILL_CATALOG.md` / `INSTALLATION.md` / `COMPATIBILITY.md` / `docs/WORKFLOW.md`
|
||
|
||
## [4.9.2] - 2026-10-01
|
||
|
||
### 新增:AI Storyboard Director v5.2 技能入库并启用(导演可切换验证成功)
|
||
|
||
- **技能文档入库** `09_ave/skills/ai-film-skills/docs/skills/zh-CN/`(Apache-2.0)
|
||
- `ai-storyboard-director.md`(v5.2 分镜导演,7.1KB)← 核心
|
||
- `director-agent.md`(编剧与导演)、`character-asset.md` / `scene-asset.md` / `prop-asset.md`(资产规范)
|
||
- 获取方式:命令行走不通时用浏览器下载 zip(GitHub 网络限制,已在 `skills/README.md` 写明两条路径)
|
||
- **v5.2 导演自动启用**:`storyboard_v52.py` 检测到技能文档 → `available=True` → 前端导演下拉由置灰变可选
|
||
- **实测对比(同一故事 / 4 镜头 / 20 秒)**:
|
||
| 维度 | legacy(简单提示词) | **v5.2(技能方法论)** |
|
||
|:--|:--|:--|
|
||
| 画面描述 | 一句话 | **完整场面调度**(手机支架位置、光线来源、景深层次) |
|
||
| 镜头契约 | 有 | **精细**(近景/平视略俯/固定/景深浅) |
|
||
| 情绪 | 单词 | **完整描述**("平静、略带疲惫但放松,像跟朋友随口聊天") |
|
||
| 连续性 | — | **跨镜头承接**("同一病房,镜头位置不变,我从半躺调整成坐直") |
|
||
| 镜头设计 | 机械分配 | **按内容选**(查房用"过肩中景";下地走用"床尾高度跟拍全景") |
|
||
- 验证了框架核心设计:**换导演系统,下游完全不用改**(同一 `generate()` 契约,输出统一 Schema)
|
||
|
||
## [4.9.1] - 2026-10-01
|
||
|
||
### 修复 + 新增:FFmpeg 路径统一(合成链此前**从未跑通**的根因)+ 分镜→成片流水线
|
||
|
||
- **🔴 修复:FFmpeg 路径**(`lib/ffmpeg.py` 新增)
|
||
- **根因**:本机 FFmpeg 装在 `~/.local/bin`(非 brew,不在 PATH),但 `composer/ffmpeg.py` 等模块用裸 `subprocess.run(["ffmpeg", ...])` → **合成类功能一直失败**
|
||
- 修复:新增 `lib/ffmpeg.py`(统一解析 `FFMPEG` / `FFPROBE` 绝对路径),批量替换 **37 处**裸命令(`composer/ffmpeg.py` 14 + `beat_sync.py` 11 + `hybrid.py` 7 + `speed_ramp.py` 5)
|
||
- 实测:`concat_segments()` 拼接成功(FFmpeg 路径解析为 `/Users/.../.local/bin/ffmpeg`)
|
||
- **新增:分镜 → 成片流水线** `composer/pipeline.py`(S2-6)
|
||
- `render_from_clips()`:已有片段 → 去AI化 → 拼接 → 成片(**可独立使用/测试**)
|
||
- `render()`:分镜 → 逐镜头生成 → 去AI化 → 拼接 → 成片(支持 `generate_fn` 注入引擎;进度回调 `progress_cb`)
|
||
- 逐镜头状态回写(`shot.status` / `artifact` / `error`),部分失败不中断(**失败镜头跳过,其余照常出片**)
|
||
- 实测:3 镜头完整管道 → 去AI化 3 段 → 拼接 → 成片 10.5MB,进度事件 14 条全通 ✓
|
||
- 生成环节:`_generate_shot()` 未接引擎时**报明确错误**(指引去「🧩 能力库」配供应商),引擎就绪即自动可用
|
||
|
||
## [4.9.0] - 2026-10-01
|
||
|
||
### 新增:S2 导演创作 —— 故事 → 分镜 → 可编辑(统一分镜 Schema 落地)
|
||
|
||
**框架**:`PLANS/VIDEO_FACTORY_FRAMEWORK.md` S2 阶段。核心是让「统一分镜 Schema」成为中枢:任何导演系统输出它,下游(编排/能力/执行)全不用改。
|
||
|
||
- **统一分镜 Schema** `09_ave/scripts/schemas.py`(**14 个 pydantic 模型**,按 DCS 第四节)
|
||
- `Storyboard` / `Shot` / `GlobalAnchors` / `ShotContract` / `VFXConfig` / `ExpressionDetail` / `SFX` / `AudioConfig` / `Subtitle` / `Transition` / `Speed` / `ColorConfig` / `PostProcess` / `OutputConfig`
|
||
- 便捷方法:`total_duration()` / `shot_by_id()` / `reindex()` / `to_dict()` / `from_dict()` / `save()` / `load()` / `summary()`
|
||
- 与现有 `scene_planner` 双向互转:`scenes_to_storyboard()` / `storyboard_to_scenes()`
|
||
- **导演适配器框架** `09_ave/scripts/directors/`(**替换点①**)
|
||
- `base.py`:`BaseDirector`(唯一契约 `generate(story, anchors, options) -> Storyboard`)+ 通用选项
|
||
- `llm.py`:导演层共用 LLM 客户端(三级配置优先级 + 熔断 + JSON 容错解析)
|
||
- `legacy_scene_planner.py`:**本地导演**(LLM 直出分镜,含镜头契约 + 单镜头重生成)
|
||
- `storyboard_v52.py`:**AI Storyboard Director v5.2**(技能型导演:读技能文档作系统提示词 + 先锁视觉概念再拆镜头;**文档未就位时自动标记不可用**,前端下拉置灰)
|
||
- `__init__.py`:注册表(`get_director` / `default_director` / `list_info`),**加新导演只改这里一处**
|
||
- **去 AI 化处理链** `09_ave/scripts/composer/de_ai.py`(DCS 第八节)
|
||
- 滤镜链:`gblur → noise → eq saturation → curves → colortemperature`(默认 模糊0.4 / 颗粒12 / 饱和-0.12 / 色温5300K)
|
||
- FFmpeg 绝对路径探测(本机 `~/.local/bin`)+ `apply_to_storyboard()` 按分镜配置处理
|
||
- **后端接口** `routes/ave.py` 扩展:`GET /api/ave/directors`、`POST /api/ave/storyboard/generate|revise|save`、`GET /api/ave/storyboards`
|
||
- **前端「🎬 导演创作」页** `views/ave-director.js`(菜单新增 `🎞️ 视频·创作` 组)
|
||
- 导演下拉(显示 kind/可用性/特性)+ **按导演 options_schema 自动生成选项**(镜头数/时长/风格…)
|
||
- 故事输入 + 全局锚点(角色/地点/一致性种子)
|
||
- **分镜表**:逐镜头可改(画面描述/镜头契约/台词/情绪/时长/类型)、🔄 单镜头重生成、删除、上下移、➕ 加镜头、💾 保存
|
||
- 实测:Schema 构造/JSON往返/格式互转/reindex ✓;legacy 导演真实出 5 镜头(镜头契约专业:近景/平视/固定/景深浅)✓;去 AI 化 FFmpeg 实测成功 ✓;接口出 4 镜头 20 秒 ✓;前端生成 6 镜头 30 秒渲染无错 ✓
|
||
- ⚠️ **待解决**(外部依赖,非代码问题):① 可灵仍报余额不足(`code:1102`,充值未到账?)② 火山方舟即梦模型名待确认(需控制台开通)→ 解决后即可跑通「分镜 → 逐镜头生成 → 去AI化 → 拼接 → 成片」
|
||
|
||
## [4.8.1] - 2026-10-01
|
||
|
||
### 优化:视频工厂菜单重组 + 能力库信息详细化 + 空壳目录清理
|
||
|
||
- **菜单重组**(消除"散乱"):原 `🎬 视频工厂` 9 项平铺 → 拆为 3 个清晰分组
|
||
- `📦 🎬 视频·资产`:角色库 / 角色生成器 / 素材库 / 人物置换
|
||
- `⚙️ 🎬 视频·编排`:工作流 / 能力库 / 生产记录 / 费用分析
|
||
- `🔧 🎬 视频·配置`:能力总览(原「能力目录」,与「能力库」区分:总览=只读,能力库=可编辑注册表)
|
||
- `🎬 视频·创作`(导演创作/口播/卡点…)待 S2 建立页面后加入
|
||
- **能力库信息详细化**(说人话):
|
||
- 顶部三句话讲清:🔑 **密钥在「⚙️ 服务 → 🔑 API 配置」配**、🤖 **模型由供应商决定可覆盖**、➕ **加能力只改 yaml**
|
||
- 每个供应商旁标明**密钥配置字段**(如 `volcano.voice_app_key`)+ 多供应商列出全部可选
|
||
- **输入/输出分区中文化**:`📥 输入:文本内容(text)· 情绪(emotion,可选)` / `📤 输出:音频文件(audio_path)· 时长(duration)`
|
||
- 补充:执行方式(本地线程 / 远程 guardd)、实现位置、来源
|
||
- **能力注册表补全**(25 个能力):修正 `tts_generate` 实现位置(→ `voice_synthesizer/` 391 行);新增 `script_generate` 脚本生成(`script_generator/` 377 行)
|
||
- **清理空壳目录**:7 个早期编号目录(`01_director_parser` … `07_service_layer`,均 0 行)**归档**到 `90_archive/ave_legacy_numbered_dirs_20261001/`(含 README 说明);确认实现都在无编号目录
|
||
- **标注废弃**:`agentos/plugins/ave.py` 引用的 5 个脚本路径全部不存在(本来就跑不通)→ 文件头加废弃说明并指向真实入口(`main.py` / `video_factory.py` / Dashboard)
|
||
|
||
## [4.8.0] - 2026-10-01
|
||
|
||
### 新增:视频工厂「🧩 能力库」—— 能力注册表(S1 落地)
|
||
|
||
**背景**:视频工厂框架对齐(见 `PLANS/VIDEO_FACTORY_FRAMEWORK.md`),S1 = 建立「能力真相源」。
|
||
此前能力散落后端代码/架构文档/外部 API 四处,无统一清单,导致"越堆越乱"。
|
||
|
||
- **能力注册表** `05_tools/09_ave/config/capabilities.yaml`(**能力真相源**,460 行)
|
||
- **24 个能力**分 5 类:音频 6 / 视觉 5 / 视频 4 / 分析 5 / 外部 4
|
||
- 每个能力含:`input`/`output` 契约、`params_schema`(自动生成配置 UI)、`providers[]`(**多供应商可选**)、`defaults`、`execution`(本地/远程)、`impl`(实现位置)、`status`(ready/partial/planned)、`source`
|
||
- 密钥只存引用(`api_key_ref` → 指向「🔑 API 配置」页),本文件不含密钥
|
||
- 状态现状:✅ 可用 17 / 🟡 部分 2 / ⚪ 规划中 5
|
||
- **加载器** `09_ave/scripts/capabilities/__init__.py`
|
||
- 查询(all/get/by_category/providers_of)+ 修改(set_default 改供应商/模型、set_param_default 改参数默认值,含范围 clamp 与枚举校验)+ 密钥配置状态检查(不读密钥内容)
|
||
- **后端接口** `10_dashboard/routes/ave.py`(`/api/ave/*`)
|
||
- `GET /capabilities`(列表 + 密钥状态)|`POST /capabilities/{id}/default`|`POST /capabilities/{id}/param`|`GET /capabilities/maintenance`
|
||
- **前端「🧩 能力库」页** `views/ave-capabilities.js`(菜单:视频工厂 → 🧩 能力库)
|
||
- 统计徽章(总/可用/部分/规划)· 分类 Tab · 能力卡片(供应商下拉含 🔑 状态、模型、参数表单按 schema 生成)
|
||
- 编辑 → 💾 保存(落盘 yaml 即时生效,全流程共用)· 底部提示可清理的空壳目录
|
||
- 实测:接口读 24 能力 ✓;改默认供应商/参数落盘 ✓;越界 clamp(99 → 上限 2)✓;非法枚举 400 ✓;前端 24 卡片渲染 + 编辑保存 + 无 console 错误 ✓
|
||
|
||
## [4.7.1] - 2026-09-25
|
||
|
||
### 修复:账号中心远程账号昵称/粉丝"消失"(guardd profiles 查询超时被静默吞掉)
|
||
|
||
- **现象**:账号中心里 5kecheng / 7kecheng 的账号(41 个)昵称、粉丝全部为空,只有本机 15 个正常
|
||
- **根因**(`dashboard.err` 实证):
|
||
```
|
||
guardd_api GET http://100.72.182.121:9090/accounts/profiles -> timeout
|
||
guardd_api GET http://100.65.35.28:9090/accounts/profiles -> timeout
|
||
```
|
||
`_guardd_api` 走 raw socket + **默认 timeout=5s**,而 profiles 响应体约 **12.5KB**(需多次 recv),
|
||
Tailscale 网络抖动时超时 → 异常被 `except: pass` 静默吞掉 → 返回空 → 昵称/粉丝全丢;
|
||
更糟的是**空结果被写入 5 分钟缓存**,导致失败后持续空
|
||
- **修复**(`services/account_service.py`):
|
||
1. profiles 查询:timeout 5s → **15s** + **重试 1 次**
|
||
2. status 查询:同样 timeout 15s + 重试
|
||
3. **失败不再污染缓存**:有旧缓存则沿用(并记 warning),无缓存则不写(留待下次重试)
|
||
- 实测:5kecheng **0/21 → 20/21** 有昵称、7kecheng 20/20、本机 15/15,连续 3 次请求稳定
|
||
|
||
## [4.7.0] - 2026-09-25
|
||
|
||
### 新增:评论工作台第三种模式「📌 指定评论」(我提供内容,账号领单条)
|
||
|
||
- **模式切换**:🎯 定向评论 / 💬 多人讨论 / **📌 指定评论**(第三个按钮)
|
||
- **流程**:粘贴评论内容 → 🔍 解析整理 → 列表可编辑/删除 → 数量校验 → 📤 分发
|
||
- **解析整理**(纯前端,0 AI 调用):
|
||
- 一行一条;自动去掉序号前缀(`1.` `2、` `[3]` `-` `•` `①` 等)
|
||
- 去首尾引号(中英文)、去空行、**自动去重**
|
||
- 可选「整段按句号拆分」(整段粘贴时按 。!? 切句)
|
||
- **1 账号 1 条**:随机抽「评论数」个账号,评论顺序同时打散(避免按序对应被识别)
|
||
- **数量校验**(实时 + 分发前双提示):
|
||
- 账号 < 评论 → ⚠️ "请补选 N 个账号,或删掉 N 条评论"
|
||
- 账号 > 评论 → ℹ️ "N 个账号领评论,剩余 M 个:按所选动作处理"
|
||
- 相等 → ✅ 数量匹配
|
||
- **多余账号动作**:不参与 / 只浏览(暂未实现,等同不参与)/ 去点赞
|
||
- 后端 `_build_assigned_plan`(command_bus)+ dispatch 分支 `assigned_comment`
|
||
- 实测:解析去重(5 行→3 条)、数量校验文案、dry_run 分发(5 账号 / 3 评论 / 多余点赞 → 5 任务,0 错误)
|
||
|
||
## [4.6.5] - 2026-09-20
|
||
|
||
### 修复:worker 机器误跑 Dashboard 导致「数据视图分裂」(标签改了看不到)
|
||
|
||
**根因**:三台机器都装了 Dashboard 并 launchd 自启(5kecheng 从 8/21 起持续运行)。
|
||
Dashboard 是联邦统一控制平面(只有 master 应运行),worker 各自跑导致账号标签/备注等
|
||
本机数据在不同看板显示不同值 → 用户在本机改标签、去那台机器看却没变。
|
||
|
||
- **停用 worker Dashboard**:5kechengdeAir 已停用(launchctl bootout + plist 改名 .disabled,保留 guardd);
|
||
7kecheng 机器离线,待上线后执行脚本
|
||
- **新增一键脚本** `00_bootstrap/disable_worker_dashboard.sh`:
|
||
- 多来源身份识别(hostname / ComputerName / LocalHostName / HOST_ID.md)→ master 上执行会**自动中止**(需 --force 才继续)
|
||
- 停用后验证 Dashboard 进程=0 / guardd 进程>0 / 9988 端口释放
|
||
- **文档**:FEDERATION_GUIDE §3.1 增加「部署原则:只有 master 运行 Dashboard」+ 正确访问方式(统一访问 http://100.111.43.6:9988)
|
||
- 验证:5kecheng 停用后中心看板仍正常聚合三台账号(21+20+15=56);guardd 心跳正常
|
||
|
||
|
||
## [4.6.4] - 2026-09-20
|
||
|
||
### 重构:侧边栏菜单单点化(消除三份硬编码菜单的技术债)
|
||
|
||
- **新增** `frontend/src/nav-menu.js`:全项目菜单的**唯一**定义处(5 分组 30 项)
|
||
- **三处统一引用**:`inline.js` / `navigation.js` / `modules/matrix_views.js` 均改为 `import { NAV_GROUPS }` + `const groups = NAV_GROUPS`(其他代码零改动)
|
||
- **零行为变化**:以重构前**实际生效**的菜单(matrix_views.js 的启用项)为基准;旧菜单里未上线的项(matrix-corpus / matrix-commands 等)以注释形式保留在 nav-menu.js,需要时取消注释即可
|
||
- 验证:构建产物「API 配置」出现次数 **3 → 1**(确认单点);三处无残留旧菜单定义;菜单规模 5 组 30 项
|
||
- 收益:**以后新增/删除菜单只改 nav-menu.js 一处**,不会再出现改了菜单看不到(4.6.2 踩过的坑)
|
||
|
||
|
||
## [4.6.3] - 2026-09-20
|
||
|
||
### 新增:API Key 版本管理(替换 / 回滚 / 删除 —— 支持轮换已泄露的 key)
|
||
|
||
- **保存即归档**:填入新 key 保存时,旧值**自动存入历史**(标记「被替换」),不会丢失
|
||
- **🔄 一键回滚**:历史面板列出该字段的所有版本(脱敏 + 备注 + 时间 + 🟢使用中),点「🔄 启用」即可切回旧版本;切换前的当前值也会自动归档,可来回切
|
||
- **🗑 删除版本**:确认无用的旧版本(如已泄露的 key)一键删除;**使用中的版本禁止删除**(提示先切换)
|
||
- 存储:`agent-local/tools/ave/config/key_history.yaml`(600 权限,不进 git);接口只回传索引 + 脱敏值,**不下发完整 key**
|
||
- 后端:`POST /config/api-keys/activate`(切换生效)/ `POST /config/api-keys/delete`(删除版本);GET 增加 `history` 字段
|
||
- 实测全流程:保存 A → 保存 B(A 自动归档)→ 切换回 A(B 归档,A 变使用中)→ 删除 B → 删除使用中版本被拒(400)✓
|
||
|
||
## [4.6.2] - 2026-09-19
|
||
|
||
### 修复:🔑 API 配置菜单项看不到(菜单存在**三处**硬编码,实际生效的那处未改)
|
||
|
||
- **根因**:侧边栏菜单有三处硬编码定义,`main.js` 的 import 顺序决定谁生效:
|
||
```
|
||
12: import './inline.js' → 菜单 A(最先,被覆盖)
|
||
18: import './navigation.js' → 菜单 B(被覆盖)
|
||
24: import './modules/matrix_views.js' → 菜单 C ← 最后加载,实际生效
|
||
```
|
||
新加的 api-config 只加在 A/B 两处,**生效的 C 没加** → 用户看不到
|
||
- **修复**:三处菜单的「服务」分组全部补上 `api-config`;构建产物验证「API 配置」出现 3 次 ✓
|
||
- **顺带健壮性**:`inline.js` 的 `_renderNav()` 优先委托 `window.renderNav()`;`navigation.js` 自动渲染加 `DOMContentLoaded` 保护
|
||
- **技术债记录**:三处菜单硬编码重复(`inline.js` / `navigation.js` / `modules/matrix_views.js`),建议后续抽为统一 `nav-menu.js` 单点定义,避免同类问题再发
|
||
|
||
## [4.6.1] - 2026-09-19
|
||
|
||
### 优化:AI 配置单点化(key 全项目只在配置中心一处)
|
||
|
||
- **`AIGenerator._load_config()` 三级优先级**:
|
||
1. 环境变量 `DEEPSEEK_API_KEY` / `DEEPSEEK_BASE_URL` / `DEEPSEEK_MODEL`(最高,容器/CI 友好)
|
||
2. **配置中心** `agent-local/tools/ave/config/local.yaml → llm.*`(推荐,全项目唯一配置点)
|
||
3. 兼容旧配置 `05_tools/07_matrix/config/ai.yaml → ai.*`(兜底)
|
||
- **`ai.yaml` 的 key 清空**(本机文件):改 key 只需在 Dashboard → 🔑 API 配置 一处操作,彻底避免两处不一致
|
||
- **配置页新增 2 项**:`模型名`(如 deepseek-v4-flash)/ `API 地址`,与密钥区分处理
|
||
- 接口新增 `secret` 标记:密钥类脱敏显示(前 5 + 后 4)+ 输入框 password;普通配置(模型名/地址)明文显示 + 输入框 text
|
||
- ⚠️ **修正一处副作用**:`local.yaml → llm.model` 原为 `deepseek-chat`,会覆盖 ai.yaml 的 `deepseek-v4-flash`(导致改用计费更高的模型)→ 已修正为 `deepseek-v4-flash`,并写入 ai_usage 日志验证
|
||
- 实测:环境变量覆盖 ✅ / 配置中心覆盖 ai.yaml ✅(临时目录精确验证)/ 缺配置中心时回退 ✅ / 端到端生成 ✅(日志记录 model=deepseek-v4-flash)
|
||
|
||
## [4.6.0] - 2026-09-19
|
||
|
||
### 新增:🔑 API 配置页面 + pre-commit 防泄露钩子(公开仓库密钥安全方案)
|
||
|
||
背景:仓库保持 public,但历史曾误提交密钥(百炼 / DeepSeek)。本版提供「各使用者自行配置密钥」的完整机制。
|
||
|
||
- **🔑 API 配置页面**(Dashboard → 服务 → 🔑 API 配置)
|
||
- 按用途分组展示 10 项配置:AI 文本(DeepSeek)/ 视觉分析+人物置换(百炼)/ 图像生成(可灵)/ 素材(Pexels)/ 视频生成(火山方舟·即梦)/ 语音合成(火山)
|
||
- 每项显示**脱敏状态**(前 5 + 后 4 位)+ ✅已配置/⚠️未配置徽章 + 「🧪 测试」就地验证连通性
|
||
- 输入框填入新 key → 保存(留空保存 = 清除);页面明示「只存本机、不进 git」
|
||
- 后端 `routes/api_config.py`:GET 状态 / POST 保存 / POST 测试;写入 `agent-local/.../local.yaml`(自动 chmod 600)
|
||
- **安全设计**:接口一律脱敏不回显完整 key;仅允许写入白名单字段(防越权);日志只记后 4 位
|
||
- **pre-commit 防泄露钩子**(`00_bootstrap/hooks/pre-commit`,deploy.sh 自动安装)
|
||
- 提交前扫描暂存内容,命中 key 模式(`sk-`/`api-key-kling-`/`AKLT`/`LTAI`/`ark-`)即**阻止提交**并提示
|
||
- 实测:假 key 提交被正确拦截 ✓
|
||
- **deploy.sh 引导**:部署完成后提示「打开 Dashboard → 🔑 API 配置填自己的 key」+ 环境变量用法
|
||
- 实测:状态查询 9/10 项正确脱敏;保存 → 600 权限 → 清除 全链路通过;越权路径被拒(400);测试接口正确识别(可灵✅ / 百炼账号欠费⚠️ / DeepSeek 旧 key 401❌)
|
||
|
||
## [4.5.9] - 2026-09-19
|
||
|
||
### 新增:初次抓取筛选增强(点赞/评论区间 + 发布时间)
|
||
|
||
- **👍 点赞区间**:原「点赞≥」单值 → 改为 `下限~上限` 区间(留空=不限)
|
||
- **💬 评论区间**(新增):`下限~上限`,可按互动热度筛(如只要 100~1000 评论的)
|
||
- **📅 发布时间区间**(新增):日期选择器 `从~到`,按视频发布时间筛选
|
||
- 兼容两种日期格式:API 的 `2026-08-24 21:15:29` 与页面兜底的 `20260814`(统一归一化为 `YYYY-MM-DD`)
|
||
- 行数据新增 `data-comments` / `data-pub` 属性;两处筛选逻辑(初次抓取 + 导入路径)同步更新
|
||
- 实测:区间边界逻辑验证通过(赞 10~100 时 150 赞被正确过滤、无数据行在区间/日期筛选下被排除、空筛选全显示)
|
||
|
||
## [4.5.8] - 2026-09-18
|
||
|
||
### 新增:引导条数可控 + 引导要求强化
|
||
|
||
- **🎯 引导条数**输入框:指定带引导要素的评论条数(留空=自动 30%;填大些可多生成再挑选;0=不带引导)
|
||
- **引导要求提到最高优先级**(prompt 首位):明确「必须恰好 N 条带出,一条都不能少」,并给出多角度示例(有人问怎么找 / 有人分享经历 / 有人说预约方式 / 有人夸技术)
|
||
- **自然过渡引导**:若引导要素与讨论主题差异大,要求用自然联想过渡(吃辣油腻 → 肠胃遭不住 → 找医生 → 怎么挂号),杜绝生硬插入
|
||
- 容量保护:引导条数不超过「总数 − 路人条数」,避免与路人配比冲突
|
||
- 实测(10 条 + 引导 6 条 + 引导路径):明确引导 4 条 + 痛点铺垫 3 条,植入自然("我爸那次拖着不去,后来朋友介绍了个肛肠科主任…关键要提前约")
|
||
- 用法建议:引导条数填大(如 8)+ 倍数 1.5x → 生成更多含引导的评论,从中挑选终稿
|
||
|
||
## [4.5.7] - 2026-09-18
|
||
|
||
### 新增:讨论角色配比 + 长评论 + 生成倍数(+ 修复 max_tokens 截断)
|
||
|
||
- **👥 角色配置**(折叠区):8 角色(过来人/追问者/赞同者/纠结者/质疑者/分享者/路人/好奇者)可填条数配比 → AI 严格按配比生成;留空 = AI 自由发挥(prompt 要求角色多样、不机械轮换)
|
||
- **📖 长评论条数**:控制 60~150 字「娓娓道来讲经历」型评论数量(默认 2,0~3)—— 由过来人讲亲身经历,有前因后果有细节
|
||
- **⚡ 生成倍数** 1x/1.5x/2x(默认 1.5x):多生成便于人工挑选删除(配比模式放大配比、自由模式放大总数)
|
||
- **铺垫克制硬约束**:开场闲聊 + 转折过渡合计 ≤ 总数 25%,尽快进入实质讨论
|
||
- **🔧 修复 AI 输出被截断**(根因):`_call_api` 的 `max_tokens` 原硬编码 300,加长评论后 token 需求暴增(10 条含 2 长评论需 ~1000 token)→ 只输出 4 条;改为**动态计算**(`total×60 + 长评论×250 + 300`,上限 4000),timeout 30s→60s
|
||
- **warning 提示**:AI 输出条数不足期望时前端明确提示("AI 少输出 N 条,可重新生成或手动补"),期望值按配比总和计算
|
||
- 实测:配比 10 条 → 精确输出 10 条(过来人3/追问者2/路人2/赞同者2/纠结者1),长评论 3 条质量达标
|
||
|
||
## [4.5.6] - 2026-09-18
|
||
|
||
### 新增:讨论主题自动提取 + 引导路径(起点→要素→收尾)
|
||
|
||
- **🎯 主题自动提取**:解析视频后自动从标题提炼讨论主题(如标题含"肥肠面" → 主题"肥肠面");主题框旁加「🔄 提取」按钮可重提;不覆盖用户已填
|
||
- **🧭 引导路径**(新增字段,与讨论走向并存):
|
||
- 起点 = 讨论主题(自动来)+ 终点 = 引导要素(用户填)
|
||
- 「🤖 AI 生成路径」按钮:按「开场 → 转折 → 逐个要素 → 收尾行动」推演
|
||
- **步数自适应**:max(3, 2 + 要素数),封顶 6 步(1 要素→3 步 / 2 要素→4 步 / 3 要素→5 步)
|
||
- 约束:引导要素一个都不能漏,每个至少 1 步承载;最后一步负责行动收尾
|
||
- 生成讨论时把「主题 + 引导要素 + 引导路径 + 讨论走向」一起喂给 AI,保证讨论**按路径推进并落到引导目标**
|
||
- 实测(肥肠面例子):主题提炼"肥肠面"✓;2 要素→路径 4 步✓;生成 10 条讨论严格按路径推进(聊肥肠面 → 肠胃遭不住 → 推荐主任 → 预约挂号),要素全覆盖
|
||
- 后端:`POST /comment-workbench/extract-topic`、`POST /comment-workbench/generate-path`(+ corpus.py extract_topic / generate_guide_path)
|
||
|
||
## [4.5.5] - 2026-09-17
|
||
|
||
### 优化:讨论走向改为三步显式流程(写想法 → AI 生成 → 采用)
|
||
|
||
- **① 写想法**:自然语言随便写(可跳跃、口语)
|
||
- **② AI 生成讨论方向**:AI 理解后输出 3~6 阶段结构化方向,显示在独立框,**可手动修改**
|
||
- **③ ✅ 采用此方向**:点采用后写入「最终走向」(生成讨论时使用),流程有明确确认步骤
|
||
- 切换预设走向时自动隐藏 AI 方向区,保持流程清晰
|
||
- 实测:三步流程(生成→修改→采用→写入最终走向)验证通过
|
||
|
||
## [4.5.4] - 2026-09-17
|
||
|
||
### 新增:讨论走向「预设模板 + AI 拆解」
|
||
|
||
- **6 个预设走向**(下拉选择,不用自己想):疑问解答型 / 亲历分享型 / 质疑争论型 / 对比选择型 / 场景切入型 / 感叹种草型
|
||
- **自定义自然语言 → AI 拆解**:写一段话(可跳跃、口语化),点「🤖 AI 拆解走向」→ AI 输出 3~6 阶段的清晰走向 → 可在结果框手动修改后再生成
|
||
- 解决「用户写的走向 AI 读不懂」问题:先拆解成结构化走向,再作为生成 prompt 输入
|
||
- 实测(用户原始想法:「讨论肥肠引到肛肠医院,对面开肥肠店,医生下来吃…宋佳…孙刘星」):
|
||
→ AI 拆解出 6 阶段(肥肠店位置 → 发现就在医院对面 → 调侃医生下楼吃 → 聊医院名气 → 具体医生 → 收尾调侃),关键信息零遗漏
|
||
- 后端:`POST /api/comment-workbench/parse-outline` + AIGenerator.parse_discussion_outline
|
||
|
||
## [4.5.3] - 2026-09-17
|
||
|
||
### 新增:评论工作台「多人讨论」模式(AI 一次生成讨论剧本 → 拆条分发)
|
||
|
||
- **生成机制**:AI **一次调用**生成完整讨论剧本(多人接力对话,每行带角色标签),系统按行拆成独立评论
|
||
- 实测:12 条一次生成,角色标签齐全、接力感强、3 个引导对象自然分散植入、路人打酱油 2 条
|
||
- **多引导对象**:引导要素支持多行(多个推荐对象),AI 分给不同发言者自然带出("你推你的我推我的")
|
||
- **弱指向表达**:prompt 要求避免「楼上/上面说的」等强顺序词(适配多机并行发布)
|
||
- **条数随机分配**:下限保底 + 均匀随机加成(非刻意均摊,自然出现 1/2/3 条混合)
|
||
- **账号不足校验**:总条数 × 每账号上限 → 计算最少发言账号数,不足时明确提示补选或减条
|
||
- **围观账号**:多余账号自动不参与(不发言);路人氛围由 AI 写进剧本
|
||
- 前端:评论工作台加模式切换(🎯定向评论 / 💬多人讨论)+ 讨论设置面板 + 对话流预览(可编辑/删除)
|
||
- 后端:`POST /api/comment-workbench/generate-discussion`(生成剧本)+ command_bus `discussion` 分发分支
|
||
- 实测:dry_run 端到端链路(5 条讨论 → 5 个任务,无错误)
|
||
|
||
|
||
## [4.5.2] - 2026-08-24
|
||
|
||
### 新增:抓取源批量跟踪视频博主
|
||
|
||
- **抓取源 Tab 新增「📌 批量跟踪视频博主」折叠面板** — 粘贴视频链接(每行一个,支持「标题: xxx + 链接」格式),一键解析 + 批量跟踪博主
|
||
- **🔍 解析链接** — 正则提取全部 URL 并去重,显示数量
|
||
- **📌 批量跟踪** — 逐个调用 track-author 解析博主加入「博主监控」,实时日志显示 新增/已存在/失败 + 失败明细,重复博主自动跳过
|
||
- **后端 `_extract_aweme_id` 支持抖音精选页链接** — `jingxuan?modal_id=xxx` / `discover?modal_id=xxx` 格式(modal_id 即视频 aweme_id),此前只支持 `/video/数字` 和短链
|
||
- 实测:jingxuan 链接正确解析 aweme_id(7673872336403957937 等),批量跟踪需抖音登录态
|
||
|
||
## [4.5.1] - 2026-08-23
|
||
|
||
### 新增:评论互动「存为默认」设置持久化
|
||
|
||
- **💾 存为默认** — 执行区新增按钮,把当前所有互动/评论设置存入浏览器 localStorage:互动动作比例(点赞/收藏/评论)、执行间隔、评论闸门(每视频上限/每账号日限/节奏)、评论内容设置(13 角色条数)、引导内容 + 引导引用比例、AI 改写开关
|
||
- **自动填充** — 下次打开评论互动页面自动应用已保存默认值(角色输入框在展开评论内容设置时按默认值初始化)
|
||
- **↩️ 恢复默认** — 清除已保存默认,恢复系统默认值(引导类各 1 条、其余 0)
|
||
- 实测:保存→读取→角色初始值→清除 全链路验证通过
|
||
|
||
### 修复:评论互动多视频生成只有 1 个视频评论(URL query 被截断)
|
||
|
||
- 根因:`_ia_parse` 的 URL 提取 `line.split(/[?\s]/)` 把 `?` 后的 query string 截掉,抖音 jingxuan 链接的 `modal_id` 在 `?` 后 → 40 个视频 url 全变成同一个 `https://www.douyin.com/jingxuan` → 评论池 `comment_map` 只剩 1 个 key
|
||
- 修复:改为 `line.trim().split(/\s+/)` 只按空白切分,保留完整 URL(含 modal_id)
|
||
- 实测:3 个视频解析出 3 个唯一 url,commentMap 3 个 key
|
||
|
||
## [4.5.0] - 2026-08-16
|
||
|
||
### 新增:评论互动全量模型(v2 重构,替换 4.4.0 分组模型)
|
||
|
||
#### 核心变化:账号分组 → 账号全量 × 视频按比例 × 动作组合
|
||
- **账号全量执行** — 每个账号对"命中的视频"执行该视频的动作组合(点赞/收藏/评论连做),不再分组分工(删除点赞组/收藏组/评论组概念)
|
||
- **视频比例控制** — 点赞 90% / 收藏 30% / 评论 60%(可调 0-100),每个视频独立随机决定动作组合,未命中任何动作的视频直接跳过
|
||
- **评论两道闸门(防封号)** — 每视频评论上限(默认 5,随机挑账号评)+ 每账号日评论上限(默认 20,到限自动降级为只赞藏)
|
||
- **评论内容可控** — 评论互动内置「⚙️ 评论内容设置」折叠面板(13 角色数字输入 → 按视频生成评论池 → 可编辑/删除/重新生成),执行时按序领取设定内容(`comment_map`),未设定退回随机语料
|
||
- **蓝图组合机制** — 引擎支持 `+` 分隔组合蓝图名(如 `interact_like+interact_collect+interact_comment`),`merge_blueprints()` 合并 steps(goto_url 去重 + 连续 wait 合并),无需新蓝图即可同视频多动作连做
|
||
- **删除误导项** — 删除百分比滑块(strategy 模式下实际不生效)、浏览作者其他作品(默认不执行)、关注动作、账号分组参数
|
||
|
||
#### 新增:评论工作台疑问类角色(一问一答)
|
||
- **🙋 提问(questioner)** + **💬 回答(answerer)** 两个独立角色,新增「疑问类(一问一答)」分组(提问默认 17% > 回答 12%)
|
||
- 语料库新增「解答」分类(14 条评论 + 5 模板,通用化无行业限制,混用"隔空回应式"/"独立解答式")
|
||
- 后端 `role_counts` 精确计数模式(`generate` 接口 + `batch_get_comments_by_roles` 支持,每个角色精确取 N 条,不受比例取整误差影响)
|
||
|
||
#### 修复:抖音页面改版兼容(8 月中 data-e2e 属性变更)
|
||
- **前置条件软条件机制** — `Condition.soft` 标志:like/collect/follow 的按钮 selector 条件失败时不再跳过(skipped),放行底层兜底(键盘 Z / JS 文字查找 / 坐标);其他操作硬条件行为完全不变(保护旧蓝图)
|
||
- **评论内容生效** — `_resolve_args` 的 `@corpus` 占位符优先使用 `--comment-text`(计划/面板设定的内容),未指定才从语料库随机取
|
||
- **账号中心远程昵称取不到** — `account_service.py get_all_accounts()` 远程账号 profile 合并被 if/else 逻辑错误挡住(远程账号 tags 为空永远进不了 `_get_profile_for_account` 分支),改为无条件合并远程 profile(guardd `/accounts/profiles`),本机与远程对等
|
||
- **账号标签保存不上** — 远程账号打标签 PATCH 返回 400(本机 MatrixManager 无此账号);改为远程账号 tags 写入集中标签文件(`agent-local/data/account_tags_cache.json`,读取侧 `_load_tags_cache` 已读此文件);前端 `_saveTags` 增加响应检查(失败不再静默)
|
||
- **评论互动 MD 表格导入** — 导入区新增「📋 MD表格」入口:粘贴 Markdown 表格(`| 标题 | 链接 | 评论数 |`)自动正则提取「标题+链接」对并解析(纯前端正则,0 AI 调用)
|
||
- **评论互动引导内容** — 评论内容设置面板新增「🎯 引导内容」输入框 + 「引导引用比例」(默认 80%):引导类(guide_*)+ 回答型(answerer)角色按比例在 AI 生成时结合引导内容(如"引导关注公众号约号"),其他角色正常;不输入引导内容则行为不变
|
||
- **AI 优化与消耗监控** — AIGenerator 关闭思考模式(`thinking: disabled`,评论生成无需推理,reasoning_tokens 归零,成本直降);AI 调用记录 token 用量到 `agent-local/runtime/ai_usage.jsonl`;新增 `/api/ops/ai/usage` 聚合接口;看板「统计概览」首页新增「🤖 今日 AI 消耗」卡片(token/费用/次数/缓存命中率,按 flash 官方空闲价估算)
|
||
|
||
#### 技术说明
|
||
- 计划生成器 `_build_interact_plan` v2 位于 `command_bus.py`,strategy 参数改为 `like_ratio / collect_ratio / comment_ratio / comment_per_video / comment_daily_limit / pace`
|
||
- 组合蓝图实现在 `engine.py` 的 `merge_blueprints()`
|
||
- 前端数字输入全部带范围保护(比例 0-100、评论上限 0-20、日限 1-100、角色条数 0-20)
|
||
- 改动文件:`command_bus.py` / `matrix-interact.js` / `comment-workbench.js` / `comment_workbench.py` / `mc/corpus.py` / `corpus/douyin.yaml` / `engine.py` / `douyin_ops.py` / `ops/_base.py`
|
||
- ⚠️ `01_core/VERSION` 未修改(版本由 ghai 决定),正式发布时同步
|
||
|
||
## [4.4.0] - 2026-08-09
|
||
|
||
### 新增:互动计划生成器(批量互动防封号核心)
|
||
|
||
#### 核心能力
|
||
- **账号分组(30赞/5评/5藏)** — 40 账号按数量随机分组,不同动作混合执行,模拟真人分散行为
|
||
- **每视频评论配额** — 每条视频最多 N 条评论(默认 5,可调 3/10),不再全量账号评论
|
||
- **每账号评论日上限** — 默认 12 条/天,达上限自动踢出轮动池(点赞/关注不限流)
|
||
- **账号轮动** — 评论账号随机轮动分配,避免同一账号连续刷
|
||
- **评论内容随机** — 从语料库随机取(dict 解析兼容),避免重复文案
|
||
- **执行节奏两档** — 🐢宽松(慢安全)/ ⚡紧凑(快风险高),间隔按动作区分
|
||
|
||
#### 配套
|
||
- 新增 `interact_collect.json` 蓝图(收藏操作,之前是占位符)
|
||
- 批量互动页新增「📊 互动策略」参数区(评论上限/评论日上限/分组数/节奏)
|
||
|
||
#### 修复
|
||
- `--comment_text` → `--comment-text`(参数名连字符,argparse 不再报错)
|
||
- 语料库 dict 解析(`{"text":...}` 取 text 字段)
|
||
- 前端接受 `accepted` 状态(提交成功不再误报"未知错误")
|
||
|
||
#### 技术说明
|
||
- 计划生成器在 `command_bus.py` 的 `_build_interact_plan()`,strategy 模式走独立路径,不动 mc 引擎/guardd
|
||
- 账号数 < 分组需求时,账号优先填评论组(收藏/点赞组可能为空)
|
||
|
||
## [4.3.0] - 2026-08-05
|
||
|
||
### 新增:抖音博主监控系统(抖追踪重大升级)
|
||
|
||
#### 博主跟踪闭环
|
||
- **视频行「👤 跟踪」按钮** — 在抖追踪「跟踪中」列表,一键把视频作者加入博主监控
|
||
- **博主监控 Tab** — 博主列表(粉丝/涨粉/作品数/今日采集状态)+ 手动刷新单个/全部
|
||
- **每日快照** — 记录粉丝数/获赞数/作品数/新视频,按天存 `douyin_authors.json`
|
||
- **新视频发现** — 刷新博主时自动发现新视频并加入视频跟踪
|
||
- **趋势查看** — 博主历史快照展开(每日粉丝/作品/新视频)
|
||
- **前3条视频展示** — 博主行直接显示最新3条视频(标题+点赞/评论/收藏)
|
||
|
||
#### 抖追踪列表增强
|
||
- **标题/作者关键字动态筛选** — 输入即过滤(不重建 DOM,五笔输入不失焦)
|
||
- **每页条数 100/200/300 可选** + 上一页/下一页/跳页
|
||
- **跟踪中搜索/全选/删除选中** — 批量清理无效跟踪
|
||
- **已跟踪状态持久化** — 用博主 uid 精确匹配,刷新后不再重复跟踪
|
||
|
||
#### 修复
|
||
- 账号选择器筛选改为**包含逻辑(AND)** + 保留选中状态(原为排除逻辑,只能选一个条件)
|
||
- track-video 重复跟踪不再覆盖 `prev_stats`(保留对比链)
|
||
- 去掉指挥台历史失败累计告警(只增不减无告警意义)
|
||
- 抖追踪全部更新 F5 后恢复进度提示(sessionStorage)
|
||
|
||
#### 技术说明
|
||
- 博主数据接口用「数字 uid」(`profile/other`、`aweme/post`),不能用 sec_user_id(会报 UserId不合法)
|
||
- 新增 8 个博主监控 API 端点 + `get_author_profile`/`get_author_videos` 采集函数
|
||
|
||
## [4.2.2] - 2026-07-26/27
|
||
|
||
### 运维改进 + 账号中心增强
|
||
|
||
#### 修复:clear-all 清不完远程机器队列
|
||
- **`_guardd_api()` 加 timeout 参数** — 默认 5s,clear-all 用 10s
|
||
- **clear-all 返回逐台结果** — 全部成功返回 `ok`,有失败返回 `partial`
|
||
- 解决了远程机器偶尔连通性差导致队列清不干净的问题
|
||
|
||
#### 新增:账号中心批量删除标签
|
||
- 选中多个账号后底部弹出「🏷️ 删除标签」按钮
|
||
- 弹窗列出选中账号的所有标签,点击即删除
|
||
- 逐账号 PATCH 更新,界面自动更新
|
||
|
||
#### 修复:5kecheng guardd POST 挂死
|
||
- guardd 运行 28 天后 `do_POST` handler 卡死(`rfile.read` 阻塞)
|
||
- 重启后恢复,guardd 版本号更新至 v2.3.1
|
||
|
||
#### 修复:mediacrawler_adapter CDP 采集优化
|
||
- 去掉 Playwright 降级方案(headless 模式有封号风险)
|
||
- CDP 断连时全量重建 Playwright 实例,不重用旧 state
|
||
- 新增 Chrome 状态检测 + 一键重启 API
|
||
- 新增登录状态检测 + 打开登录页功能
|
||
- 复用已有 Chrome 页面执行 fetch,不创建新标签页(零闪烁)
|
||
|
||
## [4.3.0] - 2026-07-15/16
|
||
|
||
### 抖追踪系统 + CDP 采集引擎
|
||
|
||
#### 新增:抖追踪全链路
|
||
- **🎵 抖追踪 Tab** — 从 tyhtak API 导入视频列表 → CDP 采集 → 跟踪 → 历史
|
||
- **📡 跟踪中 Tab** — 独立跟踪专项页,显示 👍/💬/⭐ 数据 + 评论区
|
||
- **全选/勾选机制** — 列表全选勾选框 + 单条勾选 + 采集选中/跟踪选中
|
||
- **一键复制** — 单条复制、复制已选、复制全部(标题+链接)
|
||
- **刷新全部 / 更新选中** — 逐个刷新(3 秒间隔)+ 进度显示,支持选择性刷新
|
||
- **评论展开** — 默认 5 条,点「展开全部」看 20 条
|
||
|
||
#### 新增:MediaCrawler 风格 CDP 采集引擎
|
||
- **`mediacrawler_adapter.py`** — Chrome CDP 模式,复用 Chrome 登录态调抖音官方 API
|
||
- 全局单例 Session,不复用已关闭 tab,避免重复开浏览器
|
||
- CDP 不可用时自动降级 Playwright 标准模式
|
||
- 获取准确数据:点赞/评论/收藏/分享/20条热评
|
||
|
||
#### 新增:Chrome 远程调试开机自启
|
||
- **`com.agentos.chrome-debug.plist`** — launchd 管理,KeepAlive 崩溃后自动重启
|
||
- **`chrome_debug.sh`** — 检测 9222 端口,不在线自动启动 Chrome
|
||
|
||
#### 修复:评论工作台
|
||
- 粘贴解析支持「标题+链接」配对格式(检测 douyin.com 链接模式)
|
||
- 视频列表显示双行排版:标题 + 网址(小字灰色)
|
||
|
||
#### 修复:前端导航/路由
|
||
- 浏览器标题跟随路由页面切换(`AgentOS - 矩阵总览` 等)
|
||
- 删除 `_tryMigratedView` 双路由系统
|
||
- 修复 `#view-dynamic` display 问题
|
||
- 删除废弃视图文件:matrix-record/backup/export/run/settings
|
||
- 构建产物加入 `.gitignore`(`static/assets/`)
|
||
|
||
## [4.2.2] - 2026-06-26
|
||
|
||
### 定向评论B模式修复 — 输入方式+登录检测
|
||
|
||
#### `<douyin_ops.py>` post_comment
|
||
- **修复** B模式 (`/video/` 独立页面) 评论输入不生效问题
|
||
- 输入方式改为 **pbcopy + Meta+V 粘贴**(复制 reply_comment 方案)
|
||
- 原因:Draft.js + Camoufox(Firefox) 下 `press_sequentially` 分发的键盘事件不被正确拦截
|
||
- 粘贴是浏览器原生操作,Draft.js 可靠处理 `insertFromPaste` 事件
|
||
- 输入后验证:`_verify_comment_posted()` 检查评论区前5条是否含刚发文字
|
||
- 选择器顺序恢复为 `[contenteditable="true"]` 优先
|
||
|
||
#### `<login_state_machine.py>` DouyinDetector & DouyinLoginRecovery
|
||
- **修复** 登录检测误触广告问题("登录后领取奖励"广告被当成未登录信号)
|
||
- **LOGGED_IN_ANCHORS** 增强:+3 个顶栏头像选择器(`[class*="DyHeader"] [class*="avatar"]` 等)
|
||
- **NOT_LOGGED_ANCHORS** 移除 `'div:has-text("登录后")'` — 太宽泛会匹配广告
|
||
- **页面文本检测** 去掉 `"登录后"` 关键词(同样匹配广告)
|
||
- **`_trigger_login` JS 兜底** 改为只查 `button, a` + `offsetHeight > 10` 过滤,防止点到广告元素
|
||
|
||
### 验证
|
||
- [ ] 定向评论手动测试中
|
||
|
||
## [4.2.1] - 2026-06-25
|
||
|
||
### 命令传导统一治理
|
||
- **新建 `PLANS/COMMAND_UNIFICATION_PLAN.md`** — 命令传导统一治理方案 v1.0
|
||
- **CommandBus 新增 CMD_REGISTRY 注册表** — 统一 cmd_type → 命令模板映射,collect 自动按账号平台选择采集蓝图
|
||
- **前端统一调用路径** — matrix-collect.js 改走 POST /api/ops/run,参数格式统一为 {type, accounts, params}
|
||
- **删除废弃路由** — routes/matrix.py 中 /collect-homepage、/collect-homepage/phone、/collect-homepage/cancel、/collect-homepage/status 已删除
|
||
- **platforms/ 标记 deprecated** — collect() 方法中的存档脚本引用已替换,添加废弃标记
|
||
- **CLI mc collect --all 修复** — 支持 --all 参数采集所有账号
|
||
- **AUDIT_5LAYER_REPORT.md 更新** — 信息采集路径审计状态更新
|
||
|
||
### 验证
|
||
- [x] Phase 1: CommandBus CMD_REGISTRY 注册表已添加,collect 默认带 --blueprints
|
||
- [x] Phase 2: matrix-collect.js 已改走 /api/ops/run,/collect-homepage 路由已删除
|
||
- [x] Phase 3: CLI mc collect --all/--phone/--account/--status 全部修复
|
||
- [x] Phase 4: platforms/*/plugin.py collect() 已改走 CommandBus,标记 deprecated
|
||
- [x] Phase 5: AUDIT_5LAYER_REPORT.md 信息采集审计已更新
|
||
|
||
## [4.2.0] - 2026-06-21
|
||
|
||
### 文档体系重构
|
||
- **新建 `01_core/VERSION`** — 版本唯一来源,终结版本打架
|
||
- **新建 `99_system/INDEX.md`** — 项目文档总索引,一处维护全部引用
|
||
- **精简 AGENTS.md** — 从 180 行→56 行,去掉过时硬编码数字
|
||
- **精简 README.md** — 从 246 行→26 行,改为入口性质
|
||
|
||
### 技能归档
|
||
- **归档 4 个空技能**:content_processor、web_crawler、auto_collector、cloakbrowser_controller(移至 `02_skills/_archived/`)
|
||
- **collect_to_inbox 降级**:SKILL.md 从 v2.0 降为 v1.0,标记 `status: legacy`,文档与实际代码一致
|
||
|
||
### 版本收敛
|
||
- **guardd.py 版本从 VERSION 读取**:不再硬编码 `version = "2.3.0"`
|
||
- **所有 version.json 对齐到 SKILL_CARD.yaml**:memory_manager 1.2.0, inbox_refine 1.1.0, kb_manager 1.1.0, sync_manager 1.1.0
|
||
- **collect_to_inbox SKILL_CARD 降级**:1.1.0→1.0.0 `status: legacy`
|
||
|
||
### 架构宪法发布
|
||
- **新建 `CONSTITUTION.md`**(根目录)— 架构总纲,包含 12 维全景、10 条硬规则、版本规则、开发决策流程
|
||
- **部署到 `~/.workbuddy/CONSTITUTION.md`** — WorkBuddy AI 按需加载,开发工具硬性读取
|
||
- **规则 11:架构变更必须更新宪法** — 目录层级/功能维度/版本规则/文件权限等变更时同步更新
|
||
- **`99_system/ARCHITECTURE_CONSTITUTION.md`** 标记为已迁移(指向根目录版本)
|
||
- **所有入口已更新**:AGENTS.md / 99_system/INDEX.md / apply-config.sh
|
||
- **inbox_refine SKILL.md 对齐**:1.0.0→1.1.0
|
||
- **03_knowledge/versions.json 更新**:4.1.0→4.2.0
|
||
|
||
### 代码层清理
|
||
- **统一 CLI 入口**:`00_setup/agentos` 成为统一入口,同时加载 `07_matrix/scripts/agentos/plugins/` 的联邦命令
|
||
- **`mc` 脚本指向统一 CLI**:优先使用 00_setup/agentos 包路径
|
||
- **废止 accounts_registry.yaml**:所有账号分配统一在 ORACLE.yaml 中管理
|
||
- `guardd _sync_account_override()` 改为读取 ORACLE.yaml
|
||
- 支持 ORACLE 多平台格式(一个 identity 绑定 douyin + xiaohongshu)
|
||
- **删除 guardd cross_machine 心跳写入**:不再写入 `cross_machine/machines/{UID}/heartbeat.json`,避免 Git 污染
|
||
- **自动化配置入仓**:新建 `01_core/automation/`
|
||
- `workflows.yaml` — WorkBuddy 4 个自动化任务定义
|
||
- `launchd/com.agentos.guardd.plist.template` — guardd plist 模板
|
||
|
||
### 文档修复
|
||
- **FEDERATION_GUIDE.md 数字更新**:蓝图 14→12,guardd 检查项更新为 9 模块
|
||
- **federated-multi-machine-architecture.md guardd 模块更新**:7→9,补齐 dashboard_sync 和 sync_checker
|
||
- **SOUL.md.v2-backup 归档标记**
|
||
- **03_knowledge/99_system/ 冗余文件归档**:ARCHITECTURE_AUDIT.md 等 6 个文件标记为已归档
|
||
|
||
## [4.1.0] - 2026-05-15
|
||
|
||
### 联邦式多机协同架构(V2.1)
|
||
- **新增 `docs/DASHBOARD_DATA_LAYER_V2.md`** — 联邦式数据架构完整设计文档
|
||
- **新增 7 大协同子系统**:
|
||
1. 状态机(heartbeat.json, 5-10min 周期, 15min 离线判定)
|
||
2. 事件总线(events/ 跨机事件日志, 10 种事件类型)
|
||
3. 任务协作(tasks/ 异步文件机制, pending→in_progress→completed)
|
||
4. 加密通讯(RSA-4096 密钥对, 公钥注册/私钥本地, encrypted/ 加密消息)
|
||
5. 知识双向同步(拉取总知识库更新 + 推送本地知识到 submissions/)
|
||
6. 自动升级(versions.json 版本清单, breaking 自动/手动双模式)
|
||
7. 文件直传(SSH rsync 全自动 + AirDrop 半自动备选)
|
||
- **新增 `guardd` 守护进程**:9 模块主循环(最初文档记录为 7 模块,实际代码实现 9 模块,v4.2.0 已修正), launchd 安装, 5 分钟周期, 全规则引擎 0 token 消耗
|
||
- **新增 `cross_machine/` 子目录**:events/ status/ tasks/ encrypted/ knowledge/
|
||
- **README.md 升级 v4.1.0**:新增"多机联邦协作"章节 + 第四层导航
|
||
- **新增安全边界**:私钥/API Key 固定在 agent-local/identity/secrets/, 永不进入 agent-sync/
|
||
|
||
### 文档更新
|
||
- 新增 03_knowledge/99_system/ 知识卡片:联邦式多机协同架构
|
||
- 新增 01_core/MAINTENANCE_GUIDE.md guardd 运维章节
|
||
|
||
## [4.0.0] - 2026-05-03
|
||
|
||
### 系统文档体系重构
|
||
- 根目录精简:从 12 个文件减至 4 个(README + CHANGELOG + requirements + .gitignore)
|
||
- 删除废弃文件:01_submissions.md(空)、agent-os.code-workspace、REQUIREMENTS.md(与requirements.txt重复)、VERSION(不再维护)
|
||
- 归档过时文档:CORE-ARCHITECTURE.md / SKILLS-CATALOG.md / QUICKSTART.md → 99_system/archive/
|
||
- README.md 重写为三层导航体系(入口→系统文档→技能/知识库)
|
||
- 新增 01_core/UPDATE_SYSTEM.md 更新体系规范
|
||
- 新增 99_system/architecture/loading-architecture.md 四管道加载架构
|
||
- 新增 99_system/architecture/trigger-matching-analysis.md 触发词方案分析
|
||
|
||
### 协议体系重构
|
||
- SOUL.md v4.0 精简版:5671B(减重 40%),仅含行为规则+模式切换+安全边界
|
||
- 协议文件从 20_methods/agent-protocols/ → 99_system/protocols/
|
||
- 4 个协议全部重写对齐新规范(高阶思维/跨域联想/卡壳干预/知识审查)
|
||
- 新增 trigger_matcher.py 语义匹配脚本(关键词+Embedding混合模式)
|
||
|
||
### 配置维护
|
||
- apply-config.sh v2.0:增加版本追踪 + 多机角色预设 + 自动注册
|
||
- .config-version.json 自动生成部署记录
|
||
- .obsidian/ 解除 Git 追踪(各机器独立配置不冲突)
|
||
- 知识库清理:归档测试文件 + 删除 14 个空占位目录 + README 更新
|
||
- **`agentos config`** — 配置管理子命令(status/diff/apply/rollback)
|
||
- `01_core/CONFIG_MANIFEST.yaml` — 配置清单(9文件,A/B/C三类管理)
|
||
- `agentos/config_mgr.py` — 配置管理引擎
|
||
- `agentos init` 新增 PATH 自动检测配置
|
||
- `VERSION` 文件(版本号唯一来源)
|
||
|
||
### 修复
|
||
- 路径清理:删除 `~/workbuddy-agent-os/agent-sync/` 和 `~/workbuddy-agent-os/agent-local/` 残留目录
|
||
- 5 个脚本的 help 文本从"agent-os-local 根目录"修正为完整路径
|
||
|
||
### 变更
|
||
- Git 双远程仓库:Gitee + GitHub 同步推送
|
||
- 停用坚果云,完全切换到 Git 版本管理
|
||
|
||
## [2.2.0] — 2026-05-01
|
||
|
||
### 新增
|
||
- **`agentos upgrade`** — 统一模块升级引擎
|
||
- MODULE.md 标准化规范(首个: Matrix 模块)
|
||
- `auth_manager.py` 原子化登录模块
|
||
- SOUL.md v3.3 逐级加载重构(精简 72%)
|
||
- 4 个 G2 协议文件(meta-thinking/cross-domain/stuck/knowledge-review)
|
||
- Matrix 养号系统全链路稳定(3账号12/12步全部通过)
|
||
|
||
## [2.0.1] - 2026-04-25
|
||
|
||
### 修复
|
||
|
||
- **依赖管理统一**:删除旧的 `04_memory/vector_db/.venv`,统一使用 managed Python 专用 venv
|
||
- 旧路径:`~/workbuddy-agent-os/agent-sync/04_memory/vector_db/.venv`(分散,与脚本运行环境不一致)
|
||
- 新路径:`~/.workbuddy/binaries/python/envs/agent-os/`(统一,脚本和自动化共用)
|
||
- **init.sh 修复**:指向新 venv,用 `requirements.txt` 安装依赖
|
||
- **daily_digest.py 重写**:接入三个真实数据源(Claw 工作日志、WorkBuddy 系统画像、上轮摘要)
|
||
- **自动化任务修复**:Python 路径更新为新 venv
|
||
|
||
### 新增
|
||
|
||
- **bootstrap_from_memory.py**:冷启动脚本,首次运行时将已有 MEMORY.md 灌入 L1/L2
|
||
- **requirements.txt**:集中声明 Python 依赖(trafilatura + sqlite-utils)
|
||
- **WorkBuddy 自动化**:每日凌晨 2:00 自动执行 `daily_digest.py`(ID: `agentos`)
|
||
- **冷启动执行**:L2 写入 36 条初始事实,L1 索引同步建立
|
||
|
||
### 文档更新
|
||
|
||
- **REQUIREMENTS.md**:修正 venv 路径、更新实际设备状态、写清固定安装命令、新增自动化配置说明
|
||
- **QUICKSTART.md**:新增步骤 4(冷启动记忆体)、修正坚果云路径为 `~/NutstoreCloudBridge/`
|
||
- **README.md**:新增记忆数据流说明、固定路径速查表、补全目录说明
|
||
|
||
## [2.0.0] - 2026-04-25
|
||
|
||
### 新增
|
||
|
||
#### 核心框架
|
||
- L0→L1→L2→L3 四级记忆模型
|
||
- SOUL.md v2.0:完整的三层规则体系(硬约束/软约束/学习规则)
|
||
- IDENTITY.md v2.0:Claw 身份档案,含设备信息自动填充
|
||
- USER.md v2.0:ghai 用户档案
|
||
- mcp.json:MCP 协议基础配置模板
|
||
|
||
#### 初始化脚本
|
||
- init.sh:自动创建目录、安装依赖、填充设备信息
|
||
- apply-config.sh:核心配置部署到 ~/.workbuddy/
|
||
- import_skills.sh:技能导入
|
||
- export_skills.sh:技能打包导出
|
||
|
||
#### 技能包
|
||
- memory_manager:每日对话提炼、去重、冲突检测、版本管理
|
||
- daily_digest.py:每日提炼脚本(凌晨 2:00 自动运行)
|
||
- bootstrap_from_memory.py:冷启动(首次导入已有记忆)
|
||
- memory_cleanup.py:冲突消解与过期清理
|
||
- agent_memory_init.py:记忆体初始化
|
||
- kb_manager:知识库入库、分类、检索、备份
|
||
- kb_ingest.py:知识入库脚本(支持 URL/文件/文本)
|
||
- _template:技能模板(SKILL.md + version.json + skill.py)
|
||
- web_crawler:网页抓取(占位)
|
||
- sync_manager:同步管理(占位,由坚果云替代)
|
||
|
||
#### 知识库
|
||
- 按属性分层目录结构(概念/方法/事实/参考/资源/观点)
|
||
- 16 个一级领域子目录
|
||
- 知识卡片模板(概念卡/事实卡/方法卡/个人洞见卡)
|
||
- 领域分类表(domains.md)
|
||
- 知识属性分类表(nature-types.md + 分类决策树)
|
||
- 中文映射配置(folder-aliases.json)
|
||
- 知识分类提示词模板
|
||
|
||
#### 迁移脚本
|
||
- pack.sh:全量打包
|
||
- unpack.sh:解包还原
|
||
- backup.sh:手动备份
|
||
|
||
#### 说明文件
|
||
- README.md:项目概览
|
||
- QUICKSTART.md:5 分钟快速上手
|
||
- REQUIREMENTS.md:环境依赖清单
|
||
- CHANGELOG.md:本文件
|
||
|
||
### 设计决策
|
||
|
||
| 决策 | 选择 | 原因 |
|
||
|---|---|---|
|
||
| 知识库物理目录分层 | 按属性(概念/方法/事实/...)为第一层 | 人找知识先想"类型"再想"领域",机器检索空间更小 |
|
||
| 记忆读取策略 | L2 置信度不足直接截断,不 fallback 到 L3 | 节省 token,避免无关信息干扰 |
|
||
| 跨机同步 | 坚果云,不用 Git | 国内访问 Git 不稳定 |
|
||
| 存储策略 | 单条存储线 + 平台自适应 | 避免数据分裂,init.sh 自动检测系统 |
|
||
| 目录命名 | 英文文件夹名 + 中文映射 | 机器兼容性 + 人类可读性 |
|
||
| Python 环境 | managed Python + 专用 venv | 不污染系统环境,版本可控 |
|