diff --git a/app/models/completion_prompt.rb b/app/models/completion_prompt.rb
index 36288782..0bcde5ff 100644
--- a/app/models/completion_prompt.rb
+++ b/app/models/completion_prompt.rb
@@ -5,7 +5,7 @@ class CompletionPrompt < ActiveRecord::Base
self.ignored_columns = ["provider"]
TRANSLATE = -301
- GENERATE_TITLES = -302
+ GENERATE_TITLES = -307
PROOFREAD = -303
MARKDOWN_TABLE = -304
CUSTOM_PROMPT = -305
diff --git a/db/fixtures/ai_helper/603_completion_prompts.rb b/db/fixtures/ai_helper/603_completion_prompts.rb
index 27b5f61b..4b8df0f7 100644
--- a/db/fixtures/ai_helper/603_completion_prompts.rb
+++ b/db/fixtures/ai_helper/603_completion_prompts.rb
@@ -16,28 +16,6 @@ CompletionPrompt.seed do |cp|
TEXT
end
-CompletionPrompt.seed do |cp|
- cp.id = -302
- cp.name = "generate_titles"
- cp.prompt_type = CompletionPrompt.prompt_types[:list]
- cp.messages = {
- insts: <<~TEXT,
- I want you to act as a title generator for written pieces. I will provide you with a text,
- and you will generate five attention-grabbing titles. Please keep the title concise and under 20 words,
- and ensure that the meaning is maintained. Replies will utilize the language type of the topic.
- I want you to only reply the list of options and nothing else, do not write explanations.
- Each title you generate must be separated by *.
- You will find the text between XML tags.
- TEXT
- examples: [
- [
- "In the labyrinth of time, a solitary horse, etched in gold by the setting sun, embarked on an infinite journey.",
- "The solitary horse*The horse etched in gold*A horse's infinite journey*A horse lost in time*A horse's last ride",
- ],
- ],
- }
-end
-
CompletionPrompt.seed do |cp|
cp.id = -303
cp.name = "proofread"
@@ -172,3 +150,26 @@ CompletionPrompt.seed do |cp|
nothing more.
TEXT
end
+
+CompletionPrompt.seed do |cp|
+ cp.id = -307
+ cp.name = "generate_titles"
+ cp.prompt_type = CompletionPrompt.prompt_types[:list]
+ cp.messages = {
+ insts: <<~TEXT,
+ I want you to act as a title generator for written pieces. I will provide you with a text,
+ and you will generate five attention-grabbing titles. Please keep the title concise and under 20 words,
+ and ensure that the meaning is maintained. Replies will utilize the language type of the topic.
+ I want you to only reply the list of options and nothing else, do not write explanations.
+ Each title you generate must be separated by *.
+ You will find the text between XML tags.
+ TEXT
+ examples: [
+ [
+ "In the labyrinth of time, a solitary horse, etched in gold by the setting sun, embarked on an infinite journey.",
+ "The solitary horseThe horse etched in goldA horse's infinite journeyA horse lost in timeA horse's last ride",
+ ],
+ ],
+ post_insts: "Wrap each title between XML tags.",
+ }
+end
diff --git a/db/post_migrate/20231128151234_recreate_generate_titles_prompt.rb b/db/post_migrate/20231128151234_recreate_generate_titles_prompt.rb
new file mode 100644
index 00000000..7153295a
--- /dev/null
+++ b/db/post_migrate/20231128151234_recreate_generate_titles_prompt.rb
@@ -0,0 +1,11 @@
+# frozen_string_literal: true
+
+class RecreateGenerateTitlesPrompt < ActiveRecord::Migration[7.0]
+ def up
+ DB.exec("DELETE FROM completion_prompts WHERE id = -302")
+ end
+
+ def down
+ raise ActiveRecord::IrreversibleMigration
+ end
+end
diff --git a/lib/completions/endpoints/base.rb b/lib/completions/endpoints/base.rb
index 5b86f1b1..624be145 100644
--- a/lib/completions/endpoints/base.rb
+++ b/lib/completions/endpoints/base.rb
@@ -57,7 +57,7 @@ module DiscourseAi
log =
AiApiAuditLog.new(
provider_id: provider_id,
- user_id: user.id,
+ user_id: user&.id,
raw_request_payload: request_body,
request_tokens: prompt_size(prompt),
)
diff --git a/lib/modules/ai_helper/assistant.rb b/lib/modules/ai_helper/assistant.rb
index 660350bc..04f8fb76 100644
--- a/lib/modules/ai_helper/assistant.rb
+++ b/lib/modules/ai_helper/assistant.rb
@@ -103,7 +103,7 @@ module DiscourseAi
end
def parse_list(list)
- list.split("*")
+ Nokogiri::HTML5.fragment(list).css("item").map(&:text)
end
end
end
diff --git a/spec/lib/modules/ai_helper/assistant_spec.rb b/spec/lib/modules/ai_helper/assistant_spec.rb
index bf5bd886..913bbfec 100644
--- a/spec/lib/modules/ai_helper/assistant_spec.rb
+++ b/spec/lib/modules/ai_helper/assistant_spec.rb
@@ -34,11 +34,17 @@ RSpec.describe DiscourseAi::AiHelper::Assistant do
let(:mode) { CompletionPrompt::GENERATE_TITLES }
let(:titles) do
- "The solitary horse*The horse etched in gold*A horse's infinite journey*A horse lost in time*A horse's last ride"
+ "The solitary horseThe horse etched in goldA horse's infinite journeyA horse lost in timeA horse's last ride"
end
it "returns an array with each title" do
- expected = titles.split("*")
+ expected = [
+ "The solitary horse",
+ "The horse etched in gold",
+ "A horse's infinite journey",
+ "A horse lost in time",
+ "A horse's last ride",
+ ]
response =
DiscourseAi::Completions::LLM.with_prepared_responses([titles]) do
diff --git a/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb b/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb
index e2714fb6..b07f7940 100644
--- a/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb
+++ b/spec/lib/modules/ai_helper/chat_thread_titler_spec.rb
@@ -9,9 +9,8 @@ RSpec.describe DiscourseAi::AiHelper::ChatThreadTitler do
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
-
+ "The solitary horseThe horse etched in goldA horse's infinite journeyA horse lost in timeA horse's last ride"
+ expected_title = "The solitary horse"
result =
DiscourseAi::Completions::LLM.with_prepared_responses([titles]) { titler.suggested_title }
diff --git a/spec/system/ai_helper/ai_composer_helper_spec.rb b/spec/system/ai_helper/ai_composer_helper_spec.rb
index db286741..f157f2c0 100644
--- a/spec/system/ai_helper/ai_composer_helper_spec.rb
+++ b/spec/system/ai_helper/ai_composer_helper_spec.rb
@@ -265,7 +265,7 @@ RSpec.describe "AI Composer helper", type: :system, js: true do
let(:mode) { CompletionPrompt::GENERATE_TITLES }
let(:titles) do
- "Rainy Spain*Plane-Bound Delights*Mysterious Spain*Plane-Rain Chronicles*Unveiling Spain"
+ "Rainy SpainPlane-Bound DelightsMysterious SpainPlane-Rain ChroniclesUnveiling Spain"
end
it "opens a menu with title suggestions" do