Module: RubyLLM::Providers::OpenAI::Tools

Included in:
RubyLLM::Providers::OpenAI
Defined in:
lib/ruby_llm/providers/openai/tools.rb

Overview

Tools methods of the OpenAI API integration

Constant Summary collapse

EMPTY_PARAMETERS_SCHEMA =
{
  'type' => 'object',
  'properties' => {},
  'required' => [],
  'additionalProperties' => false,
  'strict' => true
}.freeze

Class Method Summary collapse

Class Method Details

.format_tool_calls(tool_calls) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ruby_llm/providers/openai/tools.rb', line 52

def format_tool_calls(tool_calls)
  return nil unless tool_calls&.any?

  tool_calls.map do |_, tc|
    {
      id: tc.id,
      type: 'function',
      function: {
        name: tc.name,
        arguments: JSON.generate(tc.arguments)
      }
    }
  end
end

.param_schema(param) ⇒ Object



45
46
47
48
49
50
# File 'lib/ruby_llm/providers/openai/tools.rb', line 45

def param_schema(param)
  {
    type: param.type,
    description: param.description
  }.compact
end

.parameters_schema_for(tool) ⇒ Object



18
19
20
21
# File 'lib/ruby_llm/providers/openai/tools.rb', line 18

def parameters_schema_for(tool)
  tool.params_schema ||
    schema_from_parameters(tool.parameters)
end

.parse_tool_call_arguments(tool_call) ⇒ Object



67
68
69
70
71
72
73
74
75
# File 'lib/ruby_llm/providers/openai/tools.rb', line 67

def parse_tool_call_arguments(tool_call)
  arguments = tool_call.dig('function', 'arguments')

  if arguments.nil? || arguments.empty?
    {}
  else
    JSON.parse(arguments)
  end
end

.parse_tool_calls(tool_calls, parse_arguments: true) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/ruby_llm/providers/openai/tools.rb', line 77

def parse_tool_calls(tool_calls, parse_arguments: true)
  return nil unless tool_calls&.any?

  tool_calls.to_h do |tc|
    [
      tc['id'],
      ToolCall.new(
        id: tc['id'],
        name: tc.dig('function', 'name'),
        arguments: if parse_arguments
                     parse_tool_call_arguments(tc)
                   else
                     tc.dig('function', 'arguments')
                   end
      )
    ]
  end
end

.schema_from_parameters(parameters) ⇒ Object



23
24
25
26
# File 'lib/ruby_llm/providers/openai/tools.rb', line 23

def schema_from_parameters(parameters)
  schema_definition = RubyLLM::Tool::SchemaDefinition.from_parameters(parameters)
  schema_definition&.json_schema || EMPTY_PARAMETERS_SCHEMA
end

.tool_for(tool) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/ruby_llm/providers/openai/tools.rb', line 28

def tool_for(tool)
  parameters_schema = parameters_schema_for(tool)

  definition = {
    type: 'function',
    function: {
      name: tool.name,
      description: tool.description,
      parameters: parameters_schema
    }
  }

  return definition if tool.provider_params.empty?

  RubyLLM::Utils.deep_merge(definition, tool.provider_params)
end