[**English**](../../README.md) · [中文](README_ZH.md) · [Español](README_ES.md) · [日本語](README_JA.md) · [Deutsch](README_DE.md) · [Русский](README_RU.md) · **Português** · [한국어](README_KO.md)
> ※ Este documento é uma tradução do [original em inglês](../../README.md); em caso de divergência, prevalece a versão em inglês. Correções via Issue / PR são bem-vindas.
# dsh-effort-slider
> **Um deslizador de nível de raciocínio estilo Claude Code para DeepSeek Harness** — clique em **Effort** no menu de modelos, arraste sem degraus, solte e ajusta, com um rastro de fogo em WebGL; qualquer modelo/provedor de terceiros ganha controle de esforço de raciocínio real e funcional.
[](../../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)
Clique na linha **Effort** (segunda linha do menu de modelos oficial) em vez da lista de níveis embutida: um **painel deslizante de Effort** se abre — marcas OFF/MAX, status Low/Medium/High/Ultracode em tempo real e, após fechar o painel, o valor de esforço permanece colorido na linha do menu e no botão-gatilho do assento de modelo.
[Funcionalidades](#funcionalidades) · [Compatibilidade](#compatibilidade) · [Instalação / Desinstalação](#instalação--desinstalação) · [Início rápido](#início-rápido) · [Configuração](#configuração) · [Permissões e dados](#permissões-e-dados) · [Como funciona](#como-funciona) · [Solução de problemas](#solução-de-problemas) · [Desenvolvimento](#desenvolvimento)
**Capturas de demonstração** (coloração da linha do menu / gatilho do assento de modelo / painel de Effort — nível colorido):
| Linha do menu | Gatilho do assento | Painel de Effort |
| --- | --- | --- |
|

|

|

|
---
> 🆕 **v0.5.0** — Lote de correções da avaliação. Confiabilidade: o painel separa carregando / falha de carregamento / não suportado em três estados com botão de repetição; gravações falhas do slider exibem um estado vermelho transitório em vez de falhar em silêncio; edições concorrentes do usuário são detectadas (a entrada é relida antes de `mutate`, rodadas em conflito cedem a vez); todos os caminhos de falha do provisionamento do host agora registram um aviso, e uma linha Effort nunca reconhecida gera um diagnóstico único. UX do painel: reancora em scroll/resize, fecha com Esc / clique fora / desmontagem da âncora, e clicar novamente na linha Effort a alterna; pontos e rótulos da escala ficam alinhados aos pontos reais de encaixe; o slider carrega `aria-label` / `aria-valuetext`; os textos da UI são bilíngues (zh/en, seguindo ``). Nova opção `debugReport`: detalhamento de provisionamento por rota/modelo mais um rastreador opcional de somente leitura `llm/stream` que registra rota/modelo/effort por requisição; uma dica `?` no cabeçalho do painel aponta para `enabled` / dialeto / `debugReport`. Além disso: CI com GitHub Actions (typecheck + testes + build + gate de frescor de artefatos), o fogo WebGL não queima mais a 60 fps quando invisível, e o pacote npm passa a se chamar `@txc2768651338/dsh-effort-slider` (o antigo nome sem escopo `dsh-effort-slider` é aposentado).
>
> 🆕 **v0.4.0** — Portado para o DSH **0.2.0**: o DSH substituiu seu serviço de settings por `SettingsForms` (as configurações agora são configs de profile entry; `installSection` / `settings.get` / `settings/updated` desapareceram). A metade host agora localiza a profile entry do pi-ai (`llm-pi-ai`), lê via `settings.describe()`, grava via `settings.mutate()` e escuta `settings/document-updated`. A metade cliente deriva a sessão atual de `retainedBy.mainView` (`SessionListState.current` foi removido). As opções do plugin (`enabled` / `defaultDialect` / `routes`) vivem na configuração da entry do plugin, editáveis na página de configurações do DSH. DSH ≤ 0.1.5 não é mais suportado (use lá a v0.3.0).
>
> 🆕 **v0.3.0** — Portado para o DSH 0.1.5: o `Context` do cliente agora vem de `@deepseek-ai/cordis`, o estado por sessão é lido/gravado via `ctx.modelDirectories` e a seção de configurações é instalada via `settings.installSection()`; o wrapper de metadados de adaptadores, agora impossível, foi removido (ver «Provisão universal de esforço»). DSH ≤ 0.1.1 não é mais suportado.
>
> 🔧 **v0.2.5** — Corrigido o provisionamento universal que falhava em silêncio em arrays `models` explícitos (operações path do dsh-settings não atravessam nós de array — agora o array é substituído inteiro).
>
> 🔧 **v0.2.4** — Corrigido o provisionamento universal que nunca era aplicado quando a seção de configurações pi-ai se registra tarde (agora repete até a seção estar pronta).
>
> 🆕 **v0.2.3** — O botão-gatilho do assento de modelo também colore o nome do esforço por nível, persistente após fechar o menu.
>
> 🔧 **v0.2.2** — Corrigida a coloração da linha do menu que quebrava em remontagens completas do menu (repintura completa com throttle; cor inferida do texto do esforço).
>
> 🆕 **v0.2.1** — Após fechar o painel, o valor de esforço na linha Effort do menu de modelos mantém a cor do nível.
>
> ✨ **v0.2.0** — Qualquer modelo/provedor personalizado de terceiros ganha controle de esforço de raciocínio que funciona de verdade (aplicado a quente).
>
> 🎛️ **v0.1.0** — Lançamento inicial: intercepta o menu Effort oficial e mostra um painel deslizante de Effort estilo Claude Code.
>
> Notas completas de cada versão: [Releases](https://github.com/2768651338/dsh-effort-slider/releases)
---
## Funcionalidades
| Funcionalidade | Descrição |
| --- | --- |
| 🎚️ Arrasto contínuo | Arrasto contínuo de 0–100 que grava `reasoningEffort` em tempo real (throttle de 16 ms, sem acúmulo de requisições durante o arrasto) |
| 🎯 Ajuste ao soltar | Ao soltar / perder o foco / encerrar via teclado, ajusta ao nível mais próximo e envia uma gravação de confirmação |
| 🔥 Rastro de fogo WebGL | Shaders de três passadas (ignição → desfoque → composição); a frente do fogo segue o polegar com amortecimento de mola |
| 🏁 Marcas OFF/MAX | Primeiro e último níveis sempre mostram `OFF` / `MAX`; níveis intermediários mostram o nome retornado pela API |
| 🎨 Status do nível | O nome do esforço aparece no cabeçalho do painel, colorido/brilhante por nível; a linha do menu e o gatilho do assento de modelo mantêm a mesma cor ao fechar (v0.2.3) |
| 🌐 Esforço universal | Modelos de terceiros sem metadados `reasoning` ganham automaticamente a escala universal de 5 níveis; modelos pi-ai recebem os dicionários de protocolo corrigidos, **aplicado a quente** (v0.2.0) |
Só `reasoningEffort` é gravado — a seleção de modelo não é tocada. Modelos sem raciocínio multinível mostram 「当前模型不提供多档推理等级」 (o modelo atual não oferece vários níveis de raciocínio).
### Provisão universal de esforço (v0.2.0, simplificada na v0.3.0)
**Qualquer modelo/provedor personalizado de terceiros ganha controle de esforço de raciocínio que realmente funciona no protocolo**:
- **Provisionamento no nível do protocolo (host, pi-ai)**: para modelos `llm-pi-ai` sem `reasoningEfforts`, o dicionário e o dialeto de protocolo `compat` são corrigidos (**aplicado a quente, sem reinício**); o pi-ai traduz o nível em campos reais do protocolo (`reasoning_effort` / `thinking` / `reasoning.effort` do OpenRouter, etc.) **e** publica a mesma declaração como metadados `reasoning` do catálogo do modelo — é por isso que a linha oficial **Effort** aparece num modelo declarado à mão;
- **Escala de reserva no cliente**: se o diretório não retorna metadados de raciocínio, o painel ainda abre com a escala universal de 5 níveis;
- Declarações existentes do usuário (`reasoningEfforts: false` ou um dicionário personalizado) são sempre respeitadas e nunca sobrescritas.
> **Por que não há mais wrapper de adaptadores.** Até a v0.2.5, a metade host também embrulhava o `resolveModel` de cada adaptador para injetar `universalReasoning` em modelos que não declaravam metadados `reasoning`. O DSH 0.1.5 tornou `llm.adapters` um campo privado sem acessador público — esse caminho ficou impossível, e também desnecessário: `reasoningEfforts` é a única declaração que alimenta tanto a requisição real quanto o catálogo de modelos. O `compat` no nível do modelo só é gravado quando a rota declara `api: openai-completions`, porque o pi-ai recusa um interruptor que o protocolo do modelo não consegue ler.
Dialetos de protocolo suportados para endpoints personalizados (defina `effort-slider.defaultDialect` ou `routes.