dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
换心手术:让 DeepSeek Harness (dsh) 的 Web UI 用上 CodeBuddy CLI 作为唯一大脑 —— 纯腾讯积分燃料,DeepSeek 零消耗。
dsh 是"一切皆插件"的智能体框架,它的默认大脑是 DeepSeek。这个项目验证并落地了一个想法:不改 dsh 一行源码,把 agent-loop 驱动器整个换掉,让 dsh 的会话、UI、工具链全部照常工作,但每轮对话由 @tencent-ai/agent-sdk 驱动 CodeBuddy CLI 完成(复用其登录态,消耗腾讯 Coding Plan 积分)。
dsh Web UI ──会话/事件──▶ BuddyLoop(本仓库插件,服务名 agentLoop)
│
▼
@tencent-ai/agent-sdk (query 流式)
│
▼
codebuddy CLI(已登录)
│
▼
腾讯 Coding Plan 积分
实测效果:dsh Web UI 新建会话发消息 → 思考链 + 流式回答 + 用量统计全部正常,来源标记 codebuddy,DeepSeek token 消耗为 0。
| 路径 | 内容 |
|---|---|
dsh-buddy/ | ⭐ 标准 bundle 插件包(dsh.bundle 声明 + cordis.patch.yml + 控制台),一条 dsh plugin add 官方命令安装 |
buddy-loop/ | 手术原型插件(BuddyLoop 工厂 + BuddyAgent 驱动器,含 resume/持久化/inbox 完整实现,--patch 老路仍可用) |
buddy.patch.yml | 旧版 --patch 装配(遗留;bundle 流程不需要它) |
dsh-recon/ | Stage-1 验证脚本与依赖修复记录(历史参考) |
.agents/skills/ | 🧠 Agent 技能包(clone 即用):dsh-plugin-dev 开发插件 / dsh-troubleshoot 四步排障 / dsh-heart-transplant 换心适配模式 |
test-query.mjs | Spike:直连 CodeBuddy CLI 的最小验证 |
换心手术全记录.md | 📖 完整复盘:架构、时间线、12 个踩坑全记录、patch 语义速查、Agent 契约面 |
前置条件:已安装并登录 codebuddy CLI、已安装 dsh(npm 包或源码构建均可)、pnpm 在 PATH 上、Node ≥ 20。
# 1. 克隆本仓库,进入插件包装依赖
git clone https://github.com/AzcHui/dsh-buddy-spike.git
cd dsh-buddy-spike/dsh-buddy
npm install --omit=dev # 只装 @tencent-ai/agent-sdk;@deepseek-ai/* 是 peer,勿本地安装
# 2. 官方命令安装进 profile(内部转 pnpm,自动登记 bundle 层)
cd ..
dsh plugin --profile web add ./dsh-buddy # profile 名按需换;pnpm 未落链接时见下方注意
# 3. 启动(不再需要 --patch)
dsh web # = dsh --profile web
打开 http://127.0.0.1:3080,新建会话发消息,回答来自 CodeBuddy 即成功。
不想启动只想验层:dsh --profile web --dump-config,应看到 # == dsh-buddy 层。
注意(Windows + pnpm ≥ 11 实测坑):
link:依赖的顶层链接偶发不落地 (pnpm 报 Already up to date 但node_modules/dsh-buddy缺失)。手动补一个:fs.symlinkSync(<checkout>, '<profile>/node_modules/dsh-buddy', 'junction'), 再跑一次dsh plugin --profile web install触发登记即可。
换心后的 CodeBuddy 是个黑盒,但它的私有参数不必去改配置文件——插件自带一个设置面板("买电视附赠的遥控器",页面名叫控制台):
codebuddy 适配器路由(官方 LLM 适配器契约,listModels() 公布 19 个官方模型),设置页「模型」出现 CodeBuddy 卡片、/model 弹窗与输入框模型位出现 CodeBuddy 分组,选中即落为该会话的 model/selection 事件,下一回合生效(仅 provider: codebuddy 的选择会被跟随;选 DeepSeek 系模型时 CodeBuddy 无法承载,保持现状)model(下拉,官方支持清单)/ 思考模式 thinking(自适应/固定预算/关闭)/ maxTurns / 工作目录 cwd / 环境变量 env / 系统提示词 systemPrompt(追加或覆盖)codebuddy --help 实测):fast-model / balanced-model / deep-model / glm-5.3 / glm-5.3-flash / glm-5.2 / glm-5.1 / glm-5v-turbo / deepseek-v4-pro / deepseek-v4.1-flash / kimi-k3-1 / kimi-k2.8-preview / kimi-k2.7 / kimi-k2.6 / minimax-m3 / hy4-preview(-f) / hy3 / hy3-x,另支持手输自定义模型 IDdsh web 就在哪),需要圈定项目目录就在控制台里填 cwdbuddy-config.json(已 gitignore——env 里可能放密钥)原理:插件是 dsh.client 双面包——服务端 half 注册同源路由 /api/buddy/config(GET/POST + sameOrigin 校验),浏览器 half 经官方外部 UI 注入机制(window.__ModuleLoader__ + dsh.client.inject 声明)由宿主自动分发加载,ctx.slots 挂进设置页。零源码改动、零构建链,client bundle 是手写的 React.createElement。
cordis.patch.yml 支持按 id 覆盖插件行 —— 禁用 agent-loop 行 + insert 新行挂自定义工厂(服务名同为 agentLoop,消费者无感知)name 与目标行不同会被静默跳过,只能"禁用旧行 + insert 新行"dsh.bundle.patch → dsh plugin add 安装进 profile、自动加入 bundles 层栈,启动不再需要 --patch;patch 行用裸包名 name: dsh-buddy(bundle 已在 profile node_modules,Node 解析可达)./llm 子路径导出,注册 codebuddy 路由 + 模型目录,stream() 故意抛 CODEBUDDY_SDK_DRIVEN——真实对话由 SDK 驱动,适配器只承担目录与选择校验)、③控制台(./client 子路径导出 + dsh.client 声明)@deepseek-ai/* 全部声明 peerDependencies(profile 配 autoInstallPeers: false 不会本地安装)→ 解析链落到 dsh 维护的 $DSH_HOME/profiles/node_modules 后备目录 → 其链接直指宿主安装的真实包。schemastery 另有 Symbol.for 全局注册表兜底@tencent-ai/agent-sdk)装在插件包自己的 node_modules 里(ESM 沿链接路径解析时最先命中),不污染宿主、不依赖 registry 状态config 而非深度合并,覆盖时必须重述该行所有键更多细节(含 12 个踩坑的"现象→根因→解决→教训")见 换心手术全记录.md。
steer 只排队成下一轮,无真正的中途打断@tencent-ai/agent-sdk