1
0
mirror of synced 2026-08-03 22:36:54 +00:00

FEATURE: Continue conversation from Discobot discovery (#1234)

This feature update allows for continuing the conversation with Discobot Discoveries in an AI bot chat. After discoveries gives you a response to your search you can continue with the existing context.
This commit is contained in:
Keegan George
2025-04-01 10:22:39 -07:00
committed by GitHub
parent 5331b6dd8e
commit bf5ccb452c
8 changed files with 192 additions and 0 deletions
@@ -10,11 +10,15 @@ import CookText from "discourse/components/cook-text";
import DButton from "discourse/components/d-button";
import concatClass from "discourse/helpers/concat-class";
import { ajax } from "discourse/lib/ajax";
import { popupAjaxError } from "discourse/lib/ajax-error";
import { bind } from "discourse/lib/decorators";
import { withPluginApi } from "discourse/lib/plugin-api";
import DiscourseURL from "discourse/lib/url";
import Topic from "discourse/models/topic";
import { i18n } from "discourse-i18n";
import SmoothStreamer from "../lib/smooth-streamer";
import AiBlinkingAnimation from "./ai-blinking-animation";
import AiIndicatorWave from "./ai-indicator-wave";
const DISCOVERY_TIMEOUT_MS = 10000;
@@ -23,7 +27,11 @@ export default class AiSearchDiscoveries extends Component {
@service messageBus;
@service discobotDiscoveries;
@service appEvents;
@service currentUser;
@service siteSettings;
@service composer;
@tracked loadingConversationTopic = false;
@tracked hideDiscoveries = false;
@tracked fullDiscoveryToggled = false;
@tracked discoveryPreviewLength = this.args.discoveryPreviewLength || 150;
@@ -145,6 +153,28 @@ export default class AiSearchDiscoveries extends Component {
return !this.fullDiscoveryToggled && this.canShowExpandtoggle;
}
get canContinueConversation() {
const personas = this.currentUser?.ai_enabled_personas;
const discoverPersona = personas.find(
(persona) => persona.id === this.siteSettings?.ai_bot_discover_persona
);
const discoverPersonaHasBot = discoverPersona?.username;
return (
this.discobotDiscoveries.discovery?.length > 0 &&
!this.smoothStreamer.isStreaming &&
discoverPersonaHasBot
);
}
get continueConvoBtnLabel() {
if (this.loadingConversationTopic) {
return "discourse_ai.discobot_discoveries.loading_convo";
}
return "discourse_ai.discobot_discoveries.continue_convo";
}
@action
async triggerDiscovery() {
if (this.discobotDiscoveries.lastQuery === this.query) {
@@ -180,6 +210,43 @@ export default class AiSearchDiscoveries extends Component {
this.fullDiscoveryToggled = !this.fullDiscoveryToggled;
}
@action
async continueConversation() {
const data = {
user_id: this.currentUser.id,
query: this.query,
context: this.discobotDiscoveries.discovery,
};
try {
this.loadingConversationTopic = true;
const continueRequest = await ajax(
`/discourse-ai/ai-bot/discover/continue-convo`,
{
type: "POST",
data,
}
);
const topicJSON = await Topic.find(continueRequest.topic_id, {});
const topic = Topic.create(topicJSON);
DiscourseURL.routeTo(`/t/${continueRequest.topic_id}`, {
afterRouteComplete: () => {
if (this.args.closeSearchMenu) {
this.args.closeSearchMenu();
}
this.composer.focusComposer({
topic,
});
},
});
} catch (e) {
popupAjaxError(e);
} finally {
this.loadingConversationTopic = false;
}
}
timeoutDiscovery() {
this.discobotDiscoveries.loadingDiscoveries = false;
this.discobotDiscoveries.discovery = "";
@@ -226,6 +293,18 @@ export default class AiSearchDiscoveries extends Component {
{{/if}}
{{/if}}
</div>
{{#if this.canContinueConversation}}
<div class="ai-search-discoveries__continue-conversation">
<DButton
@action={{this.continueConversation}}
@label={{this.continueConvoBtnLabel}}
class="btn-small"
>
<AiIndicatorWave @loading={{this.loadingConversationTopic}} />
</DButton>
</div>
{{/if}}
</div>
</template>
}
@@ -33,6 +33,7 @@ export default class AiDiscobotDiscoveries extends Component {
<AiSearchDiscoveries
@searchTerm={{@outletArgs.searchTerm}}
@discoveryPreviewLength={{50}}
@closeSearchMenu={{@outletArgs.closeSearchMenu}}
/>
{{#if this.search.results.topics.length}}