class RubyLLM::Tool
def call(args)
def call(args) RubyLLM.logger.debug "Tool #{name} called with: #{args.inspect}" result = execute(**args.transform_keys(&:to_sym)) RubyLLM.logger.debug "Tool #{name} returned: #{result.inspect}" result rescue StandardError => e RubyLLM.logger.error "Tool #{name} failed with error: #{e.message}" { error: e.message } end
def description(text = nil)
def description(text = nil) return @description unless text @description = text end
def description
def description self.class.description end
def execute(...)
def execute(...) raise NotImplementedError, 'Subclasses must implement #execute' end
def name
def name self.class.name .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2') .gsub(/([a-z\d])([A-Z])/, '\1_\2') .downcase .delete_suffix('_tool') end
def param(name, **options)
def param(name, **options) parameters[name] = Parameter.new(name, **options) end
def parameters
def parameters @parameters ||= {} end
def parameters
def parameters self.class.parameters end