移植自 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 带网关原话 / 正常返回)。
142 KiB
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-ws4 字符) - 已补
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
(?<=。|^)在 Pythonre中非法(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 改为两级查找
- 优先读资产库(
AssetStore("bgm")):按name/mood/tags过滤 + 扫描目录找真实音频文件(mp3/wav/m4a/aac/flac/ogg) - 回落内置音乐库(原
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"] 为空)。
修复(两处):
_run_node()的audit_gate分支:auto_approve直接通过时合并上游产物到输出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 |
图生视频(用角色参考图保住人脸一致性) |
| 其他 | 文生视频 |
已知待补(用户提出,待确认/接入):
- 4 种导演系统只接了 2 个(legacy + v5.2)—— 另 2 种(clip-storyboard / Seedance / OpenDirector)待接入
- 人脸表情 / 口型暂无专用能力(
talking_head目前走图生视频替代) - 自拍/第一人称已加拍摄风格选项,待实测生成效果
[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 个,都由实测发现)
- toast 函数被 tree-shake:
showToast原定义在按需加载的productions.js→ 首页拿不到 → 移到inline.js(全局模块) - 通知器被 tree-shake:纯 IIFE
(function(){...})()被 Rollup 判定无副作用而移除(产物里搜不到) → 改为window.initGlobalNotifier = function(){...}; window.initGlobalNotifier(); - 状态登记时序 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)
- 单次运行生成镜头数硬上限 5(
- 目的:避免「误点运行 → 大量扣费」;跑生成类流程时必须明确知情
[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)→ 写入即污染仓库
- 而 registry 早已废弃(账号/角色归属以
- 修复:
AssetRegistrar._save_registry()加开关 —— 默认不再写入,仅AVE_WRITE_REGISTRY=1时写(并打印提示).gitignore加入character_registry/backups/(自动备份不再入库)- 回滚被污染的两个文件 + 删除 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(尚未实现)
- partial:
能力依赖一览(需配 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混入音频 - 并加音轨存在性校验(防静默丢音轨,缺失即明确报错)
- 定位:3 个变体测试(无
- 实测:成片 + 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 产物目录)+ 字数
- 支持火山豆包 TTS(
- 修复 2 个真实问题:
- 火山 TTS 报 400:代码里的 AK/SK 签名是简化版 basic auth(非火山真实签名),且
appid传空 → 现在明确提示"需配 access_token(或改用阿里)",不再静默失败 - 阿里 TTS 返回空:节点默认
voice_id(旧模型名cosyvoice-v3.5-plus)覆盖了配置里的正确 model(带项目 ID)→ 改为配置优先
- 火山 TTS 报 400:代码里的 AK/SK 签名是简化版 basic auth(非火山真实签名),且
- 产物透传补全(
app.py):audio_path/char_count/provider/model/prompt加入摘要字段 - 前端:节点产物预览新增音频播放器(显示文件名与字数)
- 实测:
script → tts流程 → completed,生成 92KB 语音文件 ✓(阿里 CosyVoice)
[4.11.1] - 2026-10-01
新增:流程入口页全部落地(占位页 → 一键加载模板到画布)
- 7 个流程入口页(原为「待实现」占位)全部替换为可用入口:
入口 模板 节点数 预估成本 🎭 短剧创作 short_drama12 ¥15-50 🎙️ 基础口播 basic_dub5 ¥2-5 🥁 卡点视频 beat_sync4 ¥1-3 📖 角色叙事 character_narrative8 ¥10-25 👤 数字人口播 digital_human4 ¥3-8 🎞️ 口播+混剪 hybrid_dub4 — ➕ 新建流程 (空白画布) — — - 共享入口组件
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)生成统一分镜 Schemaprompt_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__.pyAssetStore:通用资产仓库(列表/搜索/筛选/排序/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 字(原为逗号拼接的短句),信息完整度显著提升
- 按 ai-film-skills / produce-ai-video /
- 交付状态闭环:新增
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.914.3 MB)
- CRF 23 + 并发 = 单段约 1.0
- 交付状态生效:并发测试返回「候选成片 | 已生成拼接,尚未完整播放审查」✓(诚实标注,未夸大为合格)
[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_idGET /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
- 18 个技能包(324KB)下载入库
[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.py14 +beat_sync.py11 +hybrid.py7 +speed_ramp.py5) - 实测:
concat_segments()拼接成功(FFmpeg 路径解析为/Users/.../.local/bin/ffmpeg)
- 根因:本机 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):- profiles 查询:timeout 5s → 15s + 重试 1 次
- status 查询:同样 timeout 15s + 重试
- 失败不再污染缓存:有旧缓存则沿用(并记 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 顺序决定谁生效:新加的 api-config 只加在 A/B 两处,生效的 C 没加 → 用户看不到12: import './inline.js' → 菜单 A(最先,被覆盖) 18: import './navigation.js' → 菜单 B(被覆盖) 24: import './modules/matrix_views.js' → 菜单 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()三级优先级:- 环境变量
DEEPSEEK_API_KEY/DEEPSEEK_BASE_URL/DEEPSEEK_MODEL(最高,容器/CI 友好) - 配置中心
agent-local/tools/ave/config/local.yaml → llm.*(推荐,全项目唯一配置点) - 兼容旧配置
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 提交被正确拦截 ✓
- 提交前扫描暂存内容,命中 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)
- 兼容两种日期格式:API 的
- 行数据新增
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,03)—— 由过来人讲亲身经历,有前因后果有细节 - ⚡ 生成倍数 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_busdiscussion分发分支 - 实测: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_planv2 位于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_POSThandler 卡死(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-dynamicdisplay 问题 - 删除废弃视图文件: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_loginJS 兜底 改为只查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 更新 — 信息采集路径审计状态更新
验证
- Phase 1: CommandBus CMD_REGISTRY 注册表已添加,collect 默认带 --blueprints
- Phase 2: matrix-collect.js 已改走 /api/ops/run,/collect-homepage 路由已删除
- Phase 3: CLI mc collect --all/--phone/--account/--status 全部修复
- Phase 4: platforms/*/plugin.py collect() 已改走 CommandBus,标记 deprecated
- 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 大协同子系统:
- 状态机(heartbeat.json, 5-10min 周期, 15min 离线判定)
- 事件总线(events/ 跨机事件日志, 10 种事件类型)
- 任务协作(tasks/ 异步文件机制, pending→in_progress→completed)
- 加密通讯(RSA-4096 密钥对, 公钥注册/私钥本地, encrypted/ 加密消息)
- 知识双向同步(拉取总知识库更新 + 推送本地知识到 submissions/)
- 自动升级(versions.json 版本清单, breaking 自动/手动双模式)
- 文件直传(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 | 不污染系统环境,版本可控 |