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 51 52 53 |
# 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 |