dsh-slice-agent-loop

by dsh-external

工作流与自动化github 检测到 manifest package.json#dsh收录于 08-17

Drop-in DeepSeek Harness agent loop:上下文引擎是有界 slice(cordis 插件)

Every turn, hand the model exactly the context it needs. No more, no less.

安装

dsh plugin --profile web add github:dsh-external/dsh-slice-agent-loop

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

安装与环境配置指引、插件开发教程见 DSH 中文社区文档 ↗

安装即在你的机器上以你的权限运行第三方代码——它可读写文件、使用凭据、访问网络,DSH 的工具审批不会为插件代码加沙箱。「检测到 manifest」仅代表发现 dsh.bundle / dsh.plugin 清单,不构成兼容性或安全审查;安装前请审阅源码,不熟悉的插件先在不含密钥的环境试用。

README

目录

English | 中文

每一轮对话,把模型最需要的上下文交给它。不多给,也不少给。

这句话听起来像常识,但今天主流 coding agent 的做法是把整段对话史原样塞回模型:多给的部分从不裁剪,少给的时刻无法挽回。这个插件把围绕这句话设计的 slice loop 装进 DeepSeek Harness:同一个 harness、同一个模型、同一套工具与持久化,只把 agent loop 换掉——所以下面每一组对照实验,唯一的变量就是循环本身。

早期内测版;对应 DSH 快照 20260812T172954Z(rc.2,兼容 rc.1)。

一句话,两个约束

约束 transcript(全量对话史)现状
不多给 上下文有上界 上下文一路涨到窗口上限,然后压缩;注意力稀释,账单随轮数快速增长
不少给 信息可回取 压缩之后,细节消失且无法找回

Transcript 架构的三个结构问题:A · Context rot——上下文越长,模型对每条信息的利用率越低;B · 压缩即断头——摘要必然有损且不可逆,原文不在任何地方;C · 成本随轮数平方增长——每次调用重发全史,缓存折扣延后爆发点,但救不了体量。

设计:磁带 + 召回

模型每轮看到的不是对话史,是为这一轮重建的工作切片:

区域 性质
system prompt · 工具 schema 冻结,整个会话逐字节不变(前缀缓存友好)
SESSION TAPE(会话磁带) 只追加的封存轮账本:每轮问了什么、做了什么、文件基线与补丁、回复
OPEN FILES 当前打开文件,带 sha256 锚与 edited 标记
本轮请求 + 工具观察流 轮内追加,轮末封存归档

磁带长得像 transcript——同样只追加、同样缓存友好——但每条账目带哈希和出处。超长内容在切口处以精确标记截断,全文始终留在持久会话日志里。

召回是"不少给"的兑现,两层:recall_search 找到某句话在哪一轮(评分检索,默认挡掉工具输出洪水),recall_turn 逐字取回那一轮。截断处的磁带上留着路标,指回原文。

Transcript 的问题 本插件的应对
A · Context rot 峰值有界:模型永远在小上下文里工作
B · 压缩丢失 折叠但不丢失:会话日志全量持久,两层召回逐字回取
C · 平方成本 每轮只携带这一轮需要的;磁带只追加,前缀缓存生效

实测:双臂对照

default = DSH 自带 transcript loop(带校准压缩);slice = 本插件。同 harness、同工具,两代模型各测一轮:deepseek-v4-flash(0731)与 deepseek-v4-pro(0813)。价格按 2026-08-16 生效的新价目谷时价计:flash 未命中 $0.22/M · 命中 $0.007/M · 输出 $0.66/M;pro $0.66 / $0.022 / $1.98(峰时全线 ×2,两臂相对差不变)。新价目把两代的缓存折扣都收到约 1/30(此前 flash 1/50、pro 1/120)。逐调用账本随附,可复算;下面的结果同时报两轮。

① 长轮次负载 · 双臂 × 双模型

有界切片的主场是长会话——transcript 的成本与峰值随轮数增长,切片不随。两个长轮次场景(16 轮压缩失忆 · 76 轮上下文洪水),每格给 flash / pro 两轮:

场景 臂 验证(flash / pro) 价格(flash / pro) 峰值(flash / pro)
s13(16 轮) slice ✓ / ✓ $0.0241 / $0.0900 16K / 17K
default ✓ / ✓ $0.0296 / $0.0852 59K / 40K
s10(76 轮洪水) slice ✓ 零丢失 / ✓ 零丢失 $0.1529 / $0.6163 32K / 43K
default ✓ / ✗ 早期时间线丢失 $0.3755 / $0.7682 378K / 42K

s10 两轮合起来是 transcript 二难的完整现形。 flash 轮:default 的压缩跟不上洪水,峰值棘轮到 378K——信息都在,考题全对,但上下文失控。pro 轮:压缩正常工作了(峰值轨迹 40→34→39→40 锯齿,有界在阈值线),代价是把只存在于早期历史的时间线摘丢,verifier 直接判失败。峰值失控或有损丢信息,transcript 只能二选一;slice 两轮都是:有界峰值 + 零丢失,且分别便宜 59% / 20%。短场景 s13 的价格随计价结构摆动(flash 下 slice -18%,pro 下 +6%),峰值优势(2.4~3.7×)不随。

② 失忆重演 · 双臂 · 逐出核验

24 个基准数字由 agent 亲手跑脚本得出,只存在于工具输出——考题前:数字从不进任何回复(T1 明令只确认跑完)、原始样本首跑即被清除(盘上没有)、稀释洪水迫使 default 的压缩多轮改写历史。考题分两层:先不给任何提示,再明确说"这些数字是你亲手跑出来的,翻一下之前的记录"。

模型 臂 逐出核验 无提示层 明确指令层 陷阱题 峰值 价格 墙钟
flash slice ✓ 0/16 24/24 24/24 未编造 ✓ 21.5K $0.0521 222s
default ✓ 0/16 0/24 24/24 未编造 ✓ 51.9K $0.0910 569s
pro slice ✓ 0/16 24/24 24/24 未编造 ✓ 22.1K $0.1692 383s
default ✓ 0/16 24/24 24/24 未编造 ✓ 33.4K $0.4612 2014s

两臂的持久底座是同一个:DSH 把完整会话日志落盘,谁都"原则上可找回"。差异在 affordance,且随模型强度换了表现形式。flash 上:slice 收到中性考题后自发走 recall_search → recall_turn(磁带在截断处留了路标),轮内找回;default 翻遍工作区一无所获,如实写 UNKNOWN(零编造,如实记录),直到明确指令层才想到解压自己的会话日志(zstd jsonl)挖回。pro 够强:default 无提示也自己完成了这套取证式翻找——于是差异从"能不能找回"移到"找回的代价":同样 24/24,slice 用 3 个请求(383s / $0.169),default 用 32 个请求(2014s / $0.461),2.7× 价格、5.2× 墙钟。"可找回"与"会去找回"之间隔着工具与路标;模型越强,这层距离越表现为纯粹的效率差。

③ CB-20 精准检索 · 双臂

ContextBench(给一个真实 issue,agent 检索出修复所依赖的代码位置)50 题官方基准中取 20 题子集。配对对照 n=19——两轮 default 各有 1 题 20 分钟超时(不同题,均为 slice 数分钟内完成的题):

指标(19 题配对均值) slice flash default flash slice pro default pro
文件召回 fileRecall 0.816 0.761 0.752 0.780
行覆盖 spanRecall 0.847 0.772 0.794 0.811
文件精度 filePrecision 0.227 0.229 0.244 0.212
F1 · 文件级(均值法) 0.355 0.353 0.368 0.333
F1 · 文件级(macro) 0.342 0.323 0.343 0.327
价格合计 $0.6021 $0.5414 $1.3603 $1.7318
完成率 20/20 19/20 20/20 19/20

