Hermes Decision Trace

Bili Review Console 吸收 OpenBiliClaw B站渲染搜索能力方案

建议 有条件吸收,级别 L3 / Partial Absorb。吸收的不是 OpenBiliClaw 整套后端、扩展或画像系统,而是它在 B站上的一个能力单元:

🧭
推荐路径

先实现 pipeline 侧 probe_bili_rendered_search.py fixture 版:无真实浏览器也能跑解析测试。

🔎
关键依据

现有 Bili Review 控制台代码:/home/ht/.hermes/projects/bili-review-console/backend/app/services/task_service.py

🛠️
落地方式

先把已验证方案当成稳定基线:保留当前 schedule / deliver / workdir,不急着继续扩面;新增候选先读源码、看 output、做 run-now 验证,再决定是否转 script-only。

证据摘要

  • 现有 Bili Review 控制台代码:/home/ht/.hermes/projects/bili-review-console/backend/app/services/task_service.py
  • 现有 runtime adapter:/home/ht/.hermes/projects/bili-review-console/backend/app/services/runtime_adapter.py
  • 现有 broad sample 配置:/home/ht/.hermes/projects/bili-tech-pipeline/config/broad_sample_sources.json
  • 现有 pipeline adapter:src/adapters/up_feed.pysrc/adapters/autocli_up_feed.pysrc/adapters/base.py
  • 现有测试:backend/tests/test_task_service_qa_fixture.pybackend/tests/test_task_service_regressions.pytests/test_broad_sample_selection.py
  • 既有 wiki:bili-412-optimization-with-playwright-sidecar-plan-2026-05-22.mdbili-review-console-and-source-pool-optimization-2026-05-22.md
  • OpenBiliClaw 调研报告:https://decision.ht1072.top/2026-06-29-openbiliclaw-absorption-eval.html

行动清单

按需继续推进。

边界 / 风险

风险 / 边界

原 QA fixture 仍通过。

风险 / 边界

broad_sample 仍按实际 inserted_review_items 循环。

风险 / 边界

Video Review BVID 去重不受影响。

风险 / 边界

UP discovery dry-run / candidate_pool 边界不受影响。

完整记录

Bili Review Console 吸收 OpenBiliClaw B站渲染搜索能力方案

结论

建议 有条件吸收,级别 L3 / Partial Absorb。吸收的不是 OpenBiliClaw 整套后端、扩展或画像系统,而是它在 B站上的一个能力单元:

当项目本地 B站 API / up_feed 出现 412、空结果或 UID 映射不稳时,用“渲染搜索任务桥”补一条可观测、低预算、人工审核友好的 browser-side discovery/rescue 通路。

但它不应该替代当前 Bili Review 的主链:

Bili Review Console → bili-tech-pipeline broad_sample → up_profiles 动态选源 → up_feed primary → 低预算 UID/AutoCLI rescue → SDK enrichment → publish_payload → Video Review Queue

建议落点是 Bili Review 平台能力增强,具体表现为:

  1. 控制台能发起“B站浏览器侧搜索诊断 / rescue 任务”。
  2. 任务结果进入 Review Console 的任务记录和诊断区,而不是直接写正式 UP 池或默认视频队列。
  3. 只有在 POC 证明收益后,再作为 broad_sample 的低预算 fallback adapter 候选。

背景与现有能力基线

当前本地体系已经具备较强 B站生产链路:

  • bili-tech-pipeline 负责采集、broad sample、UP profile、权重治理、report/payload。
  • bili-review-console 负责人工审核控制台、任务触发、Video Review / UP Review 队列。
  • 控制台视频抓取主线已回到 broad_sample,不是旧的 stable_sample 探针。
  • TaskService._run_broad_sample_video_crawl_until_target() 已按实际 inserted_review_items 循环到目标,而不是只看 publishable_count
  • Video Review Queue 已有本地 BVID 去重、同批去重、Feishu Bitable dedupe。
  • UP 池已支持 profile-only source entity、空源 backfill、candidate_pool 导入 UP Review、连续低转化分级降权。
  • 旧 412 方案已明确:Playwright/browser 只作为诊断 sidecar,不进默认采集主链。

