From a2ddb6b94dfc6e263aeb406ee26662abf9fe83b1 Mon Sep 17 00:00:00 2001 From: wb Date: Tue, 23 Jun 2026 14:52:19 +0200 Subject: [PATCH] fix+ux(settings): clearer provider/model flow, inline provider editing - Merge Anbieter and Standard-LLM-Parameter into one card with explicit step labels (Schritt 1: Anbieter, Schritt 2: Modell setzen) - Show current default provider name in step 2 so it's always visible - Add inline edit form per provider row (pencil button toggles form) - Add /providers/{id}/update and /providers/{id}/clear-key routes - Fix sqlite3.Row.get() AttributeError in _prompt_llm_block and _process_analysis_job (use .keys() instead) Co-Authored-By: Claude Sonnet 4.6 --- app.py | 154 +++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 112 insertions(+), 42 deletions(-) diff --git a/app.py b/app.py index 5514dd2..ba606e0 100644 --- a/app.py +++ b/app.py @@ -545,7 +545,7 @@ def _process_analysis_job(job_id: int): repeat_penalty = float(get_setting("llm_repeat_penalty", "1.15")) repeat_last_n = int(get_setting("llm_repeat_last_n", "128")) else: - provider = _get_provider(prm.get("provider_id")) + provider = _get_provider(prm["provider_id"] if "provider_id" in prm.keys() else None) model = prm["llm_model"] or get_setting("llm_model", _SEED_MODEL) num_ctx_setting = prm["llm_num_ctx"] or get_setting("llm_num_ctx", "auto") num_predict = int(prm["llm_num_predict"] or get_setting("llm_num_predict", str(_SEED_NUM_PREDICT))) @@ -795,17 +795,46 @@ def settings_page(msg: str = ""): email_addrs = c.execute("SELECT id, label, email FROM email_addresses ORDER BY label").fetchall() provider_rows = "".join( - f""" - {p["name"]} - {p["base_url"]} - - {'Standard' if p["is_default"] else f'
'} - + f""" + {p["name"]} + {p["base_url"]} + + + {"Standard" if p["is_default"] else f"
"} + + +
+ + + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + + {"" if p["api_key"] else ""} +
+
+ + """ for p in providers ) @@ -842,42 +871,52 @@ def settings_page(msg: str = ""): {f"
{msg}
" if msg else ""}
-
LLM-Anbieter
-

OpenAI-kompatible Endpunkte (Ollama, OpenAI, Groq, LM Studio, …)

- {"" + provider_rows + "
NameBase-URLAPI-KeyStandard
" if providers else "

Noch kein Anbieter konfiguriert.

"} -
-
- - -
-
- - -
-
- - -
-
-
- - -
- -
-
-
+
LLM-Anbieter & Standard-Modell
-
-
Standard-LLM-Parameter
-

Gelten für alle Prompts ohne eigene Einstellungen. Anbieter = markierter Standard-Anbieter oben.

+
SCHRITT 1 — Anbieter verwalten
+

OpenAI-kompatible Endpunkte (Ollama, OpenAI, Groq, LM Studio, …). = als Standard setzen.

+ {"
" + provider_rows + "
NameBase-URLAPI-Key
" if providers else "

Noch kein Anbieter konfiguriert.

"} +
+ Neuen Anbieter hinzufügen +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
+
+
+ +
+
SCHRITT 2 — Standard-Modell & Parameter festlegen
+

+ Gilt für alle Prompts ohne eigene Einstellungen. Standard-Anbieter: + {next((p["name"] for p in providers if p["is_default"]), "– keiner gesetzt –")} +

- {provider_id_opts}
-
Aktuell gespeichert: {current_model}
+
Anbieter im Dropdown links wählen → Modelle laden → Modell auswählen → Speichern. Aktuell: {current_model}
@@ -990,21 +1029,24 @@ def settings_page(msg: str = ""):