omniai 1.9.0 → 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2be85cf16b03f342e3432ac030833ab316f36de5e2d788a084b4c42776d4a848
4
- data.tar.gz: c9d036b21d875a1b5daa672af6f21a92194e8d699a52c01d8d82fe73fff18f98
3
+ metadata.gz: 0a97ef62618647e49906212c6b7d01e1b17fe3f8149a651d3f3481a3ffd46b79
4
+ data.tar.gz: d97ec89bb5eac0f6e2c393bacdc9e2e3408d1eec62b612371e465506477bc598
5
5
  SHA512:
6
- metadata.gz: 36434f2cf177a9fe41d17517604e4bb82df002af8174544d1256041b3b6bd08c522f2017a46e312ea96a151f4c39bb7023df2cb3fbcfde2b055cf625a99245e6
7
- data.tar.gz: fc28ef3dec6bce8cc7607eb282bd8a0cd715c01775732aebbb1ad0f5139d3a3ff4de385ecf545aae6437ab7788a35c065ada364dbc1865dbe3a15bf962c1b579
6
+ metadata.gz: '08f05b135a0ac4d9acaf33fc0b221d4c4cf6634a0face266a57d0886821816984b7cdda3dffe266dc4b178497bf385a75221abb0b3afd8a650065631dea8838d'
7
+ data.tar.gz: b0c5655ac13cfdc37e429181e6e7315d2a1717b2a17bce253c655c715efa9a9dd595ad1ddc05bdb9e172a0ff9167b05f9b9ddc0344a10c224be4bbc5d11b087c
data/README.md CHANGED
@@ -72,16 +72,38 @@ require 'omniai/google'
72
72
 
73
73
  CLIENT = OmniAI::Google::Client.new
74
74
 
75
+ LOCATION = OmniAI::Tool::Property.object(
76
+ properties: {
77
+ city: OmniAI::Tool::Property.string(description: 'e.g. "Toronto"'),
78
+ country: OmniAI::Tool::Property.string(description: 'e.g. "Canada"'),
79
+ },
80
+ required: %i[city country]
81
+ )
82
+
83
+ LOCATIONS = OmniAI::Tool::Property.array(
84
+ min_items: 1,
85
+ max_items: 5,
86
+ items: LOCATION
87
+ )
88
+
89
+ UNIT = OmniAI::Tool::Property.string(enum: %w[celcius fahrenheit])
90
+
91
+ WEATHER = proc do |locations:, unit: 'celsius'|
92
+ locations.map do |location|
93
+ "#{rand(20..50)}° #{unit} in #{location[:city]}, #{location[:country]}"
94
+ end.join("\n")
95
+ end
96
+
75
97
  TOOL = OmniAI::Tool.new(
76
- proc { |location:, unit: 'celsius'| "#{rand(20..50)}° #{unit} in #{location}" },
98
+ WEATHER,
77
99
  name: 'Weather',
78
100
  description: 'Lookup the weather in a location',
79
101
  parameters: OmniAI::Tool::Parameters.new(
80
102
  properties: {
81
- location: OmniAI::Tool::Property.string(description: 'e.g. Toronto'),
82
- unit: OmniAI::Tool::Property.string(enum: %w[celcius fahrenheit]),
103
+ locations: LOCATIONS,
104
+ unit: UNIT,
83
105
  },
84
- required: %i[location]
106
+ required: %i[locations]
85
107
  )
86
108
  )