当前 config/broad_sample_sources.json 的核心参数:

{ "preferred_adapter": "up_feed", "fallback_to_autocli": false, "fallback_policy": { "enabled": true, "trigger_on_primary_all_412": true, "trigger_on_primary_candidate_below": 3, "max_fallback_sources": 3, "only_for_sources_with_alias_override": true, "rescue_sources": ["中国物理学会", "中国数学会", "中国电子学会"] }, "target_source_count": 12, "backfill_policy": { "enabled": true, "target_candidate_count": 36, "target_eligible_count": 6, "max_backfill_sources": 8 } }

这说明我们不缺“主链能跑”的能力,缺的是:

  • API 412 / 空结果时的 browser-side 对照证据。
  • UP 名称 → UID 映射的可视化/可审核修复链。
  • 对“浏览器页面可见但 API 不稳定”的 source,缺少一个比 Playwright 临时诊断更产品化的 Review Console 入口。

OpenBiliClaw B站能力可吸收点

OpenBiliClaw 的 B站链路是:

后端入队 B站 search task → 浏览器扩展轮询 /api/sources/bili/next-task → 打开 https://search.bilibili.com/all?keyword=... → content script 读取已渲染搜索卡片 → POST /api/sources/bili/task-result → 后端转入 discovery_candidates

它的关键价值有三点:

  1. 用真实浏览器页面做搜索 fallback:平台页面自己完成签名/风控上下文,content script 只读结果卡片。
  2. 任务队列化:不是一次性 Playwright 脚本,而是后端有任务、状态、结果、超时、日志。
  3. 产物结构化:输出 BV、标题、UP、封面、播放量等,能进入后续候选/审核链。

对我们的 Bili Review 来说,最值得吸的是“任务桥设计”,不是扩展代码本身。

与现有能力对比

能力当前 Bili Review / PipelineOpenBiliClaw B站链路吸收判断
主采集broad_sample + up_feed + dynamic UP pool搜索任务 + rendered cards不替代主采集
API 412 处理低预算 AutoCLI fallback、UID overrides、source healthAPI 失败时启 DOM fallback 信号可补 browser-side evidence
UID 映射up_alias_overrides.json + AutoCLI user search搜索页/UP页可见链接提取可补可视化候选证据
Review Console任务触发、Review Queue、dedupe、action logs无我们现有 Review 语义我们保留控制台,吸任务桥
数据治理UP Review / Video Review / Bitable dedupe / source weightdiscovery_candidates / content_cache不引入其候选池表,映射到现有 payload/review
浏览器执行旧方案偏 Playwright 诊断浏览器扩展常驻任务桥先 POC,不默认常驻
测试基础已有 TaskService / broad sample / queue 测试仓库有扩展测试方案应落到现有 pytest 链

判断:增强关系,不是替代关系

推荐方案:Bili Rendered Search Rescue(BRSR)

目标

构建一个面向 Bili Review 的 B站浏览器侧搜索/诊断/rescue 能力,先作为人工可控任务入口,后续再评估是否接入 broad_sample fallback。

非目标

明确不做:

  • 不安装/运行完整 OpenBiliClaw。
  • 不导入其 Soul/推荐/候选池系统。
  • 不改 Bili Review 默认视频抓取主链。
  • 不把 browser sidecar 变成大规模采集器。
  • 不自动写 up_profiles.jsonsources.yaml、正式 Bitable。
  • 不静默依赖用户登录态做无人值守批量抓取。

架构设计

Phase 0:只加 Review Console 诊断任务,不碰主链

新增一个控制台任务类型:

bili_rendered_search_probe

任务输入:

{ "source": "中国物理学会", "keyword": "中国物理学会", "search_type": "upuser | video | all", "limit": 20, "mode": "diagnostic", "timeout_seconds": 90 }

任务输出:

