Class: Ask::Conversation
- Inherits:
-
Object
- Object
- Ask::Conversation
- Includes:
- Enumerable
- Defined in:
- lib/ask/conversation.rb
Overview
Ordered collection of messages comprising a conversation with an LLM. Provides role normalization, serialization helpers, and Enumerable access.
conv = Ask::Conversation.new
conv << Ask::Message.new(role: :user, content: "Hello")
conv.system("Be helpful")
conv.to_a # => [{ role: :user, content: "Hello" }, ...]
Instance Method Summary collapse
-
#<<(message) ⇒ self
(also: #add)
Add a message by object or by attributes.
-
#[](index) ⇒ Ask::Message?
Access message by index.
-
#assistant(text = nil, tool_calls: nil, **options) ⇒ self
Add an assistant message.
-
#assistant_messages ⇒ Array<Ask::Message>
Assistant messages.
-
#by_role(role) ⇒ Array<Ask::Message>
Messages with the given role.
-
#clear ⇒ self
Remove all messages.
-
#dup ⇒ Ask::Conversation
Deep copy of this conversation.
-
#each {|Message| ... } ⇒ Enumerator
If no block given.
-
#empty? ⇒ Boolean
True if there are no messages.
-
#initialize(messages = []) ⇒ Conversation
constructor
A new instance of Conversation.
- #inspect ⇒ String
-
#last(n = nil) ⇒ Ask::Message+
Last message or last n messages.
-
#length ⇒ Integer
(also: #size)
Number of messages.
-
#system(text, **options) ⇒ self
Add a system message.
-
#system_messages ⇒ Array<Ask::Message>
System messages.
-
#to_a ⇒ Array<Hash>
Messages as an array of hashes.
-
#tool_messages ⇒ Array<Ask::Message>
Tool messages.
-
#tool_result(content, tool_call_id:, **options) ⇒ self
Add a tool result message.
-
#user(text, **options) ⇒ self
Add a user message.
-
#user_messages ⇒ Array<Ask::Message>
User messages.
Constructor Details
#initialize(messages = []) ⇒ Conversation
Returns a new instance of Conversation.
118 119 120 121 |
# File 'lib/ask/conversation.rb', line 118 def initialize( = []) @messages = [] .each { |m| self << m } end |
Instance Method Details
#<<(message) ⇒ self Also known as: add
Add a message by object or by attributes.
126 127 128 129 130 |
# File 'lib/ask/conversation.rb', line 126 def <<() msg = .is_a?(Message) ? : () @messages << msg self end |
#[](index) ⇒ Ask::Message?
Access message by index.
191 192 193 |
# File 'lib/ask/conversation.rb', line 191 def [](index) @messages[index] end |
#assistant(text = nil, tool_calls: nil, **options) ⇒ self
Add an assistant message.
151 152 153 |
# File 'lib/ask/conversation.rb', line 151 def assistant(text = nil, tool_calls: nil, **) self << Message.new(role: :assistant, content: text, tool_calls: tool_calls, **) end |
#assistant_messages ⇒ Array<Ask::Message>
Returns assistant messages.
213 |
# File 'lib/ask/conversation.rb', line 213 def = by_role(:assistant) |
#by_role(role) ⇒ Array<Ask::Message>
Returns messages with the given role.
202 203 204 |
# File 'lib/ask/conversation.rb', line 202 def by_role(role) @messages.select { |m| m.role == role.to_sym } end |
#clear ⇒ self
Remove all messages.
183 184 185 186 |
# File 'lib/ask/conversation.rb', line 183 def clear @messages.clear self end |
#dup ⇒ Ask::Conversation
Deep copy of this conversation.
220 221 222 |
# File 'lib/ask/conversation.rb', line 220 def dup Conversation.new(@messages.map { |m| Message.new(**m.to_h) }) end |
#each {|Message| ... } ⇒ Enumerator
Returns if no block given.
165 166 167 |
# File 'lib/ask/conversation.rb', line 165 def each(&block) @messages.each(&block) end |
#empty? ⇒ Boolean
Returns true if there are no messages.
179 |
# File 'lib/ask/conversation.rb', line 179 def empty? = @messages.empty? |
#inspect ⇒ String
225 226 227 |
# File 'lib/ask/conversation.rb', line 225 def inspect "#<Ask::Conversation messages=#{@messages.length}>" end |
#last(n = nil) ⇒ Ask::Message+
Returns last message or last n messages.
170 171 172 |
# File 'lib/ask/conversation.rb', line 170 def last(n = nil) n ? @messages.last(n) : @messages.last end |
#length ⇒ Integer Also known as: size
Returns number of messages.
175 |
# File 'lib/ask/conversation.rb', line 175 def length = @messages.length |
#system(text, **options) ⇒ self
Add a system message.
136 137 138 |
# File 'lib/ask/conversation.rb', line 136 def system(text, **) self << Message.new(role: :system, content: text, **) end |
#system_messages ⇒ Array<Ask::Message>
Returns system messages.
207 |
# File 'lib/ask/conversation.rb', line 207 def = by_role(:system) |
#to_a ⇒ Array<Hash>
Returns messages as an array of hashes.
196 197 198 |
# File 'lib/ask/conversation.rb', line 196 def to_a @messages.map(&:to_h) end |
#tool_messages ⇒ Array<Ask::Message>
Returns tool messages.
216 |
# File 'lib/ask/conversation.rb', line 216 def = by_role(:tool) |
#tool_result(content, tool_call_id:, **options) ⇒ self
Add a tool result message.
159 160 161 |
# File 'lib/ask/conversation.rb', line 159 def tool_result(content, tool_call_id:, **) self << Message.new(role: :tool, content: content, tool_call_id: tool_call_id, **) end |
#user(text, **options) ⇒ self
Add a user message.
143 144 145 |
# File 'lib/ask/conversation.rb', line 143 def user(text, **) self << Message.new(role: :user, content: text, **) end |
#user_messages ⇒ Array<Ask::Message>
Returns user messages.
210 |
# File 'lib/ask/conversation.rb', line 210 def = by_role(:user) |