[**English**](../../README.md) · [中文](README_ZH.md) · [Español](README_ES.md) · [日本語](README_JA.md) · **Deutsch** · [Русский](README_RU.md) · [Português](README_PT.md) · [한국어](README_KO.md)
> ※ Dieses Dokument ist eine Übersetzung des [englischen Originals](../../README.md); bei Abweichungen gilt die englische Fassung. Korrekturen per Issue / PR sind willkommen.
# dsh-effort-slider
> **Ein Reasoning-Effort-Schieberegler im Claude-Code-Stil für DeepSeek Harness** — klicke im Modellmenü auf **Effort**, ziehe stufenlos, lass los und er rastet ein, mit einer WebGL-Feuerschweif; jedes Drittanbieter-Modell bzw. jeder Anbieter bekommt eine echte, funktionierende Thinking-Effort-Steuerung.
[](../../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)
Klicke auf die **Effort**-Zeile (zweite Zeile des offiziellen Modellmenüs) statt auf die eingebaute Stufenliste: ein **Effort-Schieberegler-Panel** poppt auf — OFF/MAX-Skalenmarken, Low/Medium/High/Ultracode-Status live, und nach dem Schließen bleibt der Effort-Wert auf der Menüzeile und auf dem Trigger-Button des Modell-Seats farbig.
[Funktionen](#funktionen) · [Kompatibilität](#kompatibilität) · [Installation / Deinstallation](#installation--deinstallation) · [Schnellstart](#schnellstart) · [Konfiguration](#konfiguration) · [Berechtigungen & Daten](#berechtigungen--daten) · [Funktionsweise](#funktionsweise) · [Fehlerbehebung](#fehlerbehebung) · [Entwicklung](#entwicklung)
**Demo-Screenshots** (Menüzeilen-Färbung / Modell-Seat-Trigger / Effort-Panel — Stufe farbig):
| Menüzeile | Modell-Seat-Trigger | Effort-Panel |
| --- | --- | --- |
|

|

|

|
---
> 🆕 **v0.5.0** — Evaluierungs-Fix-Batch. Zuverlässigkeit: das Panel unterscheidet jetzt „Lädt / Laden fehlgeschlagen / nicht unterstützt“ mit Retry-Button; fehlgeschlagene Slider-Schreibvorgänge zeigen kurz einen roten Status statt still zu scheitern; gleichzeitige Bearbeitungen der Nutzerkonfiguration werden erkannt (der Entry wird vor `mutate` neu gelesen, kollidierende Runden weichen aus); jeder Fehlerpfad der Host-Bereitstellung protokolliert jetzt eine Warnung, und eine nie erkannte Effort-Zeile erzeugt eine einmalige Diagnose. Panel-UX: verankert sich bei Scroll/Resize neu, schließt bei Esc / Klick außerhalb / Unmount des Ankers, ein erneuter Klick auf die Effort-Zeile schaltet sie um; Skalenpunkte und Labels liegen an den echten Einrastpunkten; der Slider trägt `aria-label` / `aria-valuetext`; die UI-Texte sind zweisprachig (zh/en, folgt ``). Neue Option `debugReport`: Bereitstellungsdetails pro Route/Modell plus ein optionaler nur-lesender `llm/stream`-Tracer, der pro Anfrage Route/Modell/Effort protokolliert; ein `?`-Hinweis im Panel-Header zeigt auf `enabled` / Dialekt / `debugReport`. Außerdem: GitHub-Actions-CI (Typecheck + Tests + Build + Frischheits-Gate), die WebGL-Flamme brennt nicht mehr mit 60 fps, solange sie unsichtbar ist, und das npm-Paket heißt jetzt `@txc2768651338/dsh-effort-slider` (der alte Name ohne Scope, `dsh-effort-slider`, wurde eingestellt).
>
> 🆕 **v0.4.0** — Portiert auf DSH **0.2.0**: DSH hat seinen Settings-Dienst durch `SettingsForms` ersetzt (Einstellungen sind jetzt Profile-Entry-Konfigurationen; `installSection` / `settings.get` / `settings/updated` sind weg). Die Host-Hälfte lokalisiert jetzt den pi-ai-Profile-Entry (`llm-pi-ai`), liest ihn via `settings.describe()`, schreibt via `settings.mutate()` und hört auf `settings/document-updated`. Die Browser-Hälfte leitet die aktuelle Sitzung aus `retainedBy.mainView` ab (`SessionListState.current` wurde entfernt). Die Plugin-Optionen (`enabled` / `defaultDialect` / `routes`) liegen in der Entry-Konfiguration des Plugins und lassen sich auf der DSH-Settings-Seite bearbeiten. DSH ≤ 0.1.5 wird nicht mehr unterstützt (dort v0.3.0 verwenden).
>
> 🆕 **v0.3.0** — Portiert auf DSH 0.1.5: der Client-`Context` kommt jetzt aus `@deepseek-ai/cordis`, der Sitzungszustand wird über `ctx.modelDirectories` gelesen/geschrieben und die Settings-Sektion via `settings.installSection()` installiert; der Adapter-Metadaten-Wrapper wurde gestrichen (siehe „Universale Effort-Bereitstellung“). DSH ≤ 0.1.1 wird nicht mehr unterstützt.
>
> 🔧 **v0.2.5** — Behoben: universelles Provisioning schlug bei expliziten `models`-Arrays still fehl (dsh-settings-Pfad-Operationen können Array-Knoten nicht durchqueren — das Array wird jetzt als Ganzes ersetzt).
>
> 🔧 **v0.2.4** — Behoben: universelles Provisioning landete nie, wenn sich die pi-ai-Settings-Sektion spät registrierte (jetzt Retry, bis die Sektion bereit ist).
>
> 🆕 **v0.2.3** — Auch der Trigger-Button am Modell-Seat färbt seinen Effort-Namen stufengerecht, dauerhaft nach dem Schließen des Menüs.
>
> 🔧 **v0.2.2** — Behoben: die Menüzeilen-Färbung brach bei kompletten Menü-Remounts (vollständiger, gedrosselter Repaint; Farbe aus dem Effort-Text abgeleitet).
>
> 🆕 **v0.2.1** — Nach dem Schließen behält der Effort-Wert in der Effort-Zeile des Modellmenüs seine Stufenfarbe.
>
> ✨ **v0.2.0** — Jedes benutzerdefinierte Drittanbieter-Modell bzw. jeder Anbieter bekommt funktionierende Thinking-Effort-Steuerung (Hot-Apply).
>
> 🎛️ **v0.1.0** — Erste Veröffentlichung: fängt das offizielle Effort-Menü ab und zeigt ein Effort-Schieberegler-Panel im Claude-Code-Stil.
>
> Vollständige Notizen zu jeder Version: [Releases](https://github.com/2768651338/dsh-effort-slider/releases)
---
## Funktionen
| Funktion | Beschreibung |
| --- | --- |
| 🎚️ Stufenloses Ziehen | Kontinuierliches Ziehen von 0–100, das `reasoningEffort` in Echtzeit schreibt (16-ms-Drossel, kein Stau von Anfragen beim Ziehen) |
| 🎯 Einrasten beim Loslassen | Rastet beim Loslassen / Fokusverlust / Ende der Tastatureingabe auf die nächste Stufe ein, mit einer Bestätigungsschreibung |
| 🔥 WebGL-Feuerschweif | Drei-Pass-Shader (Zünden → Weichzeichnen → Komposition); die Feuerfront folgt dem Daumen mit Federdämpfung |
| 🏁 OFF/MAX-Marken | Erste und letzte Stufe zeigen immer `OFF` / `MAX`; mittlere Stufen zeigen den von der API zurückgegebenen Namen |
| 🎨 Stufenstatus | Der Effort-Name steht live im Panel-Kopf, farbig/leuchtend je nach Stufe; Menüzeile und Modell-Seat-Trigger behalten die Farbe nach dem Schließen (v0.2.3) |
| 🌐 Universeller Effort | Drittanbieter-Modelle ohne `reasoning`-Metadaten erhalten automatisch die universelle 5-Stufen-Skala; pi-ai-Modelle bekommen ihre Wire-Wörterbücher eingepatcht, **per Hot-Apply** (v0.2.0) |
Geschrieben wird nur `reasoningEffort` — die Modellauswahl bleibt unberührt. Modelle ohne mehrstufiges Reasoning zeigen 「当前模型不提供多档推理等级」 (kein mehrstufiges Reasoning verfügbar).
### Universale Effort-Bereitstellung (v0.2.0, in v0.3.0 vereinfacht)
**Jedes benutzerdefinierte Drittanbieter-Modell bzw. jeder Anbieter erhält eine Thinking-Effort-Steuerung, die auf der Leitung wirklich funktioniert**:
- **Wire-Level-Bereitstellung (Host, pi-ai)**: für `llm-pi-ai`-Modelle ohne `reasoningEfforts` werden Wörterbuch und `compat`-Wire-Dialekt eingepatcht (**Hot-Apply, kein Neustart**); pi-ai übersetzt die Stufe in echte Wire-Felder (`reasoning_effort` / `thinking` / OpenRouter `reasoning.effort` usw.) **und** veröffentlicht dieselbe Deklaration als `reasoning`-Katalog-Metadaten des Modells — genau deshalb erscheint bei handdeklarierten Modellen überhaupt die offizielle **Effort**-Zeile;
- **Client-Fallback-Skala**: liefert das Verzeichnis keine Reasoning-Metadaten, öffnet das Panel trotzdem mit der universellen 5-Stufen-Skala;
- Vorhandene Nutzerdeklarationen (`reasoningEfforts: false` oder ein eigenes Wörterbuch) werden immer respektiert und nie überschrieben.
> **Warum es den Adapter-Wrapper nicht mehr gibt.** Bis v0.2.5 umwickelte die Host-Hälfte auch das `resolveModel` jedes Adapters, um Modellen ohne `reasoning`-Metadaten `universalReasoning` zu injizieren. DSH 0.1.5 machte `llm.adapters` zu einem privaten Feld ohne öffentlichen Accessor — dieser Weg ist damit unmöglich, und auch unnötig: `reasoningEfforts` ist die eine Deklaration, die sowohl den Request-Wire als auch den Modellkatalog speist. Modell-Level-`compat` wird nur geschrieben, wenn die Route `api: openai-completions` deklariert, weil pi-ai einen Schalter ablehnt, den das Protokoll des Modells nicht lesen kann.
Unterstützte Wire-Dialekte für eigene Endpunkte (setze `effort-slider.defaultDialect` oder `routes.