{ "status": "succeeded | failed | no_result | browser_risk", "source": "中国物理学会", "searched_url": "https://search.bilibili.com/upuser?keyword=...", "browser_access": "ok | captcha_or_risk | blocked | error", "visible_user_candidates": [ { "title": "中国物理学会", "uid": "622015176", "space_url": "https://space.bilibili.com/622015176", "confidence": "exact | near | weak" } ], "visible_video_candidates": [ { "bvid": "BV...", "title": "...", "author": "...", "url": "https://www.bilibili.com/video/BV...", "cover_url": "..." } ], "recommendation": "add_uid_override_candidate | classify_browser_risk | cooldown_source | no_action", "artifact_paths": { "screenshot": "tmp/diagnostics/...png", "snapshot": "tmp/diagnostics/...json" } }

Phase 1:pipeline 侧新增只读脚本

bili-tech-pipeline 新增:

src/scripts/probe_bili_rendered_search.py

职责:

  • 输入 source/keyword/search_type。
  • 调用浏览器侧工具执行搜索。
  • 解析渲染结果。
  • 产出 JSON。
  • 只写 tmp/diagnostics/

这一阶段可以先复用 Playwright CLI / browser 工具,不急着做浏览器扩展。原因:

  • 我们要先验证收益,不要先承担 extension 分发/权限/常驻调试成本。
  • 旧 412 方案已经把 Playwright 定位为诊断 sidecar,和这一步一致。
  • OpenBiliClaw 的“扩展任务桥”可以作为 Phase 3 产品化目标,不是 Phase 1 起点。

Phase 2:Review Console 接入任务

bili-review-console 增加:

  • TaskService.enqueue_bili_rendered_search_probe(...)
  • _run_bili_rendered_search_probe_task(...)
  • LegacyRuntimeAdapter.run_bili_rendered_search_probe(...)
  • 控制台任务列表展示该任务的:
  • browser_access
  • visible_user_candidates 数量
  • visible_video_candidates 数量
  • recommendation
  • artifact_paths

此阶段仍不把视频候选写入 Video Review Queue。它只是诊断/候选证据。

Phase 3:可选转为低预算 fallback adapter

只有 Phase 0-2 证明收益后,再在 bili-tech-pipeline 新增 adapter:

src/adapters/rendered_bili_search.py adapter_name = "rendered_bili_search"

触发条件必须窄:

primary up_feed result mode == project_error/project_empty AND warning contains 412 or candidate_count < threshold AND source in rescue_sources OR has alias override candidate AND per-run rendered fallback budget not exhausted

输出要保持 CandidateVideo 兼容:

candidate_id = rendered_bili_search:<source_entity>:<bvid>:<rank> source_adapter = rendered_bili_search source_entity = query.source_entity raw_title/raw_author/bvid/url/cover_url/metadata

但即使进入 fallback,也必须继续走现有 scoring / payload / Review Queue / dedupe,不绕过现有验收。

文件级改造建议

bili-tech-pipeline

#### 新增脚本

src/scripts/probe_bili_rendered_search.py

CLI:

python3 src/scripts/probe_bili_rendered_search.py \ --source "中国物理学会" \ --search-type upuser \ --output tmp/diagnostics/bili-rendered-search-中国物理学会.json

#### 新增测试

tests/test_bili_rendered_search_probe.py

重点测试不依赖真实 B站页面,打桩 browser runner 输出 HTML/snapshot:

  1. 能从 space.bilibili.com/<uid> 链接提取 UID。
  2. 能从 /video/BV... 链接提取 BVID。
  3. 遇到验证码/风险页面时输出 browser_access=captcha_or_risk
  4. 输出 JSON 不写正式 config。
  5. --emit-override-candidate 只写 tmp/diagnostics/up_alias_override_candidates.json,不写 config/up_alias_overrides.json

#### 可选新增 adapter

src/adapters/rendered_bili_search.py

只有 Phase 3 才做。

#### 可选更新配置

{ "fallback_policy": { "rendered_search_enabled": false, "rendered_search_max_sources": 1, "rendered_search_trigger_on_412": true, "rendered_search_diagnostic_only": true } }

默认必须是 false

bili-review-console

#### 修改 TaskService

backend/app/services/task_service.py

