docs: allow stop answer generation in AI assistant (#14387)

This commit is contained in:
Shahed Nasser
2025-12-23 08:58:16 +02:00
committed by GitHub
parent 662ec7430b
commit 10dab3a47a
4 changed files with 25 additions and 4 deletions
@@ -1,6 +1,11 @@
import React, { useEffect, useMemo, useRef } from "react" import React, { useEffect, useMemo, useRef } from "react"
import clsx from "clsx" import clsx from "clsx"
import { ArrowUpCircleSolid, LightBulb, LightBulbSolid } from "@medusajs/icons" import {
ArrowUpCircleSolid,
LightBulb,
LightBulbSolid,
StopCircleSolid,
} from "@medusajs/icons"
import { import {
useAiAssistant, useAiAssistant,
useAnalytics, useAnalytics,
@@ -20,7 +25,7 @@ export const AiAssistantChatWindowInput = ({
}: AiAssistantChatWindowInputProps) => { }: AiAssistantChatWindowInputProps) => {
const { chatOpened, inputRef, loading, setChatOpened, isCaptchaLoaded } = const { chatOpened, inputRef, loading, setChatOpened, isCaptchaLoaded } =
useAiAssistant() useAiAssistant()
const { submitQuery, conversation } = useChat() const { submitQuery, conversation, stopGeneration } = useChat()
const { track } = useAnalytics() const { track } = useAnalytics()
const { active, toggle } = useDeepThinking() const { active, toggle } = useDeepThinking()
const { isBrowser } = useIsBrowser() const { isBrowser } = useIsBrowser()
@@ -43,6 +48,12 @@ export const AiAssistantChatWindowInput = ({
overrideQuestion?: string overrideQuestion?: string
) => { ) => {
e?.preventDefault() e?.preventDefault()
if (loading) {
// stop the generation
stopGeneration()
return
}
submitQuery(overrideQuestion || question) submitQuery(overrideQuestion || question)
if (!conversation.length) { if (!conversation.length) {
track({ track({
@@ -206,10 +217,10 @@ export const AiAssistantChatWindowInput = ({
"appearance-none p-0 text-medusa-fg-base disabled:text-medusa-fg-disabled", "appearance-none p-0 text-medusa-fg-base disabled:text-medusa-fg-disabled",
"transition-colors" "transition-colors"
)} )}
disabled={!question || loading || !isCaptchaLoaded} disabled={!isCaptchaLoaded || (!question && !loading)}
type="submit" type="submit"
> >
<ArrowUpCircleSolid /> {loading ? <StopCircleSolid /> : <ArrowUpCircleSolid />}
</button> </button>
</div> </div>
</form> </form>
@@ -53,6 +53,7 @@ export const AiAssistantChatWindow = () => {
content: item.question, content: item.question,
sources: item.sources, sources: item.sources,
question_id: item.id, question_id: item.id,
isGenerationAborted: item.isGenerationAborted,
}} }}
/> />
<AiAssistantThreadItem <AiAssistantThreadItem
@@ -61,6 +62,7 @@ export const AiAssistantChatWindow = () => {
content: item.answer, content: item.answer,
sources: item.sources, sources: item.sources,
question_id: item.id, question_id: item.id,
isGenerationAborted: item.isGenerationAborted,
}} }}
/> />
</Fragment> </Fragment>
@@ -25,6 +25,13 @@ export const AiAssistantThreadItem = ({ item }: AiAssistantThreadItemProps) => {
return !item.question_id && item.content.length === 0 return !item.question_id && item.content.length === 0
}, [item, error]) }, [item, error])
if (
item.isGenerationAborted &&
item.type === "answer" &&
!item.content.length
) {
return null
}
return ( return (
<div <div
className={clsx( className={clsx(
@@ -32,6 +32,7 @@ export type AiAssistantThreadItem = {
content: string content: string
question_id?: string | null question_id?: string | null
sources?: Source[] sources?: Source[]
isGenerationAborted?: boolean
} }
const AiAssistantContext = createContext<AiAssistantContextType | null>(null) const AiAssistantContext = createContext<AiAssistantContextType | null>(null)