Skip to content

Commit 59413d3

Browse files
authored
Merge pull request #1827 from derekmisler/fix/newhandler-empty-arguments
get_memories errors on new memories
2 parents 84fe6eb + 9accc8b commit 59413d3

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

pkg/tools/tools.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@ type ToolSet interface {
1717
func NewHandler[T any](fn func(context.Context, T) (*ToolCallResult, error)) ToolHandler {
1818
return func(ctx context.Context, toolCall ToolCall) (*ToolCallResult, error) {
1919
var params T
20-
if err := json.Unmarshal([]byte(toolCall.Function.Arguments), &params); err != nil {
20+
args := toolCall.Function.Arguments
21+
if args == "" {
22+
args = "{}"
23+
}
24+
if err := json.Unmarshal([]byte(args), &params); err != nil {
2125
return nil, err
2226
}
2327
return fn(ctx, params)

pkg/tools/tools_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package tools
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestNewHandler_WithArguments(t *testing.T) {
12+
type Args struct {
13+
Name string `json:"name"`
14+
}
15+
16+
handler := NewHandler(func(_ context.Context, args Args) (*ToolCallResult, error) {
17+
return ResultSuccess("hello " + args.Name), nil
18+
})
19+
20+
result, err := handler(t.Context(), ToolCall{
21+
ID: "call_1",
22+
Type: "function",
23+
Function: FunctionCall{
24+
Name: "greet",
25+
Arguments: `{"name":"world"}`,
26+
},
27+
})
28+
require.NoError(t, err)
29+
assert.Equal(t, "hello world", result.Output)
30+
}
31+
32+
func TestNewHandler_EmptyArguments(t *testing.T) {
33+
handler := NewHandler(func(_ context.Context, _ map[string]any) (*ToolCallResult, error) {
34+
return ResultSuccess("ok"), nil
35+
})
36+
37+
result, err := handler(t.Context(), ToolCall{
38+
ID: "call_1",
39+
Type: "function",
40+
Function: FunctionCall{
41+
Name: "get_memories",
42+
Arguments: "",
43+
},
44+
})
45+
require.NoError(t, err)
46+
assert.Equal(t, "ok", result.Output)
47+
}
48+
49+
func TestNewHandler_EmptyObjectArguments(t *testing.T) {
50+
handler := NewHandler(func(_ context.Context, _ map[string]any) (*ToolCallResult, error) {
51+
return ResultSuccess("ok"), nil
52+
})
53+
54+
result, err := handler(t.Context(), ToolCall{
55+
ID: "call_1",
56+
Type: "function",
57+
Function: FunctionCall{
58+
Name: "list_things",
59+
Arguments: "{}",
60+
},
61+
})
62+
require.NoError(t, err)
63+
assert.Equal(t, "ok", result.Output)
64+
}
65+
66+
func TestNewHandler_InvalidArguments(t *testing.T) {
67+
handler := NewHandler(func(_ context.Context, _ map[string]any) (*ToolCallResult, error) {
68+
return ResultSuccess("ok"), nil
69+
})
70+
71+
_, err := handler(t.Context(), ToolCall{
72+
ID: "call_1",
73+
Type: "function",
74+
Function: FunctionCall{
75+
Name: "broken",
76+
Arguments: `{"unterminated`,
77+
},
78+
})
79+
require.Error(t, err)
80+
}

0 commit comments

Comments
 (0)