Introduction

DeepSeek Harness (DSH) provides the ability to extend behavior through plugins. The default model selector uses a flat list; when the model library grows large, scrolling to find a specific model reduces operational efficiency. The dsh-model-cascade plugin aims to address this issue: it reconstructs the model selector in the lower-right corner into a three-level cascading menu and provides an independent entry point for thinking-intensity settings within the same interaction interface.

Core Features

This plugin mainly provides the following capabilities:

  1. Three-level cascade selection: It splits model selection into three levels: provider, series, and full model, reducing the number of models displayed on a single screen.
  2. Breadcrumbs navigation: The top of the menu displays the current hierarchy path. Users can click to return to the previous level, or quickly step back using the Esc key.
  3. Thinking-intensity settings: When the current model supports reasoning, an independent “Thinking Intensity” row appears at the top of the menu. Opening it allows selecting the default level or a specified level.
  4. State synchronization: It reuses DSH’s built-in ModelDirectory service to ensure that the selected state and loading hints remain consistent with the built-in selector.
  5. Built-in slot masking: It registers with priority: -1, automatically masking the built-in two-level model list.

Installation and Activation

Installing this plugin requires placing the files into DSH’s node_modules directory and modifying the cordis.patch.yml file.

  1. Place the plugin files in the corresponding directory under node_modules.
  2. Add the mount configuration in cordis.patch.yml:
- insert:
    - id: dsh-model-cascade
      name: dsh-model-cascade
  1. After modifying the configuration, restart the DSH instance and perform a hard refresh in the browser to load the browser half (lib/client.js).

Typical Usage

After enabling the plugin, the model slot in the lower-right corner of the input box becomes a cascading menu:

  1. Select a model: Click the model button, then select the provider and series in sequence, and finally click the full model ID to confirm.
  2. Navigate back: Use the breadcrumbs at the top of the menu to return level by level, or press the Esc key at any level to step back to the previous level and close the menu.
  3. Set thinking intensity: If the currently selected model supports reasoning, click the “Thinking Intensity” row at the top of the menu and select an intensity value in the independent panel that appears.

Technical Details and Dependencies

  • Host and client: This is a pure UI plugin. The host half (lib/index.js) has an empty apply() function, used only as a placeholder in the Loader. The browser half (lib/client.js) registers the conversation.input.model slot.
  • Dependent services: The client retrieves services such as slots, modelDirectories, sessions, locale, remote, and remote.session through inject. Note: Although package.json declares a dependency on ui-model-selection, the actual code requires ui-primitives.
  • Data source: Data is read directly from directory.subscribe and directory.getSnapshot(), including groups, current, status, and error information.
  • Version requirement: It depends on the internal service-layer contract of DSH 0.1.5-rc.1.

Known Limitations

  1. Series grouping logic: Series grouping is based on text-heuristic splitting (extracting the string after / and before - in the ID) rather than metadata-driven logic. Inconsistent naming (such as version-number differences) can cause splitting into multiple series.
  2. Hard-coded styles: CSS anchors and widths (such as min(280px, 100vw - 32px)) are hard-coded in the code, and style injection is executed only once.
  3. Prebuilt artifact: lib/client.js is a prebuilt artifact compiled from React JSX, not directly readable source code.
  4. Subagent limitation: In subagent sessions (where subagentAddress exists), this slot is not rendered.