Class: LLMs::Adapters::GoogleGeminiMessageAdapter

Inherits:
BaseMessageAdapter show all
Defined in:
lib/llms/adapters/google_gemini_message_adapter.rb

Class Method Summary collapse

Methods inherited from BaseMessageAdapter

has_message?, message_from_api_format, transform_text, transform_tool_calls

Class Method Details

.find_message_id(api_response_format) ⇒ Object



57
58
59
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 57

def self.find_message_id(api_response_format)
  nil ## no message id in the response
end

.find_role(api_response_format) ⇒ Object



53
54
55
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 53

def self.find_role(api_response_format)
  api_response_format.dig('candidates', 0, 'role') || api_response_format.dig('candidates', 0, 'content', 'role')
end

.find_text(api_response_format) ⇒ Object



61
62
63
64
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 61

def self.find_text(api_response_format)
  text_parts = api_response_format.dig('candidates', 0, 'content', 'parts')&.map { |c| c['text'] }&.compact
  text_parts.nil? || text_parts.empty? ? nil : text_parts.join
end

.find_tool_calls(api_response_format) ⇒ Object



66
67
68
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 66

def self.find_tool_calls(api_response_format)
  api_response_format.dig('candidates', 0, 'content', 'parts')&.map { |c| c['functionCall'] }&.compact
end

.reverse_transform_role(role) ⇒ Object



45
46
47
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 45

def self.reverse_transform_role(role)
  role == 'assistant' ? 'model' : role
end

.to_api_format(message) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 9

def self.to_api_format(message)
  parts = []
  ## TODO order is important here - results must be given in same order as corresponding calls.
  ## Currently the order is just assumed to be correctly preserved in the tool_results array
  message.tool_results&.each do |tool_result|
    parts << {functionResponse: { name: tool_result.name, response: { name: tool_result.name, content: tool_result.results}}}
  end

  message.parts&.each do |part|
    if part[:text]
      parts << {text: part[:text]}
    end
    if part[:image]
      parts << {
        inline_data: {
          mime_type: part[:media_type] || 'image/png',
          data: part[:image]
        }
      }
    end
  end


  message.tool_calls&.each do |tool_call|
    parts << {functionCall: {name: tool_call.name, args: tool_call.arguments}}
  end
  {
    role: reverse_transform_role(message.role), ##TODO also gets changed later, fix this
    parts: parts
  }
end

.transform_role(role) ⇒ Object



41
42
43
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 41

def self.transform_role(role)
  role == 'model' ? 'assistant' : role
end

.transform_tool_call(api_response_format_part, index) ⇒ Object



49
50
51
# File 'lib/llms/adapters/google_gemini_message_adapter.rb', line 49

def self.transform_tool_call(api_response_format_part, index)
  LLMs::Adapters::GoogleGeminiToolCallAdapter.from_api_format(api_response_format_part, index)
end