Class: Langchain::ToolDefinition::ParameterBuilder

Inherits:
Object
  • Object
show all
Defined in:
lib/langchain/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.



143
144
145
146
# File 'lib/langchain/tool_definition.rb', line 143

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



152
153
154
155
# File 'lib/langchain/tool_definition.rb', line 152

def build(&block)
  instance_eval(&block)
  @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



166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/langchain/tool_definition.rb', line 166

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

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

  if block_given? # rubocop:disable Performance/BlockGivenWithExplicitBlock
    nested_schema = ParameterBuilder.new(parent_type: type).build(&block)

    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