Class: LLMs::Conversation

Inherits:
Object
  • Object
show all
Defined in:
lib/llms/conversation.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeConversation

Returns a new instance of Conversation.



10
11
12
13
14
# File 'lib/llms/conversation.rb', line 10

def initialize
  @messages = []
  @system_message = nil
  @available_tools = nil
end

Instance Attribute Details

#system_messageObject (readonly)

Returns the value of attribute system_message.



8
9
10
# File 'lib/llms/conversation.rb', line 8

def system_message
  @system_message
end

Instance Method Details

#add_assistant_message(content, tool_calls = nil) ⇒ Object



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/llms/conversation.rb', line 46

def add_assistant_message(content, tool_calls = nil)
  if content.is_a?(LLMs::ConversationMessage)
    unless tool_calls.nil?
      raise "tool_calls argument not allowed when adding a ConversationMessage"
    end
    unless content.assistant?
      raise "message role must be 'assistant' when calling add_assistant_message with a ConversationMessage"
    end
    add_conversation_message(content)
  else
    unless tool_calls.nil? || tool_calls.all? { |tc| tc.is_a?(LLMs::ConversationToolCall) }
      raise "tool_calls argument must be an array of ConversationToolCall"
    end
    add_conversation_message(LLMs::ConversationMessage.new("assistant", content, tool_calls, nil))
  end
end

#add_conversation_message(message) ⇒ Object



63
64
65
66
# File 'lib/llms/conversation.rb', line 63

def add_conversation_message(message)
  raise "message is not a ConversationMessage" unless message.is_a?(LLMs::ConversationMessage)
  @messages << message
end

#add_user_message(content, tool_results = nil) ⇒ Object



29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/llms/conversation.rb', line 29

def add_user_message(content, tool_results = nil)
  if content.is_a?(LLMs::ConversationMessage)
    unless tool_results.nil?
      raise "tool_results argument not allowed when adding a ConversationMessage"
    end
    unless content.user?
      raise "message role must be 'user' when calling add_user_message with a ConversationMessage"
    end
    add_conversation_message(content)
  else
    unless tool_results.nil? || tool_results.all? { |tr| tr.is_a?(LLMs::ConversationToolResult) }
      raise "tool_results argument must be an array of ConversationToolResult"
    end
    add_conversation_message(LLMs::ConversationMessage.new("user", content, nil, tool_results))
  end
end

#available_toolsObject



72
73
74
# File 'lib/llms/conversation.rb', line 72

def available_tools
  @available_tools&.dup
end

#find_tool_call(tool_call_id) ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/llms/conversation.rb', line 90

def find_tool_call(tool_call_id)
  @messages.each do |message|
    message.tool_calls&.each do |tool_call|
      return tool_call if tool_call.tool_call_id == tool_call_id
    end
  end
  nil
end

#last_messageObject



86
87
88
# File 'lib/llms/conversation.rb', line 86

def last_message
  @messages.last&.dup
end

#messages(include_system_message: false) ⇒ Object



76
77
78
79
80
81
82
# File 'lib/llms/conversation.rb', line 76

def messages(include_system_message: false)
  m = @messages.dup
  if include_system_message && @system_message
    m.unshift(LLMs::ConversationMessage.new("system", @system_message, nil, nil))
  end
  m
end

#pending?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/llms/conversation.rb', line 16

def pending?
  !!@messages.last&.user?
end

#set_available_tools(tools) ⇒ Object



25
26
27
# File 'lib/llms/conversation.rb', line 25

def set_available_tools(tools)
  @available_tools = tools
end

#set_system_message(content) ⇒ Object



20
21
22
23
# File 'lib/llms/conversation.rb', line 20

def set_system_message(content)
  raise "content is not a String" unless content.is_a?(String)
  @system_message = content
end