dsh-slice-agent-loop
by tt-wang
每一轮都只给模型恰好需要的上下文,不多不少
Every turn, hand the model exactly the context it needs. No more, no less.
安装
dsh plugin --profile web add github:tt-wang/dsh-slice-agent-loopGitHub 源码安装:首次需按提示配置 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 ↗
同类插件
查看全部 →
dsh-anchored-standard
两阶段 DeepSeek Harness 预设:先 Minimal 对齐的 bootstrap,再切完整 Standard 工具(Project2 98/99)

PicGo-Core
极致的图片上传引擎,CLI 与 API 双支持

awesome-deepseek-harness
DeepSeek Harness(DSH)及其优秀社区插件的精选指南。

awesome-deepseek-harness
DeepSeek Harness (DSH)生态系统:来自dsh-external/hub和公共dsh-plugin主题的精选插件、工具和基础设施。

AI-Novel-Writer
本地优先 AI 小说创作工作台,提供 Windows/macOS 桌面版与 DeepSeek Harness 插件开发预览,支持角色、大纲、章节蓝图、审稿修稿和本地模型。

mcp-for-stata
MCP-for-Stata:把 Stata 集成进你的 agent