api: implement stringer for ToolFunctionParameters (#12038)

This commit is contained in:
Jeffrey Morgan 2025-08-22 16:26:48 -07:00 committed by GitHub
parent 4bcb04ad88
commit d3450dd52e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 67 additions and 37 deletions

View File

@ -286,16 +286,23 @@ func mapToTypeScriptType(jsonType string) string {
} }
} }
type ToolFunction struct { type ToolFunctionParameters struct {
Name string `json:"name"`
Description string `json:"description"`
Parameters struct {
Type string `json:"type"` Type string `json:"type"`
Defs any `json:"$defs,omitempty"` Defs any `json:"$defs,omitempty"`
Items any `json:"items,omitempty"` Items any `json:"items,omitempty"`
Required []string `json:"required"` Required []string `json:"required"`
Properties map[string]ToolProperty `json:"properties"` Properties map[string]ToolProperty `json:"properties"`
} `json:"parameters"` }
func (t *ToolFunctionParameters) String() string {
bts, _ := json.Marshal(t)
return string(bts)
}
type ToolFunction struct {
Name string `json:"name"`
Description string `json:"description"`
Parameters ToolFunctionParameters `json:"parameters"`
} }
func (t *ToolFunction) String() string { func (t *ToolFunction) String() string {

View File

@ -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)
})
}
}

View File

@ -41,13 +41,7 @@ func TestParser(t *testing.T) {
Function: api.ToolFunction{ Function: api.ToolFunction{
Name: "get_temperature", Name: "get_temperature",
Description: "Retrieve the temperature for a given location", Description: "Retrieve the temperature for a given location",
Parameters: struct { Parameters: api.ToolFunctionParameters{
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"`
}{
Type: "object", Type: "object",
Required: []string{"city"}, Required: []string{"city"},
Properties: map[string]api.ToolProperty{ Properties: map[string]api.ToolProperty{
@ -69,13 +63,7 @@ func TestParser(t *testing.T) {
Function: api.ToolFunction{ Function: api.ToolFunction{
Name: "get_conditions", Name: "get_conditions",
Description: "Retrieve the current weather conditions for a given location", Description: "Retrieve the current weather conditions for a given location",
Parameters: struct { Parameters: api.ToolFunctionParameters{
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"`
}{
Type: "object", Type: "object",
Properties: map[string]api.ToolProperty{ Properties: map[string]api.ToolProperty{
"location": { "location": {
@ -105,13 +93,7 @@ func TestParser(t *testing.T) {
Function: api.ToolFunction{ Function: api.ToolFunction{
Name: "get_address", Name: "get_address",
Description: "Get the address of a given location", Description: "Get the address of a given location",
Parameters: struct { Parameters: api.ToolFunctionParameters{
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"`
}{
Type: "object", Type: "object",
Properties: map[string]api.ToolProperty{ Properties: map[string]api.ToolProperty{
"location": { "location": {
@ -127,13 +109,7 @@ func TestParser(t *testing.T) {
Function: api.ToolFunction{ Function: api.ToolFunction{
Name: "add", Name: "add",
Description: "Add two numbers", Description: "Add two numbers",
Parameters: struct { Parameters: api.ToolFunctionParameters{
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"`
}{
Type: "object", Type: "object",
Properties: map[string]api.ToolProperty{ Properties: map[string]api.ToolProperty{
"a": { "a": {