@liveblocks/react-ui
Version:
A set of React pre-built components for the Liveblocks products. Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.
1 lines • 25.5 kB
Source Map (JSON)
{"version":3,"file":"AiChatAssistantMessage.cjs","sources":["../../../src/components/internal/AiChatAssistantMessage.tsx"],"sourcesContent":["import type {\n AiAssistantMessage,\n AiRetrievalPart,\n AiWebRetrievalPart,\n WithNavigation,\n} from \"@liveblocks/core\";\nimport { useUrlMetadata } from \"@liveblocks/react\";\nimport {\n type ComponentProps,\n forwardRef,\n memo,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { type GlobalComponents, useComponents } from \"../../components\";\nimport { ChevronRightIcon } from \"../../icons/ChevronRight\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport {\n type AiChatMessageOverrides,\n type GlobalOverrides,\n OverridesProvider,\n useOverrides,\n} from \"../../overrides\";\nimport * as AiMessage from \"../../primitives/AiMessage\";\nimport { AiMessageToolInvocation } from \"../../primitives/AiMessage/tool-invocation\";\nimport type {\n AiMessageContentReasoningPartProps,\n AiMessageContentRetrievalPartProps,\n AiMessageContentSourcesPartProps,\n AiMessageContentTextPartProps,\n AiMessageContentToolInvocationPartProps,\n} from \"../../primitives/AiMessage/types\";\nimport * as Collapsible from \"../../primitives/Collapsible\";\nimport type { MarkdownComponents } from \"../../primitives/Markdown\";\nimport { cn } from \"../../utils/cn\";\nimport { ErrorBoundary } from \"../../utils/ErrorBoundary\";\nimport { Favicon } from \"./Favicon\";\nimport { Prose } from \"./Prose\";\n\ntype UiAssistantMessage = WithNavigation<AiAssistantMessage>;\n\ntype AiChatAssistantMessageComponents = {\n /**\n * The components used to render Markdown content.\n */\n markdown?: Partial<MarkdownComponents>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AiChatAssistantMessage\n * -----------------------------------------------------------------------------------------------*/\nexport interface AiChatAssistantMessageProps extends ComponentProps<\"div\"> {\n /**\n * The message to display.\n */\n message: UiAssistantMessage;\n\n /**\n * How to show or hide reasoning.\n */\n showReasoning?: boolean | \"during\";\n\n /**\n * How to show or hide retrievals.\n */\n showRetrievals?:\n | boolean\n | \"during\"\n | Record<AiRetrievalPart[\"kind\"], boolean | \"during\">;\n\n /**\n * Whether to show sources.\n */\n showSources?: boolean;\n\n /**\n * Override the component's strings.\n */\n overrides?: Partial<GlobalOverrides & AiChatMessageOverrides>;\n\n /**\n * Override the component's components.\n */\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface TextPartProps extends AiMessageContentTextPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface ReasoningPartProps extends AiMessageContentReasoningPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface RetrievalPartProps extends AiMessageContentRetrievalPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface SourcesPartProps extends AiMessageContentSourcesPartProps {\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n}\n\ninterface AiChatSourceProps extends ComponentProps<\"a\"> {\n source: { url: string; title?: string };\n components?: Partial<GlobalComponents>;\n}\n\ninterface AiChatSourcesProps extends ComponentProps<\"ol\"> {\n sources: AiChatSourceProps[\"source\"][];\n maxSources?: number;\n components?: Partial<GlobalComponents>;\n}\n\nfunction getUrlDomain(url: string) {\n return new URL(url).hostname;\n}\n\nfunction AiChatSource({\n source,\n components,\n className,\n ...props\n}: AiChatSourceProps) {\n const { Anchor } = useComponents(components);\n const { metadata } = useUrlMetadata(source.url);\n const label = useMemo(() => {\n return source.title ?? metadata?.title ?? getUrlDomain(source.url);\n }, [source.title, source.url, metadata?.title]);\n\n return (\n <Anchor\n href={source.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={cn(\"lb-ai-chat-source\", className)}\n {...props}\n >\n <Favicon url={source.url} className=\"lb-ai-chat-source-favicon\" />\n <span className=\"lb-ai-chat-source-label\">{label}</span>\n </Anchor>\n );\n}\n\nfunction AiChatSources({\n sources: allSources,\n maxSources,\n components,\n className,\n ...props\n}: AiChatSourcesProps) {\n const $ = useOverrides();\n const [isOpen, setOpen] = useState(false);\n const visibleSources =\n typeof maxSources === \"number\" && !isOpen\n ? allSources.slice(0, maxSources)\n : allSources;\n\n const handleToggle = useCallback(() => {\n setOpen((isOpen) => !isOpen);\n }, []);\n\n return (\n <ol className={cn(\"lb-ai-chat-sources\", className)} {...props}>\n {visibleSources.map((source, index) => {\n return (\n <li key={`${index}-${source.url}`}>\n <AiChatSource source={source} components={components} />\n </li>\n );\n })}\n\n {visibleSources.length !== allSources.length ? (\n <li>\n <button className=\"lb-ai-chat-sources-more\" onClick={handleToggle}>\n <span className=\"lb-ai-chat-sources-more-label\">\n + {$.LIST_REMAINING(allSources.length - visibleSources.length)}\n </span>\n </button>\n </li>\n ) : null}\n </ol>\n );\n}\n\nexport const AiChatAssistantMessage = memo(\n forwardRef<HTMLDivElement, AiChatAssistantMessageProps>(\n (\n {\n message,\n className,\n overrides,\n components,\n showReasoning,\n showRetrievals,\n showSources,\n ...props\n },\n forwardedRef\n ) => {\n const $ = useOverrides(overrides);\n\n let children: ReactNode = null;\n\n const messageContent = (\n <AssistantMessageContent\n message={message}\n components={components}\n showReasoning={showReasoning}\n showRetrievals={showRetrievals}\n showSources={showSources}\n />\n );\n\n if (message.deletedAt !== undefined) {\n children = (\n <div className=\"lb-ai-chat-message-deleted\">\n {$.AI_CHAT_MESSAGE_DELETED}\n </div>\n );\n } else if (\n message.status === \"generating\" ||\n message.status === \"awaiting-tool\"\n ) {\n if (message.contentSoFar.length === 0) {\n children = (\n <div className=\"lb-ai-chat-message-thinking lb-ai-chat-pending\">\n {$.AI_CHAT_MESSAGE_THINKING}\n </div>\n );\n } else {\n children = messageContent;\n }\n } else if (message.status === \"completed\") {\n children = messageContent;\n } else if (message.status === \"failed\") {\n // Do not include the error message if the user aborted the request.\n if (message.errorReason === \"Aborted by user\") {\n children = messageContent;\n } else {\n children = (\n <>\n {messageContent}\n\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n {message.errorReason}\n </div>\n </>\n );\n }\n }\n\n return (\n <div\n className={cn(\n \"lb-ai-chat-message lb-ai-chat-assistant-message\",\n className\n )}\n {...props}\n ref={forwardedRef}\n >\n <OverridesProvider overrides={overrides}>\n {children}\n </OverridesProvider>\n </div>\n );\n }\n )\n);\n\nconst NoopComponent = () => null;\n\nfunction AssistantMessageContent({\n message,\n components,\n showReasoning = true,\n showRetrievals = true,\n showSources = true,\n}: {\n message: UiAssistantMessage;\n components?: Partial<GlobalComponents & AiChatAssistantMessageComponents>;\n showReasoning?: AiChatAssistantMessageProps[\"showReasoning\"];\n showRetrievals?: AiChatAssistantMessageProps[\"showRetrievals\"];\n showSources?: AiChatAssistantMessageProps[\"showSources\"];\n}) {\n const componentsRef = useRef(components);\n let showKnowledgeRetrievals =\n typeof showRetrievals === \"object\"\n ? showRetrievals.knowledge\n : showRetrievals;\n let showWebRetrievals =\n typeof showRetrievals === \"object\" ? showRetrievals.web : showRetrievals;\n\n // Both default to `true` if not specified, even with the object form (e.g. `{ web: \"during\" }`, `knowledge` is still `true`)\n showKnowledgeRetrievals ??= true;\n showWebRetrievals ??= true;\n\n const BoundTextPart = useMemo(\n () => (props: TextPartProps) => (\n <TextPart {...props} components={componentsRef.current} />\n ),\n []\n );\n const BoundReasoningPart = useMemo(\n () => (props: ReasoningPartProps) => {\n if (\n !showReasoning ||\n (showReasoning === \"during\" && !props.isStreaming)\n ) {\n return null;\n }\n\n return <ReasoningPart {...props} components={componentsRef.current} />;\n },\n [showReasoning]\n );\n const BoundRetrievalPart = useMemo(\n () => (props: RetrievalPartProps) => {\n if (props.part.kind === \"knowledge\") {\n if (\n !showKnowledgeRetrievals ||\n (showKnowledgeRetrievals === \"during\" && !props.isStreaming)\n ) {\n return null;\n }\n } else if (props.part.kind === \"web\") {\n if (\n !showWebRetrievals ||\n (showWebRetrievals === \"during\" && !props.isStreaming)\n ) {\n return null;\n }\n }\n\n return <RetrievalPart {...props} />;\n },\n [showKnowledgeRetrievals, showWebRetrievals]\n );\n\n return (\n <AiMessage.Content\n message={message}\n components={{\n TextPart: BoundTextPart,\n ReasoningPart: BoundReasoningPart,\n RetrievalPart: BoundRetrievalPart,\n SourcesPart: showSources ? SourcesPart : NoopComponent,\n ToolInvocationPart,\n }}\n className=\"lb-ai-chat-message-content\"\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * TextPart\n * -----------------------------------------------------------------------------------------------*/\nfunction TextPart({ part, components, isStreaming }: TextPartProps) {\n return (\n <Prose\n content={part.text}\n className=\"lb-ai-chat-message-text\"\n components={components}\n partial={isStreaming}\n />\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ReasoningPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ReasoningPart({ part, isStreaming, components }: ReasoningPartProps) {\n // Start collapsed if reasoning is already done.\n const [isOpen, setIsOpen] = useState(isStreaming);\n const $ = useOverrides();\n\n // Auto-collapse when reasoning is done, while still allowing the user to\n // open/collapse it manually during and after it's done.\n useEffect(() => {\n if (!isStreaming) {\n setIsOpen(false);\n }\n }, [isStreaming]);\n\n return (\n <Collapsible.Root\n className=\"lb-collapsible lb-ai-chat-message-reasoning\"\n open={isOpen}\n onOpenChange={setIsOpen}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {$.AI_CHAT_MESSAGE_REASONING(isStreaming, part)}\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n </Collapsible.Trigger>\n\n <Collapsible.Content className=\"lb-collapsible-content\">\n <Prose\n content={part.text}\n partial={isStreaming}\n components={components}\n />\n </Collapsible.Content>\n </Collapsible.Root>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * RetrievalPart\n * -----------------------------------------------------------------------------------------------*/\nfunction RetrievalPartFavicons({\n sources,\n maxSources,\n}: {\n sources: AiWebRetrievalPart[\"sources\"];\n maxSources?: number;\n}) {\n if (!sources) {\n return null;\n }\n\n const visibleSources =\n typeof maxSources === \"number\" ? sources.slice(0, maxSources) : sources;\n\n return (\n <div className=\"lb-ai-chat-message-retrieval-favicons\">\n {visibleSources.map((source) => (\n <Favicon key={source.url} url={source.url} />\n ))}\n </div>\n );\n}\n\nfunction RetrievalPart({ part, isStreaming }: RetrievalPartProps) {\n const $ = useOverrides();\n let content: ReactNode = null;\n\n if (part.kind === \"web\" && part.sources && part.sources.length > 0) {\n content = (\n <AiChatSources\n className=\"lb-ai-chat-message-retrieval-sources\"\n sources={part.sources}\n />\n );\n }\n\n return (\n <Collapsible.Root\n className=\"lb-collapsible lb-ai-chat-message-retrieval\"\n defaultOpen={false}\n disabled={!content}\n >\n <Collapsible.Trigger\n className={cn(\n \"lb-collapsible-trigger\",\n isStreaming && \"lb-ai-chat-pending\"\n )}\n >\n {$.AI_CHAT_MESSAGE_RETRIEVAL(isStreaming, part)}\n {part.kind === \"web\" ? (\n <RetrievalPartFavicons sources={part.sources} maxSources={3} />\n ) : null}\n {content ? (\n <span className=\"lb-collapsible-chevron lb-icon-container\">\n <ChevronRightIcon />\n </span>\n ) : null}\n </Collapsible.Trigger>\n\n {content ? (\n <Collapsible.Content className=\"lb-collapsible-content\">\n {content}\n </Collapsible.Content>\n ) : null}\n </Collapsible.Root>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * ToolInvocationPart\n * -----------------------------------------------------------------------------------------------*/\nfunction ToolInvocationPart({\n part,\n message,\n}: AiMessageContentToolInvocationPartProps) {\n return (\n <div className=\"lb-ai-chat-message-tool-invocation\">\n <ErrorBoundary\n fallback={\n <div className=\"lb-ai-chat-message-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n <p>\n Failed to render tool call result for <code>{part.name}</code>.\n See console for details.\n </p>\n </div>\n }\n >\n <AiMessageToolInvocation part={part} message={message} />\n </ErrorBoundary>\n </div>\n );\n}\n\n/* -------------------------------------------------------------------------------------------------\n * SourcesPart\n * -----------------------------------------------------------------------------------------------*/\nfunction SourcesPart({ part }: SourcesPartProps) {\n return (\n <AiChatSources\n className=\"lb-ai-chat-message-sources\"\n sources={part.sources}\n maxSources={5}\n />\n );\n}\n"],"names":["components","useComponents","useUrlMetadata","useMemo","jsxs","cn","jsx","Favicon","useOverrides","useState","useCallback","isOpen","memo","forwardRef","overrides","Fragment","WarningIcon","OverridesProvider","useRef","AiMessage.Content","Prose","useEffect","Collapsible.Root","Collapsible.Trigger","ChevronRightIcon","Collapsible.Content","ErrorBoundary","AiMessageToolInvocation"],"mappings":"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"}