新增:

  • enqueue_bili_rendered_search_probe(...)
  • _run_bili_rendered_search_probe_task(...)

#### 修改 RuntimeAdapter

backend/app/services/runtime_adapter.py

新增:

  • run_bili_rendered_search_probe(...)
  • subprocess 调 src/scripts/probe_bili_rendered_search.py
  • 解析 JSON 输出,带 result_path

#### 修改 Repository / Migration

如果 console_tasks 继续用 task_type + params_json + result_json 通用结构,第一阶段可不加表。

如果后续要单独列表展示诊断历史,再新增:

bili_rendered_search_diagnostics

但第一阶段不建议加表,避免过早产品化。

#### 前端 UI

frontend/src/components/tasks-manager.tsx

增加一个轻入口:

B站搜索诊断(浏览器侧)

字段:source、search_type、limit。

展示:

  • browser_access badge
  • UID 候选
  • 视频候选数
  • recommendation
  • artifact path

测试验证流程

Layer 1:纯解析单元测试(bili-tech-pipeline)

命令:

cd ~/.hermes/projects/bili-tech-pipeline pytest tests/test_bili_rendered_search_probe.py -v

验收:

  • UID/BVID 解析稳定。
  • 风险页分类稳定。
  • 输出 schema 完整。
  • 不触碰正式配置。

Layer 2:脚本级 dry-run / fixture 测试

命令:

python3 src/scripts/probe_bili_rendered_search.py \ --source "中国物理学会" \ --fixture tests/fixtures/bili_search_upuser.html \ --output tmp/diagnostics/test-rendered-search.json

验收:

  • exit code 0。
  • browser_access=ok
  • visible_user_candidates[0].uid 非空。
  • 输出路径存在。

Layer 3:Review Console 后端任务测试

新增/扩展:

backend/tests/test_task_service_bili_rendered_search.py

命令:

cd ~/.hermes/projects/bili-review-console/backend pytest tests/test_task_service_bili_rendered_search.py -v

验收:

  • enqueue 后 params_json 保留 source/search_type/limit。
  • runtime fixture 返回后 task status=succeeded
  • result_json 含 result_path、browser_access、recommendation。
  • 不新增 Video Review Queue item。
  • action_logs 有 bili_rendered_search_probe_started/finished

Layer 4:与现有 Video Review 边界回归

命令:

cd ~/.hermes/projects/bili-review-console/backend pytest \ tests/test_task_service_qa_fixture.py \ tests/test_task_service_regressions.py \ -v

验收:

  • 原 QA fixture 仍通过。
  • broad_sample 仍按实际 inserted_review_items 循环。
  • Video Review BVID 去重不受影响。
  • UP discovery dry-run / candidate_pool 边界不受影响。

Layer 5:pipeline 现有 broad sample 回归

命令:

cd ~/.hermes/projects/bili-tech-pipeline pytest \ tests/test_broad_sample_selection.py \ tests/test_discovery_strategies.py \ tests/test_up_pool_weighting.py \ -v

验收:

  • profile-only source entity 仍可选中。
  • backfill 逻辑不变。
  • UP 池权重/降权不变。

Layer 6:真实单源 smoke(人工触发)

命令:

cd ~/.hermes/projects/bili-tech-pipeline python3 src/scripts/probe_bili_rendered_search.py \ --source "中国物理学会" \ --search-type upuser \ --output tmp/diagnostics/bili-rendered-search-中国物理学会.json

验收:

  • 单 source < 90 秒。
  • 若页面正常,至少能给出 UID 候选或明确 no_visible_candidate。
  • 若页面风控,输出 browser_access=captcha_or_risk,不重试撞平台。

Layer 7:真实 broad_sample 对照

只在 Layer 6 成功后做:

cd ~/.hermes/projects/bili-tech-pipeline python3 -m src.scripts.run --strategy broad_sample

对照字段:

  • candidate_count
  • eligible_count
  • publishable_count
  • target_meta.backfill
  • warnings 中 412/empty source 数
  • fallback_triggered / fallback_reason

