dsh-agent-lab:Agent 行为回归实验台

前言

在 DeepSeek Harness(DSH)里做智能体开发时,换模型、改 effort、动提示词或升级插件后,同一条任务的行为是否一致,往往只能靠「再跑一遍、凭感觉对比」。一次成功、一次失败时,也很难快速定位差异出在哪一步工具调用。现有方式多停留在「看会话录像」,缺少把多次运行并排对齐、标出漂移、并按任务聚合为矩阵的能力。

下面介绍社区插件 dsh-agent-lab(维护者 Limtide,分类:工作流)。它把一次真实会话录成运行(run),支持与另一次运行并排对比工具序列、参数、结果与用量;可从同一任务在隔离副本里重放(换模型或改提示词);再按任务 × 变体聚合成矩阵,并为任务配置断言,用 CLI 退出码接入 CI 回归门禁。当前 package 版本为 0.4.0,许可证 MIT。

目录页:https://www.skillhub.cn/plugins/Limtide/dsh-agent-lab
源码:https://github.com/Limtide/dsh-agent-lab

这是什么

dsh-agent-lab 的定位是「给 agent 配置做 pytest」的第一程:录制运行 → 对比差异 → 有意识重跑 → 矩阵汇总 → 断言门禁。

它解决的核心问题包括:

  • 换了模型、effort、提示词或插件版本,同一任务的行为变了吗?
  • 两次跑同一流程,一次成功一次失败,差异出在哪一步?
  • 收到「乱改文件」类反馈时,如何把现场录下来供对照?

比较口径侧重行为不变量(工具名、顺序、参数、成功/失败、结果内容),而不是模型回复的逐字文本;README 也明确不保证模型输出可复现。

核心功能

对比(v0.1 起)

侧栏打开 回归实验台。在 对比 页签中:

  1. 从会话导入 —— 选择已有会话(含进行中的),录制成运行。
  2. 重放(v0.2)—— 在运行下拉菜单点重放:可改任务提示词、模型与推理强度;插件复制基线工作区到副本并真实重跑,完成后自动成为对照 B。
  3. 或直接再录一次,或从运行库选两次运行。

页面将 基线 A 与 对照 B 并排对齐,包括:

  • 顶部指标:行为相似度、工具调用数、失败数、Token、耗时、步骤,带 A→B 增量与变好/变差着色。
  • 配置指纹:模型、effort、工具 schema 数与哈希、系统提示词哈希、沙箱与审批策略。
  • 对齐轨迹:逐行状态(一致 / 参数漂移 / 结果变化 / 成败翻转 / 缺失 / 新增);序列对齐使用 Needleman–Wunsch,同名工具才能配对,避免多一次调用导致后面全部错位。
  • 仅差异、展开行看完整参数与结果等交互,README 中有截图说明。

