Module: OmniAI::OpenAI::Chat::MessageSerializer

Defined in:
lib/omniai/openai/chat/message_serializer.rb

Overview

Overrides message serialize / deserialize.

Class Method Summary collapse

Class Method Details

.arrayify(content) ⇒ Array<Object>

Parameters:

  • content (Object)

Returns:

  • (Array<Object>)


98
99
100
101
102
# File 'lib/omniai/openai/chat/message_serializer.rb', line 98

def self.arrayify(content)
  return [] if content.nil?

  content.is_a?(Array) ? content : [content]
end

.deserialize(data, context:) ⇒ OmniAI::Chat::Message

Parameters:

  • data (Hash)
  • context (OmniAI::Context)

Returns:

  • (OmniAI::Chat::Message)


56
57
58
59
60
61
62
# File 'lib/omniai/openai/chat/message_serializer.rb', line 56

def self.deserialize(data, context:)
  case data["type"]
  when "message" then deserialize_for_content(data, context:)
  when "function_call" then deserialize_for_tool_call(data, context:)
  when "reasoning" then deserialize_for_reasoning(data, context:)
  end
end

.deserialize_for_content(data, context:) ⇒ OmniAI::Chat::Message

Parameters:

  • data (Hash)
  • context (OmniAI::Context)

Returns:

  • (OmniAI::Chat::Message)


77
78
79
80
81
82
83
# File 'lib/omniai/openai/chat/message_serializer.rb', line 77

def self.deserialize_for_content(data, context:)
  role = data["role"]
  content = data["content"].map do |content|
    OmniAI::Chat::Content.deserialize(content, context:)
  end
  OmniAI::Chat::Message.new(role:, content:)
end

.deserialize_for_reasoning(data, context:) ⇒ OmniAI::Chat::Message

Parameters:

  • data (Hash)
  • context (OmniAI::Context)

Returns:

  • (OmniAI::Chat::Message)


68
69
70
71
# File 'lib/omniai/openai/chat/message_serializer.rb', line 68

def self.deserialize_for_reasoning(data, context:)
  thinking = OmniAI::Chat::Thinking.deserialize(data, context:)
  OmniAI::Chat::Message.new(role: OmniAI::Chat::Role::ASSISTANT, content: [thinking])
end

.deserialize_for_tool_call(data, context:) ⇒ OmniAI::Chat::Message

Parameters:

  • data (Hash)
  • context (OmniAI::Context)

Returns:

  • (OmniAI::Chat::Message)


89
90
91
92
93
# File 'lib/omniai/openai/chat/message_serializer.rb', line 89

def self.deserialize_for_tool_call(data, context:)
  entry = OmniAI::Chat::ToolCall.deserialize(data, context:)
  tool_call_list = OmniAI::Chat::ToolCallList.new(entries: [entry])
  OmniAI::Chat::Message.new(role: OmniAI::Chat::Role::TOOL, content: nil, tool_call_list:)
end

.serialize(message, context:) ⇒ Hash

Parameters:

  • message (OmniAI::Chat::Message)
  • context (OmniAI::Context)

Returns:

  • (Hash)


12
13
14
15
16
17
18
# File 'lib/omniai/openai/chat/message_serializer.rb', line 12

def self.serialize(message, context:)
  if message.tool?
    serialize_for_tool_call(message, context:)
  else
    serialize_for_content(message, context:)
  end
end

.serialize_for_content(message, context:) ⇒ Hash?

Parameters:

  • message (OmniAI::Chat::Message)
  • context (OmniAI::Context)

Returns:

  • (Hash, nil)


34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/omniai/openai/chat/message_serializer.rb', line 34

def self.serialize_for_content(message, context:)
  role = message.role
  direction = message.direction
  # Filter out thinking content - OpenAI doesn't accept it in input messages
  parts = arrayify(message.content).reject { |part| part.is_a?(OmniAI::Chat::Thinking) }

  return if parts.empty?

  content = parts.map do |part|
    case part
    when String then { type: "#{direction}_text", text: part }
    else part.serialize(context:, direction:)
    end
  end

  { role:, content: }
end

.serialize_for_tool_call(message, context:) ⇒ Hash

Parameters:

  • message (OmniAI::Chat::Message)
  • context (OmniAI::Context)

Returns:

  • (Hash)


24
25
26
27
28
# File 'lib/omniai/openai/chat/message_serializer.rb', line 24

def self.serialize_for_tool_call(message, context:)
  tool_call_list = message.tool_call_list
  tool_call = tool_call_list[0]
  tool_call.serialize(context:)
end