diff --git a/lib/modules/ai_helper/chat_thread_titler.rb b/lib/modules/ai_helper/chat_thread_titler.rb index 58cd323d..b60a97bc 100644 --- a/lib/modules/ai_helper/chat_thread_titler.rb +++ b/lib/modules/ai_helper/chat_thread_titler.rb @@ -7,26 +7,34 @@ module DiscourseAi @thread = thread end + def suggested_title + return nil if thread_content.blank? + + prompt = CompletionPrompt.enabled_by_name("generate_titles") + raise Discourse::InvalidParameters.new(:mode) if !prompt + + response = + DiscourseAi::AiHelper::Assistant.new.generate_and_send_prompt( + prompt, + thread_content, + thread.original_message_user, + ) + response.dig(:suggestions)&.first + end + + private + + attr_reader :thread + def thread_content # Replace me by a proper API call - @thread + thread .chat_messages .joins(:user) .pluck(:username, :message) .map { |username, message| "#{username}: #{message}" } .join("\n") end - - def suggested_title - return nil if thread_content.blank? - - prompt = CompletionPrompt.enabled_by_name(id: "generate_titles") - raise Discourse::InvalidParameters.new(:mode) if !prompt - - response = - DiscourseAi::AiHelper::LlmPrompt.new.generate_and_send_prompt(prompt, thread_content) - response.dig(:suggestions)&.first - end end end end diff --git a/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb b/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb new file mode 100644 index 00000000..e2714fb6 --- /dev/null +++ b/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +RSpec.describe DiscourseAi::AiHelper::ChatThreadTitler do + subject(:titler) { described_class.new(thread) } + + fab!(:thread) { Fabricate(:chat_thread) } + fab!(:user) { Fabricate(:user) } + + describe "#suggested_title" do + it "suggest the first option from the generate_titles prompt" do + titles = + "The solitary horse*The horse etched in gold*A horse's infinite journey*A horse lost in time*A horse's last ride" + expected_title = titles.split("*").first + + result = + DiscourseAi::Completions::LLM.with_prepared_responses([titles]) { titler.suggested_title } + + expect(result).to eq(expected_title) + end + end +end