Class: LLM::Message
- Inherits:
-
Object
- Object
- LLM::Message
- Defined in:
- lib/llm/message.rb
Instance Attribute Summary collapse
-
#content ⇒ String
readonly
Returns the content of the message.
-
#extra ⇒ Hash
readonly
Returns extra context associated with the message.
-
#role ⇒ Symbol
readonly
Returns the role of the message.
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
(also: #eql?)
Returns true when two objects have the same role and content.
-
#annotations ⇒ Array<LLM::Object>
Returns annotations associated with the message.
-
#assistant? ⇒ Boolean
Returns true when the message is an assistant message.
-
#compaction? ⇒ Boolean
Returns true when a message was created by context compaction.
-
#content! ⇒ Hash
Try to parse JSON content.
-
#file? ⇒ Boolean
Returns true when a message contains a local or remote file.
-
#files ⇒ Array<LLM::Object>
Returns local and remote file content items from the message.
- #functions ⇒ Array<LLM::Function>
-
#image_url? ⇒ Boolean
Returns true when a message contains an image URL.
-
#image_urls ⇒ Array<LLM::Object>
Returns image URL content items from the message.
-
#initialize(role, content, extra = {}) ⇒ LLM::Message
constructor
Returns a new message.
-
#inspect ⇒ String
Returns a string representation of the message.
-
#model ⇒ String?
Returns the model associated with a message.
-
#reasoning_content ⇒ String?
Returns reasoning content associated with the message.
-
#response ⇒ LLM::Response?
Returns the response associated with the message, or nil.
-
#system? ⇒ Boolean
Returns true when the message is a system message.
-
#to_h ⇒ Hash
Returns a Hash representation of the message.
- #to_json ⇒ String
-
#tool_call? ⇒ Boolean
Returns true when the message requests a function call.
-
#tool_return? ⇒ Boolean
Returns true when the message represents a function return.
-
#usage ⇒ LLM::Object?
(also: #token_usage)
Returns token usage statistics.
-
#user? ⇒ Boolean
Returns true when the message is a user message.
Constructor Details
#initialize(role, content, extra = {}) ⇒ LLM::Message
Returns a new message
26 27 28 29 30 |
# File 'lib/llm/message.rb', line 26 def initialize(role, content, extra = {}) @role = role.to_s @content = content @extra = LLM::Object.from(extra) end |
Instance Attribute Details
#content ⇒ String (readonly)
Returns the content of the message
13 14 15 |
# File 'lib/llm/message.rb', line 13 def content @content end |
#extra ⇒ Hash (readonly)
Returns extra context associated with the message
18 19 20 |
# File 'lib/llm/message.rb', line 18 def extra @extra end |
#role ⇒ Symbol (readonly)
Returns the role of the message
8 9 10 |
# File 'lib/llm/message.rb', line 8 def role @role end |
Instance Method Details
#==(other) ⇒ Boolean Also known as: eql?
Returns true when two objects have the same role and content
54 55 56 57 58 59 60 |
# File 'lib/llm/message.rb', line 54 def ==(other) if other.respond_to?(:to_h) to_h == other.to_h else false end end |
#annotations ⇒ Array<LLM::Object>
This method might return annotations for assistant messages, and it returns an empty array for non-assistant messages
Returns annotations associated with the message
178 179 180 |
# File 'lib/llm/message.rb', line 178 def annotations @annotations ||= LLM::Object.from(extra.annotations || []) end |
#assistant? ⇒ Boolean
Returns true when the message is an assistant message
129 130 131 |
# File 'lib/llm/message.rb', line 129 def assistant? role == "assistant" || role == "model" end |
#compaction? ⇒ Boolean
Returns true when a message was created by context compaction
81 82 83 |
# File 'lib/llm/message.rb', line 81 def compaction? !!extra.compaction end |
#content! ⇒ Hash
Try to parse JSON content
67 68 69 |
# File 'lib/llm/message.rb', line 67 def content! LLM.json.load(content) end |
#file? ⇒ Boolean
Returns true when a message contains a local or remote file
102 103 104 |
# File 'lib/llm/message.rb', line 102 def file? files.any? end |
#files ⇒ Array<LLM::Object>
Returns local and remote file content items from the message
109 110 111 112 113 |
# File 'lib/llm/message.rb', line 109 def files content_items.select do LLM::Object === _1 && [:local_file, :remote_file].include?(_1.kind) end end |
#functions ⇒ Array<LLM::Function>
117 118 119 120 121 122 123 124 |
# File 'lib/llm/message.rb', line 117 def functions @functions ||= tool_calls.filter_map do |fn| function = available_tools.find { _1.name.to_s == fn["name"] } || next function = function.dup function.tap { _1.id = fn.id } function.tap { _1.arguments = fn.arguments } end end |
#image_url? ⇒ Boolean
Returns true when a message contains an image URL
88 89 90 |
# File 'lib/llm/message.rb', line 88 def image_url? image_urls.any? end |
#image_urls ⇒ Array<LLM::Object>
Returns image URL content items from the message
95 96 97 |
# File 'lib/llm/message.rb', line 95 def image_urls content_items.select { LLM::Object === _1 && _1.kind == :image_url } end |
#inspect ⇒ String
Returns a string representation of the message
203 204 205 206 207 |
# File 'lib/llm/message.rb', line 203 def inspect "#<#{self.class.name}:0x#{object_id.to_s(16)} " \ "tool_call=#{tool_calls.any?} role=#{role.inspect} " \ "content=#{content.inspect} reasoning_content=#{reasoning_content.inspect}>" end |
#model ⇒ String?
Returns the model associated with a message
196 197 198 |
# File 'lib/llm/message.rb', line 196 def model response&.model end |
#reasoning_content ⇒ String?
Returns reasoning content associated with the message
74 75 76 |
# File 'lib/llm/message.rb', line 74 def reasoning_content extra.reasoning_content end |
#response ⇒ LLM::Response?
This method returns a response for assistant messages, and it returns nil for non-assistant messages
Returns the response associated with the message, or nil
168 169 170 |
# File 'lib/llm/message.rb', line 168 def response extra.response end |
#system? ⇒ Boolean
Returns true when the message is a system message
136 137 138 |
# File 'lib/llm/message.rb', line 136 def system? role == "system" end |
#to_h ⇒ Hash
Returns a Hash representation of the message.
35 36 37 38 39 40 41 |
# File 'lib/llm/message.rb', line 35 def to_h {role:, content:, reasoning_content:, compaction: extra.compaction, tools: extra.tool_calls, usage:, original_tool_calls: extra.original_tool_calls}.compact end |
#to_json ⇒ String
45 46 47 |
# File 'lib/llm/message.rb', line 45 def to_json(...) LLM.json.dump(to_h, ...) end |
#tool_call? ⇒ Boolean
Returns true when the message requests a function call
150 151 152 |
# File 'lib/llm/message.rb', line 150 def tool_call? tool_calls.any? end |
#tool_return? ⇒ Boolean
Returns true when the message represents a function return
157 158 159 160 |
# File 'lib/llm/message.rb', line 157 def tool_return? LLM::Function::Return === content || [*content].grep(LLM::Function::Return).any? end |
#usage ⇒ LLM::Object? Also known as: token_usage
This method returns token usage for assistant messages, and it returns nil for non-assistant messages
Returns token usage statistics
188 189 190 |
# File 'lib/llm/message.rb', line 188 def usage @usage ||= extra.usage || response&.usage end |
#user? ⇒ Boolean
Returns true when the message is a user message
143 144 145 |
# File 'lib/llm/message.rb', line 143 def user? role == "user" end |