DSH WorkBuddy Connect
corrinehu/dsh-workbuddy-connect将 WorkBuddy 桌面 App 包含的模型自动接入 DeepSeek Harness,在 DSH 对话窗口里零配置使用。
复用本机豆包桌面客户端已有的登录态,作为 DeepSeek Harness 的模型 provider,并提供 5 小时限额与周额度的只读额度概览。仅 Windows x64:凭据解密依赖 DPAPI。
把本机豆包(Doubao)桌面客户端已有的登录态接入 DeepSeek Harness,作为 Seed 系列模型 provider, 并在设置面板里提供一个只读的额度概览(5 小时限额 / 周额度 + 重置倒计时)。

本插件复用豆包桌面客户端的登录态,因此必须先在豆包客户端登录。
它不会替你登录、也不会输入任何账号密码:它读取豆包客户端已保存在本机的 Chromium cookie(通过 Windows DPAPI 在本进程内解密),把它当作请求凭据。
| 要求 | 说明 |
|---|---|
| 豆包桌面客户端已登录 | 未登录 → 卡片显示「未登录」,provider 不可用 |
| Windows | 凭据解密依赖 Windows DPAPI。macOS / Linux 不支持 |
| 有可用订阅额度 | 免费账号也能连,但配额很小 |
如果你没有登录豆包客户端,插件会明确报错而不是静默失败。
reasoning_effort 实测值 3 / 4 / 5。model_item_key 指定模型。127.0.0.1 的本地端点,带每进程共享密钥,任何非本机请求一律拒绝。doctor / probe,不消耗推理额度即可体检整条链路。验证环境(一次具体的真机条件,不是"所有环境都可用"的承诺):
| 项 | 值 |
|---|---|
| 操作系统 | Windows x64 |
| 豆包电脑版 | 2.31.4(已登录) |
| DeepSeek Harness | 0.2.0-rc.2(桌面版) |
| Node.js | 24.18.1(宿主内) |
标准套餐、5 小时限额 已用 0% · 2h 17m 后重置、
周额度 已用 9% · 5d 21h 后重置、账号状态: 已登录、每 5 分钟自动刷新、配置目录路径。0921 新版)/ 2.1 Turbo(专家)/
2.1 Pro / 2.1 Turbo(即将下线)/ 自动,角标与桌面包一致,计数显示 已启用 6 ↑。刷新 / 全选 / 全不选 / 保存 四个按钮。
doctor 四段检查全绿:凭据 29 cookie 解密且 9/9 必需会话 cookie 齐备、账号被上游接受、
shim 绑定回环端口且错误 bearer 返回 401、两个额度窗口可读。reasoning_effort_config 独立确认。model_item_key 与 reasoning_effort:抓包确认。以上只对上述那台机器、那个账号、被验证的那个时间点成立。 不构成任何兼容性保证 —— 请务必读下面的「已知限制」。
豆包把模型按模式分组,menu_list 每个模式有自己的一份清单:
| 模式 | 可选条目 |
|---|---|
| 对话 | 豆包 快速(0)、豆包 2.1 Turbo「专家」(3) |
| 工作任务 | 自动(9)、2.1 Lite(seed-lite-7b)、2.1 Pro(5)、Turbo(3) |
本插件只提供「对话」模式的两条:
| id | 名称 | 徽章 | 推理强度 |
|---|---|---|---|
0 | 豆包 快速 | — | ✅ |
3 | 豆包 2.1 Turbo | 专家 | ✅ |
「工作任务」的四条故意不列:它们的执行侧是豆包客户端进程内的 CUA 运行时
(tasks-mode-resource + sbox),外部客户端注册不进去,每一轮都会得到
710010702。与其在模型选择器里摆出选不中的条目,不如不摆。
推理强度:低 = 3、中 = 4、高 = 5(由客户端切换档位时重新序列化的配置 diff 读出,
并由配置里的 reasoning_effort_config 独立确认)。深度思考开关本身走
need_deep_think: 0,档位只由 reasoning_effort 携带 —— 这是 2026-10-22 CDP 抓包更正的。
DSH (pi-ai provider)
└─ doubao-adapter ──► 本机 loopback shim (127.0.0.1,仅本进程密钥)
└─ doubao-upstream ──► 豆包 /chat/completion
(带上本机读到的会话 cookie)
bot_id + reasoning_effort)。/plugins/dsh-connect-doubao/quota 与 /catalog 提供额度与目录,
按显式允许清单构造响应,不透传上游任何字段,并拒绝非 loopback 来源。# ① 通过 DSH CLI(推荐)
dsh plugin --profile desktop add dsh-connect-doubao
# ② npm 直装
npm install -g dsh-connect-doubao
dsh plugin --profile desktop add dsh-connect-doubao
# ③ 本地开发(不发布,直接挂源码目录)
dsh plugin --profile desktop add "E:\path\to\dsh-connect-doubao"
方式 ③ 会写成
link:依赖,改完源码npm run build即可,不需要重装。
| 项目 | 版本 |
|---|---|
| DeepSeek Harness | >=0.1.7-rc.1 <0.3.0-0(实测:0.2.0-rc.2) |
@earendil-works/pi-ai | >=0.85.0 <0.88.0(宿主实测:0.87.1) |
| Node.js | ^22.19.0 || >=24.0.0 |
官方 @deepseek-ai/* 依赖全部声明为 peerDependencies(不打包,由宿主提供),
这既是插件市场的硬性要求,也保证运行期用的是宿主那一份。
| 平台 | 状态 |
|---|---|
| Windows x64 | ✅ 实测验证 |
| macOS | ❌ 不支持(DPAPI 是 Windows 专有) |
| Linux | ❌ 不支持(同上) |
凭据查找逻辑(findDoubaoUserDataDir)按顺序尝试:
%LOCALAPPDATA%\Doubao\User Data%APPDATA%\Doubao\User DataC:\Users\<各用户>\AppData\Local\Doubao\User Data命中条件是存在 Default\Network\Cookies。
只写实测过的那条:第 1 条在本机实测通过,第 2/3 条是代码里的兜底分支,未在真机验证。
# 体检整条链路(不消耗推理额度)
dsh-connect-doubao-doctor
dsh-connect-doubao-doctor --json
# 冒烟探针(会消耗一次推理额度)
dsh-connect-doubao-probe --prompt "hi"
dsh-connect-doubao-probe --prompt "hi" --model 5 --thinking high --json
probe 的完整参数:
--prompt <text> 提示词(默认 "hi")
--model <key> 模型 id,见上表
--thinking <low|mid|high> 推理强度
--json 输出 JSON
--timeout <ms> 超时(默认 120000)
doctor 输出四段独立结论:凭据 / 账号 / provider 装配 / 额度。
凭据只报数量,不报值。
npm install
npm run typecheck # 节点侧 + 浏览器侧两套 tsconfig
npm run build # 两个 target:node(ESM) + browser(CJS)
npm run test # 客户端产物格式回归
npm run check # 以上全部
⚠️ 浏览器侧产物必须是 CommonJS:桌面外壳用
<script>加载它,不加type="module"。 ESM 会直接抛Cannot use import statement outside a module, 并让整个 web boot 失败(1 entry did not activate)。tests/client-bundle-format.test.ts钉住了这条规则。
'4'(豆包 2.1 Turbo「即将下线」)未实测。 其余 5 个条目已实测可对话。message.ext 里有一个
不透明标记(实测为 38),它不是版本号也不是档位,字节跳动从未公布其含义 ——
所以没有一个响应侧的字段可以拿来证明"服务端真的用了你选的那个模型"。
本插件能确定的是:它把 model_item_key 随请求发出(这已抓包确认)。
至于服务端如何解释这个键,只能由服务端回答。agent_mode 的取值是 2 = 普通对话、1 = 工作任务(CDP 抓包实测,
2026-10-22)。任务模式下服务端会把每一轮交给 Agent-GeneralTask,而它的执行运行时是豆包
客户端进程里的 CUA(tasks-mode-resource + sbox),外部客户端注册不进去,必然回
710010702。所以插件固定走对话模式;请求体里的 general_task_param 发的是客户端在普通
对话下的默认值 {"server_do_compare":true}。model_item_key 目前不影响谁来回答。 实测(2026-10-22):0 / 3 / 5 /
seed-lite-7b 以及一个刻意写错的 key,回答长度和耗时都无法区分(12.3–14.0 s),
响应里的 model_id 恒为不透明标记 38。结论:对话模式下服务端按账号/模式路由,
不看这个字段。插件仍原样转发它(服务端会把值记在消息上),但不要指望换 key 换模型;
「工作任务」模式是否按 key 路由,因为它根本跑不通,未验证。本项目仅供个人学习与研究使用。
| 依赖 | 用途 |
|---|---|
@earendil-works/pi-ai | 模型 provider 运行时(宿主提供) |
@deepseek-ai/* | Harness 插件框架(宿主提供) |
@deepseek-ai/schemastery | 设置 schema(宿主提供) |
运行时不引入任何第三方连接器插件。