class Riffer::Tools::Runtime
Handles tool call execution for an agent, composing with a Riffer::Runner for concurrency. Subclass and override dispatch_tool_call to customize dispatch (e.g. HTTP, gRPC).
Public Class Methods
Source
# File lib/riffer/tools/runtime.rb, line 14 def initialize(runner:) raise NotImplementedError, "#{self.class} is abstract — use a subclass like Riffer::Tools::Runtime::Inline" if instance_of?(Riffer::Tools::Runtime) @runner = runner end
Public Instance Methods
Source
# File lib/riffer/tools/runtime.rb, line 47 def around_tool_call(tool_call, context:, assistant_message: nil) yield end
Hook wrapping each tool call; override in subclasses to instrument or customize. Must yield to continue.
class InstrumentedRuntime < Riffer::Tools::Runtime::Inline private def around_tool_call(tool_call, context:, assistant_message: nil) start = Time.now result = yield Rails.logger.info("Tool #{tool_call.name} took #{Time.now - start}s") result end end
Source
# File lib/riffer/tools/runtime.rb, line 22 def execute(tool_calls, tools:, context:, assistant_message: nil) @runner.map(tool_calls, context: context) do |tool_call| result = around_tool_call(tool_call, context: context, assistant_message: assistant_message) do dispatch_tool_call(tool_call, tools: tools, context: context, assistant_message: assistant_message) end [tool_call, result] end end
Executes a batch of tool calls, returning [tool_call, response] pairs.