Class: Brute::MessageTransport::LLM
- Inherits:
-
MessageTransport
- Object
- MessageTransport
- Brute::MessageTransport::LLM
- Defined in:
- lib/brute/message_transport/llm.rb
Overview
MessageTransport for the llm.rb gem (https://github.com/llmrb/llm.rb). Brute does not require llm.rb — you do:
require "llm"
llm = LLM.openai(key: ENV["OPENAI_API_KEY"])
messages = Brute::MessageTransport::LLM.dump_all(env[:messages])
response = llm.complete(messages.pop, role: nil, messages: messages, tools: ...)
Brute::MessageTransport::LLM.wrap_each(response) { |m| env[:messages] << m }
Class Method Summary collapse
-
.dump(message) ⇒ Object
Brute::Message -> LLM::Message.
-
.usage_metrics(response) ⇒ Object
What the provider reported about this call — the transport knows its own library's shape, so it knows which detector to ask.
Class Method Details
.dump(message) ⇒ Object
Brute::Message -> LLM::Message. Assistant tool calls carry llm.rb's
original_tool_calls extra (the provider wire format); tool results
become an LLM::Function::Return so llm.rb's request adapters emit
them correctly.
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# File 'lib/brute/message_transport/llm.rb', line 30 def self.dump() case .role when :tool ::LLM::Message.new( :tool, ::LLM::Function::Return.new(.tool_call_id, nil, .content.to_s), ) when :assistant if .tool_call? wire = .tool_calls.map do |tc| { id: tc.id, type: "function", function: { name: tc.name, arguments: JSON.generate(tc.arguments) } } end ::LLM::Message.new(:assistant, .content.to_s, { tool_calls: wire, original_tool_calls: wire }) else ::LLM::Message.new(:assistant, .content) end else ::LLM::Message.new(.role, .content) end end |
.usage_metrics(response) ⇒ Object
What the provider reported about this call — the transport knows its own library's shape, so it knows which detector to ask.
23 24 25 |
# File 'lib/brute/message_transport/llm.rb', line 23 def self.usage_metrics(response) Brute::UsageDetection::LLMrb.detect(response) end |