dsh-thinking-effort-autoswitcher:Composer 模型選擇與思考力度一體切換

前言

在 DSH 裏,Composer 的模型選擇與各廠商暴露的 thinking effort(off / low / high / max 等)往往是分開操作的。長對話中若希望按回合難度自動調節推理力度,又要回看「這一輪實際發了什麼 effort」,單靠原生選擇器往往不夠直觀。下面介紹的插件把模型槽位收成「模型 + effort」一體選擇器,增加 Auto 檔位,並在 Host 側對當前回合打分後選用目標等級;每一輪結束後還會展示該輪請求頭裏記錄的真實 effort。

這是什麼

dsh-thinking-effort-autoswitcher(維護者 Relethe,分類:模型推理)是面向 DSH Web 客戶端的 bundle 插件,當前版本 0.1.0,MIT 許可。它替換 conversation.input.model 插槽內的原生模型選擇器,在同一菜單裏按廠商分組列出模型,併爲當前模型列出真實 effort 檔位及 Auto;在 Auto 下由 Host 半部根據失敗度與重要性評分映射到具體檔位,Client 在每輪結束後展示該輪實際發送的 effort(來自 request/header 事件,而非當前選擇器狀態)。

核心功能

模型與 effort 一體選擇器

菜單結構爲:先按 provider 分組的模型列表,再是當前模型支持的 effort 等級,最後是 Auto。方向鍵 ← / → 在「真實檔位 … Auto」階梯上遞減或遞增:從最高檔 → 進入 Auto,從 Auto ← 回到最高檔,不環繞。指針在 Composer 卡片內時忽略該快捷鍵,避免劫持光標;頁面其他區域可用。按鈕內 effort 文案有橫向滑動動畫,固定寬度槽位避免按鈕跳動。

Auto 評分(Host 半部)

Host 提供同源 JSON 接口:

路由 作用
POST /thinking-effort/evaluate 對當前回合打分並返回目標等級;apply: true 時寫入應用
POST /thinking-effort/turns 返回各輪實際發送的 effort(自 request/header 彙總)

failure(0–5,確定性):僅看最近一輪。同名同參工具調用失敗 ≥2 次計爲一組重複,得 2 分;turn/end 且 reason.kind === 'error' 再加 2,上限 5。

importance(0–10,模型評判):用小模型比較最近一條用戶消息與錨點(有運行中 goal 時用其 objective,否則用首條用戶消息)。越貼近錨點、影響面越大分越高;邊緣探索分低。評判優先使用最低 effort(傾向 off);解析失敗時回落爲 5,並返回 importanceRaw 便於調試。

映射公式(權重僅存於 patch,比例有效):

total    = wI * importance + wA * failure
maximum  = wI * 10 + wA * 5
interval = maximum / levelCount
index    = floor(total / interval)   // 限制在 0 … levelCount-1

默認權重示例(cordis.patch.yml 插入行):

- insert:
    - id: thinking-effort
      name: 'dsh-thinking-effort-autoswitcher'
      config:
        weights: { importance: 1, failure: 1 }

Client 調用時機:切換到 Auto 時立即評估(冷啓動先落到中間檔);每輪完成後由 turn-tail 標記觸發一次,防抖 600 ms,每輪至多一次。路由 404/405 則停止重試,菜單顯示「auto scoring not connected」。

每輪真實 effort 展示

/thinking-effort/turns 在 turn/start 與 turn/end 之間歸集 request/header,響應形如:

{"ok":true,"turns":[{"turn":1,"effort":"low","seq":18,"endSeq":100}]}

Client 按會話緩存,用回合尾部條目的 seq 匹配(再 fallback 到 endSeq <= seq、回合號)。無記錄 header 的回合(如已取消)顯示 default。

逃生與侷限

若替換選擇器異常,可保留插件並設置 localStorage['thinking-effort:no-replace'] = '1' 後刷新:由 conversation.input.left 上的緊湊 effort chip 接管。

已知限制包括:未記錄 header 時優先展示記錄值,僅路由不可用時回退到當前選擇;其他插件對 conversation.input.model.label 的貢獻不轉發;菜單無搜索與 roving 鍵盤焦點;agent 運行中 selectModel 可能被拒(applied: false 與 applyError,UI 保留手動選擇)。

安裝與啓用

官方做法是將插件 link 進 profile 依賴,並在 dsh.profile.bundles 中列入 bundle;bundle 自帶的 cordis.patch.yml 會插入 loader 行,profile patch 無需再寫條目。

// ~/.dsh/profiles/<profile>/package.json
{
  "dependencies": { "dsh-thinking-effort-autoswitcher": "link:C:/path/to/thinking-effort-plugin" },
  "dsh": { "profile": { "bundles": ["...", "dsh-thinking-effort-autoswitcher"] } }
}

完成後須 完全重啓 DSH(Host 半部僅在啓動時加載)。

Host 生效需同時滿足:插件已 link 進 profile 的 node_modules;存在對應 loader 行;index.js 導出 export const inject = ['webServer']。若缺依賴聲明,apply 可能早於 HTTP 載體就緒,ctx.get('webServer') 爲 undefined 時路由會落入 SPA 回退(405)。可用同源 POST 自檢:

curl.exe -s -X POST "http://127.0.0.1:<port>/thinking-effort/evaluate" `
  -H "content-type: application/json" -H "sec-fetch-site: same-origin" `
  -d '{"sessionId":"probe"}'

返回結構化 JSON(如 {"ok":false,"error":"session-not-live"})表示路由已掛載;405 表示未就緒。

典型用法

  1. 在 Composer 打開替換後的模型 + effort 菜單,選目標模型與固定檔位,或選 Auto。
  2. 使用 Auto 時,首輪會立即評估;之後每輪結束自動再評估並應用映射檔位。
  3. 在對話 UI 中查看每輪尾部標記旁顯示的 該輪實際 effort(與當輪 request/header 一致)。
  4. 頁面內用 → / ← 快速切換 effort 階梯(光標不在 Composer 卡片內時)。
  5. 需要原生模型槽位時,用 localStorage 逃生項切換爲左側 effort chip 模式。

適用場景與注意

適合需要在同一界面切換模型與 thinking effort、並希望 Auto 按回合失敗與任務重要性調節檔位的 DSH 用戶。也適合需要審計「每輪到底發了什麼 effort」的調試與復盤場景。

插件以當前 DSH 進程權限運行;安裝前請閱讀倉庫源碼與 MIT 許可證,自行確認 link 路徑與 profile 配置。DSH 生態奉行「一切皆插件」;社區目錄 SkillHub 插件頁 爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

結尾

dsh-thinking-effort-autoswitcher 把 Composer 模型選擇與 effort 合成一個選擇器,用 Host 側評分驅動 Auto,並用請求頭事件還原每輪真實 effort。更多細節與截圖見 GitHub 倉庫 與 SkillHub 目錄頁。

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

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

小夜