fix(translate): Übersetzung scheitert — llama-server ignoriert enable_thinking (Top-Level), Modell denkt Minuten, Route bricht nach 300 s mit HTTP 500; Fehlertext geht verloren #182

Closed
opened 2026-10-26 14:56:31 +00:00 by alf · 4 comments
Owner

Befund (2026-10-26, gemessen)

Die Übersetzung eines Handbuchs (Skill translate, 7 Chunks à 4000 Zeichen, Agent-LLM = lokaler llama-server, Qwen3.8-Flash-Next Q8) scheitert an Chunk 1/7, dreimal hintereinander mit wechselnder Meldung:

Job (Worker-Log /tmp/translate-worker-<pid>.log) Meldung Zeit
81354 (15:23–15:33) The read operation timed out ×3 180-s-Limit des Skripts
95805 (15:40) <urlopen error [SSL: WRONG_VERSION_NUMBER] …> ×3 sofort; später (15:44) antwortete derselbe Weg normal — vorübergehend, Ursache nicht belegt
5099 (15:48–15:53) HTTP Error 500: Error genau 300 s nach dem Start

Der Agent hat das als „Modell zu langsam“ gedeutet und im installierten Skill das Chunk-Limit auf 1800 s erhöht und eine Fehlerbild-Liste in die installierte SKILL.md geschrieben. Das ist nicht die Ursache (und ein Limit von 1800 s wirkt nicht: der Server bricht nach 300 s selbst ab).

Ursache (bewiesen)

VaultMaintenanceViewModel.callOpenAICompat schaltet das Denken des Modells per Top-Level-Feld enable_thinking: false und /no_think ab. Der llama-server (Chat-Template von Qwen3.8 kennt enable_thinking) liest den Schalter aber nur aus chat_template_kwargs: {"enable_thinking": false}. Direkter Gegenversuch gegen http://127.0.0.1:18200/v1/chat/completions, derselbe Satz, max_tokens: 80:

  • Anfrage wie die Iris-Route (Top-Level enable_thinking): 4,3 s, finish_reason: length, 366 Zeichen reasoning_content, Antwort leer — das Modell denkt und kommt in 80 Token nicht zur Antwort.
  • Mit chat_template_kwargs: 1,0 s, 15 Token, Antwort sofort („Die Karte ermöglicht es dir, schnell über das Schiff zu reisen.“).

Jeder Chunk denkt also mehrere Minuten (der Fünfzig-Zeichen-Test brauchte 51 s), überschreitet die 300 s der Route (dataWithReliableTimeout) und endet als HTTP 500. Der Linux-Server (vault_llm.py) schickt für lokale Backends gar keinen Denk-Schalter.

Zweiter Fehler: das Skript zeigt bei HTTP-Fehlern nur HTTP Error 500: Error und verschluckt den Antworttext des Servers ({"error": "…"}) — deshalb stand die wahre Meldung nirgends.

Umfang

  1. Mac-Server: chat_template_kwargs: {enable_thinking: false} zusätzlich zum bisherigen Schalter, nur für lokale Backends (openaicompat, lmstudio) — OpenAI/OpenRouter lehnen unbekannte Felder teils ab.
  2. Linux-Server (vault_llm.py): derselbe Schalter für lmstudio/openaicompat/mlxvlm.
  3. Skill translate (Quelle in iris/iris-plugins): HTTP-Fehler mit Antworttext, Resume setzt Status zurück (der Agent hat den Fehler im installierten Skill gefunden: nach einem Neustart meldete der Reporter sofort den alten Fehler), Limit und Chunk-Größe per Umgebung einstellbar.
  4. Nicht tun: die Übernahme der Agenten-Edits an der installierten Kopie (Limit 1800 s, Fehlerbild-Abschnitt mit falscher Diagnose).

Nicht geklärt

SSL: WRONG_VERSION_NUMBER um 15:40: die Iris-App lief seit 14:54 unverändert, der Port sprach laut Log TLS. Ein Verdacht ohne Beleg; sollte es wiederkommen, Worker-Log und den Zustand von 127.0.0.1:8765 im selben Moment sichern.

