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.

[View source]

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

[View source]

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

[View source]

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