Introduce a new field `reasoning_effort` to the `ChatRequest` struct. This field, set to "medium" by default, allows tuning LLM reasoning depth to balance hallucination risk against latency and token cost. This setting is specifically for Ionos' GPT-OSS reasoning models and is ignored by other OpenAI-compatible models.
Gazetteer vocabulary
Plain list of domain-specific words the analysis LLM might not know —
medication brand names, proper nouns, colleagues, technical terms. Loaded
once at server start. Used to annotate close edit-distance neighbours in
Whisper transcripts as Token [?Canonical] for LLM-side review.
Format
- One entry per line, UTF-8.
- Blank lines and lines starting with
#are skipped. - Matching is case-insensitive; original casing is preserved for display.
- Entries must be ≥5 characters (shorter tokens collide too often with everyday German words).
- Duplicates (case-insensitive, across files) are collapsed automatically.
Optional: bypass-aliases for false-positive Hunspell compounds
A line may carry one or more --prefixed alias tokens after the canonical:
Sellink -Seelink -Seelinks
Meaning: when a transcript token (case-insensitive) exactly matches a
listed alias, the gazetteer skips the Hunspell dict-veto and rewrites
the token to the canonical. Use this only when Hunspell-de
mistakenly accepts a known mishearing as a valid German compound and
thereby blocks a legitimate correction (e.g. Hunspell parses Seelink
as See + link and vetoes Seelink → Sellink).
- The
-is the bypass marker; it is stripped before storage. - Aliases are exact match only (no Damerau-Levenshtein tolerance).
If a new declension or mishearing surfaces, append it explicitly:
Sellink -Seelink -Seelinks. - Aliases are scoped to the entry whose canonical wins the DL contest; identical aliases under unrelated entries do not interfere.
- A secondary token without
-is a hard server-start error (io::ErrorKind::InvalidData) — the loader fails loud rather than silently misindex.
Adding entries
Edit vocabulary.txt (or drop additional *.txt files into this
directory — the loader picks up every *.txt non-recursively). Restart
the server afterwards; there is no hot-reload. Keep entries phonetically
distinctive: Tavor is a good entry, Haus would match innocent words.