diff --git a/api/types.go b/api/types.go index a3abc5568c..85bdd31671 100644 --- a/api/types.go +++ b/api/types.go @@ -286,16 +286,23 @@ func mapToTypeScriptType(jsonType string) string { } } +type ToolFunctionParameters struct { + Type string `json:"type"` + Defs any `json:"$defs,omitempty"` + Items any `json:"items,omitempty"` + Required []string `json:"required"` + Properties map[string]ToolProperty `json:"properties"` +} + +func (t *ToolFunctionParameters) String() string { + bts, _ := json.Marshal(t) + return string(bts) +} + type ToolFunction struct { - Name string `json:"name"` - Description string `json:"description"` - Parameters struct { - Type string `json:"type"` - Defs any `json:"$defs,omitempty"` - Items any `json:"items,omitempty"` - Required []string `json:"required"` - Properties map[string]ToolProperty `json:"properties"` - } `json:"parameters"` + Name string `json:"name"` + Description string `json:"description"` + Parameters ToolFunctionParameters `json:"parameters"` } func (t *ToolFunction) String() string { diff --git a/api/types_test.go b/api/types_test.go index 8418538081..fadaa646d6 100644 --- a/api/types_test.go +++ b/api/types_test.go @@ -436,3 +436,50 @@ func TestThinking_UnmarshalJSON(t *testing.T) { }) } } + +func TestToolFunctionParameters_String(t *testing.T) { + tests := []struct { + name string + params ToolFunctionParameters + expected string + }{ + { + name: "simple object with string property", + params: ToolFunctionParameters{ + Type: "object", + Required: []string{"name"}, + Properties: map[string]ToolProperty{ + "name": { + Type: PropertyType{"string"}, + Description: "The name of the person", + }, + }, + }, + expected: `{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"The name of the person"}}}`, + }, + { + name: "marshal failure returns empty string", + params: ToolFunctionParameters{ + Type: "object", + Defs: func() any { + // Create a cycle that will cause json.Marshal to fail + type selfRef struct { + Self *selfRef + } + s := &selfRef{} + s.Self = s + return s + }(), + Properties: map[string]ToolProperty{}, + }, + expected: "", + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + result := test.params.String() + assert.Equal(t, test.expected, result) + }) + } +} diff --git a/tools/tools_test.go b/tools/tools_test.go index 36b552c964..2a449a0eac 100644 --- a/tools/tools_test.go +++ b/tools/tools_test.go @@ -41,13 +41,7 @@ func TestParser(t *testing.T) { Function: api.ToolFunction{ Name: "get_temperature", Description: "Retrieve the temperature for a given location", - Parameters: struct { - Type string `json:"type"` - Defs any `json:"$defs,omitempty"` - Items any `json:"items,omitempty"` - Required []string `json:"required"` - Properties map[string]api.ToolProperty `json:"properties"` - }{ + Parameters: api.ToolFunctionParameters{ Type: "object", Required: []string{"city"}, Properties: map[string]api.ToolProperty{ @@ -69,13 +63,7 @@ func TestParser(t *testing.T) { Function: api.ToolFunction{ Name: "get_conditions", Description: "Retrieve the current weather conditions for a given location", - Parameters: struct { - Type string `json:"type"` - Defs any `json:"$defs,omitempty"` - Items any `json:"items,omitempty"` - Required []string `json:"required"` - Properties map[string]api.ToolProperty `json:"properties"` - }{ + Parameters: api.ToolFunctionParameters{ Type: "object", Properties: map[string]api.ToolProperty{ "location": { @@ -105,13 +93,7 @@ func TestParser(t *testing.T) { Function: api.ToolFunction{ Name: "get_address", Description: "Get the address of a given location", - Parameters: struct { - Type string `json:"type"` - Defs any `json:"$defs,omitempty"` - Items any `json:"items,omitempty"` - Required []string `json:"required"` - Properties map[string]api.ToolProperty `json:"properties"` - }{ + Parameters: api.ToolFunctionParameters{ Type: "object", Properties: map[string]api.ToolProperty{ "location": { @@ -127,13 +109,7 @@ func TestParser(t *testing.T) { Function: api.ToolFunction{ Name: "add", Description: "Add two numbers", - Parameters: struct { - Type string `json:"type"` - Defs any `json:"$defs,omitempty"` - Items any `json:"items,omitempty"` - Required []string `json:"required"` - Properties map[string]api.ToolProperty `json:"properties"` - }{ + Parameters: api.ToolFunctionParameters{ Type: "object", Properties: map[string]api.ToolProperty{ "a": {