Module: OmniAI::OpenAI::Chat::MessageSerializer
- Defined in:
- lib/omniai/openai/chat/message_serializer.rb
Overview
Overrides message serialize / deserialize.
Class Method Summary collapse
- .arrayify(content) ⇒ Array<Object>
- .deserialize(data, context:) ⇒ OmniAI::Chat::Message
- .deserialize_for_content(data, context:) ⇒ OmniAI::Chat::Message
- .deserialize_for_reasoning(data, context:) ⇒ OmniAI::Chat::Message
- .deserialize_for_tool_call(data, context:) ⇒ OmniAI::Chat::Message
- .serialize(message, context:) ⇒ Hash
- .serialize_for_content(message, context:) ⇒ Hash?
- .serialize_for_tool_call(message, context:) ⇒ Hash
Class Method Details
.arrayify(content) ⇒ 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
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
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
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
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
12 13 14 15 16 17 18 |
# File 'lib/omniai/openai/chat/message_serializer.rb', line 12 def self.serialize(, context:) if .tool? serialize_for_tool_call(, context:) else serialize_for_content(, context:) end end |
.serialize_for_content(message, context:) ⇒ Hash?
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(, context:) role = .role direction = .direction # Filter out thinking content - OpenAI doesn't accept it in input messages parts = arrayify(.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
24 25 26 27 28 |
# File 'lib/omniai/openai/chat/message_serializer.rb', line 24 def self.serialize_for_tool_call(, context:) tool_call_list = .tool_call_list tool_call = tool_call_list[0] tool_call.serialize(context:) end |