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