Class: Brute::MessageTransport::LLM

Inherits:
MessageTransport
  • Object
show all
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

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(message)
  case message.role
  when :tool
    ::LLM::Message.new(
      :tool,
      ::LLM::Function::Return.new(message.tool_call_id, nil, message.content.to_s),
    )
  when :assistant
    if message.tool_call?
      wire = message.tool_calls.map do |tc|
        { id: tc.id, type: "function", function: { name: tc.name, arguments: JSON.generate(tc.arguments) } }
      end
      ::LLM::Message.new(
        :assistant,
        message.content.to_s,
        { tool_calls: wire, original_tool_calls: wire },
      )
    else
      ::LLM::Message.new(:assistant, message.content)
    end
  else
    ::LLM::Message.new(message.role, message.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