class Riffer::Guardrails::Runner
Executes guardrails sequentially, passing each oneβs output to the next; if any blocks, execution stops and a tripwire is returned.
Attributes
The context passed to guardrails.
The guardrail configs to execute.
The execution phase (:before or :after).
Public Class Methods
Source
# File lib/riffer/guardrails/runner.rb, line 18 def initialize(guardrail_configs, phase:, context: nil) @guardrail_configs = guardrail_configs @phase = phase @context = context end
Public Instance Methods
Source
# File lib/riffer/guardrails/runner.rb, line 29 def run(data, messages: nil) current_data = data modifications = [] #: Array[Riffer::Guardrails::Modification] guardrail_configs.each do |config| guardrail = instantiate_guardrail(config) result = execute_guardrail(guardrail, current_data, messages: messages) if result.block? tripwire = Riffer::Guardrails::Tripwire.new( reason: result.data, guardrail: guardrail.class, phase: phase, metadata: result.metadata ) return [current_data, tripwire, modifications] end if result.transform? modifications << Riffer::Guardrails::Modification.new( guardrail: guardrail.class, phase: phase, message_indices: detect_changed_indices(current_data, result.data) ) end current_data = result.data end [current_data, nil, modifications] end
Runs the guardrails sequentially. For the :before phase data is the messages array; for :after itβs the response (and messages must be provided).