DSH Plugins Marketplace

DSH Plugins

Plugins

/

Development & Infrastructure

/

dsh-model-picker-control

q

dsh-model-picker-control

Identified★ 1

Model picker control for DSH: rename, regroup, sort, hide and badge models across providers, with cross-provider partitions. Unified management of the DSH model picker display.

dsh-model-picker-control

English | 中文

Model picker control for DSH — rename, regroup, sort, hide and badge every model in one place.

cross-provider partitions · rename models & groups · drag-to-reorder · hide a provider or a single model · suffix capsules · one-click restore

npm license GitHub dsh plugin

dsh plugin add dsh-model-picker-control

DeepSeek  Node.js  React  npm


Why

DSH ships a good model picker, but the display is fixed: providers come in a hard-coded order, model names are whatever the catalog says, and there is no way to put two models from different providers side by side. If you route some models through an account provider and others through a partner provider, the list you actually want never exists.

This plugin gives you one settings page — sitting next to the built-in Models page — that owns the display of the picker, without patching a single third-party plugin. Hide the models you never touch, rename the rest into something you can recognise at a glance, drag the groups into the order you think in, and merge models from different providers into a partition such as Free or Experimental.

Features

Rename anythingModel display names, provider group names, and a short suffix capsule per model.
Cross-provider partitionsCreate a partition and drop models into it from any provider — they render as one group.
Drag to reorderReorder provider groups and partitions with a handle (or focus it and press ↑ ↓).
Hide, don't deleteHide a whole provider or a single model. Nothing is removed from the catalog.
In-group orderCatalog order, or by model name. Per group or globally.
Suffix capsulesA host-native pill after the name — blue, dark red or cyan — that sits beside the host's own 1017 tag.
Draft & saveEvery edit stays local until you press Save; leaving the page with changes asks first.
RestoreOne click clears the plugin's settings; the host default returns.

Screenshots

Real setup, real host. This is the author's own picker: a cross-provider Free partition on top, a cross-provider Fast partition below it, a suffix capsule on nearly every name (腾讯 Tencent MiniMax Cmdc OpenAI Google Al), providers he never touches hidden, and the host's own 1017 tag still next to the DeepSeek model.

Model picker with cross-provider partitions and suffix capsules

Settings → Groups & partitions — drag the groups into your own order, rename or hide a provider, and create a partition that pulls models in from any provider:

Groups and partitions page

Settings → Models — rename a model, type a suffix capsule and pick its tone, drop it into a partition, or hide it. Nothing is written until you press Save:

Model table page

Install

dsh plugin add dsh-model-picker-control

Then restart DSH. Open Settings — a new page, Model picker (模型选择器), appears next to the built-in Models page.

Prefer a local build?

git clone https://github.com/qzz19970504/dsh-model-picker-control.git
cd dsh-model-picker-control
npm install
npm test
npm pack                          # produces dsh-model-picker-control-<version>.tgz
dsh plugin add ./dsh-model-picker-control-<version>.tgz

Quickstart

  1. Open Settings → Model picker.
  2. Under Groups and partitions, press New partition and name it, for example, Free.
  3. In the Models table, pick Free in the partition dropdown of the models you want there — from any provider.
  4. Drag the groups into the order you like, hide what you don't use, and give the important ones a suffix capsule such as NEW or cheap.
  5. Press Save, then open the model picker in the composer. It matches immediately; no restart needed.

Configuration

Everything is stored under this plugin's own row in your profile config (config.picker), written through the host settings service:

- id: model-picker-control
  name: 'dsh-model-picker-control'
  config:
    picker:
      version: 1
      enabled: true          # false = restore the host display, keep the settings
      sectionOrder: [p:free, deepseek-official, workbuddy]
      providers:
        deepseek-account: { name: DeepSeek Account, hidden: false }
      models:
        deepseek-official/deepseek-pro: { name: DeepSeek-V4.1-Pro, suffix: { text: cheap, tone: red }, partition: p:free }
        workbuddy/step-5-preview: { suffix: { text: NEW, tone: cyan }, partition: p:free, hidden: false }
      partitions:
        - { id: p:free, name: Free }
      sort: { default: name, bySection: { workbuddy: catalog } }
      badges: { show1017: true }
KeyTypeNotes
enabledbooleanfalse restores the host's own picker but keeps your edits.
sectionOrderstring[]Section ids: a provider id, or p:<partition id>.
providers[id].namestringGroup heading. Empty = the catalog name.
providers[id].hiddenbooleanHide the whole provider.
models["provider/model"].namestringDisplay name. Empty = the catalog name.
models["provider/model"].suffix{text, tone}tone is blue, red or cyan; up to 20 characters.
models["provider/model"].partitionstringp:<id> to move it into a partition.
models["provider/model"].hiddenbooleanHide this single model.
partitions[]{id, name}A partition merges models from different providers.
sort.defaultcatalog | nameIn-group order.
sort.bySectionmapPer-section override.
badges.show1017booleanShow or hide the host's 1017 tag next to a model.

