2024-07-04 10:48:18 +10:00
|
|
|
# frozen_string_literal: true
|
2024-10-15 13:53:26 -03:00
|
|
|
|
2024-07-04 10:48:18 +10:00
|
|
|
module DiscourseAi
|
|
|
|
module Summarization
|
2025-04-02 12:54:47 -03:00
|
|
|
class << self
|
|
|
|
def topic_summary(topic)
|
|
|
|
return nil if !SiteSetting.ai_summarization_enabled
|
|
|
|
if (ai_persona = AiPersona.find_by(id: SiteSetting.ai_summarization_persona)).blank?
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
persona_klass = ai_persona.class_instance
|
|
|
|
llm_model = find_summarization_model(persona_klass)
|
|
|
|
return nil if llm_model.blank?
|
|
|
|
|
2024-10-15 13:53:26 -03:00
|
|
|
DiscourseAi::Summarization::FoldContent.new(
|
2025-04-02 12:54:47 -03:00
|
|
|
build_bot(persona_klass, llm_model),
|
2024-10-15 13:53:26 -03:00
|
|
|
DiscourseAi::Summarization::Strategies::TopicSummary.new(topic),
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2025-04-02 12:54:47 -03:00
|
|
|
def topic_gist(topic)
|
|
|
|
return nil if !SiteSetting.ai_summarization_enabled
|
|
|
|
if (ai_persona = AiPersona.find_by(id: SiteSetting.ai_summary_gists_persona)).blank?
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
persona_klass = ai_persona.class_instance
|
|
|
|
llm_model = find_summarization_model(persona_klass)
|
|
|
|
return nil if llm_model.blank?
|
|
|
|
|
2024-10-15 13:53:26 -03:00
|
|
|
DiscourseAi::Summarization::FoldContent.new(
|
2025-04-02 12:54:47 -03:00
|
|
|
build_bot(persona_klass, llm_model),
|
2024-10-18 18:01:39 -03:00
|
|
|
DiscourseAi::Summarization::Strategies::HotTopicGists.new(topic),
|
2024-10-15 13:53:26 -03:00
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2025-04-02 12:54:47 -03:00
|
|
|
def chat_channel_summary(channel, time_window_in_hours)
|
|
|
|
return nil if !SiteSetting.ai_summarization_enabled
|
|
|
|
if (ai_persona = AiPersona.find_by(id: SiteSetting.ai_summarization_persona)).blank?
|
|
|
|
return nil
|
|
|
|
end
|
|
|
|
|
|
|
|
persona_klass = ai_persona.class_instance
|
|
|
|
llm_model = find_summarization_model(persona_klass)
|
|
|
|
return nil if llm_model.blank?
|
|
|
|
|
2024-10-15 13:53:26 -03:00
|
|
|
DiscourseAi::Summarization::FoldContent.new(
|
2025-04-02 12:54:47 -03:00
|
|
|
build_bot(persona_klass, llm_model),
|
2024-10-15 13:53:26 -03:00
|
|
|
DiscourseAi::Summarization::Strategies::ChatMessages.new(channel, time_window_in_hours),
|
|
|
|
persist_summaries: false,
|
|
|
|
)
|
2025-04-02 12:54:47 -03:00
|
|
|
end
|
|
|
|
|
|
|
|
# Priorities are:
|
|
|
|
# 1. Persona's default LLM
|
|
|
|
# 2. Hidden `ai_summarization_model` setting
|
|
|
|
# 3. Newest LLM config
|
|
|
|
def find_summarization_model(persona_klass)
|
|
|
|
model_id =
|
|
|
|
persona_klass.default_llm_id || SiteSetting.ai_summarization_model&.split(":")&.last # Remove legacy custom provider.
|
|
|
|
|
|
|
|
if model_id.present?
|
|
|
|
LlmModel.find_by(id: model_id)
|
|
|
|
else
|
|
|
|
LlmModel.last
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
### Private
|
|
|
|
|
|
|
|
def build_bot(persona_klass, llm_model)
|
|
|
|
persona = persona_klass.new
|
|
|
|
user = User.find_by(id: persona_klass.user_id) || Discourse.system_user
|
|
|
|
|
|
|
|
bot = DiscourseAi::Personas::Bot.as(user, persona: persona, model: llm_model)
|
2024-07-04 10:48:18 +10:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|