// Package tools collects tools package tools import ( "context" "fmt" "log/slog" "github.com/ollama/ollama/api" "tipsy.codes/charles/mc-god/v2/internal/pkg/rcon" "tipsy.codes/charles/mc-god/v2/internal/pkg/tools/give" "tipsy.codes/charles/mc-god/v2/internal/pkg/tools/say" "tipsy.codes/charles/mc-god/v2/internal/pkg/tools/teleport" "tipsy.codes/charles/mc-god/v2/internal/pkg/tools/time" "tipsy.codes/charles/mc-god/v2/internal/pkg/tools/weather" "tipsy.codes/charles/mc-god/v2/internal/pkg/tools/zombie" ) type Tool interface { Do(ctx context.Context, toolCall api.ToolCall, client *rcon.Client) error Desc() api.Tool Name() string } type Tools map[string]Tool func New(tools ...Tool) Tools { ret := make(map[string]Tool) for _, tool := range tools { ret[tool.Name()] = tool } return ret } // DefaultTools returns the default set of tools for mc-god func DefaultTools() Tools { return New( say.Get(), teleport.Get(), give.Get(), weather.Get(), time.Get(), zombie.Get(), ) } func (t Tools) AsAPI() api.Tools { var ret api.Tools for _, tool := range t { ret = append(ret, tool.Desc()) } return ret } func (t Tools) Do(ctx context.Context, toolCall api.ToolCall, client *rcon.Client) error { tool, found := t[toolCall.Function.Name] if !found { return fmt.Errorf("unknown tool %q", toolCall.Function.Name) } args, err := toolCall.Function.Arguments.MarshalJSON() if err != nil { return fmt.Errorf("failed to marshal args: %v", err) } slog.Info("calling function", "name", toolCall.Function.Name, "args", string(args)) return tool.Do(ctx, toolCall, client) }