module RubyLLM::Providers::Anthropic::Tools
def clean_parameters(parameters)
def clean_parameters(parameters) parameters.transform_values do |param| { type: param.type, description: param.description }.compact end end
def extract_tool_calls(data)
def extract_tool_calls(data) if json_delta?(data) { nil => ToolCall.new(id: nil, name: nil, arguments: data.dig('delta', 'partial_json')) } else parse_tool_calls(data['content_block']) end end
def find_tool_use(blocks)
def find_tool_use(blocks) blocks.find { |c| c['type'] == 'tool_use' } end
def format_tool_call(msg)
def format_tool_call(msg) tool_call = msg.tool_calls.values.first { role: 'assistant', content: [ format_text_block(msg.content), format_tool_use_block(tool_call) ] } end
def format_tool_result(msg)
def format_tool_result(msg) { role: 'user', content: [format_tool_result_block(msg)] } end
def format_tool_result_block(msg)
def format_tool_result_block(msg) { type: 'tool_result', tool_use_id: msg.tool_call_id, content: msg.content } end
def format_tool_use_block(tool_call)
def format_tool_use_block(tool_call) { type: 'tool_use', id: tool_call.id, name: tool_call.name, input: tool_call.arguments } end
def function_for(tool)
def function_for(tool) { name: tool.name, description: tool.description, input_schema: { type: 'object', properties: clean_parameters(tool.parameters), required: required_parameters(tool.parameters) } } end
def parse_tool_calls(content_block)
def parse_tool_calls(content_block) return nil unless content_block && content_block['type'] == 'tool_use' { content_block['id'] => ToolCall.new( id: content_block['id'], name: content_block['name'], arguments: content_block['input'] ) } end
def required_parameters(parameters)
def required_parameters(parameters) parameters.select { |_, param| param.required }.keys end