Introduction

When developing agents using the dsh web GUI, the model selector is a high-frequency interaction point. The default implementation is a single-column long-scrolling grouped list. With many providers and models, locating a target requires scrolling for a long time, and there is no cross-provider search. DSH’s philosophy is “everything is a plugin,” and the model selection slot in the composer can also be replaced by a plugin. The dsh-model-picker introduced below does exactly that.

What is it?

dsh-model-picker provides an enhanced panel for the model selector in the dsh web GUI: a provider column on the left + a model list on the right, with independent scrolling on both sides, supporting cross-provider search, replacing the default single-column long-scrolling grouped list. Maintained by Sanqi-normal, MIT license, current version 1.0.2.

Core Features

  • Providers are arranged vertically in the left column with independent scrolling and model count badges; the right column displays the current provider’s models, also with independent scrolling—ensuring smooth browsing even with dozens of providers and hundreds of models.
  • By default, the provider currently used is selected; clicking any provider switches to it.
  • The search box at the top matches provider names/model names/descriptions across providers case-insensitively; results include the provider name, and clicking switches immediately.
  • Preserves inference tier switching (shown at the bottom when supported by the current model), as well as loading/error/retry/empty states.
  • Shares the same model directory (ctx.modelDirectories) as the built-in /model modal; switching in one place syncs immediately in the other, without affecting the composer’s model blocking logic.
  • The interface follows the system’s light/dark theme, automatically switching text between English and Chinese.

How it Works

Plugins are integrated via a persistent bundle: dsh.bundle.patch in package.json points to cordis.patch.yml, which is automatically added to the profile’s dsh.profile.bundles layer by the dsh plugin add reconcile command.

The Client side (lib/client.js) is loaded by the web frontend via exports["./client"] + dsh.client, registered to the composer’s conversation.input.model slot (priority -1, replacing the default implementation); it reuses the ctx.modelDirectories per-session directory from the built-in ui-model-selection (session.models / session.selectModel), introducing no second state source—this is also why the panel and /model modal can sync instantly.

The Host side (lib/host.js) is an empty implementation: the Node-side loader imports it as the package root entry, while the browser-exclusive lib/client.js is only loaded by the web side under the ./client export; therefore, the Host side has no network requests or persistent state. The two entry points are declared separately in exports:

"exports": {
  ".": "./lib/host.js",
  "./client": "./lib/client.js"
}

Installation and Activation

Recommended installation from the npm registry, no git clone/prepare script steps required:

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

Can also be installed from GitHub source code:

dsh plugin --profile web add github:Sanqi-normal/dsh-model-picker

Source code installation executes the package’s prepare script. If intercepted by pnpm, add the prompted package name to the profile’s pnpm-workspace.yaml under allowBuilds and retry.

After installation, restart the web service for changes to take effect:

pnpm dsh web

Environment requirements: Node ^22.19.0 || >=24.0.0; peerDependencies are react ^18.2.0, @deepseek-ai/cordis, @deepseek-ai/dsh-client-runtime, @deepseek-ai/dsh-client-ui-slots.

Daily Usage

  1. Open any session and click the model selector on the right end of the composer toolbar (to the left of the send button).
  2. Click a provider in the left column to switch the model list on the right to that provider’s models; clicking a model in the right column selects it, with the current model marked with a ✓.
  3. Enter keywords in the top search box; the right column switches to cross-provider search results. Clicking any provider on the left exits search and switches.
  4. When the current model supports inference tiers, tier buttons appear at the bottom of the menu (including ‘Provider Default’).

Applicable Scenarios and Notes

Suitable for scenarios where multiple providers and hundreds of models are maintained in the web GUI and require fast browsing or switching via search; also suitable for scenarios where you want the panel selection to stay in sync with the /model modal without introducing a second state source.

Note the following points:

  • Requires the web profile to have @deepseek-ai/dsh-client-ui-model-selection loaded (built into web-app, usually exists); if missing, the selector slot remains empty, ensuring safe fallback.
  • Dynamic installation requires restarting the web service to take effect, consistent with all profile bundles.
  • Only affects the composer’s model selection slot; the /model modal remains unchanged but shares the same current selection as the panel.
  • The plugin runs with the current dsh process permissions; it is recommended to check the source code and license before installation.

Summary

dsh-model-picker replaces the default single-column long-scrolling list with a double-column panel and cross-provider search. It reuses the built-in model directory, introduces no second state, and the Host side has no network requests or persistent overhead, making it an installation-ready interface enhancement plugin.

Plugin directory page: https://www.skillhub.cn/plugins/Sanqi-normal/dsh-model-picker
GitHub repository: https://github.com/Sanqi-normal/dsh-model-picker

(The directory page is an independent community site with no official affiliation to DeepSeek / Hypothesis.)