llm: make Tool.Run return ToolOut
This is preliminary work towards
allowing tools to add additional information.
No functional changes (at least, that's the intent).
diff --git a/claudetool/keyword.go b/claudetool/keyword.go
index 7f2c492..69b789e 100644
--- a/claudetool/keyword.go
+++ b/claudetool/keyword.go
@@ -83,10 +83,10 @@
return strings.TrimSpace(string(out)), nil
}
-func keywordRun(ctx context.Context, m json.RawMessage) ([]llm.Content, error) {
+func keywordRun(ctx context.Context, m json.RawMessage) llm.ToolOut {
var input keywordInput
if err := json.Unmarshal(m, &input); err != nil {
- return nil, err
+ return llm.ErrorToolOut(err)
}
wd := WorkingDir(ctx)
root, err := FindRepoRoot(wd)
@@ -100,7 +100,7 @@
for _, term := range input.SearchTerms {
out, err := ripgrep(ctx, wd, []string{term})
if err != nil {
- return nil, err
+ return llm.ErrorToolOut(err)
}
if len(out) > 64*1024 {
slog.InfoContext(ctx, "keyword search result too large", "term", term, "bytes", len(out))
@@ -110,7 +110,7 @@
}
if len(keep) == 0 {
- return llm.TextContent("each of those search terms yielded too many results"), nil
+ return llm.ToolOut{LLMContent: llm.TextContent("each of those search terms yielded too many results")}
}
// peel off keywords until we get a result that fits in the query window
@@ -119,7 +119,7 @@
var err error
out, err = ripgrep(ctx, wd, keep)
if err != nil {
- return nil, err
+ return llm.ErrorToolOut(err)
}
if len(out) < 128*1024 {
break
@@ -143,10 +143,10 @@
resp, err := convo.SendMessage(initialMessage)
if err != nil {
- return nil, fmt.Errorf("failed to send relevance filtering message: %w", err)
+ return llm.ErrorfToolOut("failed to send relevance filtering message: %w", err)
}
if len(resp.Content) != 1 {
- return nil, fmt.Errorf("unexpected number of messages in relevance filtering response: %d", len(resp.Content))
+ return llm.ErrorfToolOut("unexpected number of messages in relevance filtering response: %d", len(resp.Content))
}
filtered := resp.Content[0].Text
@@ -159,7 +159,7 @@
"filtered", filtered,
)
- return llm.TextContent(resp.Content[0].Text), nil
+ return llm.ToolOut{LLMContent: llm.TextContent(resp.Content[0].Text)}
}
func ripgrep(ctx context.Context, wd string, terms []string) (string, error) {