From ba76919fe06ae89a526927df3a96d493393c829c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 11 Dec 2025 07:56:08 +0000 Subject: [PATCH] fix: ensure numeric settings are always stored and sent as numbers, not strings Co-authored-by: DeJeune <67425183+DeJeune@users.noreply.github.com> --- .../src/aiCore/prepareParams/modelParameters.ts | 10 ++++++++-- src/renderer/src/aiCore/utils/reasoning.ts | 7 +++++++ src/renderer/src/pages/home/Tabs/SettingsTab.tsx | 6 +++--- .../AssistantSettings/AssistantModelSettings.tsx | 16 ++++++++-------- .../ModelSettings/DefaultAssistantSettings.tsx | 2 +- 5 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/renderer/src/aiCore/prepareParams/modelParameters.ts b/src/renderer/src/aiCore/prepareParams/modelParameters.ts index 34c3418287..0da6fb06e6 100644 --- a/src/renderer/src/aiCore/prepareParams/modelParameters.ts +++ b/src/renderer/src/aiCore/prepareParams/modelParameters.ts @@ -54,7 +54,8 @@ export function getTemperature(assistant: Assistant, model: Model): number | und // FIXME: assistant.settings.enableTemperature should be always a boolean value. const enableTemperature = assistantSettings?.enableTemperature ?? DEFAULT_ASSISTANT_SETTINGS.enableTemperature - return enableTemperature ? temperature : undefined + // Ensure temperature is always returned as a number (not a string) + return enableTemperature && temperature !== undefined ? Number(temperature) : undefined } /** @@ -78,7 +79,9 @@ export function getTopP(assistant: Assistant, model: Model): number | undefined const assistantSettings = getAssistantSettings(assistant) // FIXME: assistant.settings.enableTopP should be always a boolean value. const enableTopP = assistantSettings.enableTopP ?? DEFAULT_ASSISTANT_SETTINGS.enableTopP - return enableTopP ? assistantSettings?.topP : undefined + const topP = assistantSettings?.topP + // Ensure topP is always returned as a number (not a string) + return enableTopP && topP !== undefined ? Number(topP) : undefined } /** @@ -103,6 +106,9 @@ export function getMaxTokens(assistant: Assistant, model: Model): number | undef return undefined } + // Ensure maxTokens is a number + maxTokens = Number(maxTokens) + const provider = getProviderByModel(model) if (isSupportedThinkingTokenClaudeModel(model) && ['anthropic', 'aws-bedrock'].includes(provider.type)) { const { reasoning_effort: reasoningEffort } = assistantSettings diff --git a/src/renderer/src/aiCore/utils/reasoning.ts b/src/renderer/src/aiCore/utils/reasoning.ts index 1e74db24df..0910c24eb4 100644 --- a/src/renderer/src/aiCore/utils/reasoning.ts +++ b/src/renderer/src/aiCore/utils/reasoning.ts @@ -702,6 +702,13 @@ export function getCustomParameters(assistant: Assistant): Record { return { ...acc, [param.name]: value } } } + // Ensure number type parameters are always numbers (not strings) + if (param.type === 'number') { + return { + ...acc, + [param.name]: Number(param.value) + } + } return { ...acc, [param.name]: param.value diff --git a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx index 014897ce9c..94497be3ec 100644 --- a/src/renderer/src/pages/home/Tabs/SettingsTab.tsx +++ b/src/renderer/src/pages/home/Tabs/SettingsTab.tsx @@ -134,19 +134,19 @@ const SettingsTab: FC = (props) => { const onTemperatureChange = (value) => { if (!isNaN(value as number)) { - onUpdateAssistantSettings({ temperature: value }) + onUpdateAssistantSettings({ temperature: Number(value) }) } } const onContextCountChange = (value) => { if (!isNaN(value as number)) { - onUpdateAssistantSettings({ contextCount: value }) + onUpdateAssistantSettings({ contextCount: Number(value) }) } } const onMaxTokensChange = (value) => { if (!isNaN(value as number)) { - onUpdateAssistantSettings({ maxTokens: value }) + onUpdateAssistantSettings({ maxTokens: Number(value) }) } } diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index bc594235a7..c311983760 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -52,19 +52,19 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA const onTemperatureChange = (value) => { if (!isNaN(value as number)) { - updateAssistantSettings({ temperature: value }) + updateAssistantSettings({ temperature: Number(value) }) } } const onContextCountChange = (value) => { if (!isNaN(value as number)) { - updateAssistantSettings({ contextCount: value }) + updateAssistantSettings({ contextCount: Number(value) }) } } const onTopPChange = (value) => { if (!isNaN(value as number)) { - updateAssistantSettings({ topP: value }) + updateAssistantSettings({ topP: Number(value) }) } } @@ -114,7 +114,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA onUpdateCustomParameter(index, 'value', value || 0)} + onChange={(value) => onUpdateCustomParameter(index, 'value', Number(value) || 0)} step={0.01} /> ) @@ -278,7 +278,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA onChange={(value) => { if (!isNull(value)) { setTemperature(value) - setTimeoutTimer('temperature_onChange', () => updateAssistantSettings({ temperature: value }), 500) + setTimeoutTimer('temperature_onChange', () => updateAssistantSettings({ temperature: Number(value) }), 500) } }} style={{ width: '100%' }} @@ -326,7 +326,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA onChange={(value) => { if (!isNull(value)) { setTopP(value) - setTimeoutTimer('topP_onChange', () => updateAssistantSettings({ topP: value }), 500) + setTimeoutTimer('topP_onChange', () => updateAssistantSettings({ topP: Number(value) }), 500) } }} style={{ width: '100%' }} @@ -355,7 +355,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA onChange={(value) => { if (!isNull(value)) { setContextCount(value) - setTimeoutTimer('contextCount_onChange', () => updateAssistantSettings({ contextCount: value }), 500) + setTimeoutTimer('contextCount_onChange', () => updateAssistantSettings({ contextCount: Number(value) }), 500) } }} formatter={(value) => (value === MAX_CONTEXT_COUNT ? t('chat.settings.max') : (value ?? ''))} @@ -417,7 +417,7 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA onChange={(value) => { if (!isNull(value)) { setMaxTokens(value) - setTimeoutTimer('maxTokens_onChange', () => updateAssistantSettings({ maxTokens: value }), 1000) + setTimeoutTimer('maxTokens_onChange', () => updateAssistantSettings({ maxTokens: Number(value) }), 1000) } }} style={{ width: '100%' }} diff --git a/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx b/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx index 2b1bed5ebe..7322142de6 100644 --- a/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx +++ b/src/renderer/src/pages/settings/ModelSettings/DefaultAssistantSettings.tsx @@ -55,7 +55,7 @@ const AssistantSettings: FC = () => { (setter: Dispatch>, updater: (value: number) => void) => (value: number | null) => { if (value !== null) { setter(value) - updater(value) + updater(Number(value)) } } const onTemperatureChange = handleChange(setTemperature, (value) => onUpdateAssistantSettings({ temperature: value }))