验收不是“必须更多 publishable”,而是至少满足一个:

  • 能把 412 source 分成 browser risk / UID mapping / source empty。
  • 能产出高置信 UID override candidate。
  • 能减少下一轮同一 source 的无效 412 消耗。

保留 / 回滚门槛

保留条件

满足任意两项才值得继续:

  1. 对至少 3 个样本 source 做出稳定分类:API 412、browser risk、UID mapping、source empty。
  2. 至少生成 1 个高置信 UID override candidate,并经 AutoCLI/SDK enrichment 后能拿到真实视频详情。
  3. 单 source 运行时间 < 90 秒,失败时可解释,不挂死任务。
  4. 接入 Review Console 后,不影响现有 video_crawlup_discovery 测试和任务执行。
  5. 对同一批 source 的后续 broad_sample,减少重复 412 或提升 candidate_count 稳定性。

禁用 / 回滚条件

出现任意一项就保持 diagnostic-only 或回滚:

  1. 频繁触发登录/验证码,无法获得稳定证据。
  2. 单 source 成本过高,拖慢控制台任务。
  3. 开始依赖用户登录态/cookie 才能工作。
  4. 误把诊断候选直接写入正式 UP 池或 Video Review Queue。
  5. 对 candidate_count / eligible_count 没有可观测改善,只增加维护面。

回滚方式

  • 删除/隐藏 Review Console 入口,不影响 video_crawl 主链。
  • 保留脚本但默认 disabled。
  • 删除 tmp/diagnostics/ 产物。
  • 若误写 alias override,用 git diff 回滚 config/up_alias_overrides.json
  • broad_sample 配置中 rendered_search_enabled=false

是否值得吸收

当前判断

值得吸收,但只吸 Phase 0-2 的控制台诊断/证据链;暂不吸 Phase 3 默认 fallback adapter。

原因:

  • 当前主链已经可交付,不需要新 transport 抢主链。
  • 412/UID/source health 的痛点是真实存在的,browser-side evidence 能提升判断质量。
  • OpenBiliClaw 的扩展任务桥证明这个模式可产品化,但我们当前用 Playwright/脚本 POC 更稳,避免先背 extension 维护成本。
  • Review Console 正好是人工审核/诊断入口,比把能力塞进 pipeline 默认 run 更合适。

决策

Partial Absorb / L3 局部能力吸收

吸收内容:

  • rendered search task bridge 的架构模式。
  • B站 API 失败时的 browser-side 对照证据。
  • 任务化、结构化 result、action log、artifact path。

不吸收内容:

  • OpenBiliClaw 后端。
  • OpenBiliClaw 浏览器扩展全量代码。
  • Soul/推荐/候选池系统。
  • 默认采集主链替换。

推荐实施顺序

  1. 先实现 pipeline 侧 probe_bili_rendered_search.py fixture 版:无真实浏览器也能跑解析测试。
  2. 再接 Review Console 后端任务:runtime fixture + action log + result_json,不写 Review Queue。
  3. 做 1-2 个真实 source smoke:只验证分类/UID 候选,不要求产出 publishable。
  4. 根据 smoke 决定是否进入 Phase 3 fallback adapter:默认先不要进。

证据来源

  • 现有 Bili Review 控制台代码:/home/ht/.hermes/projects/bili-review-console/backend/app/services/task_service.py
  • 现有 runtime adapter:/home/ht/.hermes/projects/bili-review-console/backend/app/services/runtime_adapter.py
  • 现有 broad sample 配置:/home/ht/.hermes/projects/bili-tech-pipeline/config/broad_sample_sources.json
  • 现有 pipeline adapter:src/adapters/up_feed.pysrc/adapters/autocli_up_feed.pysrc/adapters/base.py
  • 现有测试:backend/tests/test_task_service_qa_fixture.pybackend/tests/test_task_service_regressions.pytests/test_broad_sample_selection.py
  • 既有 wiki:bili-412-optimization-with-playwright-sidecar-plan-2026-05-22.mdbili-review-console-and-source-pool-optimization-2026-05-22.md
  • OpenBiliClaw 调研报告:https://decision.ht1072.top/2026-06-29-openbiliclaw-absorption-eval.html