Skip to content

Commit 163db5c

Browse files
authored
fix(agent): filter out empty params to ensure LLM can set tool params at runtime (#2288)
1 parent bbbb13a commit 163db5c

File tree

3 files changed

+64
-4
lines changed

3 files changed

+64
-4
lines changed

apps/sim/providers/utils.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,10 +1011,21 @@ export function prepareToolExecution(
10111011
toolParams: Record<string, any>
10121012
executionParams: Record<string, any>
10131013
} {
1014+
// Filter out empty/null/undefined values from user params
1015+
// so that cleared fields don't override LLM-generated values
1016+
const filteredUserParams: Record<string, any> = {}
1017+
if (tool.params) {
1018+
for (const [key, value] of Object.entries(tool.params)) {
1019+
if (value !== undefined && value !== null && value !== '') {
1020+
filteredUserParams[key] = value
1021+
}
1022+
}
1023+
}
1024+
10141025
// User-provided params take precedence over LLM-generated params
10151026
const toolParams = {
10161027
...llmArgs,
1017-
...tool.params,
1028+
...filteredUserParams,
10181029
}
10191030

10201031
// Add system parameters for execution

apps/sim/tools/params.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,44 @@ describe('Tool Parameters Utils', () => {
177177
expect(merged.message).toBe('Hello world')
178178
expect(merged.timeout).toBe(10000)
179179
})
180+
181+
it.concurrent('should skip empty strings so LLM values are used', () => {
182+
const userProvided = {
183+
apiKey: 'user-key',
184+
channel: '', // User cleared this field
185+
message: '', // User cleared this field too
186+
}
187+
const llmGenerated = {
188+
message: 'Hello world',
189+
channel: '#random',
190+
timeout: 10000,
191+
}
192+
193+
const merged = mergeToolParameters(userProvided, llmGenerated)
194+
195+
expect(merged.apiKey).toBe('user-key') // Non-empty user value preserved
196+
expect(merged.channel).toBe('#random') // LLM value used because user value was empty
197+
expect(merged.message).toBe('Hello world') // LLM value used because user value was empty
198+
expect(merged.timeout).toBe(10000)
199+
})
200+
201+
it.concurrent('should skip null and undefined values', () => {
202+
const userProvided = {
203+
apiKey: 'user-key',
204+
channel: null,
205+
message: undefined,
206+
}
207+
const llmGenerated = {
208+
message: 'Hello world',
209+
channel: '#random',
210+
}
211+
212+
const merged = mergeToolParameters(userProvided, llmGenerated)
213+
214+
expect(merged.apiKey).toBe('user-key')
215+
expect(merged.channel).toBe('#random') // LLM value used
216+
expect(merged.message).toBe('Hello world') // LLM value used
217+
})
180218
})
181219

182220
describe('validateToolParameters', () => {

apps/sim/tools/params.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -572,16 +572,27 @@ export function createExecutionToolSchema(toolConfig: ToolConfig): ToolSchema {
572572
}
573573

574574
/**
575-
* Merges user-provided parameters with LLM-generated parameters
575+
* Merges user-provided parameters with LLM-generated parameters.
576+
* User-provided parameters take precedence, but empty strings are skipped
577+
* so that LLM-generated values are used when user clears a field.
576578
*/
577579
export function mergeToolParameters(
578580
userProvidedParams: Record<string, unknown>,
579581
llmGeneratedParams: Record<string, unknown>
580582
): Record<string, unknown> {
581-
// User-provided parameters take precedence
583+
// Filter out empty strings from user-provided params
584+
// so that cleared fields don't override LLM values
585+
const filteredUserParams: Record<string, unknown> = {}
586+
for (const [key, value] of Object.entries(userProvidedParams)) {
587+
if (value !== undefined && value !== null && value !== '') {
588+
filteredUserParams[key] = value
589+
}
590+
}
591+
592+
// User-provided parameters take precedence (after filtering empty values)
582593
return {
583594
...llmGeneratedParams,
584-
...userProvidedParams,
595+
...filteredUserParams,
585596
}
586597
}
587598

0 commit comments

Comments
 (0)