Skip to content
This repository was archived by the owner on Jul 22, 2025. It is now read-only.

Commit 907d1ca

Browse files
committed
DEV: Improve title suggester suggestions when editing topic
1 parent bb32d0d commit 907d1ca

File tree

5 files changed

+51
-30
lines changed

5 files changed

+51
-30
lines changed

app/controllers/discourse_ai/ai_helper/assistant_controller.rb

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,32 @@ def suggest
5353
end
5454

5555
def suggest_title
56-
input = get_text_param!
56+
assistant = DiscourseAi::AiHelper::Assistant.new
57+
58+
if params[:topic_id]
59+
topic = Topic.find_by(id: params[:topic_id])
60+
61+
topic_content =
62+
topic
63+
.posts
64+
.joins(:user)
65+
.pluck(:post_number, :raw, :username, :last_version_at)
66+
.map do |pn, raw_text, username, last_version_at|
67+
{ poster: username, id: pn, text: raw_text, last_version_at: last_version_at }
68+
end
69+
70+
truncated_content = topic_content.map { |item| assistant.truncate(item) }
71+
72+
input = truncated_content
73+
else
74+
input = get_text_param!
75+
end
5776

5877
prompt = CompletionPrompt.enabled_by_name("generate_titles")
5978
raise Discourse::InvalidParameters.new(:mode) if !prompt
6079

6180
hijack do
62-
render json:
63-
DiscourseAi::AiHelper::Assistant.new.generate_and_send_prompt(
64-
prompt,
65-
input,
66-
current_user,
67-
),
68-
status: 200
81+
render json: assistant.generate_and_send_prompt(prompt, input, current_user), status: 200
6982
end
7083
rescue DiscourseAi::Completions::Endpoints::Base::CompletionFailed
7184
render_json_error I18n.t("discourse_ai.ai_helper.errors.completion_request_failed"),

assets/javascripts/discourse/components/suggestion-menus/ai-title-suggester.gjs

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,30 +17,15 @@ export default class AiTitleSuggester extends Component {
1717
@tracked untriggers = [];
1818
@tracked triggerIcon = "discourse-sparkles";
1919
@tracked content = null;
20-
@tracked topicContent = null;
21-
22-
constructor() {
23-
super(...arguments);
24-
25-
if (!this.topicContent && this.args.composer?.reply === undefined) {
26-
this.fetchTopicContent();
27-
}
28-
}
29-
30-
async fetchTopicContent() {
31-
await ajax(`/t/${this.args.buffered.content.id}.json`).then(
32-
({ post_stream }) => {
33-
this.topicContent = post_stream.posts[0].cooked;
34-
}
35-
);
36-
}
3720

3821
get showSuggestionButton() {
3922
const composerFields = document.querySelector(".composer-fields");
4023
const editTopicTitleField = document.querySelector(".edit-topic-title");
4124

42-
this.content = this.args.composer?.reply || this.topicContent;
43-
const showTrigger = this.content?.length > MIN_CHARACTER_COUNT;
25+
this.content = this.args.composer?.reply;
26+
const showTrigger =
27+
this.content?.length > MIN_CHARACTER_COUNT ||
28+
this.args.topicState === "edit";
4429

4530
if (composerFields) {
4631
if (showTrigger) {
@@ -69,13 +54,20 @@ export default class AiTitleSuggester extends Component {
6954

7055
this.loading = true;
7156
this.triggerIcon = "spinner";
57+
const data = {};
58+
59+
if (this.content) {
60+
data.text = this.content;
61+
} else {
62+
data.topic_id = this.args.buffered.content.id;
63+
}
7264

7365
try {
7466
const { suggestions } = await ajax(
7567
"/discourse-ai/ai-helper/suggest_title",
7668
{
7769
method: "POST",
78-
data: { text: this.content },
70+
data,
7971
}
8072
);
8173
this.suggestions = suggestions;

assets/javascripts/discourse/connectors/after-composer-title-input/ai-title-suggestion.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export default class AiTitleSuggestion extends Component {
1313
}
1414

1515
<template>
16-
<AiTitleSuggester @composer={{@outletArgs.composer}} />
16+
<AiTitleSuggester @composer={{@outletArgs.composer}} @topicState="new" />
1717
</template>
1818
}

assets/javascripts/discourse/connectors/edit-topic-title__after/ai-title-suggestion.gjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ export default class AiTitleSuggestion extends Component {
1313
}
1414

1515
<template>
16-
<AiTitleSuggester @buffered={{@outletArgs.buffered}} />
16+
<AiTitleSuggester @buffered={{@outletArgs.buffered}} @topicState="edit" />
1717
</template>
1818
}

lib/ai_helper/assistant.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,22 @@ def generate_image_caption(upload, user)
206206
raw_caption.delete("|").squish.truncate_words(IMAGE_CAPTION_MAX_WORDS)
207207
end
208208

209+
def truncate(item)
210+
item_content = item[:text].to_s
211+
split_1, split_2 =
212+
[item_content[0, item_content.size / 2], item_content[(item_content.size / 2)..-1]]
213+
214+
truncation_length = 500
215+
tokenizer = helper_llm.llm_model.tokenizer_class
216+
217+
item[:text] = [
218+
tokenizer.truncate(split_1, truncation_length),
219+
tokenizer.truncate(split_2.reverse, truncation_length).reverse,
220+
].join(" ")
221+
222+
item
223+
end
224+
209225
private
210226

211227
SANITIZE_REGEX_STR =

0 commit comments

Comments
 (0)