[**English**](../../README.md) · [中文](README_ZH.md) · [Español](README_ES.md) · [日本語](README_JA.md) · [Deutsch](README_DE.md) · **Русский** · [Português](README_PT.md) · [한국어](README_KO.md)
> ※ Этот документ — перевод [английского оригинала](../../README.md); при расхождениях приоритет у английской версии. Правки через Issue / PR приветствуются.
# dsh-effort-slider > **Слайдер уровня рассуждений в стиле Claude Code для DeepSeek Harness** — нажмите **Effort** в меню моделей, тяните без ступеней, при отпускании значение прилипает к уровню, огненный след на WebGL; любая сторонняя модель / любой провайдер получает реально работающее управление усилием рассуждений. [![License: BSD-3-Clause](https://img.shields.io/badge/License-BSD--3--Clause-yellow.svg)](../../LICENSE) [![DeepSeek Harness](https://img.shields.io/badge/DeepSeek%20Harness-Plugin-4C9AFF.svg)](https://github.com/deepseek-ai/deepseek-harness) [![version](https://img.shields.io/badge/version-v0.5.0-success.svg)](https://github.com/2768651338/dsh-effort-slider/releases) [![TypeScript](https://img.shields.io/badge/TypeScript-5-3178C6.svg)](https://www.typescriptlang.org) [![React](https://img.shields.io/badge/React-18-61DAFB.svg)](https://react.dev) [![topic: dsh-plugin](https://img.shields.io/badge/topic-dsh--plugin-7B68EE.svg)](https://github.com/topics/dsh-plugin)
Нажмите на строку **Effort** (вторая строка официального меню моделей) вместо встроенного списка уровней: откроется **панель со слайдером Effort** — метки OFF/MAX, статусы Low/Medium/High/Ultracode в реальном времени, а после закрытия панели значение усилия остаётся раскрашенным на строке меню и на кнопке-триггере модельного места. [Возможности](#возможности) · [Совместимость](#совместимость) · [Установка / Удаление](#установка--удаление) · [Быстрый старт](#быстрый-старт) · [Конфигурация](#конфигурация) · [Права и данные](#права-и-данные) · [Как это работает](#как-это-работает) · [Устранение неполадок](#устранение-неполадок) · [Разработка](#разработка) **Демо-скриншоты** (раскраска строки меню / триггер модельного места / панель Effort — уровень раскрашен): | Строка меню | Триггер модельного места | Панель Effort | | --- | --- | --- | | Строка Effort в меню моделей раскрашена | Триггер модельного места раскрашен | Панель со слайдером Effort |
--- > 🆕 **v0.5.0** — Пакет исправлений по итогам оценки. Надёжность: панель разделяет «загрузка / ошибка загрузки / не поддерживается» на три состояния с кнопкой повтора; неудачные записи слайдера кратко подсвечивают статус красным вместо тихого сбоя; одновременные правки конфигурации пользователем обнаруживаются (запись перечитывается перед `mutate`, конфликтующие раунды уступают); все пути сбоя провижининга на стороне хоста пишут предупреждение, а ни разу не опознанная строка Effort выдаёт одноразовую диагностику. UX панели: перепозиционируется при прокрутке/изменении окна, закрывается по Esc / клику вне / размонтированию якоря, повторный клик по строке Effort переключает её; точки и подписи шкалы выровнены по реальным точкам прилипания; слайдер несёт `aria-label` / `aria-valuetext`; тексты интерфейса двуязычны (zh/en, по ``). Новая опция `debugReport`: детализация провижининга по маршрутам/моделям плюс необязательный read-only трассировщик `llm/stream`, пишущий route/model/effort на каждый запрос; подсказка `?` в шапке панели указывает на `enabled` / диалект / `debugReport`. Также: CI на GitHub Actions (typecheck + тесты + сборка + проверка свежести артефактов), WebGL-огонь больше не горит на 60 fps, когда невидим, а npm-пакет переименован в `@txc2768651338/dsh-effort-slider` (старое имя без scope `dsh-effort-slider` выведено из употребления). > > 🆕 **v0.4.0** — Портировано на DSH **0.2.0**: DSH заменил свой сервис settings на `SettingsForms` (настройки теперь — конфигурации profile entry; `installSection` / `settings.get` / `settings/updated` удалены). Хост-часть теперь находит profile entry pi-ai (`llm-pi-ai`), читает её через `settings.describe()`, пишет через `settings.mutate()` и слушает `settings/document-updated`. Клиентская часть выводит текущую сессию из `retainedBy.mainView` (`SessionListState.current` удалён). Опции плагина (`enabled` / `defaultDialect` / `routes`) живут в конфигурации entry плагина, редактируются на странице настроек DSH. DSH ≤ 0.1.5 больше не поддерживается (там используйте v0.3.0). > > 🆕 **v0.3.0** — Портировано на DSH 0.1.5: клиентский `Context` берётся из `@deepseek-ai/cordis`, состояние сессии читается/пишется через `ctx.modelDirectories`, секция настроек устанавливается через `settings.installSection()`; ставшая невозможной обёртка метаданных адаптеров удалена (см. «Универсальное предоставление усилий»). DSH ≤ 0.1.1 больше не поддерживается. > > 🔧 **v0.2.5** — Исправлено: универсальное предоставление молча не срабатывало на явных массивах `models` (path-операции dsh-settings не умеют обходить узлы-массивы — теперь массив заменяется целиком). > > 🔧 **v0.2.4** — Исправлено: универсальное предоставление не применялось, когда секция настроек pi-ai регистрировалась поздно (теперь повторяется, пока секция не будет готова). > > 🆕 **v0.2.3** — Кнопка-триггер модельного места тоже раскрашивает имя усилия по уровню, сохраняется после закрытия меню. > > 🔧 **v0.2.2** — Исправлено: раскраска строки меню ломалась при полном перемонтировании меню (полная перерисовка с троттлингом; цвет выводится из текста усилия). > > 🆕 **v0.2.1** — После закрытия панели значение усилия в строке Effort меню моделей сохраняет цвет уровня. > > ✨ **v0.2.0** — Любая сторонняя модель/провайдер получает реально работающее управление усилием рассуждений (применяется на лету). > > 🎛️ **v0.1.0** — Первый релиз: перехватывает официальное меню Effort и показывает панель со слайдером Effort в стиле Claude Code. > > Полные заметки по версиям: [Releases](https://github.com/2768651338/dsh-effort-slider/releases) --- ## Возможности | Возможность | Описание | | --- | --- | | 🎚️ Бесступенчатое перетаскивание | Непрерывное перетаскивание 0–100 с записью `reasoningEffort` в реальном времени (троттлинг 16 мс, без накопления запросов при перетаскивании) | | 🎯 Прилипание при отпускании | При отпускании / потере фокуса / завершении клавиатурного ввода прилипает к ближайшему уровню и отправляет одну подтверждающую запись | | 🔥 Огненный след WebGL | Трёхпроходные шейдеры (воспламенение → размытие → композиция); фронт огня следует за бегунком с пружинным демпфированием | | 🏁 Метки OFF/MAX | Первый и последний уровни всегда показывают `OFF` / `MAX`; промежуточные уровни показывают имя, возвращённое API | | 🎨 Статус уровня | Имя усилия показывается в шапке панели, раскрашивается/светится по уровню; строка меню и триггер модельного места сохраняют тот же цвет после закрытия (v0.2.3) | | 🌐 Универсальные усилия | Сторонние модели без метаданных `reasoning` автоматически получают универсальную шкалу из 5 уровней; моделям pi-ai дописываются словари на уровне сети, **применяется на лету** (v0.2.0) | Записывается только `reasoningEffort` — выбор модели не затрагивается. Модели без многоуровневого рассуждения показывают 「当前模型不提供多档推理等级」 (текущая модель не предоставляет несколько уровней рассуждений). ### Универсальное предоставление усилий (v0.2.0, упрощено в v0.3.0) **Любая сторонняя модель/провайдер получает управление усилием рассуждений, которое реально действует на уровне сети**: - **Предоставление на уровне сети (хост, pi-ai)**: для моделей `llm-pi-ai` без `reasoningEfforts` дописываются словарь и сетевой диалект `compat` (**на лету, без перезапуска**); pi-ai переводит уровень в реальные поля сети (`reasoning_effort` / `thinking` / OpenRouter `reasoning.effort` и т.д.) **и** публикует то же объявление как метаданные `reasoning` каталога модели — именно поэтому у вручную объявленной модели вообще появляется официальная строка **Effort**; - **Резервная шкала на клиенте**: если каталог не возвращает метаданные рассуждений, панель всё равно открывается с универсальной шкалой из 5 уровней; - Существующие объявления пользователя (`reasoningEfforts: false` или свой словарь) всегда уважаются и никогда не перезаписываются. > **Почему больше нет обёртки адаптеров.** До v0.2.5 хост-часть также оборачивала `resolveModel` каждого адаптера, чтобы внедрять `universalReasoning` в модели без метаданных `reasoning`. В DSH 0.1.5 `llm.adapters` стал приватным полем без публичного акцессора — этот путь стал невозможным, и больше не нужен: `reasoningEfforts` — единственное объявление, которое питает и запрос по сети, и каталог моделей. `compat` на уровне модели записывается только когда маршрут объявляет `api: openai-completions`, потому что pi-ai отвергает переключатель, который протокол модели не может прочитать. Поддерживаемые сетевые диалекты для сторонних эндпоинтов (задайте `effort-slider.defaultDialect` или `routes.<маршрут>`). Диалект переводит уровни только на маршрутах `api: openai-completions` — нативные протоколы используют встроенное сопоставление pi-ai, так что настройка диалекта там на провод не влияет: | Диалект | Эффект в сети | | --- | --- | | `effort` (по умолчанию) | `reasoning_effort: low/medium/high/max` в стиле OpenAI | | `deepseek` | переключатель `thinking:{type}` + `reasoning_effort` | | `openrouter` | `reasoning: { effort }` (нормализация OpenRouter) | | `together` / `zai` | `reasoning.enabled` / `thinking:{type}` + необязательный effort | | `qwen` | переключатель `enable_thinking` | | `string-thinking` / `ant-ling` | строки `thinking` / `reasoning.effort` | ## Совместимость | Пункт | Значение | | --- | --- | | Версия DSH | **0.2.0-rc.2** (dist-tag npm `latest`; версия, под которую проверена эта сборка), веб-профиль на Windows | | Не работает на | DSH ≤ 0.1.5 — v0.4.0 нацелена на сервис settings `SettingsForms`, появившийся в 0.2.0 (для DSH 0.1.5 используйте v0.3.0; v0.2.5 и ранее также импортируют `@deepseek-ai/dsh-client-runtime`, удалённый после 0.1.1-rc.2) | | Механизм установки | `dsh plugin --profile web add` (патч бандла + две половины) | | Зависимости | `ctx.sessions` (`@deepseek-ai/dsh-api-session-controller`) и `ctx.modelDirectories` (`@deepseek-ai/dsh-client-ui-model-selection`); хост: `ctx.llm`, `ctx.settings` (`SettingsForms`) | | Модульные запросы клиента | никаких сверх базовой платформы (`react`, `react-dom/client`, `react/jsx-runtime`) — все импорты DSH типовые и стираются при сборке | ## Установка / Удаление ```sh # Установка из npm (пакет, добавленный в каталог deepseek1024.com) dsh plugin --profile web add @txc2768651338/dsh-effort-slider # Или установка с GitHub (собранные артефакты lib/ закоммичены, локальная сборка не нужна) dsh plugin --profile web add github:2768651338/dsh-effort-slider#main # Или собрать локально и установить из checkout pnpm install && pnpm build dsh plugin --profile web add file:./dsh-effort-slider ``` > После установки **перезапустите DeepSeek Harness** и один раз нажмите **Ctrl+F5** на веб-странице. > Артефакты `lib/` закоммичены, поэтому установка с GitHub не требует локальной сборки. **Приходите с версии, закреплённой за старым DSH?** Удалите строку `- id: ui-effort-slider` / `disabled: true` из `~/.dsh/profiles/web/cordis.patch.yml`, иначе новая сборка останется выключенной. | Действие | Команда | | --- | --- | | Обновление | `dsh plugin --profile web update @txc2768651338/dsh-effort-slider` (или повторный `add`), затем перезапуск DSH | | Удаление | `dsh plugin --profile web remove @txc2768651338/dsh-effort-slider`, и удалить его строку из `cordis.patch.yml`, если есть | ## Быстрый старт 1. Установите плагин, перезапустите DSH, нажмите `Ctrl+F5`. 2. Откройте меню моделей над полем ввода → нажмите **Effort** → появится панель со слайдером Effort. 3. Тяните, чтобы выбрать уровень; при отпускании значение прилипает. После закрытия панели значение уровня сохраняет свой цвет на строке меню. 4. Для сторонних моделей без усилия рассуждений панель открывается с универсальной шкалой из 5 уровней; моделям pi-ai словари сети дописываются на хосте (на лету). Строка `[effort-slider] intercept row: ...` в консоли DevTools означает, что перехват работает. ## Конфигурация | Пункт | Подробности | | --- | --- | | Опции плагина | конфигурация profile entry плагина (`enabled` / `defaultDialect` / `routes` / `debugReport`), редактируется на странице настроек DSH (автоматически сгенерированная форма), применяется при перемонтировании плагина | | Значения по умолчанию | `enabled: true`, `defaultDialect: effort`, `debugReport: false` | | Переменные окружения | своих нет; следует разрешению `DSH_HOME` в DSH | | Чувствительные данные | нет — ключи, токены и учётные данные не читаются и не сохраняются | ```yaml effort-slider: enabled: true # главный выключатель предоставления defaultDialect: effort # сетевой диалект по умолчанию routes: my-gateway: deepseek # переопределение по маршруту debugReport: false # отчёт о предоставлении за каждый запуск (маршрут/модель/диалект/записано-или-пропущено) + трассировка усилия по каждому запросу (llm/stream) в лог хоста ``` ## Права и данные | Область | Что затрагивает | | --- | --- | | Файлы (чтение) | нет — пользовательские файлы не читаются и не пишутся (настройки идут через сервис settings DSH) | | Сеть | своих запросов нет — панель читает и пишет общий каталог Model Controller в браузере; итоговый вызов `session.selectModel` идёт по существующему соединению DSH | | Учётные данные | никогда не читаются | | Данные пользователя | не читаются (нет доступа к содержимому переписки/сообщениям/промптам; только provider/model/`reasoningEffort` текущей сессии через общий каталог моделей) | ## Как это работает | Половина | Файл | Роль | | --- | --- | --- | | Хост | `lib/index.js` | Универсальное предоставление усилий: находит profile entry pi-ai (`llm-pi-ai`), читает её через `settings.describe()`, дописывает сетевые диалекты через `settings.mutate` (`buildProvisionOps`, идемпотентно, уважает объявления пользователя); слушает `llm/adapters-updated` / `settings/document-updated`. С `debugReport: true` каждый запуск выводит отчёт по маршруту/модели (записанные поля или причина пропуска, с пометкой, где диалект не применяется) вместо однострочного счётчика, а каждый вызов модели трассируется как `[debug] request route=… model=… effort=…` через read-only прохождение `llm/stream` | | Браузер | `lib/client.js` | Перехватывает клики по строке Effort меню моделей → показывает панель Effort; читает `ctx.modelDirectories.directoryFor(sessionId)` и пишет через `directory.select({ reasoningEffort })`; MutationObserver поддерживает цвет уровня на строке меню после закрытия панели | > Браузерная часть следует официальной конвенции внешних плагинов: классический скрипт + фабрика `window.__ModuleLoader__.load`; `react` / `react-dom/client` / `react/jsx-runtime` — платформенные externals; `effort.module.css` хешируется и встраивается lightningcss, инъекция как `