From 41cf584a65dd606585551412e46a07e1c1281d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Wed, 21 Oct 2026 12:35:24 +0200 Subject: [PATCH] fix(settings): say what the AI provider picker does The select on the AI provider card read "Primary provider" under a card that said it held the provider HealthLog asks first. It only picks which provider's key and model the form below edits, and saves nothing; the order of the fallback chain decides who answers first. A person who picked a provider there expected it to answer first and it did not. The picker and the card description now say what they do and point at the chain for the order. --- messages/de.json | 4 ++-- messages/en.json | 4 ++-- messages/es.json | 4 ++-- messages/fr.json | 4 ++-- messages/it.json | 4 ++-- messages/ko.json | 4 ++-- messages/nl.json | 4 ++-- messages/pl.json | 4 ++-- .../settings/__tests__/ai-section.test.tsx | 23 +++++++++++++++---- 9 files changed, 34 insertions(+), 21 deletions(-) diff --git a/messages/de.json b/messages/de.json index e299f3ad6..8900b5641 100644 --- a/messages/de.json +++ b/messages/de.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "Die Kette wird auf Codex → OpenAI → Anthropic → Lokal → Admin-OpenAI zurückgesetzt. Gespeicherte Zugangsdaten bleiben erhalten." }, "activeProviderHeading": "Aktiver Provider", - "activeProviderLabel": "Primärer Provider", + "activeProviderLabel": "Anbieter einrichten", "providerSelect": { "codex": "ChatGPT-Account (Codex)", "openai": "OpenAI (eigener API-Key)", @@ -6413,7 +6413,7 @@ }, "coachNote": "Im Coach gilt die Denktiefe aus den Coach-Einstellungen." }, - "providerCardDescription": "Der Anbieter, den HealthLog zuerst fragt, mit Schlüssel und Modell.", + "providerCardDescription": "Richte Schlüssel und Modell je Anbieter ein; die Reihenfolge darunter bestimmt, welchen HealthLog zuerst fragt.", "runtimeTitle": "Prüfen und aktualisieren", "usage": { "title": "KI-Einsatz", diff --git a/messages/en.json b/messages/en.json index ff603514e..aaf2689f9 100644 --- a/messages/en.json +++ b/messages/en.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "The chain reverts to Codex → OpenAI → Anthropic → Local → Admin OpenAI. Your saved credentials are not touched." }, "activeProviderHeading": "Active provider", - "activeProviderLabel": "Primary provider", + "activeProviderLabel": "Set up a provider", "providerSelect": { "codex": "ChatGPT account (Codex)", "openai": "OpenAI (your API key)", @@ -6413,7 +6413,7 @@ }, "coachNote": "In the Coach, the thinking depth from the Coach settings applies." }, - "providerCardDescription": "The provider HealthLog asks first, and its key and model.", + "providerCardDescription": "Set up each provider's key and model; the order below decides which one HealthLog asks first.", "runtimeTitle": "Check and refresh", "usage": { "title": "AI usage", diff --git a/messages/es.json b/messages/es.json index dfd004bcf..a304a8819 100644 --- a/messages/es.json +++ b/messages/es.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "La cadena vuelve a Codex → OpenAI → Anthropic → Local → OpenAI de administrador. Tus credenciales guardadas no se modifican." }, "activeProviderHeading": "Proveedor activo", - "activeProviderLabel": "Proveedor principal", + "activeProviderLabel": "Configurar un proveedor", "providerSelect": { "codex": "Cuenta de ChatGPT (Codex)", "openai": "OpenAI (tu clave de API)", @@ -6413,7 +6413,7 @@ }, "coachNote": "En el Coach se aplica la profundidad de pensamiento de los ajustes del Coach." }, - "providerCardDescription": "El proveedor al que HealthLog pregunta primero, con su clave y su modelo.", + "providerCardDescription": "Configura la clave y el modelo de cada proveedor; el orden de abajo decide a cuál pregunta HealthLog primero.", "runtimeTitle": "Comprobar y actualizar", "usage": { "title": "Uso de la IA", diff --git a/messages/fr.json b/messages/fr.json index 5fb617982..0249cfcf9 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "La chaîne revient à Codex → OpenAI → Anthropic → Local → OpenAI administrateur. Vos identifiants enregistrés ne sont pas affectés." }, "activeProviderHeading": "Fournisseur actif", - "activeProviderLabel": "Fournisseur principal", + "activeProviderLabel": "Configurer un fournisseur", "providerSelect": { "codex": "Compte ChatGPT (Codex)", "openai": "OpenAI (votre clé API)", @@ -6413,7 +6413,7 @@ }, "coachNote": "Dans le Coach, c'est la profondeur de réflexion des réglages du Coach qui s'applique." }, - "providerCardDescription": "Le fournisseur que HealthLog sollicite en premier, avec sa clé et son modèle.", + "providerCardDescription": "Configurez la clé et le modèle de chaque fournisseur ; l’ordre ci-dessous décide lequel HealthLog sollicite en premier.", "runtimeTitle": "Vérifier et actualiser", "usage": { "title": "Usage de l'IA", diff --git a/messages/it.json b/messages/it.json index eda8a4549..f3ff85750 100644 --- a/messages/it.json +++ b/messages/it.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "La catena torna a Codex → OpenAI → Anthropic → Locale → OpenAI amministratore. Le credenziali salvate non vengono toccate." }, "activeProviderHeading": "Provider attivo", - "activeProviderLabel": "Provider principale", + "activeProviderLabel": "Configura un fornitore", "providerSelect": { "codex": "Account ChatGPT (Codex)", "openai": "OpenAI (la tua chiave API)", @@ -6413,7 +6413,7 @@ }, "coachNote": "Nel Coach vale la profondità di ragionamento delle impostazioni del Coach." }, - "providerCardDescription": "Il fornitore che HealthLog interpella per primo, con chiave e modello.", + "providerCardDescription": "Configura chiave e modello di ogni fornitore; l’ordine qui sotto decide quale HealthLog interpella per primo.", "runtimeTitle": "Verifica e aggiorna", "usage": { "title": "Uso dell'IA", diff --git a/messages/ko.json b/messages/ko.json index 69b2f0bd1..2952f87cb 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "순서가 Codex → OpenAI → Anthropic → 로컬 → 관리자 OpenAI로 돌아가요. 저장한 인증 정보는 그대로예요." }, "activeProviderHeading": "사용 중인 제공자", - "activeProviderLabel": "기본 제공자", + "activeProviderLabel": "설정할 제공자", "providerSelect": { "codex": "ChatGPT 계정 (Codex)", "openai": "OpenAI (내 API 키)", @@ -6413,7 +6413,7 @@ }, "coachNote": "코치에서는 코치 설정의 사고 깊이가 적용됩니다." }, - "providerCardDescription": "HealthLog가 가장 먼저 쓰는 제공자와 그 키, 모델이에요.", + "providerCardDescription": "제공자마다 키와 모델을 설정하고, 아래 순서로 HealthLog가 먼저 쓸 제공자를 정해요.", "runtimeTitle": "확인 및 새로고침", "usage": { "title": "AI 사용량", diff --git a/messages/nl.json b/messages/nl.json index 09026ba66..4eac566f5 100644 --- a/messages/nl.json +++ b/messages/nl.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "De keten wordt teruggezet naar Codex → OpenAI → Anthropic → Lokaal → OpenAI van beheerder. Je opgeslagen inloggegevens blijven onaangeroerd." }, "activeProviderHeading": "Actieve provider", - "activeProviderLabel": "Primaire provider", + "activeProviderLabel": "Provider instellen", "providerSelect": { "codex": "ChatGPT-account (Codex)", "openai": "OpenAI (je eigen API-sleutel)", @@ -6413,7 +6413,7 @@ }, "coachNote": "In de Coach geldt de denkdiepte uit de Coach-instellingen." }, - "providerCardDescription": "De provider die HealthLog als eerste raadpleegt, met de bijbehorende sleutel en het model.", + "providerCardDescription": "Stel per provider de sleutel en het model in; de volgorde hieronder bepaalt welke HealthLog als eerste raadpleegt.", "runtimeTitle": "Controleren en vernieuwen", "usage": { "title": "AI-gebruik", diff --git a/messages/pl.json b/messages/pl.json index a9213953d..78cf7bb4a 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -6206,7 +6206,7 @@ "resetConfirmBody": "Łańcuch wraca do Codex → OpenAI → Anthropic → Lokalny → OpenAI administratora. Zapisane dane logowania pozostają nienaruszone." }, "activeProviderHeading": "Aktywny dostawca", - "activeProviderLabel": "Główny dostawca", + "activeProviderLabel": "Skonfiguruj dostawcę", "providerSelect": { "codex": "Konto ChatGPT (Codex)", "openai": "OpenAI (Twój klucz API)", @@ -6413,7 +6413,7 @@ }, "coachNote": "W Coachu obowiązuje głębokość myślenia z ustawień Coacha." }, - "providerCardDescription": "Dostawca, którego HealthLog pyta najpierw, wraz z kluczem i modelem.", + "providerCardDescription": "Skonfiguruj klucz i model każdego dostawcy; kolejność poniżej decyduje, którego HealthLog pyta najpierw.", "runtimeTitle": "Sprawdź i odśwież", "usage": { "title": "Użycie AI", diff --git a/src/components/settings/__tests__/ai-section.test.tsx b/src/components/settings/__tests__/ai-section.test.tsx index dc7e7b860..b647fc056 100644 --- a/src/components/settings/__tests__/ai-section.test.tsx +++ b/src/components/settings/__tests__/ai-section.test.tsx @@ -216,12 +216,25 @@ describe(" — dropdown-driven UX (B2)", () => { expect(html).toContain("ChatGPT-Account (Codex)"); // v1.4.33 — the active-provider heading and the parent section // both ship without the "KI"/"AI" prefix per the project-voice rule - // ("Aktiver KI-Provider" → "Aktiver Provider"). The heading and the - // chain summary now share the same phrase, so we assert against the - // explicit `activeProviderLabel` slot below it ("Primärer Provider") - // to keep the test pinned to the right surface. + // ("Aktiver KI-Provider" → "Aktiver Provider"). The picker below it is + // labelled for what it does: it chooses the form, not the order. expect(html).toContain("Aktiver Provider"); - expect(html).toContain("Primärer Provider"); + expect(html).toContain("Anbieter einrichten"); + }); + + it("labels the picker for what it does, not as the primary provider", () => { + // The select picks which provider's key and model the form below edits. + // It never wrote anything, yet read "Primary provider" under a card + // that said it held "the provider HealthLog asks first": a person who + // picked one expected it to answer first, and the chain order, which is + // what decides that, stayed as it was. The copy now points at the chain. + activeProviderQuery = "codex"; + const html = render(); + expect(html).not.toContain("Primary provider"); + expect(html).toContain("Set up a provider"); + expect(html).toContain( + "the order below decides which one HealthLog asks first", + ); }); // v1.18.0 — the Coach preference cards (disable toggle, preferences,