tlewa/dsh-better-choice:給 DSH 選擇題卡片加備註與旁問

前言

DSH 的 ask_user_question 在交互上有兩個常見缺口:選項文字往往只有一句話,用戶想補充約束只能塞進 custom 輸入框;卡片期間模型不會回答「這個選項到底是什麼意思」這類追問,想確認信息得跳出當前流程另開一輪。下面介紹的插件針對這兩點做了增強,不改變原有的選擇協議。

這是社區目錄頁上的 tlewa/dsh-better-choice,由 TLEWA 維護,分類爲客戶端插件,GitHub 星標數爲 1(截至 2026-11-06),npm 最新版本 1.0.4,許可證 MIT。一句話定位:給 DSH 的通用問題卡片補上「按選項的補充框」和「卡片內旁問模型」,左鍵選擇、跳過、翻頁、倒計時等官方行爲全部保留。

插件概覽

安裝前先看清適用範圍。它只接管 DSH 客戶端的通用選擇題卡片,計劃審查(plan-review)、審批等非通用問題卡片仍走官方組件。宿主要求爲 DSH 0.2.0-rc 族(engines.dsh: >=0.2.0-rc.1 <0.3.0-0,客戶端內置包 ^0.2.0-rc.1),Node.js 20+;作者標明已在 DSH 0.2.2-rc.1 上驗證。

它包含兩個半邊:

  1. 客戶端:掛在瀏覽器半邊,向 conversation.composer 鏈式槽註冊,priority: -10(官方默認 0),先於官方組件被詢問;
  2. 宿主:一個自己的命令 bc-ask,用來跑旁問子代理;
  3. 樣式:由官方問題卡 CSS 派生並加 bc_ 前綴,避免污染其他插件。

識別不到通用 PendingQuestion 載體時,增強卡片返回 null,自動落回官方組件。

核心能力

右鍵選項寫補充

右鍵任意選項,即選中該項(若尚未選中)並在該選項下方展開補充說明輸入框。填寫內容不會替換選項,而是作爲該選項的附註,提交時與所選項一起交給模型:

{
  "answers": [
    {
      "id": "question-id",
      "selected": ["方案 B"],
      "custom": "方案 B: 先灰度 5%,觀察一小時再全量"
    }
  ]
}

沒有填寫任何附註時,請求與官方完全一致,不額外生成 custom。單選、多選都按選項分別保存補充內容,切換選項不會串稿。多選提交時一行一個附註:

方案 A: 需要保留舊接口
方案 C: 下個迭代再刪

多選時給未勾選的選項寫了備註,提交文本會標註 (未選),便於模型分清語氣。

卡片內旁問

問題卡片底部有「先問一句」輸入區,用來基於當前會話上下文回答用戶的疑問,例如「這兩個選項在生產環境下的差別是什麼」「選 B 的話需要改哪些文件」。旁問的工作方式:

  1. 以 fork 子代理複用當前會話已完成的上下文、模型與工具聲明,delivery: 'caller' 讓它掛在當前命令調用上,不排隊等父回合;
  2. 旁問內容只顯示在卡片裏,不提交、不污染主對話,也不替用戶做出選擇;
  3. 子代理執行期掛 tools.guard,一切工具調用都被拒絕,不改文件,不繼續原任務;輸出上限 32000 tokens(不超過父會話上限)。

交互上的細節:把光標放進旁問框,卡片會顯示「已暫停」,倒計時停住,失焦後自動恢復;點「提問」後卡片進入等待,不再因爲等回答而超時;線程按題分開保存,切題再回來仍能看到原來的問答;回答中可點「取消旁問」中止,每個線程最多保留 20 輪。旁問回答目前是完成後整段出現,不是逐字流式顯示。

安裝與啓用

下面命令來自 README。作者推薦從 npm 安裝。

從 npm 安裝(推薦):

  1. 打開側邊欄插件頁 → 安裝插件;
  2. 輸入包名並確認:
   dsh-better-choice
  1. 安裝完成後硬刷新(Ctrl+Shift+R);若宿主半邊未生效,重啓桌面端。

固定版本:

dsh-better-choice@1.0.1

命令行等價寫法:

dsh plugin --profile desktop add dsh-better-choice@1.0.1

倉庫的 lib/ 是可直接運行的產物,從 GitHub 安裝不需要本地構建:

https://github.com/TLEWA/dsh-better-choice

