File tree Expand file tree Collapse file tree 3 files changed +64
-4
lines changed
Expand file tree Collapse file tree 3 files changed +64
-4
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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' , ( ) => {
Original file line number Diff line number Diff 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 */
577579export 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
You can’t perform that action at this time.
0 commit comments