## Befund (2026-10-26, gemessen) Die Übersetzung eines Handbuchs (Skill `translate`, 7 Chunks à 4000 Zeichen, Agent-LLM = lokaler llama-server, Qwen3.8-Flash-Next Q8) scheitert an Chunk 1/7, dreimal hintereinander mit wechselnder Meldung: | Job (Worker-Log `/tmp/translate-worker-<pid>.log`) | Meldung | Zeit | |---|---|---| | 81354 (15:23–15:33) | `The read operation timed out` ×3 | 180-s-Limit des Skripts | | 95805 (15:40) | `<urlopen error [SSL: WRONG_VERSION_NUMBER] …>` ×3 | sofort; später (15:44) antwortete derselbe Weg normal — vorübergehend, Ursache nicht belegt | | 5099 (15:48–15:53) | `HTTP Error 500: Error` | genau **300 s** nach dem Start | Der Agent hat das als „Modell zu langsam“ gedeutet und im **installierten** Skill das Chunk-Limit auf 1800 s erhöht und eine Fehlerbild-Liste in die installierte `SKILL.md` geschrieben. Das ist **nicht die Ursache** (und ein Limit von 1800 s wirkt nicht: der Server bricht nach 300 s selbst ab). ## Ursache (bewiesen) `VaultMaintenanceViewModel.callOpenAICompat` schaltet das Denken des Modells per **Top-Level-Feld `enable_thinking: false`** und `/no_think` ab. Der llama-server (Chat-Template von Qwen3.8 kennt `enable_thinking`) liest den Schalter aber nur aus **`chat_template_kwargs: {"enable_thinking": false}`**. Direkter Gegenversuch gegen `http://127.0.0.1:18200/v1/chat/completions`, derselbe Satz, `max_tokens: 80`: - Anfrage wie die Iris-Route (Top-Level `enable_thinking`): **4,3 s, `finish_reason: length`, 366 Zeichen `reasoning_content`, Antwort leer** — das Modell denkt und kommt in 80 Token nicht zur Antwort. - Mit `chat_template_kwargs`: **1,0 s, 15 Token, Antwort sofort** („Die Karte ermöglicht es dir, schnell über das Schiff zu reisen.“). Jeder Chunk denkt also mehrere Minuten (der Fünfzig-Zeichen-Test brauchte 51 s), überschreitet die 300 s der Route (`dataWithReliableTimeout`) und endet als HTTP 500. Der Linux-Server (`vault_llm.py`) schickt für lokale Backends gar keinen Denk-Schalter. **Zweiter Fehler:** das Skript zeigt bei HTTP-Fehlern nur `HTTP Error 500: Error` und verschluckt den Antworttext des Servers (`{"error": "…"}`) — deshalb stand die wahre Meldung nirgends. ## Umfang 1. Mac-Server: `chat_template_kwargs: {enable_thinking: false}` zusätzlich zum bisherigen Schalter, nur für lokale Backends (`openaicompat`, `lmstudio`) — OpenAI/OpenRouter lehnen unbekannte Felder teils ab. 2. Linux-Server (`vault_llm.py`): derselbe Schalter für `lmstudio`/`openaicompat`/`mlxvlm`. 3. Skill `translate` (Quelle in iris/iris-plugins): HTTP-Fehler mit Antworttext, Resume setzt Status zurück (der Agent hat den Fehler im installierten Skill gefunden: nach einem Neustart meldete der Reporter sofort den alten Fehler), Limit und Chunk-Größe per Umgebung einstellbar. 4. Nicht tun: die Übernahme der Agenten-Edits an der installierten Kopie (Limit 1800 s, Fehlerbild-Abschnitt mit falscher Diagnose). ## Nicht geklärt `SSL: WRONG_VERSION_NUMBER` um 15:40: die Iris-App lief seit 14:54 unverändert, der Port sprach laut Log TLS. Ein Verdacht ohne Beleg; sollte es wiederkommen, Worker-Log und den Zustand von `127.0.0.1:8765` im selben Moment sichern.
Author
Owner

PR #183 gemergt: fix(translate): Denk-Schalter für lokale Modelle über chat_template_kwargs — Übersetzung lief ins 300-s-Limit (iris/Iris#182)
#183

