From 4473e32f9c1597c9503013ab6086388d8fe801a1 Mon Sep 17 00:00:00 2001 From: "CTO (LegalAI)" Date: Thu, 9 Apr 2026 13:18:38 +0000 Subject: [PATCH] fix: API-Key Status-Anzeige fuer Anthropic/OpenAI im AI-Provider Bereich Zeigt im AI-Provider Formular einen Status-Indikator an, ob ein API-Schluessel fuer den gewaehlten Provider (Anthropic/OpenAI) hinterlegt ist. Entfernt Ollama aus dem API-Key Dropdown, da Ollama keine API-Keys benoetigt. Co-Authored-By: Paperclip --- .../(dashboard)/einstellungen/ai-settings.tsx | 45 ++++++++++++++----- .../einstellungen/api-key-settings.tsx | 1 - 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/src/app/(dashboard)/einstellungen/ai-settings.tsx b/src/app/(dashboard)/einstellungen/ai-settings.tsx index dacd721..2c23165 100644 --- a/src/app/(dashboard)/einstellungen/ai-settings.tsx +++ b/src/app/(dashboard)/einstellungen/ai-settings.tsx @@ -9,6 +9,11 @@ interface AISettings { ollamaModel: string; } +interface ApiKeyInfo { + provider: string; + isActive: boolean; +} + export default function AISettingsForm() { const [settings, setSettings] = useState({ provider: 'anthropic', @@ -19,6 +24,7 @@ export default function AISettingsForm() { const [saving, setSaving] = useState(false); const [message, setMessage] = useState<{ type: 'success' | 'error'; text: string } | null>(null); const [loading, setLoading] = useState(true); + const [apiKeys, setApiKeys] = useState([]); useEffect(() => { fetch('/api/settings/ai') @@ -28,6 +34,10 @@ export default function AISettingsForm() { setLoading(false); }) .catch(() => setLoading(false)); + fetch('/api/settings/api-keys') + .then((r) => r.json()) + .then((data) => setApiKeys(data)) + .catch(() => {}); }, []); async function handleSubmit(e: React.FormEvent) { @@ -82,16 +92,31 @@ export default function AISettingsForm() { {settings.provider !== 'ollama' && ( -
- - setSettings({ ...settings, model: e.target.value })} - placeholder={settings.provider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o'} - className="w-full rounded-lg border border-card-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted/50" - /> -
+ <> +
+ + setSettings({ ...settings, model: e.target.value })} + placeholder={settings.provider === 'anthropic' ? 'claude-sonnet-4-20250514' : 'gpt-4o'} + className="w-full rounded-lg border border-card-border bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted/50" + /> +
+ {(() => { + const activeKey = apiKeys.find( + (k) => k.provider === settings.provider && k.isActive, + ); + return ( +
+ + {activeKey + ? `API-Schlüssel für ${settings.provider === 'anthropic' ? 'Anthropic' : 'OpenAI'} ist konfiguriert.` + : `Kein API-Schlüssel für ${settings.provider === 'anthropic' ? 'Anthropic' : 'OpenAI'} hinterlegt. Bitte unten unter „API-Schlüssel" einen Schlüssel hinzufügen.`} +
+ ); + })()} + )} {settings.provider === 'ollama' && ( diff --git a/src/app/(dashboard)/einstellungen/api-key-settings.tsx b/src/app/(dashboard)/einstellungen/api-key-settings.tsx index 83b6862..00ce142 100644 --- a/src/app/(dashboard)/einstellungen/api-key-settings.tsx +++ b/src/app/(dashboard)/einstellungen/api-key-settings.tsx @@ -172,7 +172,6 @@ export default function ApiKeySettings() { > -