87
109
 
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAI
4
+ class Tool
5
+ # Represents a schema object.
6
+ #
7
+ # @example
8
+ # array = OmniAI::Tool::Array.new(
9
+ # description: 'A list of people.',
10
+ # items: OmniAI::Tool::Object.new(
11
+ # properties: {
12
+ # name: OmniAI::Tool::Property.string(description: 'The name of the person.'),
13
+ # age: OmniAI::Tool::Property.integer(description: 'The age of the person.'),
14
+ # },
15
+ # required: %i[name]
16
+ # ),
17
+ # min_items: 1,
18
+ # max_items: 5,
19
+ # })
20
+ class Array
21
+ TYPE = 'array'
22
+
23
+ # @!attribute [rw] items
24
+ # @return [OmniAI::Tool::Object, OmniAI::Tool::Array, OmniAI::Tool::Property]
25
+ attr_accessor :items
26
+
27
+ # @!attribute [rw] max_items
28
+ # @return [Integer, nil]
29
+ attr_accessor :max_items
30
+
31
+ # @!attribute [rw] min_items
32
+ # @return [Integer, nil]
33
+ attr_accessor :min_items
34
+
35
+ # @!attribute [rw] description
36
+ # @return [String, nil]
37
+ attr_accessor :description
38
+
39
+ # @param items [OmniAI::Tool::Object, OmniAI::Tool::Array, OmniAI::Tool::Property] required
40
+ # @param max_items [Integer] optional
41
+ # @param min_items [Integer] optional
42
+ # @param description [String] optional
43
+ def initialize(items:, max_items: nil, min_items: nil, description: nil)
44
+ @items = items
45
+ @description = description
46
+ @max_items = max_items
47
+ @min_items = min_items
48
+ end
49
+
50
+ # @example
51
+ # array.serialize # => { type: 'array', items: { type: 'string' } }
52
+ #
53
+ # @return [Hash]
54
+ def serialize
55
+ {
56
+ type: TYPE,
57
+ description: @description,
58
+ items: @items.serialize,
59
+ maxItems: @max_items,
60
+ minItems: @min_items,
61
+ }.compact
62
+ end
63
+
64
+ # @example
65
+ # array.parse(['1', '2', '3']) # => [1, 2, 3]
66
+ # @param args [Array]
67
+ #
68
+ # @return [Array]
69
+ def parse(args)
70
+ args.map { |arg| @items.parse(arg) }
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module OmniAI
4
+ class Tool
5
+ # Represents a schema object.
6
+ #
7
+ # @example
8
+ # object = OmniAI::Tool::Object.new(
9
+ # properties: {
10
+ # name: OmniAI::Tool::Property.string(description: 'The name of the person.'),
11
+ # age: OmniAI::Tool::Property.integer(description: 'The age of the person.'),
12
+ # },
13
+ # required: %i[name]
14
+ # })
15
+ class Object
16
+ TYPE = 'object'
17
+
18
+ # @!attribute [rw] properties
19
+ # @return [Hash]
20
+ attr_accessor :properties
21
+
22
+ # @!attribute [rw] required
23
+ # @return [Array<String>]
24
+ attr_accessor :required
25
+
26
+ # @!attribute [rw] description
27
+ # @return [String, nil]
28
+ attr_accessor :description
29
+
30
+ # @param properties [Hash]
31
+ # @param required [Array<String>]
32
+ # @return [OmniAI::Tool::Parameters]
33
+ def initialize(properties: {}, required: [], description: nil)
34
+ @properties = properties
35
+ @required = required
36
+ @description = description
37
+ end
38
+
39
+ # @return [Hash]
40
+ def serialize
41
+ {
42
+ type: TYPE,
43
+ description: @description,
44
+ properties: @properties.transform_values(&:serialize),
45
+ required: @required,
46
+ }.compact
47
+ end
48
+
49
+ # @param args [Hash]
50
+ #
51
+ # @return [Hash]
52
+ def parse(args)
53
+ result = {}
54
+ @properties.each do |name, property|
55
+ value = args[String(name)]
56
+ result[name.intern] = property.parse(value) unless value.nil?
57
+ end
58
+ result
59
+ end
60
+ end
61
+ end
62
+ end
@@ -2,46 +2,22 @@
2
2
 
3
3
  module OmniAI
4
4
  class Tool
5
- # Usage:
5
+ # Parameters are used to define the arguments for a tool.
6
6
  #
