# frozen_string_literal: true
module DiscourseAi
module Summarization
module Strategies
class ChatMessages < Base
def type
AiSummary.summary_types[:complete]
end
def highest_target_number
nil # We don't persist so we can return nil.
end
def initialize(target, since)
super(target)
@since = since
end
def targets_data
target
.chat_messages
.where("chat_messages.created_at > ?", since.hours.ago)
.includes(:user)
.order(created_at: :asc)
.pluck(:id, :username_lower, :message, :updated_at)
.map { { id: _1, poster: _2, text: _3, last_version_at: _4 } }
end
def as_llm_messages(contents)
content_title = target.name
input =
contents.map { |item| "(#{item[:id]} #{item[:poster]} said: #{item[:text]} " }.join
[{ type: :user, content: <<~TEXT.strip }]
#{content_title.present? ? "These texts come from a chat channel called " + content_title + ".\n" : ""}
Here are the texts, inside XML tags:
#{input}
Generate a summary of the given chat messages.
TEXT
end
private
attr_reader :since
end
end
end
end