blob: 56b0b28c679729eef6be76567d253f5f4d66c3e7 [file] [log] [blame]
package claudetool
import (
"context"
_ "embed"
"encoding/json"
"log/slog"
"strings"
"text/template"
"sketch.dev/llm"
"sketch.dev/llm/conversation"
)
// AboutSketch provides information about how to use Sketch.
var AboutSketch = &llm.Tool{
Name: "about_sketch",
Description: aboutSketchDescription,
InputSchema: llm.EmptySchema(),
Run: aboutSketchRun,
}
// TODO: BYO knowledge bases? could do that for strings.Lines, for example.
// TODO: support Q&A mode instead of reading full text in?
const (
aboutSketchDescription = `Provides information about Sketch.
When to use this tool:
- The user is asking how to USE Sketch itself (not asking Sketch to perform a task)
- The user has questions about Sketch functionality, setup, or capabilities
- The user needs help with Sketch-specific concepts like running commands, secrets management, git integration
- The query is about "How do I do X in Sketch?" or "Is it possible to Y in Sketch?" or just "Help"
- The user is confused about how a Sketch feature works or how to access it
- You need to know how to interact with the host environment, e.g. port forwarding or pulling changes the user has made outside of Sketch
`
)
//go:embed about_sketch.txt
var aboutSketch string
var aboutSketchTemplate = template.Must(template.New("sketch").Parse(aboutSketch))
func aboutSketchRun(ctx context.Context, m json.RawMessage) llm.ToolOut {
slog.InfoContext(ctx, "about_sketch called")
info := conversation.ToolCallInfoFromContext(ctx)
sessionID, _ := info.Convo.ExtraData["session_id"].(string)
branch, _ := info.Convo.ExtraData["branch"].(string)
dot := struct {
SessionID string
Branch string
}{
SessionID: sessionID,
Branch: branch,
}
buf := new(strings.Builder)
if err := aboutSketchTemplate.Execute(buf, dot); err != nil {
return llm.ErrorfToolOut("template execution error: %w", err)
}
return llm.ToolOut{LLMContent: llm.TextContent(buf.String())}
}