Class: Ask::Conversation

Inherits:
Object
  • Object
show all
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

Constructor Details

#initialize(messages = []) ⇒ Conversation

Returns a new instance of Conversation.

Parameters:

  • messages (Array<Ask::Message>) (defaults to: [])

    initial messages



118
119
120
121
# File 'lib/ask/conversation.rb', line 118

def initialize(messages = [])
  @messages = []
  messages.each { |m| self << m }
end

Instance Method Details

#<<(message) ⇒ self Also known as: add

Add a message by object or by attributes.

Parameters:

  • message (Ask::Message, Hash, String)

    message or attributes

Returns:

  • (self)


126
127
128
129
130
# File 'lib/ask/conversation.rb', line 126

def <<(message)
  msg = message.is_a?(Message) ? message : build_message(message)
  @messages << msg
  self
end

#[](index) ⇒ Ask::Message?

Access message by index.

Parameters:

  • index (Integer)

    zero-based index

Returns:



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.

Parameters:

  • text (String, nil) (defaults to: nil)

    message content (nil when tool_calls are present)

  • tool_calls (Array<Hash>, nil) (defaults to: nil)

    tool call invocations

Returns:

  • (self)


151
152
153
# File 'lib/ask/conversation.rb', line 151

def assistant(text = nil, tool_calls: nil, **options)
  self << Message.new(role: :assistant, content: text, tool_calls: tool_calls, **options)
end

#assistant_messagesArray<Ask::Message>

Returns assistant messages.

Returns:



213
# File 'lib/ask/conversation.rb', line 213

def assistant_messages = by_role(:assistant)

#by_role(role) ⇒ Array<Ask::Message>

Returns messages with the given role.

Parameters:

  • role (Symbol, String)

    role to filter by

Returns:



202
203
204
# File 'lib/ask/conversation.rb', line 202

def by_role(role)
  @messages.select { |m| m.role == role.to_sym }
end

#clearself

Remove all messages.

Returns:

  • (self)


183
184
185
186
# File 'lib/ask/conversation.rb', line 183

def clear
  @messages.clear
  self
end

#dupAsk::Conversation

Deep copy of this conversation.

Returns:



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.

Yields:

  • (Message)

    yields each message in order

Returns:

  • (Enumerator)

    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.

Returns:

  • (Boolean)

    true if there are no messages



179
# File 'lib/ask/conversation.rb', line 179

def empty? = @messages.empty?

#inspectString

Returns:

  • (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.

Returns:



170
171
172
# File 'lib/ask/conversation.rb', line 170

def last(n = nil)
  n ? @messages.last(n) : @messages.last
end

#lengthInteger Also known as: size

Returns number of messages.

Returns:

  • (Integer)

    number of messages



175
# File 'lib/ask/conversation.rb', line 175

def length = @messages.length

#system(text, **options) ⇒ self

Add a system message.

Parameters:

  • text (String)

    message content

Returns:

  • (self)


136
137
138
# File 'lib/ask/conversation.rb', line 136

def system(text, **options)
  self << Message.new(role: :system, content: text, **options)
end

#system_messagesArray<Ask::Message>

Returns system messages.

Returns:



207
# File 'lib/ask/conversation.rb', line 207

def system_messages = by_role(:system)

#to_aArray<Hash>

Returns messages as an array of hashes.

Returns:

  • (Array<Hash>)

    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_messagesArray<Ask::Message>

Returns tool messages.

Returns:



216
# File 'lib/ask/conversation.rb', line 216

def tool_messages = by_role(:tool)

#tool_result(content, tool_call_id:, **options) ⇒ self

Add a tool result message.

Parameters:

  • content (String)

    tool output

  • tool_call_id (String)

    ID of the tool call this result is for

Returns:

  • (self)


159
160
161
# File 'lib/ask/conversation.rb', line 159

def tool_result(content, tool_call_id:, **options)
  self << Message.new(role: :tool, content: content, tool_call_id: tool_call_id, **options)
end

#user(text, **options) ⇒ self

Add a user message.

Parameters:

  • text (String)

    message content

Returns:

  • (self)


143
144
145
# File 'lib/ask/conversation.rb', line 143

def user(text, **options)
  self << Message.new(role: :user, content: text, **options)
end

#user_messagesArray<Ask::Message>

Returns user messages.

Returns:



210
# File 'lib/ask/conversation.rb', line 210

def user_messages = by_role(:user)