dsh-free-channels
把 WorkBuddy 国内版(腾讯 · copilot.tencent.com)、WorkBuddy 国际版
(腾讯 · www.workbuddy.ai)与 Raccoon(商汤小浣熊)三个账号渠道单独接入 DSH:
登录、多账号池、模型开关、积分查询与限流探测,全部在一个设置页里完成。
本插件是
dsh-our-free-model@2.5.7中「白嫖模型接入」部分的三渠道抽离版:上游把 13 个渠道打包在一起,本插件 只保留用户指定的这三个(腾讯系国内版 + 国际版,以及 Raccoon),其余全部移除。
功能
| 能力 | WorkBuddy 国内版 | WorkBuddy 国际版 | Raccoon | 说明 |
|---|---|---|---|---|
| 登录 | ✅ 浏览器轮询式 | ✅ 浏览器轮询式 | ✅ 微信扫码 / 短信 | 本地页承载,不依赖官方客户端 |
| 多账号池 | ✅ | ✅ | ✅ | 拖拽排序决定选号优先级 |
| 凭据静默续期 | ✅ refresh_token |
✅ refresh_token |
✅ refresh_token |
只刷新「本次实际用到」的那个账号 |
| 模型开关 | ✅ | ✅ | ✅ | 关闭项仍列出,可随时重新打开 |
| 积分余额 | ✅ | ✅ | ✅ | 逐账号查询,失败带原因 |
| 一次性奖励 | ❌ | ❌ | ✅ 桌面端登录奖励 3000 分 | 幂等,每号一次 |
| 限流探测 | ✅ | ✅ | ✅ | 「测试 / 重测 / 清除限流标记」 |
| 图片输入 | ✅ | ✅ | ✅ | 按模型能力投影,超大图自动缩放 |
| 系统提示词指纹改写 | ✅ 仅国内版 | ❌ 原样透传 | ❌ 原样透传 | 见下方「国内版的提示词处理」 |
刻意不包含(与上游的差异)
- 其余 10 个渠道(CodeArts / LobsterAI / Qoder / Qoder CN / TRAE / Cline / Loomy / MiniMax / ZCode / Gemini)
- 匿名免费车道、EAC 协付渠道、Kilo 免费车道
- 本地 OpenAI 兼容网关(上游的
127.0.0.1:8326) - 用量徽标、Token 账本、数据看板、运行日志页
- 公告推送、自更新器、热重载
- 「锁定永久积分」选号策略、供应商拖拽排序
- 每日签到(一键领积分):按你的要求已整体移除,未随国内版恢复。
如实说明三个渠道的端点情况:国内版上游确实有
checkin-activity-status/daily-checkin;国际版内核里连这两个路径的字面量都不存在;Raccoon 的每日积分 由服务端按日自动发放、无端点。本插件只保留三者都真实可用的积分余额查询 与 Raccoon 的一次性登录奖励。
国内版的提示词处理
WorkBuddy 国内版(copilot.tencent.com)会留存请求体里的 messages[0].content。
DSH 注入的系统提示词首句带产品名自述,按你的要求,仅国内版在发送前把它换成
一句语义等价、用词完全不同的说法:
| 内容 | |
|---|---|
| 原文(命中即替换) | You are an AI agent powered by DeepSeek Harness. |
| 替换为 | Serving as autonomous coding helper operating within this environment. |
约束(由单元测试逐词锁死):
- 替换句与原句零单词重叠(原句 9 个词一个都不出现);
- 替换句自身无重复单词;
- 只替换这一句,提示词的其余部分(工具约定、行为准则)逐字保留;
- 国际版与 Raccoon 原样透传,不做任何改写;
- 只改发往上游的
options.system,不改会话历史里的 system 消息。
实现见 src/channel/prompt-guard.ts,接入点是 buddy-adapter.ts 组装请求体的
那一步。命中大小写/句号变体均可;带 /g 正则的 lastIndex 已复位,重复调用结果稳定。
安装
方式一:从 GitHub 安装(推荐)
dsh plugin --profile <profile> add https://github.com/vi0let-dev/dsh-free-channels
也可以在 插件 页 → 添加插件 → 安装第三方插件,填入同一个地址:
https://github.com/vi0let-dev/dsh-free-channels
固定版本(不跟随分支变动,推荐长期使用):
https://github.com/vi0let-dev/dsh-free-channels#v0.1.0
GitHub 源在安装前会先 git ls-remote 预检可达性(默认 5 秒);国内网络若提示
「无法访问 GitHub」,可挂代理后重试。
方式二:从本地目录安装(开发调试用)
dsh plugin --profile <profile> add "C:\path\to\dsh-free-channels"
插件页里填该目录的绝对路径(也可写成 file:... / link:...)。
⚠️ 这是链接安装:node_modules 里是指向源目录的符号链接,源目录不能移动、
改名或删除,否则插件立即失效;改代码后需重启 DSH 生效。
方式三:从 .tgz 安装(分发用,装完可删源码)
npm pack # 在插件目录执行,得到 dsh-free-channels-0.1.0.tgz
dsh plugin --profile <profile> add "D:\somewhere\dsh-free-channels-0.1.0.tgz"
这类安装会把包解出一份真实副本放进 profile 的 pnpm store,因此源码目录可以删。
但 .tgz 本身必须保留:profile 的 package.json 记录的是
file:…/dsh-free-channels-0.1.0.tgz,删掉它之后任何一次 profile 的 pnpm 操作都可能
失败并清掉已安装副本。
装完之后
- 插件页确认
dsh-free-channels已出现且没有error标记(新 bundle 默认启用); - 刷新页面(浏览器半身随新 bundle 加载,不刷新看不到设置页);
- 打开 设置 → 白嫖渠道,点「添加账号」登录。
⚠️ 与 dsh-our-free-model 冲突
两个插件注册同名的 provider 路由(workbuddy、raccoon)。DSH 的
ctx.llm.registerAdapter() 对重复路由会抛 DUPLICATE_ADAPTER,因此:
不要同时启用这两个插件。 若要换成本插件,请先停用 dsh-our-free-model。
本插件对重复注册做了幂等处理(保留已有路由、跳过本次注册并记一条 warn), 所以「同一插件被重启两次」不会炸;但那是同一个插件的场景,跨插件仍会 出现「谁的实现生效不确定」—— 这种不确定性本身就是不该有的。
数据目录
账号索引与模型开关写在:
$DSH_HOME/dsh-free-channels/state.json
不复用上游的 $DSH_HOME/channel-pack/state.json —— 那份文档是同机多 profile
共享的,且采用整体替换写入,两个插件共用会互相抹掉对方不认识的字段。
登录凭据不在这里:它们写在宿主凭据库(.credentials.yaml)的
WORKBUDDY_ACCOUNT_* / RACCOON_ACCOUNT_* ref 下。
可用 DSH_FREE_CHANNELS_STATE_DIR 覆盖状态目录(测试用)。
使用
打开 设置 → 白嫖渠道(settings.section 里的一项)。
添加账号
- 点「添加账号」,插件会返回一个登录地址并立即打开新窗口;
- WorkBuddy:在打开的页面完成登录,插件后台轮询到 token 后自动把账号加入池;
- Raccoon:在打开的本地页面里选「微信扫码」或「短信登录」;
- 页面会每 1.5 秒询问一次登录状态,成功后自动刷新账号列表。
⚠️ 如果浏览器拦截了弹窗,请允许本站弹窗后重试。插件不会把设置页导航走。
账号操作
| 按钮 | 行为 |
|---|---|
| 启用 / 停用 | 只影响自动选号;停用账号仍参与积分查询与凭据续期 |
| 测试 | 无条件发一次真实的最小请求,只回答「现在能不能用」,不写任何状态 |
| 清除限流标记 | 不发请求,直接清掉该账号的限流标记 |
| 新手奖励 | 仅 Raccoon:领取一次性的桌面端登录奖励(幂等) |
| 删除 | 同时清除该账号的凭据(需要重新登录) |
模型开关
- 关闭的模型从模型选择器消失,但仍列在设置页(否则用户再也无法重新打开);
- 「全部打开 / 全部关闭」作用于该渠道的全部模型;
- 支持搜索。
限流行为
- 撞到额度限流(业务码 6004 / HTTP 429)→ 给该账号的该模型写一个解禁时刻, 并自动换下一个账号重试;
- 撞到「模型饱和」(业务码 14003)→ 不写标记、不换号,只建议换模型: 换号对这种情形无效,写标记反而会把整池锁住一小时;
- 限流标记只接受更晚的解禁时刻(防止一次短兜底覆盖掉服务端给的真值)。
配置
本插件没有 Config(不写 profile 的 cordis.patch.yml)。行为通过环境变量微调:
| 变量 | 默认 | 作用 |
|---|---|---|
DSH_HIDE_MODELS_WITHOUT_ACCOUNT |
1(开) |
设为 0 后,即使没有已登录账号也列出模型 |
DSH_FREE_CHANNELS_STATE_DIR |
— | 覆盖状态目录(测试隔离用) |
项目结构
dsh-free-channels/
├── index.js Host 半边:装配 + 本机 HTTP 路由
├── client.js 浏览器半边:设置页(手写 ModuleLoader bundle)
├── cordis.patch.yml bundle patch(一行 insert)
├── package.json
├── icon.svg
├── locale/{zh,en}.json 插件管理器显示的标题/描述
├── src/channel/ 渠道实现(TypeScript 源码 + 编译产物)
│ ├── product.ts WorkBuddy 产品配置(端点 / UA 分档 / 兜底模型表)
│ ├── buddy.ts WorkBuddy 协议常量与纯解析
│ ├── buddy-oauth.ts external-link-v2 轮询式登录与续期
│ ├── buddy-auth.ts 认证服务(多账号 + 调度器)
│ ├── buddy-adapter.ts WorkBuddy 的 LlmAdapter
│ ├── raccoon*.ts Raccoon 的协议 / 登录页 / 认证 / 适配器 / 积分
│ ├── credits.ts 腾讯系积分余额端点(只读)
│ ├── account-pool.ts 多账号索引、选号、限流标记、模型黑名单
│ ├── account-store.ts 状态文档(原子写)
│ ├── rate-limit.ts 限流判定与重置时刻解析
│ ├── prompt-guard.ts 国内版系统提示词指纹改写(仅 buddy 调用)
│ ├── register.ts 适配器注册的幂等包装
│ ├── rpc.ts 设置页要用的全部业务编排
│ ├── image-budget.ts 图片投影预算
│ ├── message-shape.ts 消息序列化
│ ├── sse.ts SSE 解析与思考链处理
│ ├── openai-compat.ts OpenAI 兼容流消费
│ ├── model-queue.ts 按日额度的时间工具
│ └── ...
├── scripts/build.mjs TypeScript → ESM 编译(类型擦除)
└── test/ 离线测试(49 项)
构建
src/channel/*.ts 需要先编译成同目录的 .js(Host 半边由 Node 直接 import(),
它不认识 TypeScript):
npm install --no-save typescript # 或在任意目录装一份
TYPESCRIPT_DIR=<含 node_modules/typescript 的目录> node scripts/build.mjs
构建只做类型擦除,不改写 import 路径,因此产物与源码一一对应。仓库已包含
编译后的 .js,正常安装不需要构建。
测试
node test/run.mjs
49 个用例,覆盖:请求栅栏、限流判定与重置时刻解析、账号池的选号/限流/黑名单/
重排/持久化、Raccoon 昵称、模型目录合并、国内版提示词改写、产品配置一致性、
浏览器半身的注册契约与纯函数,
以及 8 项真实 apply() 装配断言(三个 provider 注册 / 路由挂载 / /summary /
/rpc 分派 / 请求栅栏 / 404 / 卸载后路由被摘掉)。
test/stub-loader.mjs 会把 @deepseek-ai/* 映射到 test/stubs/*(插件目录里
没有 node_modules,否则桩会遮住宿主真正的实现)。
隐私与安全
- 凭据只进宿主凭据库:
ctx.credentials.set()。插件自己的state.json里 只有账号 id、昵称、有效期与限流时间戳,没有任何 token。 - 只访问本机:设置页的所有请求都发往
/api/dsh-free-channels(同源、127.0.0.1)。路由有三道栅栏:回环地址检查、Host 头必须是回环字面量 (挡 DNS-rebinding)、必须带自定义头x-dsh-free-channels: 1(挡跨站请求)。 - 不出网代理:插件不做代理、不上报、不遥测。请求只发往三个渠道自己的
官方端点(
copilot.tencent.com/www.workbuddy.ai/xiaohuanxiong.com)。 - 日志不含内容:只记事件与错误,不记消息正文、不记 token。
详见 AUDIT.md。
已知限制(未验证项,务必先读)
以下内容在本机无法验证,需要真实 DSH 与真实账号才能确认:
- slot 渲染:
settings.section的注册参数与 props 形状取自实时 inspection (DSH0.2.1-rc.3),但「页面是否真的渲染出来、布局是否如预期」未验证。 - 真实登录流程:WorkBuddy 的轮询式登录与 Raccoon 的扫码/短信登录都依赖 上游接口;本插件只做了静态与离线验证,没有用真实账号跑通。
- 凭据续期:
refresh_token的轮换行为由上游决定,未做端到端验证。 - 图片投影:缩放后的字节预算与上游网关的实际限制是否匹配,未验证。
@deepseek-ai/*契约:三个宿主包的导入符号取自app.asar的导出表; 测试用的是桩(test/stubs/),不构成「与宿主 API 一致」的证明。- 卸载残留:
ctx.effect的清理函数已按规范返回,但「卸载后是否真的无残留」 需要真机验证。
许可
MIT。src/channel/** 的实现抽离自 MIT 许可的
dsh-our-free-model
(其渠道包又来自 dsh-codearts-auth)。
详见 LICENSE。
No comments yet. Be the first to write one.