dsh-steer-anchor:为中途插话加上「仍在原任务」的语义框

前言

在 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 一致):

  1. 触发条件:仅当 payload.step > 1,即当前 step 延续已打开的 turn;step === 1(含 idle steer 开回合)不改动。
  2. 消息范围:只处理 source.kind === 'user' 的消息;runtime-context、peer-bus-message、agent-message 等已有归属的生产者不动。
  3. 改写方式:在原有 text blocks 之前 prepend 一个 text block(三条规则 + 标记「【用户插话原文】」),用户原文块顺序与内容不变。
  4. 幂等:若第一条 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
羽毛球分组比赛记分
小程序二维码

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

小夜