Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion internal/agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -1524,7 +1524,14 @@ func formatToolDefs(toolDefs []llm.ToolDef) string {
}
}
}
for name, p := range params {
paramNames := make([]string, 0, len(params))
for name := range params {
paramNames = append(paramNames, name)
}
sort.Strings(paramNames)

for _, name := range paramNames {
p := params[name]
suffix := ""
if required[name] {
suffix = " (required)"
Expand Down
49 changes: 49 additions & 0 deletions internal/agent/agent_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,55 @@ func TestFormatToolDefs(t *testing.T) {
}
})

t.Run("parameters are rendered in sorted order", func(t *testing.T) {
defs := []llm.ToolDef{
{
Type: "function",
Function: llm.FunctionDef{
Name: "code_search",
Description: "Search code",
Parameters: map[string]any{
"type": "object",
"properties": map[string]any{
"query": map[string]any{
"description": "Query string",
},
"case_sensitive": map[string]any{
"description": "Match case",
},
"path_glob": map[string]any{
"description": "Path glob",
},
"max_results": map[string]any{
"description": "Maximum results",
},
},
"required": []any{"query"},
},
},
},
}

got := formatToolDefs(defs)
wantLines := []string{
" - case_sensitive: Match case",
" - max_results: Maximum results",
" - path_glob: Path glob",
" - query: Query string (required)",
}
last := -1
for _, line := range wantLines {
idx := strings.Index(got, line)
if idx == -1 {
t.Fatalf("missing parameter line %q in:\n%s", line, got)
}
if idx <= last {
t.Fatalf("parameter line %q is out of order in:\n%s", line, got)
}
last = idx
}
})

t.Run("tool without parameters", func(t *testing.T) {
defs := []llm.ToolDef{
{
Expand Down
Loading