dsh-buddy-spike 🐿️
换心手术:让 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 契约面 |
快速开始(官方 bundle 安装,一条命令换心)
前置条件:已安装并登录 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 是个黑盒,但它的私有参数不必去改配置文件——插件自带一个设置面板("买电视附赠的遥控器",页面名叫控制台):
- 入口:Web UI 设置页 → 「CodeBuddy 控制台」分区
- 模型入口有两个:① 控制台的全局默认下拉(对所有新会话生效);② dsh 原生模型选择器——插件同时注册了
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,另支持手输自定义模型 ID - 生效时机:保存后对新会话即时生效,无需重启 dsh;清空字段即回退 CLI 默认
- 工作目录默认值:不填时 CodeBuddy 继承 dsh 进程的启动目录(在哪个目录跑
dsh web就在哪),需要圈定项目目录就在控制台里填cwd - 落盘位置:插件包目录的
buddy-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。
核心原理
- 官方换件入口:dsh 的
cordis.patch.yml支持按 id 覆盖插件行 —— 禁用agent-loop行 +insert新行挂自定义工厂(服务名同为agentLoop,消费者无感知) - patch 不能换名:overlay 行的
name与目标行不同会被静默跳过,只能"禁用旧行 + insert 新行" - 标准 bundle 形态:package.json 声明
dsh.bundle.patch→dsh plugin add安装进 profile、自动加入 bundles 层栈,启动不再需要--patch;patch 行用裸包名name: dsh-buddy(bundle 已在 profile node_modules,Node 解析可达) - 同包三面:一个 bundle 同时是 ①组合包(禁用原生 loop + 插入 buddy-loop)、②LLM 适配器(
./llm子路径导出,注册codebuddy路由 + 模型目录,stream()故意抛CODEBUDDY_SDK_DRIVEN——真实对话由 SDK 驱动,适配器只承担目录与选择校验)、③控制台(./client子路径导出 +dsh.client声明) - cordis 单例三重保障:
@deepseek-ai/*全部声明 peerDependencies(profile 配autoInstallPeers: false不会本地安装)→ 解析链落到 dsh 维护的$DSH_HOME/profiles/node_modules后备目录 → 其链接直指宿主安装的真实包。schemastery 另有Symbol.for全局注册表兜底 - 外挂依赖自持:bundle 的非宿主依赖(
@tencent-ai/agent-sdk)装在插件包自己的node_modules里(ESM 沿链接路径解析时最先命中),不污染宿主、不依赖 registry 状态 - 层叠规则(文档明载):后应用的层按行胜出;patch 替换目标行整个
config而非深度合并,覆盖时必须重述该行所有键
更多细节(含 12 个踩坑的"现象→根因→解决→教训")见 换心手术全记录.md。
已知限制
- CodeBuddy 侧每轮独立对话,resume 后旧历史不会喂给模型上下文(UI 历史完整)
steer只排队成下一轮,无真正的中途打断- 工具审批走 CodeBuddy CLI 自己的审批流程,未映射到 dsh 的 approval 弹窗
致谢
- deepseek-ai/deepseek-harness —— "一切皆插件"的出色设计,让换心成为可能
- 腾讯 CodeBuddy /
@tencent-ai/agent-sdk
No comments yet. Be the first to write one.