mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 05:09:38 +02:00
* Start refactor * Interface updates * Rework Assistant, Provider, and tests for better domain boundaries * Consolidate and simplify OpenAI provider and provider concepts * Clean up assistant streaming * Improve assistant message orchestration logic * Clean up "thinking" UI interactions * Remove stale class * Regenerate VCR test responses
37 lines
946 B
Ruby
37 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
|