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.
151 152 153 154 |
# File 'lib/ask/conversation.rb', line 151 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.
159 160 161 162 163 |
# File 'lib/ask/conversation.rb', line 159 def <<() msg = .is_a?(Message) ? : () @messages << msg self end |
#[](index) ⇒ Ask::Message?
Access message by index.
224 225 226 |
# File 'lib/ask/conversation.rb', line 224 def [](index) @messages[index] end |
#assistant(text = nil, tool_calls: nil, **options) ⇒ self
Add an assistant message.
184 185 186 |
# File 'lib/ask/conversation.rb', line 184 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.
246 |
# File 'lib/ask/conversation.rb', line 246 def = by_role(:assistant) |
#by_role(role) ⇒ Array<Ask::Message>
Returns messages with the given role.
235 236 237 |
# File 'lib/ask/conversation.rb', line 235 def by_role(role) @messages.select { |m| m.role == role.to_sym } end |
#clear ⇒ self
Remove all messages.
216 217 218 219 |
# File 'lib/ask/conversation.rb', line 216 def clear @messages.clear self end |
#dup ⇒ Ask::Conversation
Deep copy of this conversation.
253 254 255 |
# File 'lib/ask/conversation.rb', line 253 def dup Conversation.new(@messages.map { |m| Message.new(**m.to_h) }) end |
#each {|Message| ... } ⇒ Enumerator
Returns if no block given.
198 199 200 |
# File 'lib/ask/conversation.rb', line 198 def each(&block) @messages.each(&block) end |
#empty? ⇒ Boolean
Returns true if there are no messages.
212 |
# File 'lib/ask/conversation.rb', line 212 def empty? = @messages.empty? |
#inspect ⇒ String
258 259 260 |
# File 'lib/ask/conversation.rb', line 258 def inspect "#<Ask::Conversation messages=#{@messages.length}>" end |
#last(n = nil) ⇒ Ask::Message+
Returns last message or last n messages.
203 204 205 |
# File 'lib/ask/conversation.rb', line 203 def last(n = nil) n ? @messages.last(n) : @messages.last end |
#length ⇒ Integer Also known as: size
Returns number of messages.
208 |
# File 'lib/ask/conversation.rb', line 208 def length = @messages.length |
#system(text, **options) ⇒ self
Add a system message.
169 170 171 |
# File 'lib/ask/conversation.rb', line 169 def system(text, **) self << Message.new(role: :system, content: text, **) end |
#system_messages ⇒ Array<Ask::Message>
Returns system messages.
240 |
# File 'lib/ask/conversation.rb', line 240 def = by_role(:system) |
#to_a ⇒ Array<Hash>
Returns messages as an array of hashes.
229 230 231 |
# File 'lib/ask/conversation.rb', line 229 def to_a @messages.map(&:to_h) end |
#tool_messages ⇒ Array<Ask::Message>
Returns tool messages.
249 |
# File 'lib/ask/conversation.rb', line 249 def = by_role(:tool) |
#tool_result(content, tool_call_id:, **options) ⇒ self
Add a tool result message.
192 193 194 |
# File 'lib/ask/conversation.rb', line 192 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.
176 177 178 |
# File 'lib/ask/conversation.rb', line 176 def user(text, **) self << Message.new(role: :user, content: text, **) end |
#user_messages ⇒ Array<Ask::Message>
Returns user messages.
243 |
# File 'lib/ask/conversation.rb', line 243 def = by_role(:user) |