mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 21:29:38 +02:00
38 lines
946 B
Ruby
38 lines
946 B
Ruby
|
class Assistant::FunctionToolCaller
|
||
|
Error = Class.new(StandardError)
|
||
|
FunctionExecutionError = Class.new(Error)
|
||
|
|
||
|
attr_reader :functions
|
||
|
|
||
|
def initialize(functions = [])
|
||
|
@functions = functions
|
||
|
end
|
||
|
|
||
|
def fulfill_requests(function_requests)
|
||
|
function_requests.map do |function_request|
|
||
|
result = execute(function_request)
|
||
|
|
||
|
ToolCall::Function.from_function_request(function_request, result)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def function_definitions
|
||
|
functions.map(&:to_definition)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def execute(function_request)
|
||
|
fn = find_function(function_request)
|
||
|
fn_args = JSON.parse(function_request.function_args)
|
||
|
fn.call(fn_args)
|
||
|
rescue => e
|
||
|
raise FunctionExecutionError.new(
|
||
|
"Error calling function #{fn.name} with arguments #{fn_args}: #{e.message}"
|
||
|
)
|
||
|
end
|
||
|
|
||
|
def find_function(function_request)
|
||
|
functions.find { |f| f.name == function_request.function_name }
|
||
|
end
|
||
|
end
|