前言¶
在 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