跳到主要内容
进行中2026年10月29日

DSH Runtime Tuning

一个关于 Agent 运行时的长期实验:从 DeepSeek Harness 的真实会话记录里找出时间花在了哪里、哪些是白白浪费的,再用插件把它修掉,每一项都用数据验证。

DeepSeek HarnessNode.jsJavaScript
状态
进行中
发布于
2026年10月29日
更新于
2026年11月6日
技术
DeepSeek Harness · Node.js · JavaScript

一个关于 Agent 运行时的长期实验:从 DeepSeek Harness(DSH)的真实会话记录里找出时间花在了哪里、哪些是白白浪费的,再尽量用插件把它修掉,并且每一项都用数据验证。

它既是一组可以安装的 DSH 插件,也是这个过程的记录。随着分析推进,插件会不断增加。完整的分析与实验过程见文章《从一份 9.7 小时的真实会话开始》。

起点

一份日常使用 DSH 的会话:119 轮对话、2347 次工具调用,跨度 9.7 小时。按事件逐条统计后,除了模型生成,大量时间花在阻塞等待后台任务、等人回答提问、等人审批和前台 sleep 上;同一个 GitHub 令牌还出现在了几十条命令和模型回复里。

目前包含的插件

插件 作用
wait-guard 拦截前台长 sleep 和长时间阻塞等待;后台任务没回报时兜底唤醒模型;可选的 task_status 工具
ask-nonblocking 让 ask_user_question 问完不阻塞
secret-guard 不让令牌进入模型的上下文
chat-answer-fix 替换 DSH 聊天界面判定,避免带着工具调用结束时答复被收进折叠里
secret-files 在沙箱挂载层遮住凭据文件,文件工具与子进程读到的是说明而不是真实内容
fs-view edit 未读也可按原文精确替换;read_image 按文件头识别图片格式
session-tmp 文件工具与 bash 共用同一个 /tmp(仅在确认换过 bwrap /tmp 时生效)
stream-stall 模型回答开始输出后只剩心跳、连续 stallSeconds(默认 180)秒没有新内容时,断开这次请求,DSH 按传输失败自动重试;不限制思考时长和输出长度,第一个内容出来之前默认不管
todo-reminder 任务清单还有没做完的项、又 15 步没更新时,在工具结果后附一条提醒和清单当前内容,让模型对一下进度;没写过清单或已全部完成时不提醒;频率可配

几个结论

  • 收益是“不占住对话”,不是“更快”:长等待拆成“后台运行 → 结束本轮 → 完成事件唤醒新一轮”后,编译期间用户随时可以插话
  • 别靠模型自己报告状态:长会话里模型几乎从不调用 task_status,所以状态改由 runtime 按事实判断,task_status 降为可选
  • 不是所有问题都值得修:插件只能拒绝、不能改参数,对触发多、真正有问题少的情况,拒绝的代价比省下的还多,这类就不做

当前状态

  • 版本:0.2.8,开源(MIT 协议)
  • 使用环境:只在 DSH 0.2.1-rc.5 的 web profile 下验证过,系统是 Windows 11 + WSL2;headless、sdk 等 profile 暂不支持
  • 调优预设:模式里可选「调优」,去掉日常编码用不到的工具并附带工具使用规则;标准模式不受影响;v0.2.7 起默认关闭,用过调优预设的需要在自己的 cordis.patch.yml 里加 - id: runtime-tuning-preset-tuned 和 disabled: false,否则升级后用该预设开始的对话会显示「会话不可用」
  • 已知限制:ask-nonblocking 依赖 DSH 的内部接口,DSH 升级后可能失效,失效时只是退回阻塞版提问;硬保底“到点唤醒”目前只有单元测试覆盖
  • 测试:共 109 个测试,只用 Node.js 自带的 node:test,不需要安装依赖,通过 GitHub Actions 在 Node.js 22 / 24 下运行
  • 完成通知与提醒、托盘、崩溃防护和插件健康检查由配套插件 DSH Sentinel(接替 dsh-task-notify)负责
  • DSH 版本要求:v0.2.6 起适配 DSH 0.2.2-rc.1,要求的 DSH 版本改为 >=0.2.2-rc.1;还在 0.2.1 上请继续用 0.2.5
  • v0.2.8 新增:todo-reminder。官方 todo_write 只记录不提醒,长任务里清单常常写一次就停在第一项;现在清单还有没做完的项、又 15 步没更新时,在工具结果后附一条提醒和清单当前内容,请模型和下一个工具调用放在同一步更新,不单独占一步。没写过清单或已全部完成时不提醒;频率可配
  • v0.2.7 变更:调优预设改为默认关闭。用某个预设开始的对话会一直绑在这个预设上,预设没了或加载失败,这些对话就打不开;而它省不省时还没有同任务的耗时数据,不该默认带上。新增测试:把调优预设和本机 DSH 的 standard 逐项比较,除了有意去掉和加上的几项,有差异就报出来,DSH 升级后先跑测试再手动更新预设
  • v0.2.6 修复:适配 DSH 0.2.2-rc.1。0.2.2 去掉了 dsh-tool-subagent-control/list-agents 子路径(并进了 dsh-tool-subagent-control),旧调优预设引用它,用调优预设的会话打不开(显示「会话不可用」),新建也不行;预设按 0.2.2 的 standard 更新。chat-answer-fix:显示设置的字段按当前官方 Config 读(0.2.2 加了 foldedReplies);DSH 刚启动时加载器还在重载事务里,搬设置会报错,现在过一会儿重试;新版加载器给的条目是迭代器,原来在同一个迭代器上找两次,导致每次启动都把设置重写一遍,现在先转成数组
  • v0.2.5 新增:stream-stall。官方的流空闲超时会被心跳重置,服务端降级时界面会一直停在「思考」;现在回答开始输出后连续 180 秒(默认,可通过 stallSeconds 调整)没有新内容就断开这次请求,由 DSH 自动重试。文档里的 dsh-task-notify 也改成了后继 dsh-sentinel
  • v0.2.4 修复:工具步骤展示方式等显示设置重启后不再回到「详细」;非 pnpm 安装的 DSH 也能找到官方聊天界面