# dsh-model-tidy [中文](README.md) · [English](README.en.md) · [日本語](README.ja.md) · **Русский** Плагин для DeepSeek Harness, который приводит в порядок меню выбора модели: вы решаете, какие модели показывать, даёте им понятные имена и сохраняете тарифный коэффициент, указанный провайдером. ![Раздел «Модели: порядок» в настройках](docs/screenshots/main.png) ## Какую задачу решает Поставьте два-три плагина-провайдера, и меню моделей превращается в стену. Бесплатный канал, рабочее приложение, пара самостоятельно настроенных шлюзов — и вот уже тридцать строк. Большинство из них вы никогда не выберете, а некоторые — один и тот же продукт, доступный через разные маршруты. Выбор модели — это **место для решения, а не склад**. Там должны быть только те несколько моделей, которыми вы действительно пользуетесь, и под теми именами, которые вы узнаёте. ## Что он делает После установки в настройках DSH появляется раздел «**Модели: порядок**». Модели сгруппированы по провайдеру, у каждой — один переключатель: ``` ┌─ WorkBuddy ───────────── 8/12 ─ [сбросить порядок] [скрыть все] [показать все] ─┐ │ ▲▼ Auto ●─── │ │ ▲▼ GLM-5.3 · x0.79 ●─── │ │ ▲▼ GLM-5.2 · x0.79 · ночная скидка [псевдоним] ───● │ │ ▲▼ Grok-4.7 · x1.90 ───● │ └─────────────────────────────────────────────────────────────────────────────────┘ ┌─ our-free-model ───────── 6/6 ── [сбросить порядок] [скрыть все] [показать все] ─┐ │ ▲▼ Kilo Auto Free ●─── │ └─────────────────────────────────────────────────────────────────────────────────┘ ``` - **Один переключатель на модель.** Выключен — модель исчезает из меню выбора. - **Стрелки порядка.** Перемещают модель вверх или вниз внутри её провайдера; кнопка в заголовке возвращает порядок каталога. - **Псевдоним.** Дайте модели понятное имя, и меню покажет её под этим именем. Тарифный суффикс провайдера остаётся в конце. - **Поиск.** Фильтр по имени модели, провайдеру или псевдониму. - **Групповые действия по провайдеру.** Скрыть или показать все модели одного провайдера одним нажатием. - **Общие кнопки «показать / скрыть».** Две кнопки на весь каталог. - **Восстановление.** Одна кнопка очищает все псевдонимы, другая возвращает все модели. ## Свой порядок моделей В каждой строке есть пара стрелок для перестановки внутри провайдера. Порядок **сохраняется явно**, поэтому переживает перезапуск и переносится вместе с настройками на другую машину. - **Порядок — это не видимость.** Скрытая модель сохраняет своё место в записанном порядке и возвращается туда же, когда её снова показывают. - **Новые модели встают после расставленных.** Модель, которую провайдер добавит позже, не вклинится в середину выстроенной вами последовательности. - **Сортировать можно и при фильтре.** Во время поиска стрелки меняют местами двух *видимых* соседей, поэтому нажатие всегда даёт заметный результат; строки, скрытые фильтром, сохраняют свои относительные позиции. - **Отмена в один клик.** «Сбросить порядок» в заголовке провайдера удаляет его пользовательскую последовательность и возвращает порядок каталога. Раскладка хранится в собственном пространстве настроек плагина (поле `order`: список идентификаторов моделей для каждого провайдера); настройки провайдеров не затрагиваются. ## Тарифный коэффициент переживает переименование Провайдеры публикуют коэффициенты, дописывая их к **отображаемому имени** модели — `GLM-5.3 · x0.79` — потому что в каталоге моделей harness нет отдельного поля для тарифа. Простая замена этого имени (а именно так обычно и делают переименование) молча выбрасывает коэффициент. Плагин разделяет имя по тому же разделителю, что использует провайдер, и сохраняет хвост: | | имя в меню выбора | |---|---| | Как опубликовано | `GLM-5.3 · x0.79` | | Переименовано в «GLM дешёвая» | **`GLM дешёвая · x0.79`** | | Переименовано, с акциями | **`GLM дешёвая · x0.79 · ночная скидка`** | | Модель без коэффициента | `Автоматически` ← лишний разделитель не добавится | ## Скрытая модель не меняет своё место Скрытая модель отсутствует в каталоге — harness её отфильтровывает, — поэтому строку можно восстановить только из сохранённых данных. Очевидная реализация дописывает такую строку в конец, и модель при скрытии прыгает в низ группы. Плагин запоминает, где каждая строка встретилась впервые: скройте третью из пяти, и она останется третьей. ## Чего он сознательно не делает **Приведение в порядок — это решение об отображении, а не изменение конфигурации.** - Конфигурация провайдеров не перезаписывается. Список скрытых моделей и таблица псевдонимов живут только в собственном пространстве настроек плагина. - Модель, скрытая или переименованная во время работы сессии, продолжает обслуживать эту сессию: маршрутизация идёт по идентификатору модели, меняется только подпись. - После удаления плагина список полностью возвращается к исходному виду. - Новые модели, которые начинает предлагать провайдер, видны по умолчанию. Плагин записывает, что скрыть и что переименовать, но никогда — что показать. ## Охват Переключатели работают со **всеми** источниками моделей, а не только с провайдерами, настроенными вручную. Плагин фильтрует собственное перечисление каталога harness — `ctx.llm.listModels` — а это единственный список, который читают все экраны. Модели, зарегистрированные другими плагинами через `ctx.llm.registerAdapter`, и провайдеры, объявленные в `llm-pi-ai`, попадают в тот же список, поэтому охвачены оба случая. Ключ строки — **провайдер + модель**, поэтому одно и то же имя, пришедшее двумя маршрутами, остаётся двумя независимыми строками: `workbuddy/gemini-3.8-flash` и `gemini/gemini-3.8-flash` — это разные вышестоящие сервисы, у каждого свой переключатель и свой псевдоним. ## Установка ```sh dsh plugin --profile <ваш профиль> add dsh-model-tidy ``` Затем откройте веб-интерфейс DSH заново. В навигации настроек появится «**Модели: порядок**». ## Разработка Шага сборки нет: обе половины поставляются как обычные файлы, которые загружает harness. Серверная половина — это модуль ES; браузерная — фабрика `window.__ModuleLoader__.load`, формат, который вызывает клиентская система модулей. ```sh npm test ``` Запускает девять наборов тестов: фильтр каталога, разделение тарифного суффикса, поведение браузерной половины, захват суффикса при переименовании, порядок строк, пользовательский порядок, стрелки порядка в отрисованном дереве, само отрисованное дерево и сосуществование с другим плагином, который оборачивает тот же метод. `npm run check:packaging` проверяет, что объявленные клиентские зависимости указывают на пакеты, которые действительно поставляются с harness. ## Совместимость Разработано для DSH `0.2.0-rc.2`. Требуется DSH `>= 0.2.0-rc.1`: начиная с этой версии в слое настроек появился сервис `configForms`, через который пишет раздел плагина. ## Лицензия MIT