Commits:

  • fix(translate): Denk-Schalter für lokale Modelle über chat_template_kwargs — Übersetzung lief ins 300-s-Limit (iris/Iris#182)

Stand: Mac-Server (zu #182)

VaultMaintenanceViewModel.callOpenAICompat sendet für openaicompat und lmstudio zusätzlich chat_template_kwargs: {enable_thinking: false}. Der bisherige Top-Level-Schalter bleibt (andere Server lesen ihn), OpenAI/OpenRouter bekommen das neue Feld nicht.

Geprüft: Iris (Debug, eigenes DerivedData) baut. Die Wirkung ist am laufenden llama-server gemessen, nicht über die App: gleiche Anfrage, max_tokens 80 — mit Top-Level-Feld 4,3 s, finish_reason length, 366 Zeichen reasoning_content, Antwort leer; mit chat_template_kwargs 1,0 s, 15 Token, Antwort sofort. Nicht geprüft: die Übersetzung selbst in der neu gebauten App (Iris muss neu gebaut und gestartet werden, dann den Job neu starten); lmstudio/vLLM nicht gegen einen echten Server.

PR #183 gemergt: fix(translate): Denk-Schalter für lokale Modelle über chat_template_kwargs — Übersetzung lief ins 300-s-Limit (iris/Iris#182) https://forgejo.lewerken.duckdns.org/iris/Iris/pulls/183 Commits: - fix(translate): Denk-Schalter für lokale Modelle über chat_template_kwargs — Übersetzung lief ins 300-s-Limit (iris/Iris#182) --- ## Stand: Mac-Server (zu #182) `VaultMaintenanceViewModel.callOpenAICompat` sendet für `openaicompat` und `lmstudio` zusätzlich `chat_template_kwargs: {enable_thinking: false}`. Der bisherige Top-Level-Schalter bleibt (andere Server lesen ihn), OpenAI/OpenRouter bekommen das neue Feld nicht. **Geprüft:** `Iris` (Debug, eigenes DerivedData) baut. Die Wirkung ist am **laufenden llama-server** gemessen, nicht über die App: gleiche Anfrage, `max_tokens 80` — mit Top-Level-Feld 4,3 s, `finish_reason length`, 366 Zeichen `reasoning_content`, Antwort leer; mit `chat_template_kwargs` 1,0 s, 15 Token, Antwort sofort. **Nicht geprüft:** die Übersetzung selbst in der neu gebauten App (Iris muss neu gebaut und gestartet werden, dann den Job neu starten); `lmstudio`/`vLLM` nicht gegen einen echten Server.
Author
Owner

PR #100 gemergt: fix(translate): chat_template_kwargs enable_thinking für lokale Backends in vault_llm (iris/Iris#182)
iris/iris-linux-server#100

Commits:

  • fix(translate): chat_template_kwargs enable_thinking für lokale Backends in vault_llm (iris/Iris#182)

Stand: Linux-Server (zu iris/Iris#182)

vault_llm.py: für lmstudio/openaicompat/mlxvlm schickt call_llm jetzt chat_template_kwargs: {enable_thinking: false} (vorher gar kein Denk-Schalter). Wortgleiche Begründung zur Mac-App. Geprüft: Syntax; nicht geprüft: kein Lauf des Servers, keine Tests, nicht auf iris-server ausgerollt.

PR #100 gemergt: fix(translate): chat_template_kwargs enable_thinking für lokale Backends in vault_llm (iris/Iris#182) https://forgejo.lewerken.duckdns.org/iris/iris-linux-server/pulls/100 Commits: - fix(translate): chat_template_kwargs enable_thinking für lokale Backends in vault_llm (iris/Iris#182) --- ## Stand: Linux-Server (zu iris/Iris#182) `vault_llm.py`: für `lmstudio`/`openaicompat`/`mlxvlm` schickt `call_llm` jetzt `chat_template_kwargs: {enable_thinking: false}` (vorher gar kein Denk-Schalter). Wortgleiche Begründung zur Mac-App. **Geprüft:** Syntax; **nicht geprüft:** kein Lauf des Servers, keine Tests, **nicht auf iris-server ausgerollt**.
Author
Owner

PR #286 gemergt: fix(translate): echter Fehlertext bei HTTP-Fehlern, Resume setzt Status zurück, Limits einstellbar, Version 1.0.6 (iris/Iris#182)
iris/iris-plugins#286

Commits:

  • fix(translate): echter Fehlertext bei HTTP-Fehlern, Resume setzt Status zurück, Limits einstellbar, Version 1.0.6 (iris/Iris#182)

Stand: Skill translate 1.0.6 (zu iris/Iris#182)

HTTP-Fehler zeigen den Grund aus {"error": …} des Servers statt HTTP Error 500: Error (mit Ersatz, wenn der Text kein JSON ist); Resume setzt Status auf running und leert den Fehler (Fehler aus dem installierten Skill übernommen, dort vom Agenten gefunden); TRANSLATE_MAX_CHUNK_CHARS und TRANSLATE_CHUNK_TIMEOUT_SECONDS (Standard 300 s = Limit der Route). SKILL.md: Abschnitt „Fehlerbilder“ mit der richtigen Diagnose (Zeitüberschreitung bei kleinen Chunks = das Modell denkt, nicht „zu langsam“). Nicht übernommen: das 1800-s-Limit und der Fehlerbild-Abschnitt des Agenten aus der installierten Kopie (falsche Diagnose).

Geprüft: Syntax; das Verhalten der Fehlertext-Behandlung gegen ein simuliertes HTTPError (mit/ohne JSON-Body); publish-plugins.sh --dry-run grün. Nicht geprüft: ein echter Übersetzungslauf; kein Test-Verzeichnis im Plugin. Veröffentlicht nach der Standardregel.

PR #286 gemergt: fix(translate): echter Fehlertext bei HTTP-Fehlern, Resume setzt Status zurück, Limits einstellbar, Version 1.0.6 (iris/Iris#182) https://forgejo.lewerken.duckdns.org/iris/iris-plugins/pulls/286 Commits: - fix(translate): echter Fehlertext bei HTTP-Fehlern, Resume setzt Status zurück, Limits einstellbar, Version 1.0.6 (iris/Iris#182) --- ## Stand: Skill translate 1.0.6 (zu iris/Iris#182) HTTP-Fehler zeigen den Grund aus `{"error": …}` des Servers statt `HTTP Error 500: Error` (mit Ersatz, wenn der Text kein JSON ist); Resume setzt Status auf `running` und leert den Fehler (Fehler aus dem installierten Skill übernommen, dort vom Agenten gefunden); `TRANSLATE_MAX_CHUNK_CHARS` und `TRANSLATE_CHUNK_TIMEOUT_SECONDS` (Standard 300 s = Limit der Route). SKILL.md: Abschnitt „Fehlerbilder“ **mit der richtigen Diagnose** (Zeitüberschreitung bei kleinen Chunks = das Modell denkt, nicht „zu langsam“). **Nicht übernommen:** das 1800-s-Limit und der Fehlerbild-Abschnitt des Agenten aus der installierten Kopie (falsche Diagnose). **Geprüft:** Syntax; das Verhalten der Fehlertext-Behandlung gegen ein simuliertes `HTTPError` (mit/ohne JSON-Body); `publish-plugins.sh --dry-run` grün. **Nicht geprüft:** ein echter Übersetzungslauf; kein Test-Verzeichnis im Plugin. Veröffentlicht nach der Standardregel.
Author
Owner

Stand: veröffentlicht

translate 1.0.6 ist in der Registry (nach dem Pull geprüft): HTTP-Fehler nennen den echten Grund, ein neu gestarteter Job meldet nicht mehr sofort den alten Fehler, Chunk-Größe und Zeitlimit sind einstellbar. Die eigentliche Ursache (llama-server ignorierte den Denk-Schalter) ist in der Mac-App (PR in iris/Iris, noch nicht in deiner laufenden Iris) und im Linux-Server (vault_llm.py, nicht ausgerollt) behoben.

Zum Wiederholen der Übersetzung: Iris neu bauen und starten, den laufenden Übersetzungsjob (Worker-PID siehe pgrep -f 'translate_document.py _worker') beenden und neu starten. Nicht geprüft: ein echter Übersetzungslauf nach dem Fix.

## Stand: veröffentlicht **translate 1.0.6** ist in der Registry (nach dem Pull geprüft): HTTP-Fehler nennen den echten Grund, ein neu gestarteter Job meldet nicht mehr sofort den alten Fehler, Chunk-Größe und Zeitlimit sind einstellbar. Die eigentliche Ursache (llama-server ignorierte den Denk-Schalter) ist in der **Mac-App** (PR in iris/Iris, noch nicht in deiner laufenden Iris) und im **Linux-Server** (`vault_llm.py`, nicht ausgerollt) behoben. **Zum Wiederholen der Übersetzung:** Iris neu bauen und starten, den laufenden Übersetzungsjob (Worker-PID siehe `pgrep -f 'translate_document.py _worker'`) beenden und neu starten. **Nicht geprüft:** ein echter Übersetzungslauf nach dem Fix.
alf closed this issue 2026-10-26 18:06:53 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/Iris#182
No description provided.