前言¶
在 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 会让整条插件不激活。
登录(只为字幕)¶
字幕接口要登录态。三种放法任选一处:
~/.dsh/bili-saver/credential.json~/.bili-ai/credentials.json(很多 B 站工具都写这里)- 环境里给
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 里还记了两个装进宿主踩过的坑,值得提前知道:
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。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