Module: OllamaChat::ToolCalling

Included in:
Chat
Defined in:
lib/ollama_chat/tool_calling.rb

Overview

A module that provides tool calling functionality for OllamaChat.

The ToolCalling module encapsulates methods for managing and processing tool calls within the chat application. It handles the registration and execution of tools that can be invoked during conversations, allowing the chat to interact with external systems or perform specialized tasks beyond simple text generation.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#enabled_toolsArray<String> (readonly)

Provides access to the list of enabled tools for the chat session.

Returns:

  • (Array<String>)

    an Array containing the enabled tools



38
39
40
# File 'lib/ollama_chat/tool_calling.rb', line 38

def enabled_tools
  @enabled_tools
end

#tool_call_resultsHash (readonly)

The tool_call_results reader returns the tools’ results for the chat session if any.

Returns:

  • (Hash)

    a hash containing the registered tool results



94
95
96
# File 'lib/ollama_chat/tool_calling.rb', line 94

def tool_call_results
  @tool_call_results
end

Instance Method Details

#configured_toolsArray<String>

The configured_tools method returns an array of tool names configured for the chat session.

This method retrieves the list of available tools from the configuration and returns them as a sorted array of strings. It handles cases where the tools configuration might be nil or empty by returning an empty array.

Returns:

  • (Array<String>)

    a sorted array of tool names configured for the chat session



86
87
88
# File 'lib/ollama_chat/tool_calling.rb', line 86

def configured_tools
  Array(config.tools&.functions&.attribute_names&.map(&:to_s)).sort
end

#default_enabled_toolsArray<String>

The default_enabled_tools method returns an array of tool names that are configured as default tools.

This method iterates through the configured tools and collects those that are registered and have the default flag set to true. Unregistered tools are skipped with a warning message.

Returns:

  • (Array<String>)

    a sorted array of tool names that are configured as default tools



65
66
67
68
69
70
71
72
73
74
75
# File 'lib/ollama_chat/tool_calling.rb', line 65

def default_enabled_tools
  result = []
  config.tools.functions.each { |n, v|
    if tool_registered?(n)
      result << n.to_s if v.default
    else
      STDERR.puts "Skipping configuration for unregistered tool %s" % bold { n }
    end
  }
  result
end

#disable_toolObject

The disable_tool method allows the user to select and disable a tool from a list of enabled tools.

This method presents a menu of currently enabled tools to the user, allowing them to choose which tool to disable. It uses the chooser to display the available tools and handles the user’s selection by removing the chosen tool from the list of enabled tools and sorting the list afterwards.



143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/ollama_chat/tool_calling.rb', line 143

def disable_tool
  select_tools = enabled_tools
  select_tools += [ '[EXIT]' ]
  case chosen = OllamaChat::Utils::Chooser.choose(select_tools)
  when '[EXIT]', nil
    STDOUT.puts "Exiting chooser."
    return
  when *select_tools
    enabled_tools.delete chosen
    puts "Disabled tool %s" % bold { chosen }
  end
end

#enable_toolObject

The enable_tool method allows the user to select and enable a tool from a list of available tools.

This method presents a menu of tools that can be enabled, excluding those that are already enabled. It uses the chooser to display the available tools and handles the user’s selection by adding the chosen tool to the list of enabled tools and sorting the list.



121
122
123
124
125
126
127
128
129
130
131
132
133
# File 'lib/ollama_chat/tool_calling.rb', line 121

def enable_tool
  select_tools = configured_tools - enabled_tools
  select_tools += [ '[EXIT]' ]
  case chosen = OllamaChat::Utils::Chooser.choose(select_tools)
  when '[EXIT]', nil
    STDOUT.puts "Exiting chooser."
    return
  when *select_tools
    enabled_tools << chosen
    enabled_tools.sort!
    puts "Enabled tool %s" % bold { chosen }
  end
end

#handle_tool_call_results?String? (private)

The handle_tool_call_results? method processes and returns results from tool calls.

This method checks if there are any pending tool call results and formats them into a string message. It clears the tool call results after processing.

Returns:

  • (String, nil)

    a formatted string containing tool call results or nil if no results exist



179
180
181
182
183
184
185
186
# File 'lib/ollama_chat/tool_calling.rb', line 179

def handle_tool_call_results?
  @tool_call_results.present? or return
  content = @tool_call_results.map do |name, result|
    "Tool %s returned %s" % [ name, result ]
  end.join(?\n)
  @tool_call_results.clear
  content
end

#list_toolsObject

The list_tools method displays the sorted list of enabled tools.

This method outputs to standard output the alphabetically sorted list of tool names that are currently enabled in the chat session.



100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/ollama_chat/tool_calling.rb', line 100

def list_tools
  STDOUT.puts "Registered tools:"
  configured_tools.each do |tool|
    enabled = tool_enabled?(tool) ? ?✓ : ?☐
    require_confirmation = tool_function(tool).require_confirmation? ? ?? : ?☐
    printf(
      "%s %s %s\n",
      enabled, require_confirmation, (enabled ? bold { tool } : tool)
    )
  end
  STDOUT.puts ?┉ * Tins::Terminal.columns
  tools_support.show
end

#tool_configured?(name) ⇒ true, false

Checks whether a tool is configured in the chat configuration.

Parameters:

  • name (String)

    the name of the tool

Returns:

  • (true, false)

    true if the tool is configured



13
14
15
# File 'lib/ollama_chat/tool_calling.rb', line 13

def tool_configured?(name)
  config.tools.functions.attribute_set?(name)
end

#tool_enabled?(name) ⇒ true, false

Checks if a tool is currently enabled for the chat session.

Parameters:

  • name (String)

    the name of the tool

Returns:

  • (true, false)

    true if the tool is enabled



44
45
46
# File 'lib/ollama_chat/tool_calling.rb', line 44

def tool_enabled?(name)
  enabled_tools.member?(name.to_s)
end

#tool_function(name) ⇒ ComplexConfig::Settings

The tool_function method retrieves a tool configuration by name from the chat’s configuration.

Parameters:

  • name (String)

    the name of the tool to retrieve

Returns:

  • (ComplexConfig::Settings)

    the tool configuration object corresponding to the given name



23
24
25
# File 'lib/ollama_chat/tool_calling.rb', line 23

def tool_function(name)
  config.tools.functions[name]
end

#tool_paths_allowedObject

The tool_paths_allowed method returns a hash mapping each enabled tool name to its list of allowed paths or patterns. @return [Hash] a hash where keys are tool names and values are the allowed path lists



159
160
161
162
163
164
165
166
# File 'lib/ollama_chat/tool_calling.rb', line 159

def tool_paths_allowed
  config.tools.functions.to_h.
    select { |name, value| tool_enabled?(name) && value[:allowed].present? }.
    sort_by(&:first).
    each_with_object({}) { |(name, value), hash|
      hash[name] = value[:allowed].map { Pathname.new(_1).expand_path.to_s }
    }
end

#tool_registered?(name) ⇒ true, false

Determines whether a tool has been registered in the tool registry.

Parameters:

  • name (String)

    the name of the tool

Returns:

  • (true, false)

    true if the tool is registered



31
32
33
# File 'lib/ollama_chat/tool_calling.rb', line 31

def tool_registered?(name)
  OllamaChat::Tools.registered?(name)
end

#toolsHash

The tools reader returns the registered tools for the chat session.

Returns:

  • (Hash)

    a hash containing the registered tools



51
52
53
54
# File 'lib/ollama_chat/tool_calling.rb', line 51

def tools
  @tools_support.off? and return []
  enabled_tools.map { OllamaChat::Tools.registered[it]&.to_hash }.compact
end