Skip to content
dsh.fish
Bundle

dsh-auto-model

Auto model selection for DeepSeek Harness: routes each turn to V4 Flash or V4 Pro through a classifier call

Source
AL-spiritphoenix
stars
2 stars
License
MIT
Updated
Updated 19 hours ago

Readme

# dsh-auto-model

English | [中文](README.zh.md)

A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) bundle that adds an **Auto** model option. When a session selects `auto`, the plugin classifies each turn with a small Flash call and routes it to `deepseek-v4-flash` (SIMPLE) or `deepseek-v4-pro` (COMPLEX).

It is a plain-JavaScript bundle, so it installs straight from a git host with no build step. It uses only shipped core APIs and runs against an unmodified harness.

## Install

Install into the `web` profile (the profile the `dsh web` command boots):

From a local checkout:

```sh
dsh plugin --profile web add ./dsh-auto-model
```

From GitHub:

```sh
dsh plugin --profile web add github:AL-spiritphoenix/dsh-auto-model
```

Then boot it:

```sh
dsh web
```

`dsh web` is the `web` profile's alias, so no `--profile` flag is needed. The model selector now lists **Auto** alongside Flash and Pro. The concrete model the router chooses is what the session log records in each request header.

## How it works

- The plugin registers its own `deepseek-auto` provider route, whose `listModels()` returns the `auto` entry at runtime. The directory entry is therefore independent of `llm-deepseek`'s `models` config, so a `settings.yaml` override cannot hide it.
- The plugin listens on the root `agent/request` waterfall (outside `installModelSelection`) and rewrites `auto` — whichever provider carried it — to a concrete `provider`/`model` before dispatch.
- Each turn's first step sends one auxiliary classifier call to `classifierModel` (defaults to the fast model); later steps of the same turn reuse the decision. A failed call falls back to `onClassifierError` (default `slow`).

## Configuration

All fields are optional and default to the DeepSeek V4 pair:

| Key | Default | Meaning |
| --- | --- | --- |
| `provider` | `deepseek-official` | Provider route the concrete requests are routed to. |
| `model` | `auto` | Virtual model id shown and submitted; never dispatched. |
| `providerName` | `DeepSeek(Auto)` | Selector group label. |
| `name` | `Auto` | Selector model label. |
| `description` | (built-in) | Selector detail. |
| `fastModel` | `deepseek-v4-flash` | Model for SIMPLE tasks. |
| `slowModel` | `deepseek-v4-pro` | Model for COMPLEX tasks. |
| `classifierModel` | `fastModel` | Model serving the classifier call. |
| `classifierPrompt` | (built-in) | Classifier system prompt. |
| `classifierMaxTokens` | `16` | Classifier output-token cap. |
| `classifierTimeoutMs` | `10000` | Classifier call deadline. |
| `contextBudgetChars` | `4000` | Maximum task characters fed to the classifier. |
| `onClassifierError` | `slow` | Target when classification fails or returns an unknown token. |

Override them in the `web` profile's `cordis.patch.yml`:

```yaml
- id: auto-model
  config:
    fastModel: deepseek-v4-flash
    slowModel: deepseek-v4-pro
    onClassifierError: slow
```

## Limitations

- `auto` is advertised as a text model, so an image-containing session cannot select it.
- The classifier call is an auxiliary dispatch and is not counted by the token meter.
- `auto` is session-local: after a restart, a non-blank session resumes from the logged concrete model rather than re-classifying.

Install

dsh plugin --profile web add github:AL-spiritphoenix/dsh-auto-model

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source