How it works

composer ──► slot conversation.input.model   (single, session scope)
                 │
                 ├─ host  @deepseek-ai/dsh-client-ui-model-selection   priority  0
                 └─ this  dsh-model-picker-control                     priority -1   ← wins, host seat goes inactive
                        │
                        │  ctx.modelDirectories.directoryFor(sessionId)
                        ▼
                 catalog groups ──┐
                 your config ─────┴──►  src/pipeline.js  ──►  sections (order, names, hidden, partitions)
                                                              │
                                             ┌────────────────┴────────────────┐
                                             ▼                                 ▼
                                   picker menu + trigger              /model popup rows
                                             │                                 │
                                             └────────► directory.select() ◄───┘
  • The picker seat conversation.input.model is a single, session-scoped slot. The plugin registers it at priority -1, which shadows the host seat at priority 0; disabling the plugin brings the host seat straight back. Selecting, reasoning effort, search, keyboard navigation, the pending state and the “not available in subagent sessions” behaviour are all ported from the host picker and use the host's own model translations.
  • The /model popup builds its rows through the same pipeline, so names, groups, order and hidden models match the picker. Row ids stay provider/model, so the host's own select handler is still what switches models.
  • The model list itself is never modified. The plugin reads ctx.modelDirectories.directoryFor(sessionId) and renders a section list derived from the catalog plus your config; choosing a model still goes through directory.select().
  • Hiding only changes what is displayed. A saved selection that becomes invisible is left untouched — the trigger falls back to “Select model” and you can pick another one.
  • Writes are revision-checked by the settings service, rolled back on failure, and only ever touch this plugin's row — the rest of cordis.patch.yml is never rewritten.
  • The page is available in Chinese and English, following the GUI language.

FAQ

Does this patch other plugins? No. It only registers slots and wraps the host's /model contribution in memory, and restores it on dispose.

I hid the model I was using. Your saved selection is kept; the trigger shows “Select model” and the picker offers whatever is still visible.

Where are the settings? In your DSH profile config, under the plugin's row: config.picker. Restore all defaults clears them.

Can I keep the 1017 tag and add my own capsule? Yes, they coexist — the tag and the capsule are separate slots.

Does it work in subagent sessions? The picker behaves as the host does there: it is shown as unavailable, matching host behaviour.

Development

npm install
npm run build   # concatenates src/ into lib/client.js (no bundler required)
npm test        # pure pipeline tests (node:test)
npm pack

The source is plain ESM + h() calls — src/pipeline.js is pure data transformation and is what the tests cover; src/client/ holds the slot code.

License

MIT

Comments

Loading…

From the same category

awesome-dsh-plugin

by awesome-dsh-plugin

A curated list of plugins for DeepSeek Harness (dsh) · DeepSeek Harness 插件精选列表

Development & Infrastructure

★ 20.7k

CC0-1.0

Python

Oct 25, 2026

Index only — not installable

by 0xsline

DeepSeek Harness (DSH) ecosystem: curated plugins, tools, and infrastructure from dsh-external/hub and the public dsh-plugin topic.

Development & Infrastructure

★ 1.3k

CC0-1.0

Python

Oct 16, 2026

Index only — not installable

by pax-beehive

Open-source CLI, schemas, resolver, and DSH agent tools for DSH Plugin Hub

Development & Infrastructure

★ 277

MIT

TypeScript

Oct 20, 2026

Index only — not installable

by xiajiajun516

DeepSeek Harness (DSH) backup & restore plugin — export, import, migrate and sync your complete DSH configuration, plugins, MCP servers, skills and workspace. One-click migration to another machine.

Development & InfrastructureManifest valid

★ 245

MIT

TypeScript

Oct 25, 2026

dsh plugin --profile web add dsh-config-manager

by Yuuyuko-uu

DSH 鱼的记忆:给会话一份会淡忘的长期记忆,每条都带时间

Development & InfrastructureMemory & ContextSessions & MessagesManifest valid

★ 210

MIT

JavaScript

Oct 25, 2026

dsh plugin --profile web add dsh-fish-memory

by yjh051108

推荐组件(非必须):DeepSeek Harness 运行时注入器;已随 dsh-routing-suite 单仓库化保留,本仓库继续维护/发布。

Development & InfrastructureManifest valid

★ 167

TypeScript

Oct 16, 2026

dsh plugin --profile web add @dsh-external/dsh-super-injector