中文EN

dsh-t3-model-picker

ui已测通过npmMIT

把 T3 Code 的模型选择器移植到 DSH 输入框:提供方侧栏、按提供方分组的搜索结果、浏览器本地收藏、不可用提供方标记,以及用 Cmd/Ctrl+1..9 直接选中可见列表的前九行。

下载量 / Downloads
954
依赖体积 / node_modules
0.07 MB
测试时间 / Tested
2026-11-06
DSH 版本 / Version
0.2.2-rc.1

安装

dsh plugin --profile web add dsh-t3-model-picker

沙箱测试结果

阶段结果
1 安装✓
2 列装✓
3 挂载✓
4 启动—

四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。

README

dsh-t3-model-picker

A model picker for the DeepSeek Harness composer,

ported from T3 Code's model selector.

Open the picker with Cmd/Ctrl+Shift+M, search across every provider,

star what you use, and reach the first nine rows with

Cmd/Ctrl+1…9.

Credit

The selector this plugin implements is T3 Code's ProviderModelPicker. The

provider rail, the borderless search field, the row layout with a provider

footer, the favorites model, the tiered search ranking, and the Cmd+1…9

jump chords are all theirs. T3 Code is

open source under MIT;

this port keeps the same behaviour and swaps the data underneath for DeepSeek

Harness's model directory. Please support the original project.

Features

  • Provider rail. A 44px column with Favorites first and one tile per

advertised provider. The active entry carries a primary-colored indicator.

  • Search. The field takes focus when the picker opens. Matching uses tiered

scoring over the model name, its description, the provider id and the

provider name, including subsequence matching for queries of three characters

or more, with a small boost for favorites. Results are grouped under provider

headings.

  • Favorites. A star on every row, stored in the browser under

dsh.t3-model-picker.favorites.v1 as [{ provider, model }]. The Favorites

rail entry lists them grouped by provider.

  • Jump shortcuts. Cmd+1…9 on macOS, Ctrl+1…9 elsewhere, select

the first nine rows of the visible list; each of those rows shows its chord in

a kbd chip. The listener is live only while the card is open.

  • Toggle shortcut. Cmd+Shift+M on macOS, Ctrl+Shift+M

elsewhere, opens the card when it is closed and closes it when it is open,

from anywhere in the window including the composer editor. The trigger's

tooltip carries the chord. On a locked session the chord is inert, as the

trigger is. The shift leaves the bare Cmd+M text binding alone.

  • Unavailable models. Providers the host does not report as routable are

marked on their rows, on the rail tile's tooltip, and on the trigger.

  • Reasoning effort. A footer row opens the effort levels the current model

advertises. It is hidden when the model exposes none.

Install

From this repository:

dsh plugin --profile web add github:yusufameri/dsh-t3-model-picker

Or from the release tarball, which needs no build step:

dsh plugin --profile web add https://github.com/yusufameri/dsh-t3-model-picker/releases/latest/download/dsh-t3-model-picker.tgz

Once the package is on npm, the registry form is one word shorter:

dsh plugin --profile web add dsh-t3-model-picker

Any of them reconciles the profile's bundle list, so the next boot merges the

plugin's patch and loads its client half. Removing the bundle restores the

shipped model selector with no residue.

Screenshots

Picker open on Favorites · Grouped search results · Favorites after starring

![Favorites pane](assets/picker-open.png) · ![Search grouped by provider](assets/search-grouped.png) · ![Favorites list](assets/favorites.png)

How it works

The composer's conversation.input.model seat is a single slot. Two

occupants can coexist there at different priorities, and the lowest live

priority renders, so this plugin registers at -1 and the shipped

ModelSelect at its default 0 stops rendering.

Both read the same per-session model directory (ctx.modelDirectories), which

is also what the /model command popup uses. A model chosen here is what those

surfaces show next, and a selection made there is what this picker highlights.

File · Role

package.json · Bundle manifest: dsh.bundle.patch plus the dsh.client web half

cordis.patch.yml · One insert row mounting the bundle

index.js · Host half — empty; the feature is entirely browser-side

client.js · Client half: the picker, its styles, favorites and shortcuts

Differences from T3 Code

Four deliberate departures, all recorded in client.js:

  • Search results are grouped under provider headings. T3 renders one flat

ranked list with the provider named on each row.

  • A footer row keeps the reasoning-effort selector reachable. T3 keeps effort

in a sibling control, while in DeepSeek Harness this seat is the composer's

only effort control.

  • The row of the model in use carries a check mark. This seat is single-select

and the trigger is not always in view.

  • Cmd/Ctrl+Shift+M opens and closes the card. T3 leaves opening to the

trigger alone, so a chord bound to the trigger would mean holding Cmd and

reaching for the mouse.

Known limits

  • The picker needs a session-scoped model directory. Addressed subagent

sessions expose none, so the seat stays absent there and the chord has

nothing to open.

  • Jump chords stay open-only, as in T3. Cmd/Ctrl+Shift+M is the one

chord that works with the card closed.

  • The effort footer only ever shows models whose provider advertises reasoning

metadata.

Development

No build step: client.js is plain JavaScript in the format the client module

loader takes. Edit it and reload the page.

scripts/verify-shortcuts.mjs checks the chords against the real component. It

mounts client.js in a jsdom page with React and dispatches real key events at

the window, so a chord change is verified without the desktop app. The plugin

has no dependencies, so the harness brings its own:

npm install --no-save react react-dom jsdom
node scripts/verify-shortcuts.mjs

scripts/ also holds the recording tooling used for the assets above. It drives

the running DeepSeek Harness page over the Chrome DevTools Protocol

…(truncated)

以上内容来自 npm 上的 README,我们只做格式化,不改内容。

版本

npm 上共发布:2,最后更新 2026-09-27

链接

GitHub · Homepage · npm

同类插件