两代模型互换了召回的领先位(flash 下 slice 召回 +5.5pp,pro 下 default 略胜 +2.8pp),但 F1 与完成率 slice 两代全胜,精度在 pro 上拉开(+3.2pp);价格从 flash 的 +11% 翻到 pro 的 -21%——pro 输出贵($1.98/M),default 更多的步数与更长的会话在贵模型上代价放大。有界切片强迫的"每轮重读纪律"在检索任务上是优势而非负担,这个结论跨两代模型稳定。

题(Multi-SWE-Bench) slice R/span/F1 default R/span/F1 slice $ default $
c__0f94ce4d 1.00/1.00/0.36 1.00/1.00/0.26 0.0601 0.0597
c__1ac60ce9 1.00/1.00/0.25 1.00/1.00/0.20 0.0160 0.0237
c__b9b45262 0.33/0.30/0.17 0.33/0.30/0.13 0.1118 0.0627
c__cdbc5890 1.00/1.00/0.22 1.00/1.00/0.18 0.0300 0.0267
cpp__6a4e21e9 0.67/0.63/0.22 0.67/0.25/0.40 0.0363 0.0283
cpp__7c9ef76c 0.67/0.97/0.33 0.33/0.93/0.18 0.0194 0.0276
cpp__bca55dea 1.00/1.00/0.64 0.29/0.14/0.21 0.0438 0.0206
cpp__fe080aac 0.50/0.87/0.33 0.50/0.87/0.25 0.0258 0.0342
go__0498ad7f 1.00/1.00/0.29 1.00/1.00/0.18 0.0175 0.0341
go__0b78ed50 1.00/1.00/0.67 1.00/1.00/1.00 0.0150 0.0095
go__0f79e39c 1.00/1.00/0.50 1.00/1.00/0.50 0.0135 0.0094
go__1384380d 0.67/0.39/0.42 0.67/0.51/0.32 0.0302 0.0764
go__1ba303a5 0.67/0.92/0.36 0.67/0.92/0.44 0.0365 0.0389
go__250649eb 1.00/1.00/0.50 1.00/1.00/0.57 0.0099 0.0129
go__2a889a1d 1.00/1.00/0.29 1.00/1.00/0.29 0.0299 0.0088
go__2c512ec3 0.00/0.00/0.00 0.00/0.00/0.00 0.0315 0.0171
go__3d1b3145 1.00/1.00/0.50 1.00/1.00/0.29 0.0137 0.0270
go__3d85271b 1.00/1.00/0.22 1.00/1.00/0.22 0.0162 0.0106
go__3deeea9c 1.00/1.00/0.22 1.00/0.75/0.50 0.0449 0.0131

超时未配对:c__8bffb1b1(default 20 分钟超时;slice 137 秒完成,R/span 1.00/1.00,$0.0213)。

题(Multi-SWE-Bench) slice R/span/F1 default R/span/F1 slice $ default $
c__0f94ce4d 0.40/0.65/0.17 0.80/0.85/0.33 0.1446 0.1326
c__8bffb1b1 1.00/1.00/0.44 1.00/1.00/0.36 0.0485 0.0906
c__b9b45262 0.33/0.30/0.40 0.33/0.30/0.20 0.0501 0.1579
c__cdbc5890 1.00/1.00/0.20 1.00/1.00/0.18 0.0515 0.1199
cpp__6a4e21e9 0.67/0.49/0.16 0.33/0.15/0.13 0.1411 0.0947
cpp__7c9ef76c 0.33/0.93/0.12 0.67/0.97/0.27 0.1240 0.1051
cpp__bca55dea 0.71/0.56/0.45 0.86/0.86/0.36 0.1144 0.1728
cpp__fe080aac 0.50/0.87/0.36 0.50/0.71/0.29 0.0648 0.0763
go__0498ad7f 1.00/1.00/0.40 1.00/1.00/0.29 0.0486 0.0551
go__0b78ed50 1.00/1.00/0.67 1.00/1.00/0.40 0.0415 0.1038
go__0f79e39c 1.00/1.00/0.40 1.00/1.00/0.50 0.0346 0.0257
go__1384380d 0.67/0.36/0.47 0.67/0.66/0.44 0.0976 0.0872
go__1ba303a5 0.67/0.92/0.44 0.67/0.92/0.36 0.0604 0.1281
go__250649eb 1.00/1.00/0.57 1.00/1.00/0.50 0.0630 0.0348
go__2a889a1d 1.00/1.00/0.22 1.00/1.00/0.40 0.0393 0.0603
go__2c512ec3 0.00/0.00/0.00 0.00/0.00/0.00 0.0643 0.0902
go__3d1b3145 1.00/1.00/0.29 1.00/1.00/0.29 0.0545 0.0501
go__3d85271b 1.00/1.00/0.40 1.00/1.00/0.40 0.0259 0.0266
go__3deeea9c 1.00/1.00/0.33 1.00/1.00/0.50 0.0915 0.1201

