Class: Brute::Events::Handler

Inherits:
Object
  • Object
show all
Defined in:
lib/brute/events/handler.rb

Overview

EXAMPLES: class TerminalOutput < Brute::Events::Handler

def <<(event)
  h = event.to_h
  case h[:type]
  when :content       then write(h[:data])
  when :tool_result   then write("#{h[:data][:name]}\n")
  when :log           then write("[#{h[:data]}]\n")
  end
  super  # forward to whatever's wrapped underneath
end

private
def write(text); $stderr.write(text); $stderr.flush; end

end

class JsonlTrace < Brute::Events::Handler

def initialize(inner, path:)
  super(inner)
  @file = File.open(path, "a")
end

def <<(event)
  @file.puts(JSON.generate(event.to_h))
  @file.flush
  super
end

end

class FilterNoise < Brute::Events::Handler

# Drop reasoning chunks before they reach the terminal
def <<(event)
  return self if event.to_h[:type] == :reasoning
  super
end

end

pipeline = Brute::Pipeline.new do

use Brute::Middleware::EventHandler, handler_class: JsonlTrace, path: "trace.jsonl"
use Brute::Middleware::EventHandler, handler_class: FilterNoise
use Brute::Middleware::EventHandler, handler_class: TerminalOutput

end

Direct Known Subclasses

PrefixedTerminalOutput, TerminalOutput

Instance Method Summary collapse

Constructor Details

#initialize(inner) ⇒ Handler

Returns a new instance of Handler.



52
53
54
# File 'lib/brute/events/handler.rb', line 52

def initialize(inner)
  @inner = inner
end

Instance Method Details

#<<(event) ⇒ Object

Default: pass through. Subclasses override <<, do their thing, then super (or don’t, to swallow the event).



58
59
60
61
62
# File 'lib/brute/events/handler.rb', line 58

def <<(event)
  tap do
    @inner << event if @inner
  end
end