Module: RobotLab::RailsIntegration::TurboStreamCallbacks
- Defined in:
- lib/robot_lab/rails_integration/turbo_stream_callbacks.rb
Overview
Stateless utility module that builds callback Procs for Turbo Stream broadcasting.
Safe to require even without turbo-rails installed — checks at call time via ‘defined?(Turbo::StreamsChannel)`.
Class Method Summary collapse
-
.available? ⇒ Boolean
Check whether Turbo Streams broadcasting is available at runtime.
-
.build_content_callback(stream_name:, target: "robot_response") ⇒ Proc
Build a Proc that broadcasts content chunks via Turbo Streams.
-
.build_tool_call_callback(stream_name:, target: "robot_tools") ⇒ Proc
Build a Proc that broadcasts tool call badges via Turbo Streams.
Class Method Details
.available? ⇒ Boolean
Check whether Turbo Streams broadcasting is available at runtime.
23 24 25 |
# File 'lib/robot_lab/rails_integration/turbo_stream_callbacks.rb', line 23 def self.available? defined?(Turbo::StreamsChannel) ? true : false end |
.build_content_callback(stream_name:, target: "robot_response") ⇒ Proc
Build a Proc that broadcasts content chunks via Turbo Streams.
The returned Proc receives a chunk object (e.g. RubyLLM::Chunk) and broadcasts ‘chunk.content` as HTML-escaped text via `broadcast_append_to`.
36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/robot_lab/rails_integration/turbo_stream_callbacks.rb', line 36 def self.build_content_callback(stream_name:, target: "robot_response") ->(chunk) { content = chunk.respond_to?(:content) ? chunk.content : chunk.to_s return unless content && TurboStreamCallbacks.available? Turbo::StreamsChannel.broadcast_append_to( stream_name, target: target, html: ERB::Util.html_escape(content) ) } end |
.build_tool_call_callback(stream_name:, target: "robot_tools") ⇒ Proc
Build a Proc that broadcasts tool call badges via Turbo Streams.
The returned Proc receives a tool_call object and broadcasts a badge showing the tool name.
58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/robot_lab/rails_integration/turbo_stream_callbacks.rb', line 58 def self.build_tool_call_callback(stream_name:, target: "robot_tools") ->(tool_call) { return unless TurboStreamCallbacks.available? name = tool_call.respond_to?(:name) ? tool_call.name : tool_call.to_s Turbo::StreamsChannel.broadcast_append_to( stream_name, target: target, html: "<span class=\"tool-badge\">Using: #{ERB::Util.html_escape(name)}</span>" ) } end |