[**English**](../../README.md) · [中文](README_ZH.md) · **Español** · [日本語](README_JA.md) · [Deutsch](README_DE.md) · [Русский](README_RU.md) · [Português](README_PT.md) · [한국어](README_KO.md)
> ※ Este documento es una traducción del [original en inglés](../../README.md); en caso de discrepancia prevalece la versión inglesa. Las correcciones vía Issue / PR son bienvenidas.
# dsh-effort-slider
> **Un deslizador de nivel de razonamiento estilo Claude Code para DeepSeek Harness** — haz clic en **Effort** en el menú de modelos, arrastra sin escalones, suelta y se ajusta, con una estela de fuego WebGL; cualquier modelo/proveedor de terceros obtiene un control real y funcional del esfuerzo de razonamiento.
[](../../LICENSE)
[](https://github.com/deepseek-ai/deepseek-harness)
[](https://github.com/2768651338/dsh-effort-slider/releases)
[](https://www.typescriptlang.org)
[](https://react.dev)
[](https://github.com/topics/dsh-plugin)
Haz clic en la fila **Effort** (segunda fila del menú de modelos oficial) en lugar de la lista de niveles integrada: se despliega un **panel deslizante de Effort** — marcas OFF/MAX, estado Low/Medium/High/Ultracode en vivo y, tras cerrar el panel, el valor de esfuerzo permanece coloreado en la fila del menú y en el botón disparador del asiento de modelos.
[Características](#características) · [Compatibilidad](#compatibilidad) · [Instalación / Desinstalación](#instalación--desinstalación) · [Inicio rápido](#inicio-rápido) · [Configuración](#configuración) · [Permisos y datos](#permisos-y-datos) · [Cómo funciona](#cómo-funciona) · [Solución de problemas](#solución-de-problemas) · [Desarrollo](#desarrollo)
**Capturas de demostración** (coloreado de la fila del menú / disparador del asiento de modelos / panel de Effort — nivel coloreado):
| Fila del menú | Disparador del asiento | Panel de Effort |
| --- | --- | --- |
|

|

|

|
---
> 🆕 **v0.5.0** — Lote de correcciones de la evaluación. Fiabilidad: el panel separa cargando / error de carga / no compatible en tres estados con botón de reintento; las escrituras fallidas del deslizador muestran un estado rojo transitorio en lugar de fallar en silencio; las ediciones concurrentes del usuario se detectan (la entrada se relee antes de `mutate`, las rondas en conflicto ceden el paso); todas las rutas de fallo del aprovisionamiento del host registran ahora una advertencia, y una fila Effort nunca reconocida genera un diagnóstico único. UX del panel: se reancla con scroll/resize, se cierra con Esc / clic fuera / desmontaje del ancla, y pulsar de nuevo la fila Effort la alterna; los puntos y etiquetas de la escala se alinean con los puntos reales de ajuste; el deslizador lleva `aria-label` / `aria-valuetext`; los textos de la UI son bilingües (zh/en, según ``). Nueva opción `debugReport`: detalle de aprovisionamiento por ruta/modelo más un trazador opcional de solo lectura `llm/stream` que registra ruta/modelo/effort por petición; una ayuda `?` en la cabecera del panel apunta a `enabled` / dialecto / `debugReport`. Además: CI con GitHub Actions (typecheck + tests + build + puerta de frescura de artefactos), el fuego WebGL ya no arde a 60 fps cuando es invisible, y el paquete npm pasa a llamarse `@txc2768651338/dsh-effort-slider` (el antiguo nombre sin scope `dsh-effort-slider` se retira).
>
> 🆕 **v0.4.0** — Portado a DSH **0.2.0**: DSH sustituyó su servicio de settings por `SettingsForms` (los ajustes son ahora configuraciones de profile entry; `installSection` / `settings.get` / `settings/updated` desaparecieron). La parte host ahora localiza la profile entry de pi-ai (`llm-pi-ai`), la lee vía `settings.describe()`, escribe vía `settings.mutate()` y escucha `settings/document-updated`. La parte cliente deriva la sesión actual de `retainedBy.mainView` (`SessionListState.current` fue eliminado). Las opciones del plugin (`enabled` / `defaultDialect` / `routes`) viven en la configuración de la entry del plugin, editables en la página de ajustes de DSH. DSH ≤ 0.1.5 ya no es compatible (usa ahí la v0.3.0).
>
> 🆕 **v0.3.0** — Portado a DSH 0.1.5: el `Context` del cliente viene ahora de `@deepseek-ai/cordis`, el estado por sesión se lee/escribe vía `ctx.modelDirectories` y la sección de ajustes se instala vía `settings.installSection()`; el envoltorio de metadatos de adaptadores fue eliminado (ver «Ajuste universal de esfuerzo»). DSH ≤ 0.1.1 ya no es compatible.
>
> 🔧 **v0.2.5** — Corregido el fallo silencioso del aprovisionamiento universal con arrays `models` explícitos (las operaciones path de dsh-settings no pueden atravesar nodos de array — ahora el array se reemplaza como un todo).
>
> 🔧 **v0.2.4** — Corregido el aprovisionamiento universal que nunca aterrizaba cuando la sección de ajustes pi-ai se registra tarde (ahora reintenta hasta que la sección está lista).
>
> 🆕 **v0.2.3** — El botón disparador del asiento de modelos también colorea el nombre del esfuerzo según el nivel, persistente tras cerrar el menú.
>
> 🔧 **v0.2.2** — Corregido el coloreado de la fila del menú que se rompía al remontarse todo el árbol del menú (repintado completo con estrangulación; color inferido del texto del esfuerzo).
>
> 🆕 **v0.2.1** — Tras cerrar el panel, el valor de esfuerzo en la fila Effort del menú de modelos conserva el color del nivel.
>
> ✨ **v0.2.0** — Cualquier modelo/proveedor personalizado de terceros obtiene un control de esfuerzo de razonamiento que funciona de verdad (aplicado en caliente).
>
> 🎛️ **v0.1.0** — Lanzamiento inicial: intercepta el menú Effort oficial y muestra un panel deslizante de Effort estilo Claude Code.
>
> Notas completas de cada versión: [Releases](https://github.com/2768651338/dsh-effort-slider/releases)
---
## Características
| Característica | Descripción |
| --- | --- |
| 🎚️ Arrastre continuo | Arrastre 0–100 continuo que escribe `reasoningEffort` en tiempo real (estrangulación de 16 ms, sin acumulación de peticiones mientras arrastras) |
| 🎯 Ajuste al soltar | Al soltar / perder el foco / terminar con el teclado, se ajusta al nivel más cercano y envía una escritura de confirmación |
| 🔥 Estela de fuego WebGL | Shaders de tres pasadas (ignición → desenfoque → composición); el frente del fuego sigue el pulgar con amortiguación de resorte |
| 🏁 Marcas OFF/MAX | El primer y el último nivel muestran siempre `OFF` / `MAX`; los niveles intermedios muestran el nombre devuelto por la API |
| 🎨 Estado del nivel | El nombre del esfuerzo se muestra en la cabecera del panel, coloreado/brillante según el nivel; la fila del menú y el disparador del asiento de modelos conservan el mismo color al cerrar (v0.2.3) |
| 🌐 Esfuerzo universal | Los modelos de terceros sin metadatos `reasoning` obtienen automáticamente la escala universal de 5 niveles; los modelos pi-ai reciben los diccionarios a nivel de cable parcheados, **aplicado en caliente** (v0.2.0) |
Solo se escribe `reasoningEffort` — la selección de modelo no se toca. Los modelos sin razonamiento multinivel muestran 「当前模型不提供多档推理等级」 (el modelo actual no ofrece varios niveles de razonamiento).
### Ajuste universal de esfuerzo (v0.2.0, simplificado en v0.3.0)
**Cualquier modelo/proveedor personalizado de terceros obtiene un control del esfuerzo de razonamiento que de verdad funciona en el cable**:
- **Aprovisionamiento a nivel de cable (host, pi-ai)**: para los modelos `llm-pi-ai` sin `reasoningEfforts`, se parchean el diccionario y el dialecto de cable `compat` (**aplicado en caliente, sin reinicio**); pi-ai traduce el nivel a campos reales del cable (`reasoning_effort` / `thinking` / `reasoning.effort` de OpenRouter, etc.) **y** publica la misma declaración como metadatos `reasoning` del catálogo del modelo — gracias a eso aparece la fila oficial **Effort** en un modelo declarado a mano;
- **Escala de respaldo en el cliente**: si el directorio no devuelve metadatos de razonamiento, el panel se abre igualmente con la escala universal de 5 niveles;
- Las declaraciones existentes del usuario (`reasoningEfforts: false` o un diccionario personalizado) siempre se respetan y nunca se sobrescriben.
> **Por qué ya no hay envoltorio de adaptadores.** Hasta la v0.2.5, la parte host también envolvía el `resolveModel` de cada adaptador para inyectar `universalReasoning` en los modelos que no declaraban metadatos `reasoning`. DSH 0.1.5 convirtió `llm.adapters` en un campo privado sin accesor público, así que esa vía es imposible — y ya no es necesaria: `reasoningEfforts` es la única declaración que alimenta tanto la solicitud real como el catálogo de modelos. El `compat` a nivel de modelo solo se escribe cuando la ruta declara `api: openai-completions`, porque pi-ai rechaza un interruptor que el protocolo del modelo no puede leer.
Dialectos de cable admitidos para endpoints personalizados (configura `effort-slider.defaultDialect` o `routes.