Files
MediaCrawler/mac-agent-os-main/PLANS/CAPABILITY_GOVERNANCE.md
T
butubb 2112c1a870
Deploy VitePress site to Pages / build (push) Canceled after 0s
Deploy VitePress site to Pages / Deploy (push) Canceled after 0s
feat(monitor): 抖音 Web 接口客户端 —— 绕开爬虫子进程,直接发 HTTP
移植自 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 带网关原话 / 正常返回)。
2026-10-10 17:12:25 +08:00

145 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 基础能力治理与补强方案(提案)
> 2026-10-03 · 状态:待用户拍板
> 背景:用户提问"接着补基础能力,怎么加,也涉及以后基础能力如何增加调整"
---
## 一、诊断:能力体系已"半脱节"
### 已有基础(做得好的)
| 模块 | 位置 | 作用 |
|---|---|---|
| 能力登记 | `05_tools/09_ave/config/capabilities.yaml` | 25 个能力,含 io / params_schema / providers |
| 缺口声明 | `05_tools/09_ave/config/feasibility_rules.yaml` | 30 条可行性规则 + 10 个能力缺口映射 + 三色红线 |
| 匹配器 | `05_tools/09_ave/scripts/capability_matcher.py` | 需求→能力匹配 + 目录指纹 + 升级检测 |
| 前端 | 导演台技术预检弹窗 | 显示每个镜头的技术预检与缺口汇总 |
### ⚠️ 实测发现的 5 处"清单 ≠ 实际"
| 能力 | 清单写的 | 实际 | 影响 |
|---|---|---|---|
| `lipsync` 对口型 | providers: fal / volcano / d_id · partial | 已用**百炼 videoretalk** 跑通 | 清单 provider 错误,无法据此排障 |
| `person_swap` 人物置换 | partial | **已实测跑通** | 状态偏保守 |
| `vfx_apply` 特效 | planned | 可灵 `camera_control` **已可用** | 状态偏保守 |
| `frame_chain` 首尾帧 | **missing** | `kling_video.py:152` **已实现 image_tail** | **把已有能力报成缺口** |
| `voice_lock` 声线锁 | cap_id=**None** | 音色库已实现 | 未挂到能力,统计丢失 |
**根因**:能力登记、代码实现、缺口声明**三者无联动** ——
加了功能忘登记、登记了没实现、实现了却仍报"缺失"。
---
## 二、机制方案:能力生命周期(4 步 + 1 台账)
```
① 登记 capabilities.yaml(唯一真相源)
新增字段:
cost: {unit: "元/秒", price: 0.08, note: "走免费额度优先"}
limits: ["正面近景 2~120s", "边长 640~2048"]
self_test: "python -m capabilities.selftest lipsync"
last_verified: "2026-10-03"
provider.state: ready | needs_key | broken
② 自检 scripts/capability_doctor.py(新)
一条命令验证"清单说的 ready 是不是真能跑"
--list 列出全部能力与最近验证状态
--capability X 单查(api_key 配置 / provider 可达 / limits 校验)
--live 真跑最小样例(产生费用,需显式开启)
--update 把验证结果写回 capabilities.yaml 的 last_verified
③ 接入 标准 4 步(写成 docs/CAPABILITY_GUIDE.md)
a. capabilities.yaml 登记(id/name/category/io/schema/provider/cost/limits)
b. 实现 provider(scripts/capabilities/<name>.py 或既有模块)
c. 写自检样例(让 doctor --live 能跑)
d. feasibility_rules.yaml 声明"什么技术需求触发它"
—— 与导演系统的"接新导演 3 步"对称
④ 台账 runtime/ave/capability_gaps.json(新)
缺口不再散落在规则里,而是有状态:
{id, name, first_seen, occurrences, affected_shots[], status,
blocking, resolved_at, resolved_by}
status: open → planned → in_progress → resolved
+ 能力升级 → 指纹变化 → 已出片方案自动提示"可重新生成更好版本"
```
**设计取舍**:先做 ①②(对账 + 体检),台账 ④ 可后置。
理由是 ①② 立刻消除"清单不可信"这个根本问题;④ 是统计增项。
---
## 三、本轮补什么(按性价比排序)
### 🥇 P0 能力对账 + 体检脚本(零成本 · 约 1 天)
- 修正上述 5 处脱节(尤其 `frame_chain` 从 missing → ready)
- 补 `cost` / `limits` 字段(为报价与预算打基础)
- 写 `capability_doctor.py`(`--list` 与单查;`--live` 可选)
- **产出**:一份可信的能力清单 + 一键体检
### 🥈 P1 首尾帧衔接 `frame_chain`(能力已有,只差接线)
- **前提**:可灵 `image_tail` 参数**代码已实现**(`capabilities/kling_video.py:143-152`)
- **做**:分镜 `tech_requirements.chain_from_prev` → 生成时自动把上一镜尾帧作为本镜尾帧/首帧
- 抽尾帧:ffmpeg 取上一镜最后一帧 → 存 `chain/{shot_id}_tail.jpg`
- 生成时:`tail_image_path=上镜尾帧`
- **效果**:长镜头分段生成无缝衔接;跨镜人物/光线不漂移
- **成本**:0(只多一个参数;抽帧是本地 ffmpeg)
### 🥉 P2 多角色同框一致性(已发现的真实问题)
现状:图生视频只喂**一张**参考图 → 双人同框时只有主角保脸,配角随机。
| 方案 | 做法 | 成本 | 我的评价 |
|---|---|---|---|
| **a. 首帧合成** | 生成前把多角色合成到一张首帧图 → 图生视频 | 一次图生图 | 效果最好,稍复杂 |
| **b. 导演层规避** | 提示词要求避免"多角色同框近景",改用正反打/过肩 | **0** | **零成本先上**,且更符合真实拍摄 |
| c. 多参考图 | 查即梦/万相是否支持多图输入 | ? | 需先验证 |
**建议**:先 b(零成本、马上见效)→ 再评估 a。
### P3 表情微管理 `expression_consistency`
- 轻量:分镜 `expression_detail`(已有)+ 跨镜一致性提示词强化
- 中量:角色资产加"表情参考图"槽位 → 图生视频时带上
### P4 口型质检辅助(用户提过的"微表情口型核对")
- 出片后自动抽关键帧 → 拼对比图 → 人工快速核对
- 进阶:接人脸检测,粗判嘴部开合与音频包络是否吻合
---
## 四、推荐执行顺序
```
P0 对账 + 体检脚本 ← 地基,零成本,先做
↓
P1 首尾帧接线 ← 能力已有,投入产出比最高
↓
P2b 多角色规避(提示词)→ P2a 首帧合成
↓
P3 表情 / P4 口型质检
```
---
## 五、待用户拍板
1. **P0 治理机制**是否认可?(登记 + 自检 + 台账三件套;可精简为"对账 + doctor")
2. **P1 首尾帧**是否本轮做?
3. **P2 多角色**:先用提示词规避够不够,还是直接上首帧合成?
---
## 附:执行时需动的文件(预告)
- `05_tools/09_ave/config/capabilities.yaml`(对账 + 补字段)
- `05_tools/09_ave/config/feasibility_rules.yaml`(缺口状态修正)
- `05_tools/09_ave/scripts/capability_doctor.py`(新建)
- `05_tools/09_ave/scripts/capability_matcher.py`(缺口台账读写)
- `05_tools/09_ave/scripts/composer/pipeline.py`(首尾帧接线)
- `05_tools/09_ave/scripts/directors/*.py`(多角色规避提示词)
- `05_tools/10_dashboard/routes/ave.py` + 前端(缺口台账展示,可选)