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.
-
#find_matching_tool_call(tool_call_id) ⇒ Object
Walk message history to find a matching assistant tool call for a tool result.
-
#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.
229 230 231 232 |
# File 'lib/ask/conversation.rb', line 229 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.
237 238 239 240 241 |
# File 'lib/ask/conversation.rb', line 237 def <<() msg = .is_a?(Message) ? : () @messages << msg self end |
#[](index) ⇒ Ask::Message?
Access message by index.
310 311 312 |
# File 'lib/ask/conversation.rb', line 310 def [](index) @messages[index] end |
#assistant(text = nil, tool_calls: nil, **options) ⇒ self
Add an assistant message.
270 271 272 |
# File 'lib/ask/conversation.rb', line 270 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.
332 |
# File 'lib/ask/conversation.rb', line 332 def = by_role(:assistant) |
#by_role(role) ⇒ Array<Ask::Message>
Returns messages with the given role.
321 322 323 |
# File 'lib/ask/conversation.rb', line 321 def by_role(role) @messages.select { |m| m.role == role.to_sym } end |
#clear ⇒ self
Remove all messages.
302 303 304 305 |
# File 'lib/ask/conversation.rb', line 302 def clear @messages.clear self end |
#dup ⇒ Ask::Conversation
Deep copy of this conversation.
348 349 350 351 352 353 354 355 356 357 358 359 |
# File 'lib/ask/conversation.rb', line 348 def dup Conversation.new(@messages.map { |m| opts = { role: m.role, name: m.name, tool_call_id: m.tool_call_id, tool_calls: m.tool_calls, metadata: m. } if m.content_blocks opts[:content] = m.content_blocks.dup else opts[:content] = m.content end Message.new(**opts) }) end |
#each {|Message| ... } ⇒ Enumerator
Returns if no block given.
284 285 286 |
# File 'lib/ask/conversation.rb', line 284 def each(&block) @messages.each(&block) end |
#empty? ⇒ Boolean
Returns true if there are no messages.
298 |
# File 'lib/ask/conversation.rb', line 298 def empty? = @messages.empty? |
#find_matching_tool_call(tool_call_id) ⇒ Object
Walk message history to find a matching assistant tool call for a tool result. Returns the assistant message that contains the tool call, or nil.
339 340 341 342 343 344 |
# File 'lib/ask/conversation.rb', line 339 def find_matching_tool_call(tool_call_id) @messages.reverse.find do |m| next unless m.role == :assistant && m.tool_calls.is_a?(Hash) m.tool_calls.key?(tool_call_id) end end |
#inspect ⇒ String
362 363 364 |
# File 'lib/ask/conversation.rb', line 362 def inspect "#<Ask::Conversation messages=#{@messages.length}>" end |
#last(n = nil) ⇒ Ask::Message+
Returns last message or last n messages.
289 290 291 |
# File 'lib/ask/conversation.rb', line 289 def last(n = nil) n ? @messages.last(n) : @messages.last end |
#length ⇒ Integer Also known as: size
Returns number of messages.
294 |
# File 'lib/ask/conversation.rb', line 294 def length = @messages.length |
#system(text, **options) ⇒ self
Add a system message.
247 248 249 |
# File 'lib/ask/conversation.rb', line 247 def system(text, **) self << Message.new(role: :system, content: text, **) end |
#system_messages ⇒ Array<Ask::Message>
Returns system messages.
326 |
# File 'lib/ask/conversation.rb', line 326 def = by_role(:system) |
#to_a ⇒ Array<Hash>
Returns messages as an array of hashes.
315 316 317 |
# File 'lib/ask/conversation.rb', line 315 def to_a @messages.map(&:to_h) end |
#tool_messages ⇒ Array<Ask::Message>
Returns tool messages.
335 |
# File 'lib/ask/conversation.rb', line 335 def = by_role(:tool) |
#tool_result(content, tool_call_id:, **options) ⇒ self
Add a tool result message.
278 279 280 |
# File 'lib/ask/conversation.rb', line 278 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.
262 263 264 |
# File 'lib/ask/conversation.rb', line 262 def user(text, **) self << Message.new(role: :user, content: text, **) end |
#user_messages ⇒ Array<Ask::Message>
Returns user messages.
329 |
# File 'lib/ask/conversation.rb', line 329 def = by_role(:user) |