Class: OmniAI::Tool

Inherits:
Object
  • Object
show all
Defined in:
lib/omniai/tool.rb

Overview

Usage:

class Weather < OmniAI::Tool
  description 'Find the weather for a location'

  parameter :location, :string, description: 'The location to find the weather for (e.g. "Toronto, Canada").'
  parameter :unit, :string, description: 'The unit of measurement (e.g. "Celsius" or "Fahrenheit").'
  required %i[location]

  def execute!(location:)
    # ...
  end
end

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(function = method(:execute), name: self.class.namify, description: self.class.description, parameters: self.class.parameters) ⇒ Tool

Returns a new instance of Tool.

Parameters:

  • function (Proc) (defaults to: method(:execute))
  • name (String) (defaults to: self.class.namify)
  • description (String) (defaults to: self.class.description)
  • parameters (OmniAI::Tool::Parameters) (defaults to: self.class.parameters)


80
81
82
83
84
85
86
87
88
89
90
# File 'lib/omniai/tool.rb', line 80

def initialize(
  function = method(:execute),
  name: self.class.namify,
  description: self.class.description,
  parameters: self.class.parameters
)
  @function = function
  @name = name
  @description = description
  @parameters = parameters
end

Instance Attribute Details

#descriptionString?

Returns:

  • (String, nil)


70
71
72
# File 'lib/omniai/tool.rb', line 70

def description
  @description
end

#functionProc

Returns:

  • (Proc)


62
63
64
# File 'lib/omniai/tool.rb', line 62

def function
  @function
end

#nameString

Returns:

  • (String)


66
67
68
# File 'lib/omniai/tool.rb', line 66

def name
  @name
end

#parametersHash?

Returns:

  • (Hash, nil)


74
75
76
# File 'lib/omniai/tool.rb', line 74

def parameters
  @parameters
end

Class Method Details

.description(description = nil) ⇒ String

Parameters:

  • description (String) (defaults to: nil)

    optional

Returns:

  • (String)


22
23
24
25
26
27
28
# File 'lib/omniai/tool.rb', line 22

def description(description = nil)
  if description.nil?
    @description || (superclass.description unless superclass.eql?(OmniAI::Tool))
  else
    @description = description
  end
end

.namifyString

Converts a class name to a tool:

- e.g. "IBM::Watson::SearchTool" => "ibm_watson_search"

Returns:

  • (String)


50
51
52
53
54
55
56
57
# File 'lib/omniai/tool.rb', line 50

def namify
  name
    .gsub("::", "_")
    .gsub(/(?<prefix>[A-Z+])(?<suffix>[A-Z][a-z])/, '\k<prefix>_\k<suffix>')
    .gsub(/(?<prefix>[a-z])(?<suffix>[A-Z])/, '\k<prefix>_\k<suffix>')
    .gsub(/_tool$/i, "")
    .downcase
end

.parameter(name, kind) ⇒ Object

Parameters:

  • name (Symbol)
  • kind (Symbol)


37
38
39
# File 'lib/omniai/tool.rb', line 37

def parameter(name, kind, **)
  parameters.properties[name] = OmniAI::Schema.build(kind, **)
end

.parametersOmniAI::Schema::Object



31
32
33
# File 'lib/omniai/tool.rb', line 31

def parameters
  @parameters ||= superclass.eql?(OmniAI::Tool) ? superclass.parameters.dup : OmniAI::Schema::Object.new
end

.required(names) ⇒ Object

Parameters:

  • names (Array<Symbol>)


42
43
44
# File 'lib/omniai/tool.rb', line 42

def required(names)
  parameters.required += names
end

Instance Method Details

#call(args = {}) ⇒ String

Examples:

tool.call({ "n" => 6 })
#=> 8

Parameters:

  • args (Hash) (defaults to: {})

Returns:

  • (String)


138
139
140
# File 'lib/omniai/tool.rb', line 138

def call(args = {})
  @function.call(**(@parameters.is_a?(Schema::Object) ? @parameters.parse(args) : args))
end

#executeObject

Raises:

  • (NotImplementedError)


128
129
130
# File 'lib/omniai/tool.rb', line 128

def execute(...)
  raise NotImplementedError, "#{self.class}#execute undefined"
end

#serialize(context: nil) ⇒ Hash

Examples:

tool.serialize
# {
#   type: 'function',
#   function: {
#     name: 'Fibonacci',
#     description: 'Calculate the nth Fibonacci number',
#     parameters: {
#       type: 'object',
#       properties: {
#         n: {
#           description: 'The nth Fibonacci number to calculate')
#           type: 'integer'
#         }
#       },
#       required: ['n']
#     }
#   }
# }

Parameters:

  • context (Context) (defaults to: nil)

    optional

Returns:

  • (Hash)


114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/omniai/tool.rb', line 114

def serialize(context: nil)
  serialize = context&.serializer(:tool)
  return serialize.call(self, context:) if serialize

  {
    type: "function",
    function: {
      name: @name,
      description: @description,
      parameters: @parameters.is_a?(Schema::Object) ? @parameters.serialize : @parameters,
    }.compact,
  }
end