7
- # parameters = OmniAI::Tool::Parameters.new(properties: {
8
- # n: OmniAI::Tool::Parameters.integer(description: 'The nth number to calculate.')
9
- # required: %i[n]
10
- # })
11
- class Parameters
12
- module Type
13
- OBJECT = 'object'
14
- end
15
-
16
- # @param type [String]
17
- # @param properties [Hash]
18
- # @param required [Array<String>]
19
- # @return [OmniAI::Tool::Parameters]
20
- def initialize(type: Type::OBJECT, properties: {}, required: [])
21
- @type = type
22
- @properties = properties
23
- @required = required
24
- end
25
-
26
- # @return [Hash]
27
- def serialize
28
- {
29
- type: @type,
30
- properties: @properties.transform_values(&:serialize),
31
- required: @required,
32
- }.compact
33
- end
34
-
35
- # @param args [Hash]
36
- # @return [Hash]
37
- def parse(args)
38
- result = {}
39
- @properties.each do |name, property|
40
- value = args[String(name)]
41
- result[name.intern] = property.parse(value) if value
42
- end
43
- result
44
- end
7
+ # @example
8
+ # parameters = OmniAI::Tool::Parameters.new(properties: {
9
+ # people: OmniAI::Tool::Parameters.array(
10
+ # items: OmniAI::Tool::Parameters.object(
11
+ # properties: {
12
+ # name: OmniAI::Tool::Parameters.string(description: 'The name of the person.'),
13
+ # age: OmniAI::Tool::Parameters.integer(description: 'The age of the person.'),
14
+ # employeed: OmniAI::Tool::Parameters.boolean(description: 'Is the person employeed?'),
15
+ # }
16
+ # n: OmniAI::Tool::Parameters.integer(description: 'The nth number to calculate.')
17
+ # required: %i[n]
18
+ # })
19
+ # tool = OmniAI::Tool.new(fibonacci, parameters: parameters)
20
+ class Parameters < Object
45
21
  end
46
22
  end
47
23
  end
@@ -2,9 +2,15 @@
2
2
 
3
3
  module OmniAI
4
4
  class Tool
5
- # Usage:
5
+ # A property used for a tool parameter.
6
6
  #
7
- # property = OmniAI::Tool::Property.new(type: 'string', description: 'The nth number to calculate.')
7
+ # @example
8
+ # OmniAI::Tool::Property.array(description: '...', items: ...)
9
+ # OmniAI::Tool::Property.object(description: '...', properties: { ... }, required: %i[...])
10
+ # OmniAI::Tool::Property.string(description: '...')
11
+ # OmniAI::Tool::Property.integer(description: '...')
12
+ # OmniAI::Tool::Property.number(description: '...')
13
+ # OmniAI::Tool::Property.boolean(description: '...')
8
14
  class Property
9
15
  module Type
10
16
  BOOLEAN = 'boolean'
@@ -22,36 +28,80 @@ module OmniAI
22
28
  # @return [Array<String>, nil]
23
29
  attr_reader :enum
24
30
 
25
- # @param description [String]
26
- # @param enum [Array<String>]
31
+ # @example
32
+ # property = OmniAI::Tool::Property.array(
33
+ # items: OmniAI::Tool::Property.string(description: 'The name of the person.'),
34
+ # description: 'A list of names.'
35
+ # min_items: 1,
36
+ # max_items: 5,
37
+ # )
38
+ #
39
+ # @param items [OmniAI::Tool::Property] required - the items in the array
40
+ # @param min_items [Integer] optional - the minimum number of items
41
+ # @param max_items [Integer] optional - the maximum number of items
42
+ # @param description [String] optional - a description of the array
43
+ #
44
+ # @return [OmniAI::Tool::Array]
45
+ def self.array(items:, min_items: nil, max_items: nil, description: nil)
46
+ OmniAI::Tool::Array.new(items:, description:, min_items:, max_items:)
47
+ end
48
+
49
+ # @example
50
+ # property = OmniAI::Tool::Property.object(
51
+ # properties: {
52
+ # name: OmniAI::Tool::Property.string(description: 'The name of the person.'),
53
+ # age: OmniAI::Tool::Property.integer(description: 'The age of the person.'),
54
+ # employeed: OmniAI::Tool::Property.boolean(description: 'Is the person employeed?'),
55
+ # },
56
+ # description: 'A person.'
57
+ # required: %i[name]
58
+ # )
59
+ #
60
+ # @param properties [Hash<String, OmniAI::Tool::Property>] required - the properties of the object
61
+ # @param requird [Array<Symbol>] optional - the required properties
62
+ # @param description [String] optional - a description of the object
63
+ #
64
+ # @return [OmniAI::Tool::Array]
65
+ def self.object(properties: {}, required: [], description: nil)
66
+ OmniAI::Tool::Object.new(properties:, required:, description:)
67
+ end
68
+
69
+ # @param description [String] optional - a description of the property
70
+ # @param enum [Array<Boolean>] optional - the possible values of the property
71
+ #
27
72
  # @return [OmniAI::Tool::Property]
