{
"name": "chatbot",
"type": "registry:item",
"title": "Chatbot",
"description": "A chatbot component that allows users to chat with an AI model. It uses prompt-kit, shadcn/ui, and AI SDK V5.",
"dependencies": [
"ai",
"@ai-sdk/openai",
"zod",
"@ai-sdk/react",
"use-stick-to-bottom",
"react-markdown",
"remark-gfm",
"shiki",
"marked",
"remark-breaks"
],
"devDependencies": [],
"registryDependencies": [
"avatar",
"tooltip",
"textarea"
],
"files": [
{
"path": "components/primitives/chatbot.tsx",
"content": "\"use client\"\n\nimport {\n ChatContainerContent,\n ChatContainerRoot,\n} from \"@/components/prompt-kit/chat-container\"\nimport { DotsLoader } from \"@/components/prompt-kit/loader\"\nimport {\n Message,\n MessageAction,\n MessageActions,\n MessageContent,\n} from \"@/components/prompt-kit/message\"\nimport {\n PromptInput,\n PromptInputActions,\n PromptInputTextarea,\n} from \"@/components/prompt-kit/prompt-input\"\nimport { Button } from \"@/components/ui/button\"\nimport { cn } from \"@/lib/utils\"\nimport { useChat } from \"@ai-sdk/react\"\nimport { DefaultChatTransport } from \"ai\"\nimport type { UIMessage } from \"ai\"\nimport {\n AlertTriangle,\n ArrowUp,\n Copy,\n ThumbsDown,\n ThumbsUp,\n} from \"lucide-react\"\nimport { memo, useState } from \"react\"\n\ntype MessageComponentProps = {\n message: UIMessage\n isLastMessage: boolean\n}\n\nexport const MessageComponent = memo(\n ({ message, isLastMessage }: MessageComponentProps) => {\n const isAssistant = message.role === \"assistant\"\n\n return (\n {error.message}
\")\n return\n }\n\n const html = await codeToHtml(code, { lang: language, theme })\n setHighlightedHtml(html)\n }\n highlight()\n }, [code, language, theme])\n\n const classNames = cn(\n \"w-full overflow-x-auto text-[13px] [&>pre]:px-4 [&>pre]:py-4\",\n className\n )\n\n // SSR fallback: render plain code if not hydrated yet\n return highlightedHtml ? (\n \n ) : (\n \n {code}\n \n