前言¶
在 DeepSeek Harness(DSH)里,任务进行过程中用户可以通过 GUI 在回合尚未结束时补发一条消息(steering,常见操作是运行中按 Ctrl+Enter)。这条消息在协议层会记成普通的 user/message,source.kind === 'user';界面会标成 steering,但模型看到的只是上下文末尾又多了一条用户话,很容易把它当成全新指令——丢掉正在执行的计划、重做已完成步骤,或偏离当前任务。
Codex 的 turn/steer 在投递时机上类似(输入合并进活跃回合,在下一次模型请求前消费),但 Codex 的 harness 提示与模型训练里已经约定「回合中途的消息是延续当前任务」。DSH 默认没有这层约定,社区插件 dsh-steer-anchor(维护者 yelloooooooow,分类:工作流)在 agent 循环的 pre-step 阶段为符合条件的 steering 消息 prepend 一段固定说明框,把「插话而非新任务」写进模型可见内容,且与 session log 一致(model-visible ⟺ logged),不另开隐藏通道。
下面介绍它做什么、如何安装,以及自检与限制。
这是什么¶
dsh-steer-anchor 是 DSH 工作流类插件:在用户于任务中途 steering 时,给该条 user/message 加上简短的处理框(三条规则 + 保留用户原文块),引导模型保持主线、把插话当补充或纠偏,而不是默认重启任务。仓库:GitHub - yelloooooooow/dsh-steer-anchor;社区目录页:skillhub.cn 插件页。许可证 MIT(见仓库 README)。
核心功能¶
插件挂在 agent/pre-step 瀑布流上,逻辑要点如下(与 README 一致):
- 触发条件:仅当
payload.step > 1,即当前 step 延续已打开的 turn;step === 1(含 idle steer 开回合)不改动。 - 消息范围:只处理
source.kind === 'user'的消息;runtime-context、peer-bus-message、agent-message等已有归属的生产者不动。 - 改写方式:在原有 text blocks 之前 prepend 一个 text block(三条规则 + 标记「【用户插话原文】」),用户原文块顺序与内容不变。
- 幂等:若第一条 text block 已含标记
【任务中途插话 · 不是新任务】,不再重复 framing。
数据流(概念):
user 在 turn 运行中按 Ctrl+Enter
│
▼
agent.steer(message) ──► inbox next-step(在 step N+1 认领,N ≥ 1)
│
▼
agent/pre-step ──► 本插件 prepend 处理框
│
▼
循环将 admitted 消息记为 user/message 并发送给模型
框内默认中文规则(可在 lib/index.js 的 ANCHOR_TEXT 修改):
【任务中途插话 · 不是新任务】
这条用户消息是在当前任务进行中补发的,请按以下规则处理:
1. 保持当前任务主线与已经完成的步骤,不要因为这条消息重启、重做或丢弃整个任务;
2. 把它当作补充信息、约束或纠偏来纳入;只有它明确要求改变目标或步骤时,才调整与它冲突的部分;
3. 若与当前计划无冲突:简短确认后继续原步骤;若有冲突:说明差异,只改冲突部分,保留已完成的有效结果。
【用户插话原文】
成本:每条被 framing 的 steering 多一个 text block,约 198 字符(README 估算 ~100 tokens);无额外模型调用、无额外消息、不改写历史。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议阅读仓库源码与 LICENSE,确认符合你的环境策略。
官方 Quick start 安装命令:
dsh plugin --profile <your-profile> add github:yelloooooooow/dsh-steer-anchor
安装后需重启实例。下一次通过 Ctrl+Enter 发出的 steering 会带上上述处理框。
若要在 profile 里手工挂载行(便于热重载测试),可编辑 profile 的 cordis.patch.yml;不要与 bundle 安装同时启用同一 row id,否则会插入两次:
# profile cordis.patch.yml
- insert:
- id: steer-anchor
name: dsh-steer-anchor
典型用法与自检¶
日常使用:在 agent 执行任务的多 step turn 中,用 GUI steering(Ctrl+Enter)补充约束或纠偏即可;插件在 step >= 2 认领 steering 时自动 framing。
在 Web profile 下挂载时,本地服务提供只读自检路由:
curl "http://127.0.0.1:3080/api/steer-anchor/state?selftest=1"
示例响应字段含义:mounted 是否挂载;marker 为框标记;framed 累计 framing 次数;lastTurn / lastStep 为最近一次;selftest 可验证 rewrite 与原文保留。
适用场景与注意¶
适合:经常在 DSH GUI 里对进行中的 agent turn 插话,又希望模型不要误把插话当成全新任务的开发者。
限制(README 原文要点):
- 仅覆盖 GUI 用户 steering(
source.kind === 'user');peer-bus、子 agent 等自带 attribution, intentionally 不处理。 - 处理框出现在用户消息气泡内——这是保持「模型可见 ⟺ 已记录」的可见代价。
- 框是引导而非硬约束;模型仍可在插话明确要求时改目标,规则也允许只改冲突部分。
- 文案目前固定在模块级,尚无配置面(无额外配置项文档)。
DSH 生态强调「一切皆插件」;skillhub.cn 上的插件目录是社区站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-steer-anchor 用极小的上下文增量,在 DSH 里补上「中途插话延续当前任务」的显式约定,对齐 Codex steering 在语义上的常见预期。需要细节与版本信息时以仓库为准。
- 目录页:https://www.skillhub.cn/plugins/yelloooooooow/dsh-steer-anchor
- GitHub:https://github.com/yelloooooooow/dsh-steer-anchor