From e0e904ff98dfab5e2c78263ac91f3cf529f9ec62 Mon Sep 17 00:00:00 2001 From: Ettore Di Giacinto Date: Sun, 4 Jan 2026 17:40:48 +0000 Subject: [PATCH] fixups Signed-off-by: Ettore Di Giacinto --- pkg/functions/functions.go | 71 +++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/pkg/functions/functions.go b/pkg/functions/functions.go index f4a90636e..c1360b994 100644 --- a/pkg/functions/functions.go +++ b/pkg/functions/functions.go @@ -110,43 +110,60 @@ func SanitizeTools(tools Tools) Tools { return tools } + xlog.Debug("SanitizeTools: processing tools", "count", len(tools)) sanitized := make(Tools, 0, len(tools)) for _, tool := range tools { // Create a copy of the tool to avoid modifying the original sanitizedTool := Tool{ - Type: tool.Type, - Function: tool.Function, + Type: tool.Type, + Function: Function{ + Name: tool.Function.Name, + Description: tool.Function.Description, + Strict: tool.Function.Strict, + }, } - // Check if the tool has parameters - if sanitizedTool.Function.Parameters != nil { - // Check if parameters has a "properties" field - if properties, ok := sanitizedTool.Function.Parameters["properties"]; ok { - // Try to cast properties to a map - if propertiesMap, ok := properties.(map[string]interface{}); ok { - // Create a new map for sanitized properties - sanitizedProperties := make(map[string]interface{}) - hasNullValues := false + // Deep copy and sanitize parameters + if tool.Function.Parameters != nil { + // Create a new Parameters map + sanitizedTool.Function.Parameters = make(map[string]interface{}) - // Iterate through properties and remove null values - for key, value := range propertiesMap { - if value == nil { - // Convert null to empty object - sanitizedProperties[key] = map[string]interface{}{} - hasNullValues = true - xlog.Warn("Found null value in tool parameter properties, converting to empty object", - "tool", sanitizedTool.Function.Name, - "parameter", key) - } else { - // Preserve valid values - sanitizedProperties[key] = value + // Copy all parameters, sanitizing properties if present + for key, value := range tool.Function.Parameters { + if key == "properties" { + // Special handling for properties - sanitize null values + if propertiesMap, ok := value.(map[string]interface{}); ok { + // Create a new map for sanitized properties + sanitizedProperties := make(map[string]interface{}) + + // Iterate through properties and convert null values to empty objects + for propKey, propValue := range propertiesMap { + // Check for nil/null values (handles both Go nil and JSON null) + if propValue == nil { + // Convert null to empty object to prevent Jinja template errors + sanitizedProperties[propKey] = map[string]interface{}{} + xlog.Warn("Found null value in tool parameter properties, converting to empty object", + "tool", sanitizedTool.Function.Name, + "parameter", propKey) + } else { + // Check if value is a map/object - if so, ensure it's not null + if propValueMap, ok := propValue.(map[string]interface{}); ok { + // It's already a valid map, preserve it + sanitizedProperties[propKey] = propValueMap + } else { + // Preserve other valid values (strings, numbers, arrays, etc.) + sanitizedProperties[propKey] = propValue + } + } } - } - - // Update the properties if we found null values - if hasNullValues { sanitizedTool.Function.Parameters["properties"] = sanitizedProperties + } else { + // If properties is not a map, preserve as-is + sanitizedTool.Function.Parameters[key] = value } + } else { + // Copy other parameters as-is + sanitizedTool.Function.Parameters[key] = value } } }