Introduction

DeepSeek Harness (DSH) uses a plugin-based architecture. In the model selection step, the official components provide basic functionality. The bittersmilezzz/dsh-model-selector plugin aims to optimize this experience: it overlays the official input area’s model selection seat (conversation.input.model) via a shadowing approach without overriding or disabling the official component, and instead provides a more intuitive interaction layer.

Plugin Description

  • Name: dsh-model-selector
  • Maintainer: bitterSmilezzz
  • Category: Model Reasoning
  • Core Value: Provides a single-level model menu (with search and collapsible grouping) and an inline reasoning intensity (Effort) slider at the bottom.

Installation and Enabling

The plugin is installed via the DSH CLI.

1、Run the following command to install the plugin (replace <profile> with your DSH profile name):

dsh plugin --profile <profile> add @bittersmilezzz/dsh-model-selector

2、After enabling, refresh the browser page (web profile). After the page finishes loading, the model selection seat in the official input area will be replaced by the plugin, and the menu and slider will appear in the interface.

Core Features

The plugin mainly includes the following features:

  • Single-level Menu and Search: The menu uses a single-level structure and supports searching by name. Search results support highlighting matched fragments, and collapsible grouping by provider is provided. The selected row and provider label are visibly highlighted, and opening the menu automatically scrolls to the currently selected row.
  • Lenient Search Mechanism: Matching is case-insensitive and tolerant of diacritics and Unicode folding differences (such as café and cafe), using NFKD normalization.
  • Adaptive Layout: The menu height and width are clamped based on measured viewport dimensions. The pop-up direction adapts automatically (choosing the side with more available space above or below), ensuring no overflow in short windows or narrow sidebars.
  • Full Keyboard Navigation: Supports moving between results with arrow keys, selecting the first hit with Enter, and clearing the search term while closing the menu with Escape. The IME composition commit key is not mistakenly treated as selection.
  • Accessibility Support: The search box is identified as a combobox, and the result list is a listbox or grouped view. A roving tabindex mechanism is used to ensure that only one tab stop remains when focus moves between list items; state changes are announced through a live region.
  • Reasoning Intensity Slider: After selecting a reasoning model, an inline reasoning intensity slider appears at the bottom. The slider displays the current level name and description in real time.
  • Error Notifications: When the host rejects the model switch, the failure reason is displayed above the input area via the official Toast, and it remains visible even after the menu is closed.
  • Automatic Selection of the Strongest Level: After selecting a reasoning model, the strongest thinking level is automatically selected (only for known levels; levels generated by adapters are not guessed), and the selected level is shown after success.
  • Directory Synchronization: It shares the modelDirectories catalog with the official /model dialog, and the data in both places is synchronized in real time.

Configuration and Permissions

  • Configuration Items: The plugin has no settings items and is a pure UI plugin, so it does not occupy the “Settings → Plugins → Configuration” card slot.
  • Permission Level: low. The plugin runs in a pure client UI environment, does not register host tools, does not read/write host files, does not access credentials, and does not initiate its own network requests. Model catalog and switching actions are performed through the official session RPC (ctx.remote.session).

Notes

  • Dependencies and Runtime Environment: It depends on the DSH web profile (client half) and official injection packages (such as @deepseek-ai/dsh-client-ui-slots).
  • Shadow Mechanism and Priority: The plugin shadows the official seat via slot priority (priority: -1). If the official side later changes the injection surface of that seat, it needs to be adapted accordingly. When installed alongside other plugins that also shadow conversation.input.model, priority determines the winning rendered component. Because this plugin’s priority is -1 (the lowest), it wins by default in a conflict.

Conclusion

This plugin focuses on improving the interactive efficiency of model selection, especially the visual control of reasoning intensity. It is suitable for developers who need to switch models frequently or pay attention to thinking level configuration.