前言¶
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 上驗證。
它包含兩個半邊:
- 客戶端:掛在瀏覽器半邊,向
conversation.composer鏈式槽註冊,priority: -10(官方默認 0),先於官方組件被詢問; - 宿主:一個自己的命令
bc-ask,用來跑旁問子代理; - 樣式:由官方問題卡 CSS 派生並加
bc_前綴,避免污染其他插件。
識別不到通用 PendingQuestion 載體時,增強卡片返回 null,自動落回官方組件。
核心能力¶
右鍵選項寫補充¶
右鍵任意選項,即選中該項(若尚未選中)並在該選項下方展開補充說明輸入框。填寫內容不會替換選項,而是作爲該選項的附註,提交時與所選項一起交給模型:
{
"answers": [
{
"id": "question-id",
"selected": ["方案 B"],
"custom": "方案 B: 先灰度 5%,觀察一小時再全量"
}
]
}
沒有填寫任何附註時,請求與官方完全一致,不額外生成 custom。單選、多選都按選項分別保存補充內容,切換選項不會串稿。多選提交時一行一個附註:
方案 A: 需要保留舊接口
方案 C: 下個迭代再刪
多選時給未勾選的選項寫了備註,提交文本會標註 (未選),便於模型分清語氣。
卡片內旁問¶
問題卡片底部有「先問一句」輸入區,用來基於當前會話上下文回答用戶的疑問,例如「這兩個選項在生產環境下的差別是什麼」「選 B 的話需要改哪些文件」。旁問的工作方式:
- 以 fork 子代理複用當前會話已完成的上下文、模型與工具聲明,
delivery: 'caller'讓它掛在當前命令調用上,不排隊等父回合; - 旁問內容只顯示在卡片裏,不提交、不污染主對話,也不替用戶做出選擇;
- 子代理執行期掛
tools.guard,一切工具調用都被拒絕,不改文件,不繼續原任務;輸出上限 32000 tokens(不超過父會話上限)。
交互上的細節:把光標放進旁問框,卡片會顯示「已暫停」,倒計時停住,失焦後自動恢復;點「提問」後卡片進入等待,不再因爲等回答而超時;線程按題分開保存,切題再回來仍能看到原來的問答;回答中可點「取消旁問」中止,每個線程最多保留 20 輪。旁問回答目前是完成後整段出現,不是逐字流式顯示。
安裝與啓用¶
下面命令來自 README。作者推薦從 npm 安裝。
從 npm 安裝(推薦):
- 打開側邊欄插件頁 → 安裝插件;
- 輸入包名並確認:
dsh-better-choice
- 安裝完成後硬刷新(
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 未註冊時,旁問框會提示失敗,重啓桌面端即可。
典型用法¶
- 等模型發起一個普通的選擇題;
- 想補充約束:右鍵選項,寫完後正常提交;
- 想先確認信息:在底部旁問框提問,看完回答再選;
- 兩者可以同時使用,旁問內容不會進入最終答案。
右鍵在觸控板上通常是雙指點按;沒有右鍵的設備仍可正常左鍵作答,只是用不到補充框。
實現要點¶
旁問通過本插件自己的命令 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:
- 只接管通用選擇題,計劃審查、審批等卡片保持官方實現;
- 旁問固定在當前會話的模型上,不提供單獨選擇模型或推理強度的入口;
- 旁問是隻讀的,需要讀文件、跑命令才能回答的問題,應直接在對話裏問;
- fork seed 只包含父會話最後一個已完成回合,正在等待回答的那一輪不會進入 seed;
- 旁問回答完成後整段出現,不是逐字流式顯示,超長回答受 32K 輸出上限約束;
- 沒有右鍵輸入的設備無法使用補充框,但左鍵作答完全不受影響。
需要注意權限邊界:插件以當前 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 包硬刷新試一輪,再決定是否需要固定版本。