Class: OxAiWorkers::ToolDefinition::ParameterBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/oxaiworkers/tool_definition.rb

Overview

Builds parameter schemas for functions

Constant Summary collapse

VALID_TYPES =
%w[object array string number integer boolean].freeze

Instance Method Summary collapse

Constructor Details

#initialize(parent_type:) ⇒ ParameterBuilder

Returns a new instance of ParameterBuilder.



166
167
168
169
# File 'lib/oxaiworkers/tool_definition.rb', line 166

def initialize(parent_type:)
  @schema = parent_type == 'object' ? { type: 'object', properties: {}, required: [] } : {}
  @parent_type = parent_type
end

Instance Method Details

#build { ... } ⇒ Hash

Builds the parameter schema

Yields:

  • Block that defines the properties of the schema

Returns:

  • (Hash)

    The built schema



175
176
177
178
# File 'lib/oxaiworkers/tool_definition.rb', line 175

def build(&)
  instance_eval(&)
  @schema
end

#property(name = nil, type:, description: nil, enum: nil, required: false) {|Block| ... } ⇒ Object Also known as: item

Defines a property in the schema

Parameters:

  • name (Symbol) (defaults to: nil)

    Name of the property (required only for a parent of type object)

  • type (String)

    Type of the property

  • description (String) (defaults to: nil)

    Description of the property

  • enum (Array) (defaults to: nil)

    Array of allowed values

  • required (Boolean) (defaults to: false)

    Whether the property is required

Yields:

  • (Block)

    Block for nested properties (only for object and array types)

Raises:

  • (ArgumentError)

    If any parameter is invalid



189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
# File 'lib/oxaiworkers/tool_definition.rb', line 189

def property(name = nil, type:, description: nil, enum: nil, required: false, &)
  validate_parameters(name:, type:, enum:, required:)

  prop = { type:, description:, enum: }.compact

  if block_given?
    nested_schema = ParameterBuilder.new(parent_type: type).build(&)

    case type
    when 'object'
      if nested_schema[:properties].empty?
        raise ArgumentError, 'Object properties must have at least one property defined within it'
      end

      prop = nested_schema
    when 'array'
      if nested_schema.empty?
        raise ArgumentError,
              'Array properties must have at least one item defined within it'
      end

      prop[:items] = nested_schema
    end
  end

  if @parent_type == 'object'
    @schema[:properties][name] = prop
    @schema[:required] << name.to_s if required
  else
    @schema = prop
  end
end