固定到標籤:

https://github.com/TLEWA/dsh-better-choice#v1.0.3

或直接安裝 Release 附件:

https://github.com/TLEWA/dsh-better-choice/releases/latest/download/dsh-better-choice.tgz

命令行等價寫法:

dsh plugin --profile desktop add github:TLEWA/dsh-better-choice#v1.0.3

從源碼安裝:

git clone https://github.com/TLEWA/dsh-better-choice.git
cd dsh-better-choice
npm install
npm run build
npm test
dsh plugin --profile desktop add .

安裝或升級後硬刷新頁面。宿主命令 bc-ask 未註冊時,旁問框會提示失敗,重啓桌面端即可。

典型用法

  1. 等模型發起一個普通的選擇題;
  2. 想補充約束:右鍵選項,寫完後正常提交;
  3. 想先確認信息:在底部旁問框提問,看完回答再選;
  4. 兩者可以同時使用,旁問內容不會進入最終答案。

右鍵在觸控板上通常是雙指點按;沒有右鍵的設備仍可正常左鍵作答,只是用不到補充框。

實現要點

旁問通過本插件自己的命令 bc-ask 完成,客戶端把問題、全部問題卡片、已寫備註和本線程之前的旁問序列化後交給宿主。宿主側的機制:

  • 用 ctx.subagents.startActivation({ provider: 'fork', delivery: 'caller' }) 啓動 fork 子代理,seed 是父會話最後一個 turn/end 之前的已完成回合,當前尚未完成的 tool-call 回合不進入 seed;
  • 只追加一條尾部 user 消息(旁問模式 + 問題卡片 + 之前的旁問 + 本次問題),不改 system、不改工具聲明、不重寫歷史;
  • 子代理繼承父會話的 provider / model / reasoningEffort,maxTokens 取 min(32000, parent.maxTokens);
  • 父調用的 signal 與 30 分鐘 watchdog 一起透傳;
  • 子代理不把問答寫回父 session,父會話只落 command/run、subagent/catalog 與 command/done,且 recordInput: false 不記錄問題正文。

因爲 fork 子代理複用了父會話已完成回合的前綴,provider 可以命中已有 prompt cache。作者實測主請求與緊隨其後的 fork 子請求都會報告非零 cacheReadTokens,並隨父會話已完成回合增長(本機 DeepSeek 路由爲自動前綴緩存)。

適用場景與注意

這個插件適合在生成環境決策場景裏用 ask_user_question 的項目:需要按選項補充約束,或想在當前會話上下文裏先問清選項含義再作答。它解決的是信息密度問題,不解決選擇本身。

幾條限制來自 README:

  1. 只接管通用選擇題,計劃審查、審批等卡片保持官方實現;
  2. 旁問固定在當前會話的模型上,不提供單獨選擇模型或推理強度的入口;
  3. 旁問是隻讀的,需要讀文件、跑命令才能回答的問題,應直接在對話裏問;
  4. fork seed 只包含父會話最後一個已完成回合,正在等待回答的那一輪不會進入 seed;
  5. 旁問回答完成後整段出現,不是逐字流式顯示,超長回答受 32K 輸出上限約束;
  6. 沒有右鍵輸入的設備無法使用補充框,但左鍵作答完全不受影響。

需要注意權限邊界:插件以當前 dsh 進程的權限運行。安裝前應先打開源碼與許可證覈對,本插件爲 MIT,NOTICE.md 列明瞭具體複用範圍(問題卡組件結構與樣式派生自 dsh-question-note,旁問交互參考了 dsh-btw 的設計)。DSH 升級若改動問題卡內部結構,識別失敗時增強卡片不接管,官方問題卡仍可用;旁問接口變化時會報錯,但不影響正常作答。

目錄與來源

目錄頁:https://www.skillhub.cn/plugins/TLEWA/dsh-better-choice
GitHub:https://github.com/TLEWA/dsh-better-choice
npm:https://www.npmjs.com/package/dsh-better-choice

總結一下:它做的是「選項附註」與「卡片內旁問」兩件小事,接入點都在官方 composer 鏈上,識別不到通用問題卡就自動退回官方組件,對現有選擇流程的改動面很小。如果你在用 DSH 的 ask_user_question 做決策收集,可以先裝 npm 包硬刷新試一輪,再決定是否需要固定版本。

羽毛球分组比赛记分
小程序二维码

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

小夜