Class: OmniAI::Tool
- Inherits:
-
Object
- Object
- OmniAI::Tool
- 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
- .description(description = nil) ⇒ String
-
.namify ⇒ String
Converts a class name to a tool: - e.g.
- .parameter(name, kind) ⇒ Object
- .parameters ⇒ OmniAI::Schema::Object
- .required(names) ⇒ Object
Instance Method Summary collapse
- #call(args = {}) ⇒ String
- #execute ⇒ Object
-
#initialize(function = method(:execute), name: self.class.namify, description: self.class.description, parameters: self.class.parameters) ⇒ Tool
constructor
A new instance of Tool.
- #serialize(context: nil) ⇒ Hash
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.
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
#description ⇒ String?
70 71 72 |
# File 'lib/omniai/tool.rb', line 70 def description @description end |
#function ⇒ Proc
62 63 64 |
# File 'lib/omniai/tool.rb', line 62 def function @function end |
#name ⇒ String
66 67 68 |
# File 'lib/omniai/tool.rb', line 66 def name @name end |
#parameters ⇒ Hash?
74 75 76 |
# File 'lib/omniai/tool.rb', line 74 def parameters @parameters end |
Class Method Details
.description(description = nil) ⇒ 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 |
.namify ⇒ String
Converts a class name to a tool:
- e.g. "IBM::Watson::SearchTool" => "ibm_watson_search"
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
37 38 39 |
# File 'lib/omniai/tool.rb', line 37 def parameter(name, kind, **) parameters.properties[name] = OmniAI::Schema.build(kind, **) end |
.parameters ⇒ OmniAI::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
42 43 44 |
# File 'lib/omniai/tool.rb', line 42 def required(names) parameters.required += names end |
Instance Method Details
#call(args = {}) ⇒ 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 |
#execute ⇒ Object
128 129 130 |
# File 'lib/omniai/tool.rb', line 128 def execute(...) raise NotImplementedError, "#{self.class}#execute undefined" end |
#serialize(context: nil) ⇒ 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 |