28
73
  def self.boolean(description: nil, enum: nil)
29
74
  new(type: Type::BOOLEAN, description:, enum:)
30
75
  end
31
76
 
32
- # @param description [String]
33
- # @param enum [Array<String>]
77
+ # @param description [String] optional - a description of the property
78
+ # @param enum [Array<Integer>] optinoal - the possible values of the property
79
+ #
34
80
  # @return [OmniAI::Tool::Property]
35
81
  def self.integer(description: nil, enum: nil)
36
82
  new(type: Type::INTEGER, description:, enum:)
37
83
  end
38
84
 
39
- # @param description [String]
40
- # @param enum [Array<String>]
85
+ # @param description [String] optional - a description of the property
86
+ # @param enum [Array<String>] optional - the possible values of the property
87
+ #
41
88
  # @return [OmniAI::Tool::Property]
42
89
  def self.string(description: nil, enum: nil)
43
90
  new(type: Type::STRING, description:, enum:)
44
91
  end
45
92
 
46
- # @param description [String]
47
- # @param enum [Array<String>]
93
+ # @param description [String] optional - a description of the property
94
+ # @param enum [Array<Number>] optional - the possible values of the property
95
+ #
48
96
  # @return [OmniAI::Tool::Property]
49
97
  def self.number(description: nil, enum: nil)
50
98
  new(type: Type::NUMBER, description:, enum:)
51
99
  end
52
100
 
53
- # @param description [String]
54
- # @param enum [Array<String>]
101
+ # @param type [String] required - the type of the property
102
+ # @param description [String] optional - a description of the property
103
+ # @param enum [Array] optional - the possible values of the property
104
+ #
55
105
  # @return [OmniAI::Tool::Property]
56
106
  def initialize(type:, description: nil, enum: nil)
57
107
  @type = type
@@ -60,12 +110,7 @@ module OmniAI
60
110
  end
61
111
 
62
112
  # @example
63
- # property.serialize
64
- # # {
65
- # # type: 'string',
66
- # # description: 'The unit (e.g. "fahrenheit" or "celsius").'
67
- # # enum: %w[fahrenheit celsius]
68
- # # }
113
+ # property.serialize #=> { type: 'string' }
69
114
  #
70
115
  # @return [Hash]
71
116
  def serialize
@@ -76,6 +121,9 @@ module OmniAI
76
121
  }.compact
77
122
  end
78
123
 
124
+ # @example
125
+ # property.parse('123') #=> 123
126
+ #
79
127
  # @return [String, Integer, Float, Boolean, Object]
80
128
  def parse(value)
81
129
  case @type
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module OmniAI
4
- VERSION = '1.9.0'
4
+ VERSION = '1.9.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omniai
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.0
4
+ version: 1.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kevin Sylvestre
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-10-30 00:00:00.000000000 Z
11
+ date: 2024-11-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: event_stream_parser
@@ -98,6 +98,8 @@ files:
98
98
  - lib/omniai/instrumentation.rb
99
99
  - lib/omniai/speak.rb
100
100
  - lib/omniai/tool.rb
101
+ - lib/omniai/tool/array.rb
102
+ - lib/omniai/tool/object.rb
101
103
  - lib/omniai/tool/parameters.rb
102
104
  - lib/omniai/tool/property.rb
103
105
  - lib/omniai/transcribe.rb