diff --git a/src/components/ops/providers-panel.tsx b/src/components/ops/providers-panel.tsx index 80219e5..0b0e7b1 100644 --- a/src/components/ops/providers-panel.tsx +++ b/src/components/ops/providers-panel.tsx @@ -26,7 +26,11 @@ export function ProvidersPanel() { React.useEffect(() => { if (secrets.data?.provider) setProvider(secrets.data.provider); - if (secrets.data?.api_url) setUrl(secrets.data.api_url); + // Mirror the server's value even when it is absent. A truthy guard here only + // ever filled the field and never emptied it, so a base URL that the gateway + // stopped returning — including one it now withholds because it held an API + // key — stayed on screen until a page reload. + setUrl(secrets.data?.api_url ?? ""); }, [secrets.data?.provider, secrets.data?.api_url]); React.useEffect(() => { if (info.data?.model) setModel(info.data.model); @@ -107,17 +111,33 @@ export function ProvidersPanel() { defaultModel={info.data?.model} /> - setUrl(e.target.value)} - placeholder="API base URL (optional)" - /> - setKey(e.target.value)} - type="password" - placeholder="API key for this provider (leave blank to keep current)" - /> + {/* Labelled, not placeholder-only: these two fields sit next to each + other, one takes a URL and one takes a credential, and a placeholder + disappears the moment either is focused. Pasting a key into the base + URL field put it in config.toml in plaintext. */} +