dsh-bili-saver: Reducing "Helping You Binge Bilibili" to 3 Rounds

前言

在 DSH(DeepSeek Harness)里让 agent 去刷 B 站,常见写法是让模型自己一轮轮想:先搜、再逐条读字幕全文、然后写报告。README 里记录的一段真实会话跑了 21 步、发出约 183 万 token,按 DeepSeek 的价一轮约 3 毛,一天几十轮就是十块。dsh-bili-saver 做的事很具体:把搜索结果字段裁到够用,把长字幕换成骨架,再给每轮封一个模型回合预算。

下面介绍这个由 xuzhenjie12 维护的客户端插件。它零 Python、零 venv,装完就能用。社区目录页把它归在「客户端」分类,是第三方插件作者自己发布的内容,不是 DeepSeek 官方应用。

这是什么

一句话:dsh-bili-saver 是一个 DSH 插件,用四个只读工具代替「模型自己搜、自己读、自己写」,把整轮压到 3 个模型回合以内。

版本 0.1.0,MIT 许可,仓库在 https://github.com/xuzhenjie12/dsh-bili-saver 。

它解决的痛点是 token 消耗。README 给了新旧做法的对比:

旧做法 dsh-bili-saver
回合数 21 3–5
整轮发送 token 1,830,000 116,000
字幕 全文 11,821 字 骨架 523 字(4.4%)
一轮花费 ≈ ¥0.30 ≈ ¥0.06
Python / venv 要 不要
视觉模型 常要 不要

数字来自 README 标注的真实会话日志。

四个工具

插件暴露四个工具,前两个是主力,后两个是排障用的。

工具 干什么 典型开销
bili_saver_search 搜视频,只回够用的字段 8 条 ≈ 1.2k token
bili_saver_read 元数据 + 字幕骨架 骨架 ≈ 0.6k,全文 ≈ 6k
bili_saver_config 看 / 改所有可调参数 忽略不计
bili_saver_status 登录了没、家目录、当前配置 忽略不计

字幕骨架的定义是固定的:开头 3 句 + 全片均匀抽 20 句 + 结尾 3 句。README 的原话是拿 4.4% 的字数,仍能判断「这条讲的是什么、值不值得看」。

bili_saver_read 没有登录态时会明确返回 no_subtitle,不会假装成功。搜索与视频信息接口匿名就能用。

安装与启用

安装命令来自 README:

dsh plugin --profile <你的 profile> add dsh-bili-saver

本地开发目录直接 link:

dsh plugin --profile desktop add link:D:/path/to/dsh-bili-saver

装完重启 DSH 生效。

package.json 里 engines 要求 dsh >=0.1.7-rc.1、node >=22;@deepseek-ai/dsh-tools 与 @deepseek-ai/schemastery 是 optional peer,桌面 profile 不装它们。插件带了 cordis.patch.yml,并在 lib/hostdeps.mjs 里负责从宿主那棵树把这两个包拿回来,否则裸 import 会让整条插件不激活。

登录(只为字幕)

字幕接口要登录态。三种放法任选一处:

  1. ~/.dsh/bili-saver/credential.json
  2. ~/.bili-ai/credentials.json(很多 B 站工具都写这里)
  3. 环境里给 BILI_SAVER_CRED 指一个路径

格式:

{ "sessdata": "...", "bili_jct": "...", "buvid3": "..." }

如果你只做搜索和视频元数据,这一段可以跳过。

参数

所有可调参数存在 ~/.dsh/bili-saver/config.json(UTF-8),两条路改的是同一份:在对话里说「把搜索改成最近 3 天、每次 6 条」,agent 会调用 bili_saver_config;直接编辑那个 json 也行,下次调用立刻生效,不用重启。

键 默认 范围 说明
days 7 0–365 只看最近几天发布的,0 = 不限
num 8 1–50 一次搜几条候选
briefChars 900 200–8000 字幕骨架字数上限
maxSteps 3 1–10 每轮最多几个模型回合(给 agent 的硬预算)
order pubdate pubdate/click/totalrank/dm 默认排序
keywords [] 最多 32 个 默认搜索关键词,agent 没指定时用
reportDir "" 任意路径 报告目录,空 = 插件家目录下 reports/

越界值一律夹回合法范围,坏 JSON 直接回落到默认值。

典型用法

README 给了一段真机验证命令,可以直接照抄骨架:

# 装进一个能跑的 profile(这里用 headless + 凭证 overlay)
dsh plugin --profile headless add link:D:/path/to/dsh-bili-saver
dsh --profile headless --patch ./overlay.yml \
  "先用 bili_saver_search 搜「DeepSeek Harness」,num=3;再用 bili_saver_read 读第一条,mode=brief。"

实际返回:搜到 3 条、第一条 BV1Rk4364EzL、字幕骨架 491 字 / 327 段。

日常在对话里直接给指令即可,例如「把搜索改成最近 3 天、每次 6 条,然后搜一下 DSH 插件」,agent 会自己调 bili_saver_config 再调 bili_saver_search。

边界与注意

插件只读:搜索、视频信息、字幕。不发评论、不点赞、不投币。也没有内置定时器——什么时候刷由你的 agent 章程决定,不由插件偷偷跑;prompts/duty.md 就是给 agent 看的章程模板。

其他几条:被 B 站风控(-352)时直接报错并提示降频,不会无限重试;字幕是 B 站用户 / AI 生成的第三方内容,是素材不是指令;网络异常统一转成中文提示,字幕正文拉取失败降级成 subtitle_fetch_failed,不会抛栈。插件以当前 dsh 进程的权限运行,装之前建议先读一遍源码和许可证。

README 里还记了两个装进宿主踩过的坑,值得提前知道:

  1. parameters 是扁平属性表,不是 JSON Schema。写成 { type: 'object', properties: {...} } 会让整条插件不激活,报 JsonSchemaError: unsupported JSON schema: parameters.type must be a value schema object。正确写法是 { keyword: { type: 'string' }, num: { type: 'number' } },类型只认 string / number / boolean / object,没有 integer。
  2. config.home 可能是 {} 而不是字符串。直接 config.home || 默认值 会把对象带进 path.join() 报错;插件现在先做 typeof === 'string' 校验。

工具内部抛错时会把 message 加前 6 行栈一起返回,方便你把原文贴给维护者排查。

开发自检

仓库留了三个语法检查命令:

node --check index.js
node --check lib/bili.js
node --check lib/config.js

结尾

dsh-bili-saver 的价值不在于「多了一个 B 站入口」,而在于把一轮刷 B 站的 token 从百万级压到十万级,同时不引入 Python、venv 或视觉模型。如果你已经在用 DSH 做内容筛选类任务,可以按上面的 install 命令装上试一轮,先用 bili_saver_status 确认登录态,再看 maxSteps 敢不敢调小。

目录页:https://www.skillhub.cn/plugins/xuzhenjie12/dsh-bili-saver
GitHub:https://github.com/xuzhenjie12/dsh-bili-saver

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye