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.
This commit is contained in:
Marc-André Bombeck committed 2026-10-21 12:36:14 +02:00
1 parent 2bb3783b14
commit 41cf584a65
9 files changed
+34 -21

No files matched your search

+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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 사용량",
+2 -2
View File
@@ -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",
+2 -2
View File
@@ -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",
@@ -216,12 +216,25 @@ describe("<AiSection> — 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,