Module: ActiveAgent::Providers::Ollama::Chat::Transforms

Defined in:
lib/active_agent/providers/ollama/chat/transforms.rb

Overview

Provides transformation methods for normalizing Ollama parameters to work with OpenAI gem’s native format plus Ollama extensions

Leverages OpenAI::Chat::Transforms for base message normalization while adding handling for Ollama-specific parameters like format, options, keep_alive, and raw mode.

Class Method Summary collapse

Class Method Details

.cleanup_serialized_request(openai_hash, ollama_params, defaults, gem_object) ⇒ Hash

Cleans up serialized request for API submission

Merges OpenAI-compatible params with Ollama-specific params. Also groups consecutive same-role messages as required by Ollama.

Parameters:

  • openai_hash (Hash)

    serialized OpenAI request

  • ollama_params (Hash)

    Ollama-specific parameters

  • defaults (Hash)

    default values to remove

  • gem_object (Object)

    original gem object

Returns:

  • (Hash)

    cleaned and merged request hash



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/active_agent/providers/ollama/chat/transforms.rb', line 76

def cleanup_serialized_request(openai_hash, ollama_params, defaults, gem_object)
  # Start with OpenAI cleanup
  cleaned = OpenAI::Chat::Transforms.cleanup_serialized_request(openai_hash, defaults, gem_object)

  # Group consecutive same-role messages for Ollama
  if cleaned[:messages]
    cleaned[:messages] = group_same_role_messages(cleaned[:messages])
  end

  # Merge Ollama-specific params, but skip default values
  ollama_params.each do |key, value|
    # Skip if value is nil, empty, or matches the default
    next if value.nil?
    next if value.respond_to?(:empty?) && value.empty?
    next if defaults.key?(key) && defaults[key] == value

    cleaned[key] = value
  end

  cleaned
end

.gem_to_hash(gem_object) ⇒ Hash

Converts gem model object to hash via JSON round-trip

Parameters:

  • gem_object (Object)

Returns:

  • (Hash)

    with symbolized keys



22
23
24
# File 'lib/active_agent/providers/ollama/chat/transforms.rb', line 22

def gem_to_hash(gem_object)
  OpenAI::Chat::Transforms.gem_to_hash(gem_object)
end

.group_same_role_messages(messages) ⇒ Array<Hash>

Groups consecutive same-role messages for Ollama

Ollama requires consecutive messages with the same role to be merged by concatenating their content.

Parameters:

  • messages (Array<Hash>)

    array of message hashes

Returns:

  • (Array<Hash>)

    grouped messages



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/active_agent/providers/ollama/chat/transforms.rb', line 105

def group_same_role_messages(messages)
  return [] if messages.nil? || messages.empty?

  grouped = []
  messages.each do |message|
    if grouped.empty? || grouped.last[:role] != message[:role]
      grouped << message.deep_dup
    else
      # Concatenate content for same-role messages
      last_content = grouped.last[:content]
      new_content = message[:content]

      grouped.last[:content] = if last_content.is_a?(Array) && new_content.is_a?(Array)
        last_content + new_content
      elsif last_content.is_a?(String) && new_content.is_a?(String)
        last_content + new_content
      else
        # Mix of types, convert to array
        Array(last_content) + Array(new_content)
      end
    end
  end

  grouped
end

.normalize_instructions(instructions) ⇒ Array<OpenAI::Models::Chat::ChatCompletionMessageParam>

Normalizes instructions using OpenAI transforms

Parameters:

  • instructions (Array<String>, String)

Returns:

  • (Array<OpenAI::Models::Chat::ChatCompletionMessageParam>)


62
63
64
# File 'lib/active_agent/providers/ollama/chat/transforms.rb', line 62

def normalize_instructions(instructions)
  OpenAI::Chat::Transforms.normalize_instructions(instructions)
end

.normalize_messages(messages) ⇒ Array<OpenAI::Models::Chat::ChatCompletionMessageParam>?

Normalizes messages using OpenAI transforms

Parameters:

  • messages (Array, String, Hash, nil)

Returns:

  • (Array<OpenAI::Models::Chat::ChatCompletionMessageParam>, nil)


54
55
56
# File 'lib/active_agent/providers/ollama/chat/transforms.rb', line 54

def normalize_messages(messages)
  OpenAI::Chat::Transforms.normalize_messages(messages)
end

.normalize_params(params) ⇒ Array<Hash, Hash>

Normalizes all request parameters for Ollama API

Handles both OpenAI-compatible parameters and Ollama-specific extensions. Ollama-specific params (format, options, keep_alive, raw) are extracted and returned separately for manual serialization.

Parameters:

  • params (Hash)

Returns:

  • (Array<Hash, Hash>)

    tuple of [openai_params, ollama_params]



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/active_agent/providers/ollama/chat/transforms.rb', line 34

def normalize_params(params)
  params = params.dup

  # Extract Ollama-specific parameters
  ollama_params = {}
  ollama_params[:format] = params.delete(:format) if params.key?(:format)
  ollama_params[:options] = params.delete(:options) if params.key?(:options)
  ollama_params[:keep_alive] = params.delete(:keep_alive) if params.key?(:keep_alive)
  ollama_params[:raw] = params.delete(:raw) if params.key?(:raw)

  # Use OpenAI transforms for the base parameters
  openai_params = OpenAI::Chat::Transforms.normalize_params(params)

  [ openai_params, ollama_params ]
end