运行库与断言库分别保存在 $DSH_HOME/agent-lab/runs/*.json 与 $DSH_HOME/agent-lab/checks/*.json,可直接阅读与版本化。

重放(v0.2)

点重放后 Host 会:复制基线工作目录到 $DSH_HOME/agent-lab/replays/<job>/workspace;用基线记录的 agent preset(不存在则回退默认)在副本里建新会话;按指定 provider / model / effort 跑任务,会话强制 workspace-write 且审批 never;turn/end 后录成新运行并写入 replay 元数据。

使用前需知:

  • 真实调用模型与工具,消耗 Token;默认 20 分钟上限,超时取消并保存已产生轨迹。
  • 工具只能写副本;越界写会被沙箱拒绝。副本不会自动删除;复制的是重放时刻的目录(含 .git、node_modules),大仓库会慢。
  • 同一时刻只允许一个重放;进程重启后内存中的任务状态丢失,已完成运行已落盘。

矩阵(v0.3)

矩阵 页签中:行为任务(按归一化任务提示词分组,键形如 task-1a2b3c4d5e6f);列为变体(provider / model / reasoningEffort);单元格展示通过率、平均工具调用数、平均 Token。无断言时按「正常结束」判通过;有断言时需正常结束且全部断言通过。空单元格可「重放这个变体」,任务与工作区来自该任务最近一次导入的运行(无则退回最近一次重放)。

README 说明 v0.4 不做批量重放队列,矩阵需逐个发起重放。

断言与 CI 门禁(v0.4)

断言挂在任务上($DSH_HOME/agent-lab/checks/<task-key>.json),同一任务的所有运行共用。内置始终检查:这一轮必须正常结束(turn-completed)。可追加:

断言 参数 含义
no-tool — 未调用任何工具
file-contains path, text 工作区内相对路径文件包含文本
final-contains text 最终回复包含文本
max-tool-calls max 工具调用数上限
max-total-tokens max 输入+输出 Token 上限
max-failures max 失败工具调用数上限

file-contains 对重放读副本目录,对导入读会话当前工作目录;路径须留在工作区内。

CI 示例:

node bin/agent-lab-check.mjs --run run-xxxxxxxx
node bin/agent-lab-check.mjs --task task-1a2b3c4d5e6f --variant deepseek-account/deepseek-flash@high
node bin/agent-lab-check.mjs --run run-xxxxxxxx --json

退出码:0 通过、1 断言失败、2 用法或存储错误。默认读 $DSH_HOME/agent-lab/{runs,checks},可用 --runs-dir / --checks-dir 覆盖,--checks <file> 指定断言 JSON。

GitHub Actions 中可写:

- name: agent regression gate
  run: node plugins/dsh-agent-lab/bin/agent-lab-check.mjs --run "${{ env.RUN_ID }}"

安装与启用

DSH 生态里插件通过 Profile 的 Plugin Manager 安装。README 给出的安装 / 更新方式为(在本 profile 中):

plugin_manager install_bundle <插件目录的绝对路径>

Host 侧代码改动在下次 profile 重组(Plugin Manager 里关闭再开启该条目)或应用重启后生效;浏览器侧刷新页面即可。开发自测可在插件目录执行 npm test。

插件以当前 DSH 进程权限运行,安装前应自行查看源码与 MIT 许可证;运行记录、断言与临时副本仅在本机,不含上传。

典型用法

  1. 在 DSH 侧栏打开 回归实验台。
  2. 在 对比 页签从目标会话 从会话导入,得到基线运行 A。
  3. 需要对照时:对 A 使用 重放 改 model / effort / 提示词,或再导入/选择另一次运行作为 B。
  4. 查看顶部指标、配置指纹与对齐轨迹;必要时开 仅差异 或展开行核对参数键变化。
  5. 切到 矩阵 页签,按任务 × 变体查看通过率与用量;对空单元格按需 重放这个变体。
  6. 为任务编辑断言 JSON(或通过 UI 对话框,以实际客户端为准),本地或 CI 调用 agent-lab-check.mjs 做门禁。

参数与结果比较前会做归一化(工作目录替换为 <cwd> 等),「行为相似度」为启发式分数(60% 轨迹对齐 + 25% Token + 15% 失败差异),README 建议只作趋势参考,以原始 diff 为准。

适用场景与边界

适合:需要对比两次 agent 运行的工具行为;在换模型/提示词/插件版本前做手工或 CI 回归;把失败会话录成 run 留档对照。

明确不做(v0.4 README):批量重放队列、worktree 隔离、外部工具夹具、CI 托管、递归录制子代理/工作流树;数据不上传。

Skillhub 目录页星标为 0,与 GitHub 公开信息一致;社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

结尾

dsh-agent-lab 把「录一次、比两次、重放变体、矩阵汇总、断言退出码」串成一条可落地的 agent 行为回归路径,适合已在 DSH 里跑真实任务、又需要可版本化运行库与 CI 门禁的开发者。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