diff --git a/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts b/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts index c1c06b359b..e755ce3f20 100644 --- a/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts +++ b/src/renderer/src/aiCore/legacy/clients/BaseApiClient.ts @@ -405,6 +405,9 @@ export abstract class BaseApiClient< if (!param.name?.trim()) { return acc } + // Parse JSON type parameters (Legacy API clients) + // Related: src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx:133-148 + // The UI stores JSON type params as strings, this function parses them before sending to API if (param.type === 'json') { const value = param.value as string if (value === 'undefined') { diff --git a/src/renderer/src/aiCore/utils/reasoning.ts b/src/renderer/src/aiCore/utils/reasoning.ts index ba4ab35f8e..8f0df91e7b 100644 --- a/src/renderer/src/aiCore/utils/reasoning.ts +++ b/src/renderer/src/aiCore/utils/reasoning.ts @@ -684,6 +684,10 @@ export function getCustomParameters(assistant: Assistant): Record { if (!param.name?.trim()) { return acc } + // Parse JSON type parameters + // Related: src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx:133-148 + // The UI stores JSON type params as strings (e.g., '{"key":"value"}') + // This function parses them into objects before sending to the API if (param.type === 'json') { const value = param.value as string if (value === 'undefined') { diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx index c452096d47..bc594235a7 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantModelSettings.tsx @@ -135,12 +135,18 @@ const AssistantModelSettings: FC = ({ assistant, updateAssistant, updateA { - try { - const jsonValue = JSON.parse(e.target.value) - onUpdateCustomParameter(index, 'value', jsonValue) - } catch { - onUpdateCustomParameter(index, 'value', e.target.value) - } + // For JSON type parameters, always store the value as a STRING + // + // Data Flow: + // 1. UI stores: { name: "config", value: '{"key":"value"}', type: "json" } ← STRING format + // 2. API parses: getCustomParameters() in src/renderer/src/aiCore/utils/reasoning.ts:687-696 + // calls JSON.parse() to convert string to object + // 3. Request sends: The parsed object is sent to the AI provider + // + // Previously this code was parsing JSON here and storing + // the object directly, which caused getCustomParameters() to fail when trying + // to JSON.parse() an already-parsed object. + onUpdateCustomParameter(index, 'value', e.target.value) }} /> )