fix: ensure numeric settings are always stored and sent as numbers, not strings

Co-authored-by: DeJeune <67425183+DeJeune@users.noreply.github.com>
This commit is contained in:
copilot-swe-agent[bot] 2025-12-11 07:56:08 +00:00
parent 18d5f74f36
commit ba76919fe0
5 changed files with 27 additions and 14 deletions

View File

@ -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

View File

@ -702,6 +702,13 @@ export function getCustomParameters(assistant: Assistant): Record<string, any> {
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

View File

@ -134,19 +134,19 @@ const SettingsTab: FC<Props> = (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) })
}
}

View File

@ -52,19 +52,19 @@ const AssistantModelSettings: FC<Props> = ({ 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<Props> = ({ assistant, updateAssistant, updateA
<InputNumber
style={{ width: '100%' }}
value={param.value as number}
onChange={(value) => onUpdateCustomParameter(index, 'value', value || 0)}
onChange={(value) => onUpdateCustomParameter(index, 'value', Number(value) || 0)}
step={0.01}
/>
)
@ -278,7 +278,7 @@ const AssistantModelSettings: FC<Props> = ({ 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<Props> = ({ 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<Props> = ({ 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<Props> = ({ 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%' }}

View File

@ -55,7 +55,7 @@ const AssistantSettings: FC = () => {
(setter: Dispatch<SetStateAction<number>>, 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 }))