mirror of
https://github.com/ollama/ollama.git
synced 2025-11-11 20:57:58 +01:00
* app: add code for macOS and Windows apps under 'app' * app: add readme * app: windows and linux only for now * ci: fix ui CI validation --------- Co-authored-by: jmorganca <jmorganca@gmail.com>
123 lines
3.1 KiB
Go
123 lines
3.1 KiB
Go
//go:build windows || darwin
|
|
|
|
package tools
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
)
|
|
|
|
// Tool defines the interface that all tools must implement
|
|
type Tool interface {
|
|
// Name returns the unique identifier for the tool
|
|
Name() string
|
|
|
|
// Description returns a human-readable description of what the tool does
|
|
Description() string
|
|
|
|
// Schema returns the JSON schema for the tool's parameters
|
|
Schema() map[string]any
|
|
|
|
// Execute runs the tool with the given arguments and returns result to store in db, and a string result for the model
|
|
Execute(ctx context.Context, args map[string]any) (any, string, error)
|
|
|
|
// Prompt returns a prompt for the tool
|
|
Prompt() string
|
|
}
|
|
|
|
// Registry manages the available tools and their execution
|
|
type Registry struct {
|
|
tools map[string]Tool
|
|
workingDir string // Working directory for all tool operations
|
|
}
|
|
|
|
// NewRegistry creates a new tool registry with no tools
|
|
func NewRegistry() *Registry {
|
|
return &Registry{
|
|
tools: make(map[string]Tool),
|
|
}
|
|
}
|
|
|
|
// Register adds a tool to the registry
|
|
func (r *Registry) Register(tool Tool) {
|
|
r.tools[tool.Name()] = tool
|
|
}
|
|
|
|
// Get retrieves a tool by name
|
|
func (r *Registry) Get(name string) (Tool, bool) {
|
|
tool, exists := r.tools[name]
|
|
return tool, exists
|
|
}
|
|
|
|
// List returns all available tools
|
|
func (r *Registry) List() []Tool {
|
|
tools := make([]Tool, 0, len(r.tools))
|
|
for _, tool := range r.tools {
|
|
tools = append(tools, tool)
|
|
}
|
|
return tools
|
|
}
|
|
|
|
// SetWorkingDir sets the working directory for all tool operations
|
|
func (r *Registry) SetWorkingDir(dir string) {
|
|
r.workingDir = dir
|
|
}
|
|
|
|
// Execute runs a tool with the given name and arguments
|
|
func (r *Registry) Execute(ctx context.Context, name string, args map[string]any) (any, string, error) {
|
|
tool, ok := r.tools[name]
|
|
if !ok {
|
|
return nil, "", fmt.Errorf("unknown tool: %s", name)
|
|
}
|
|
|
|
result, text, err := tool.Execute(ctx, args)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
return result, text, nil
|
|
}
|
|
|
|
// ToolCall represents a request to execute a tool
|
|
type ToolCall struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"`
|
|
Function ToolFunction `json:"function"`
|
|
}
|
|
|
|
// ToolFunction represents the function call details
|
|
type ToolFunction struct {
|
|
Name string `json:"name"`
|
|
Arguments json.RawMessage `json:"arguments"`
|
|
}
|
|
|
|
// ToolResult represents the result of a tool execution
|
|
type ToolResult struct {
|
|
ToolCallID string `json:"tool_call_id"`
|
|
Content any `json:"content"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|
|
|
|
// ToolSchemas returns all tools as schema maps suitable for API calls
|
|
func (r *Registry) AvailableTools() []map[string]any {
|
|
schemas := make([]map[string]any, 0, len(r.tools))
|
|
for _, tool := range r.tools {
|
|
schema := map[string]any{
|
|
"name": tool.Name(),
|
|
"description": tool.Description(),
|
|
"schema": tool.Schema(),
|
|
}
|
|
schemas = append(schemas, schema)
|
|
}
|
|
return schemas
|
|
}
|
|
|
|
// ToolNames returns a list of all tool names
|
|
func (r *Registry) ToolNames() []string {
|
|
names := make([]string, 0, len(r.tools))
|
|
for name := range r.tools {
|
|
names = append(names, name)
|
|
}
|
|
return names
|
|
}
|