超时未配对:c__1ac60ce9(default 20 分钟超时;slice 949 秒完成,R/span 1.00/1.00,$0.1222)。

缺陷与改进方向

缺陷 说明与实测量级 方向
1 · 缓存命中天然低于 transcript loop 切片每轮重建,字节位置移动即缓存失效,新鲜输入占比高(编码短任务实测 fresh 2~3×);DeepSeek 的缓存折扣对只追加的 transcript 有利(08-16 新价目后两代都约 1/30,此前 flash 1/50、pro 1/120)——中短任务可能没有价格优势(flash 实测部分场景 +10%~65%,但长链路调试场景在新价目下已反超 -38%;pro 下 s13 +6%)。 字节卫生两组优化(稳定渲染、第二次读取即冻结)已排期;长会话与检索负载在两代计价下都反超(s10:-59%/-20%;CB-20 pro:-21%);缓存折扣更浅的计价(Claude / OpenAI)下交叉点更早。
2 · 召回通道依赖模型主动伸手 历史逐字节可回取,受控压力下的自发召回已实证(测试②);但日常编码负载里主动召回接近零(信息多在磁带容量内,靠系统推送覆盖),跨会话"接着昨天做"的冷启动仍有风险。 让召回在日常负载与冷启动里成为习惯;agent memory 仍是前沿话题,改造已排期。
3 · 检索广度与节俭内核仍在调平 当前内核换来精度与价格,召回广度对上一构建有回撤。 kernel A/B 持续迭代。
4 · 整体仍是早期插件 目前覆盖 web profile 的 agent-loop 面;settings 面板对齐、子代理生态、TUI 等外围尚在跟进。核心机制(封存、审计事件、两层召回)已被上面三组测试反复验证。 工程覆盖面问题,不是技术难度问题。

安装

dsh plugin --profile web add "github:TT-Wang/dsh-slice-agent-loop#main"

或本地目录:git clone 后 dsh plugin --profile web add . 装完重启 web 生效 —— bundle 在启动时合成。

自带的 patch 会禁用 stock loop 与压缩 —— 有界重建同时替代两者。如果你的 组合里有 agent-loop-invariant 行,删掉它:重建的切片不可能与派生历史 逐字节相等,本插件在那条断言旁会拒绝加载。

配置

键 默认
kernel 'slice' 系统提示 kernel;'ported' 换成 Python prompt 逐字移植版(A/B 臂)
maxStepsPerTurn 50 单轮 continuation step 硬顶
maxParallelToolCalls 10 每步并行工具上限;DSH 0811 起同时限制子 agent 扇出

在你 profile 的 cordis.patch.yml 里按 id 定位已有行来设 (- id: slice-agent-loop + config:)。

开发

npm install --legacy-peer-deps   # @deepseek-ai/* peer 未发布
npm run link:dsh                 # 从你的 dsh 检出软链
npm run typecheck && npm test

lib/ 是提交物(git 源安装不跑构建)—— 推之前先 npm run build。 真模型冒烟:npm run e2e:recall(需要 env 里有 DEEPSEEK_API_KEY)。

许可

BSD-3-Clause —— 见 LICENSE。

原始 README: https://github.com/TT-Wang/dsh-slice-agent-loop/blob/main/README.zh.md ↗