From 97b3ef0124276c676e3fd6ba20588fc246202efd Mon Sep 17 00:00:00 2001 From: localai-bot Date: Thu, 19 Mar 2026 22:13:34 +0000 Subject: [PATCH 1/2] fix(settings): prevent API key duplication on save - Convert api_keys_text (textarea input) to api_keys array before saving - Split text by newlines and trim each key to avoid duplicates - Set api_keys to empty array when no keys are provided - This fixes the issue where saving settings would duplicate API keys because the backend expects an array, not a text string Signed-off-by: localai-bot --- core/http/react-ui/src/pages/Settings.jsx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/http/react-ui/src/pages/Settings.jsx b/core/http/react-ui/src/pages/Settings.jsx index b1491f216317..a50c3362219a 100644 --- a/core/http/react-ui/src/pages/Settings.jsx +++ b/core/http/react-ui/src/pages/Settings.jsx @@ -55,7 +55,17 @@ export default function Settings() { const handleSave = async () => { setSaving(true) try { - await settingsApi.save(settings) + // Prepare settings for saving: convert api_keys_text to api_keys array + const settingsToSave = { ...settings } + if (settingsToSave.api_keys_text !== undefined && settingsToSave.api_keys_text !== null) { + const text = settingsToSave.api_keys_text + if (typeof text === 'string' && text.trim() !== '') { + settingsToSave.api_keys = text.split('\n').map(k => k.trim()).filter(k => k !== '') + } else { + settingsToSave.api_keys = [] + } + } + await settingsApi.save(settingsToSave) addToast('Settings saved successfully', 'success') } catch (err) { addToast(`Save failed: ${err.message}`, 'error') From e2ae3d273cd3577098c3a26161ece339cc44cde2 Mon Sep 17 00:00:00 2001 From: localai-bot Date: Fri, 20 Mar 2026 02:06:11 +0000 Subject: [PATCH 2/2] fix: address Copilot review feedback - deduplicate API keys and remove UI-only field - Use Set to deduplicate API keys before saving - Delete api_keys_text from payload before sending to backend - Addresses feedback from Copilot review comments Signed-off-by: localai-bot --- core/http/react-ui/src/pages/Settings.jsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/http/react-ui/src/pages/Settings.jsx b/core/http/react-ui/src/pages/Settings.jsx index a50c3362219a..d4e99f15a50a 100644 --- a/core/http/react-ui/src/pages/Settings.jsx +++ b/core/http/react-ui/src/pages/Settings.jsx @@ -60,11 +60,14 @@ export default function Settings() { if (settingsToSave.api_keys_text !== undefined && settingsToSave.api_keys_text !== null) { const text = settingsToSave.api_keys_text if (typeof text === 'string' && text.trim() !== '') { - settingsToSave.api_keys = text.split('\n').map(k => k.trim()).filter(k => k !== '') + const keys = text.split('\n').map(k => k.trim()).filter(k => k !== '') + settingsToSave.api_keys = Array.from(new Set(keys)) } else { settingsToSave.api_keys = [] } } + // Remove UI-only field before sending to backend + delete settingsToSave.api_keys_text await settingsApi.save(settingsToSave) addToast('Settings saved successfully', 'success') } catch (err) {