Class: Raif::Conversation

Instance Method Summary collapse

Methods included from Raif::Concerns::LlmResponseParsing

#clean_html_fragment, #parsed_response

Methods included from Raif::Concerns::HasAvailableModelTools

#available_model_tools_map

Methods included from Raif::Concerns::HasRequestedLanguage

#requested_language_name, #system_prompt_language_preference

Methods included from Raif::Concerns::HasLlm

#default_llm_model_key, #llm

Methods inherited from ApplicationRecord

table_name_prefix

Instance Method Details

#available_user_tool_classesObject



71
72
73
# File 'app/models/raif/conversation.rb', line 71

def available_user_tool_classes
  available_user_tools.map(&:constantize)
end

#build_system_promptObject



21
22
23
24
25
26
# File 'app/models/raif/conversation.rb', line 21

def build_system_prompt
  <<~PROMPT
    #{system_prompt_intro}
    #{system_prompt_language_preference}
  PROMPT
end

#initial_chat_messageObject

i18n-tasks-use t(‘raif.conversation.initial_chat_message’)



34
35
36
# File 'app/models/raif/conversation.rb', line 34

def initial_chat_message
  I18n.t("#{self.class.name.underscore.gsub("/", ".")}.initial_chat_message")
end

#llm_messagesObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'app/models/raif/conversation.rb', line 54

def llm_messages
  messages = []

  entries.oldest_first.includes(:raif_model_tool_invocations).each do |entry|
    messages << { "role" => "user", "content" => entry.user_message } unless entry.user_message.blank?
    next unless entry.completed?

    messages << { "role" => "assistant", "content" => entry.model_response_message } unless entry.model_response_message.blank?
    entry.raif_model_tool_invocations.each do |tool_invocation|
      messages << { "role" => "assistant", "content" => tool_invocation.as_llm_message }
      messages << { "role" => "assistant", "content" => tool_invocation.result_llm_message } if tool_invocation.result_llm_message.present?
    end
  end

  messages
end

#process_model_response_message(message:, entry:) ⇒ Object



48
49
50
51
52
# File 'app/models/raif/conversation.rb', line 48

def process_model_response_message(message:, entry:)
  # no-op by default.
  # Override in subclasses for type-specific processing of the model response message
  message
end

#prompt_model_for_entry_response(entry:) ⇒ Object



38
39
40
41
42
43
44
45
46
# File 'app/models/raif/conversation.rb', line 38

def prompt_model_for_entry_response(entry:)
  llm.chat(
    messages: llm_messages,
    source: entry,
    response_format: response_format.to_sym,
    system_prompt: system_prompt,
    available_model_tools: available_model_tools
  )
end

#system_prompt_introObject



28
29
30
31
# File 'app/models/raif/conversation.rb', line 28

def system_prompt_intro
  sp = Raif.config.conversation_system_prompt_intro
  sp.respond_to?(:call) ? sp.call(self) : sp
end