mirror of
https://github.com/likelovewant/ollama-for-amd.git
synced 2025-12-23 07:03:57 +00:00
app: add code for macOS and Windows apps under 'app' (#12933)
* 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>
This commit is contained in:
122
app/tools/tools.go
Normal file
122
app/tools/tools.go
Normal file
@@ -0,0 +1,122 @@
|
||||
//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
|
||||
}
|
||||
Reference in New Issue
Block a user