import type { Message } from "@langchain/langgraph-sdk"; import { useParams } from "next/navigation"; import { memo, useMemo } from "react"; import { Message as AIElementMessage, MessageContent as AIElementMessageContent, MessageResponse as AIElementMessageResponse, MessageToolbar, } from "@/components/ai-elements/message"; import { resolveArtifactURL } from "@/core/artifacts/utils"; import { extractContentFromMessage, extractReasoningContentFromMessage, } from "@/core/messages/utils"; import { useRehypeSplitWordsIntoSpans } from "@/core/rehype"; import { cn } from "@/lib/utils"; import { CopyButton } from "../copy-button"; export function MessageListItem({ className, message, isLoading, }: { className?: string; message: Message; isLoading?: boolean; }) { return (
); } function MessageContent_({ className, message, isLoading = false, }: { className?: string; message: Message; isLoading?: boolean; }) { const rehypePlugins = useRehypeSplitWordsIntoSpans(isLoading); const content = useMemo(() => { const reasoningContent = extractReasoningContentFromMessage(message); const content = extractContentFromMessage(message); if (!isLoading && reasoningContent && !content) { return reasoningContent; } return content; }, [isLoading, message]); const { thread_id } = useParams<{ thread_id: string }>(); return ( ) => { if (!src) return null; if (typeof src !== "string") { return ( {alt} ); } let url = src; if (src.startsWith("/mnt/")) { url = resolveArtifactURL(src, thread_id); } return ( {alt} ); }, }} > {content} ); } const MessageContent = memo(MessageContent_);