[{"data":1,"prerenderedAt":12081},["ShallowReactive",2],{"navigation":3,"-blog-how-to-build-an-ai-chat":958},[4],{"title":5,"path":6,"stem":7,"children":8,"page":36},"Docs","\u002Fdocs","docs",[9,163,816,857],{"title":10,"path":11,"stem":12,"children":13,"framework":16,"category":16,"description":16,"icon":30},"Get Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[14,19,37,47,53,76,141],{"title":15,"path":11,"stem":12,"framework":16,"category":16,"description":17,"icon":18},"Introduction",null,"Nuxt UI is a comprehensive Vue UI component library (Nuxt optional), offering 125+ accessible, Tailwind CSS components for building modern web applications.","i-lucide-house",{"title":20,"framework":16,"category":16,"description":16,"shadow":21,"path":22,"stem":23,"children":24,"page":36},"Installation",true,"\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",[25,31],{"title":20,"path":26,"stem":27,"framework":28,"category":16,"description":29,"icon":30},"\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fnuxt","docs\u002F1.getting-started\u002F2.installation\u002F1.nuxt","nuxt","Learn how to install and configure Nuxt UI in your Nuxt application.","i-lucide-square-play",{"title":20,"path":32,"stem":33,"framework":34,"category":16,"description":35,"icon":30},"\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fvue","docs\u002F1.getting-started\u002F2.installation\u002F2.vue","vue","Learn how to install and configure Nuxt UI in your Vue application, compatible with both plain Vite and Inertia.",false,{"title":38,"framework":16,"category":16,"description":16,"icon":39,"shadow":21,"path":40,"stem":41,"children":42,"page":36},"Migration","i-lucide-arrow-right-left","\u002Fdocs\u002Fgetting-started\u002Fmigration","docs\u002F1.getting-started\u002F3.migration",[43],{"title":38,"path":44,"stem":45,"framework":16,"category":16,"description":46,"icon":39},"\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv4","docs\u002F1.getting-started\u002F3.migration\u002F1.v4","A comprehensive guide to migrate your application from Nuxt UI v3 to Nuxt UI v4.",{"title":48,"path":49,"stem":50,"framework":16,"category":16,"description":51,"icon":52},"Contribution","\u002Fdocs\u002Fgetting-started\u002Fcontribution","docs\u002F1.getting-started\u002F4.contribution","A comprehensive guide on contributing to Nuxt UI, including project structure, development workflow, and best practices.","i-lucide-handshake",{"title":54,"path":55,"stem":56,"children":57,"page":36},"Theme","\u002Fdocs\u002Fgetting-started\u002Ftheme","docs\u002F1.getting-started\u002F5.theme",[58,64,70],{"title":59,"path":60,"stem":61,"framework":16,"category":16,"description":62,"icon":63},"Design System","\u002Fdocs\u002Fgetting-started\u002Ftheme\u002Fdesign-system","docs\u002F1.getting-started\u002F5.theme\u002F1.design-system","Nuxt UI's design system uses Tailwind CSS for simple theming and easy customization.","i-lucide-palette",{"title":65,"path":66,"stem":67,"framework":16,"category":16,"description":68,"icon":69},"CSS Variables","\u002Fdocs\u002Fgetting-started\u002Ftheme\u002Fcss-variables","docs\u002F1.getting-started\u002F5.theme\u002F2.css-variables","Nuxt UI uses CSS variables as design tokens for flexible, consistent theming with built-in light and dark mode support.","i-lucide-swatch-book",{"title":71,"path":72,"stem":73,"framework":16,"category":16,"description":74,"icon":75},"Components","\u002Fdocs\u002Fgetting-started\u002Ftheme\u002Fcomponents","docs\u002F1.getting-started\u002F5.theme\u002F3.components","Learn how to customize Nuxt UI components with the Tailwind Variants API for advanced, flexible, and maintainable styling.","i-lucide-layout-grid",{"title":77,"framework":16,"category":16,"description":16,"path":78,"stem":79,"children":80,"page":36},"Integrations","\u002Fdocs\u002Fgetting-started\u002Fintegrations","docs\u002F1.getting-started\u002F6.integrations",[81,95,101,115,129,135],{"title":82,"framework":16,"category":16,"description":16,"shadow":21,"path":83,"stem":84,"children":85,"page":36},"Icons","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ficons","docs\u002F1.getting-started\u002F6.integrations\u002F1.icons",[86,91],{"title":82,"path":87,"stem":88,"framework":28,"category":16,"description":89,"icon":90},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ficons\u002Fnuxt","docs\u002F1.getting-started\u002F6.integrations\u002F1.icons\u002F1.nuxt","Nuxt UI integrates with Nuxt Icon to access over 200,000+ icons from Iconify.","i-lucide-smile",{"title":82,"path":92,"stem":93,"framework":34,"category":16,"description":94,"icon":90},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ficons\u002Fvue","docs\u002F1.getting-started\u002F6.integrations\u002F1.icons\u002F2.vue","Nuxt UI integrates with Iconify to access over 200,000+ icons.",{"title":96,"path":97,"stem":98,"framework":28,"category":16,"description":99,"icon":100},"Fonts","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ffonts","docs\u002F1.getting-started\u002F6.integrations\u002F2.fonts","Nuxt UI integrates with Nuxt Fonts to provide plug-and-play font optimization.","i-lucide-a-large-small",{"title":102,"framework":16,"category":16,"description":16,"shadow":21,"path":103,"stem":104,"children":105,"page":36},"Color Mode","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcolor-mode","docs\u002F1.getting-started\u002F6.integrations\u002F3.color-mode",[106,111],{"title":102,"path":107,"stem":108,"framework":28,"category":16,"description":109,"icon":110},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcolor-mode\u002Fnuxt","docs\u002F1.getting-started\u002F6.integrations\u002F3.color-mode\u002F1.nuxt","Nuxt UI integrates with Nuxt Color Mode to allow for easy switching between light and dark themes.","i-lucide-sun-moon",{"title":102,"path":112,"stem":113,"framework":34,"category":16,"description":114,"icon":110},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcolor-mode\u002Fvue","docs\u002F1.getting-started\u002F6.integrations\u002F3.color-mode\u002F2.vue","Nuxt UI integrates with VueUse to allow for easy switching between light and dark themes.",{"title":116,"framework":16,"category":16,"description":16,"shadow":21,"path":117,"stem":118,"children":119,"page":36},"I18n","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fi18n","docs\u002F1.getting-started\u002F6.integrations\u002F4.i18n",[120,126],{"title":121,"path":122,"stem":123,"framework":28,"category":16,"description":124,"icon":125},"Internationalization (i18n)","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fi18n\u002Fnuxt","docs\u002F1.getting-started\u002F6.integrations\u002F4.i18n\u002F1.nuxt","Nuxt UI supports 50+ locales and multi-directional (LTR\u002FRTL) internationalization.","i-lucide-languages",{"title":121,"path":127,"stem":128,"framework":34,"category":16,"description":124,"icon":125},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fi18n\u002Fvue","docs\u002F1.getting-started\u002F6.integrations\u002F4.i18n\u002F2.vue",{"title":130,"path":131,"stem":132,"framework":28,"category":16,"description":133,"icon":134},"Content","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcontent","docs\u002F1.getting-started\u002F6.integrations\u002F5.content","Nuxt UI integrates with Nuxt Content to deliver beautiful typography and consistent component styling.","i-simple-icons-markdown",{"title":136,"path":137,"stem":138,"framework":34,"category":16,"description":139,"icon":140},"SSR","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fssr","docs\u002F1.getting-started\u002F6.integrations\u002F6.ssr","Nuxt UI has first-party support for Vue SSR. This guide will help you have it fully enabled.","i-lucide-server",{"title":142,"framework":16,"category":16,"description":16,"path":143,"stem":144,"children":145,"page":36},"Agents","\u002Fdocs\u002Fgetting-started\u002Fai","docs\u002F1.getting-started\u002F7.ai",[146,151,157],{"title":147,"path":148,"stem":149,"framework":16,"category":16,"description":150,"icon":140},"MCP Server","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fmcp","docs\u002F1.getting-started\u002F7.ai\u002F1.mcp","Use Nuxt UI components in your AI assistants with Model Context Protocol support.",{"title":152,"path":153,"stem":154,"framework":16,"category":16,"description":155,"icon":156},"LLMs.txt","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fllms-txt","docs\u002F1.getting-started\u002F7.ai\u002F2.llms-txt","How to get AI tools like Cursor, Windsurf, GitHub Copilot, ChatGPT, and Claude to understand Nuxt UI components, theming, and best practices.","i-lucide-bot",{"title":158,"path":159,"stem":160,"framework":16,"category":16,"description":161,"icon":162},"Skills","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fskills","docs\u002F1.getting-started\u002F7.ai\u002F3.skills","Install Nuxt UI skills to give AI coding agents deep knowledge of components, theming, and best practices.","i-lucide-sparkles",{"title":71,"framework":16,"category":16,"description":16,"icon":164,"path":165,"stem":166,"children":167,"page":36},"i-lucide-square-code","\u002Fdocs\u002Fcomponents","docs\u002F2.components",[168,174,180,186,192,197,202,207,212,217,222,228,233,238,243,248,253,258,264,269,274,279,284,289,295,300,305,311,316,321,326,332,337,342,347,352,357,362,367,373,378,383,388,393,399,405,410,415,420,425,430,435,440,445,450,455,460,466,471,476,481,486,491,496,501,506,511,516,521,526,531,536,541,546,551,556,561,566,571,576,581,587,592,597,602,607,612,617,622,627,632,637,642,647,652,657,662,667,672,677,682,687,692,697,702,707,712,717,722,727,732,737,742,747,752,757,762,767,772,777,782,787,791,796,801,806,811],{"title":169,"path":170,"stem":171,"framework":16,"category":172,"description":173},"Accordion","\u002Fdocs\u002Fcomponents\u002Faccordion","docs\u002F2.components\u002Faccordion","data","A stacked set of collapsible panels.",{"title":175,"path":176,"stem":177,"framework":16,"category":178,"description":179},"Alert","\u002Fdocs\u002Fcomponents\u002Falert","docs\u002F2.components\u002Falert","element","A callout to draw user's attention.",{"title":181,"path":182,"stem":183,"framework":16,"category":184,"description":185},"App","\u002Fdocs\u002Fcomponents\u002Fapp","docs\u002F2.components\u002Fapp","layout","Wraps your app to provide global configurations and more.",{"title":187,"path":188,"stem":189,"framework":16,"category":190,"description":191},"AuthForm","\u002Fdocs\u002Fcomponents\u002Fauth-form","docs\u002F2.components\u002Fauth-form","page","A customizable Form to create login, register or password reset forms.",{"title":193,"path":194,"stem":195,"framework":16,"category":178,"description":196},"Avatar","\u002Fdocs\u002Fcomponents\u002Favatar","docs\u002F2.components\u002Favatar","An img element with fallback and Nuxt Image support.",{"title":198,"path":199,"stem":200,"framework":16,"category":178,"description":201},"AvatarGroup","\u002Fdocs\u002Fcomponents\u002Favatar-group","docs\u002F2.components\u002Favatar-group","Stack multiple avatars in a group.",{"title":203,"path":204,"stem":205,"framework":16,"category":178,"description":206},"Badge","\u002Fdocs\u002Fcomponents\u002Fbadge","docs\u002F2.components\u002Fbadge","A short text to represent a status or a category.",{"title":208,"path":209,"stem":210,"framework":16,"category":178,"description":211},"Banner","\u002Fdocs\u002Fcomponents\u002Fbanner","docs\u002F2.components\u002Fbanner","Display a banner at the top of your website to inform users about important information.",{"title":213,"path":214,"stem":215,"framework":16,"category":190,"description":216},"BlogPost","\u002Fdocs\u002Fcomponents\u002Fblog-post","docs\u002F2.components\u002Fblog-post","A customizable article to display in a blog page.",{"title":218,"path":219,"stem":220,"framework":16,"category":190,"description":221},"BlogPosts","\u002Fdocs\u002Fcomponents\u002Fblog-posts","docs\u002F2.components\u002Fblog-posts","Display a list of blog posts in a responsive grid layout.",{"title":223,"path":224,"stem":225,"framework":16,"category":226,"description":227},"Breadcrumb","\u002Fdocs\u002Fcomponents\u002Fbreadcrumb","docs\u002F2.components\u002Fbreadcrumb","navigation","A hierarchy of links to navigate through a website.",{"title":229,"path":230,"stem":231,"framework":16,"category":178,"description":232},"Button","\u002Fdocs\u002Fcomponents\u002Fbutton","docs\u002F2.components\u002Fbutton","A button element that can act as a link or trigger an action.",{"title":234,"path":235,"stem":236,"framework":16,"category":178,"description":237},"Calendar","\u002Fdocs\u002Fcomponents\u002Fcalendar","docs\u002F2.components\u002Fcalendar","A calendar component for selecting single dates, multiple dates or date ranges.",{"title":239,"path":240,"stem":241,"framework":16,"category":178,"description":242},"Card","\u002Fdocs\u002Fcomponents\u002Fcard","docs\u002F2.components\u002Fcard","Display content in a card with a header, body and footer.",{"title":244,"path":245,"stem":246,"framework":16,"category":172,"description":247},"Carousel","\u002Fdocs\u002Fcomponents\u002Fcarousel","docs\u002F2.components\u002Fcarousel","A carousel with motion and swipe built using Embla.",{"title":249,"path":250,"stem":251,"framework":16,"category":190,"description":252},"ChangelogVersion","\u002Fdocs\u002Fcomponents\u002Fchangelog-version","docs\u002F2.components\u002Fchangelog-version","A customizable article to display in a changelog.",{"title":254,"path":255,"stem":256,"framework":16,"category":190,"description":257},"ChangelogVersions","\u002Fdocs\u002Fcomponents\u002Fchangelog-versions","docs\u002F2.components\u002Fchangelog-versions","Display a list of changelog versions in a timeline.",{"title":259,"path":260,"stem":261,"framework":16,"category":262,"description":263},"Chat","\u002Fdocs\u002Fcomponents\u002Fchat","docs\u002F2.components\u002Fchat","chat","Build AI chat interfaces with streaming, reasoning, and tool calling.",{"title":265,"path":266,"stem":267,"framework":16,"category":262,"description":268},"ChatMessage","\u002Fdocs\u002Fcomponents\u002Fchat-message","docs\u002F2.components\u002Fchat-message","Display a chat message with icon, avatar, and actions.",{"title":270,"path":271,"stem":272,"framework":16,"category":262,"description":273},"ChatMessages","\u002Fdocs\u002Fcomponents\u002Fchat-messages","docs\u002F2.components\u002Fchat-messages","Display a list of chat messages, designed to work seamlessly with Vercel AI SDK.",{"title":275,"path":276,"stem":277,"framework":16,"category":262,"description":278},"ChatPalette","\u002Fdocs\u002Fcomponents\u002Fchat-palette","docs\u002F2.components\u002Fchat-palette","A chat palette to create a chatbot interface inside an overlay.",{"title":280,"path":281,"stem":282,"framework":16,"category":262,"description":283},"ChatPrompt","\u002Fdocs\u002Fcomponents\u002Fchat-prompt","docs\u002F2.components\u002Fchat-prompt","An enhanced Textarea for submitting prompts in AI chat interfaces.",{"title":285,"path":286,"stem":287,"framework":16,"category":262,"description":288},"ChatPromptSubmit","\u002Fdocs\u002Fcomponents\u002Fchat-prompt-submit","docs\u002F2.components\u002Fchat-prompt-submit","A Button for submitting chat prompts with automatic status handling.",{"title":290,"path":291,"stem":292,"framework":16,"category":262,"description":293,"badge":294},"ChatReasoning","\u002Fdocs\u002Fcomponents\u002Fchat-reasoning","docs\u002F2.components\u002Fchat-reasoning","Display a collapsible AI reasoning or thinking process.","New",{"title":296,"path":297,"stem":298,"framework":16,"category":262,"description":299,"badge":294},"ChatShimmer","\u002Fdocs\u002Fcomponents\u002Fchat-shimmer","docs\u002F2.components\u002Fchat-shimmer","Display a text shimmer animation effect.",{"title":301,"path":302,"stem":303,"framework":16,"category":262,"description":304,"badge":294},"ChatTool","\u002Fdocs\u002Fcomponents\u002Fchat-tool","docs\u002F2.components\u002Fchat-tool","Display a collapsible AI tool invocation status.",{"title":306,"path":307,"stem":308,"framework":16,"category":309,"description":310},"Checkbox","\u002Fdocs\u002Fcomponents\u002Fcheckbox","docs\u002F2.components\u002Fcheckbox","form","An input element to toggle between checked and unchecked states.",{"title":312,"path":313,"stem":314,"framework":16,"category":309,"description":315},"CheckboxGroup","\u002Fdocs\u002Fcomponents\u002Fcheckbox-group","docs\u002F2.components\u002Fcheckbox-group","A set of checklist buttons to select multiple option from a list.",{"title":317,"path":318,"stem":319,"framework":16,"category":178,"description":320},"Chip","\u002Fdocs\u002Fcomponents\u002Fchip","docs\u002F2.components\u002Fchip","An indicator of a numeric value or a state.",{"title":322,"path":323,"stem":324,"framework":16,"category":178,"description":325},"Collapsible","\u002Fdocs\u002Fcomponents\u002Fcollapsible","docs\u002F2.components\u002Fcollapsible","A collapsible element to toggle visibility of its content.",{"title":327,"path":328,"stem":329,"framework":16,"category":330,"description":331},"ColorModeAvatar","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-avatar","docs\u002F2.components\u002Fcolor-mode-avatar","color-mode","An Avatar with a different source for light and dark mode.",{"title":333,"path":334,"stem":335,"framework":16,"category":330,"description":336},"ColorModeButton","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-button","docs\u002F2.components\u002Fcolor-mode-button","A Button to switch between light and dark mode.",{"title":338,"path":339,"stem":340,"framework":16,"category":330,"description":341},"ColorModeImage","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-image","docs\u002F2.components\u002Fcolor-mode-image","An image element with a different source for light and dark mode.",{"title":343,"path":344,"stem":345,"framework":16,"category":330,"description":346},"ColorModeSelect","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-select","docs\u002F2.components\u002Fcolor-mode-select","A Select to switch between system, dark & light mode.",{"title":348,"path":349,"stem":350,"framework":16,"category":330,"description":351},"ColorModeSwitch","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-switch","docs\u002F2.components\u002Fcolor-mode-switch","A switch to toggle between light and dark mode.",{"title":353,"path":354,"stem":355,"framework":16,"category":309,"description":356},"ColorPicker","\u002Fdocs\u002Fcomponents\u002Fcolor-picker","docs\u002F2.components\u002Fcolor-picker","A component to select a color.",{"title":358,"path":359,"stem":360,"framework":16,"category":226,"description":361},"CommandPalette","\u002Fdocs\u002Fcomponents\u002Fcommand-palette","docs\u002F2.components\u002Fcommand-palette","A command palette with full-text search powered by Fuse.js for efficient fuzzy matching.",{"title":363,"path":364,"stem":365,"framework":16,"category":184,"description":366},"Container","\u002Fdocs\u002Fcomponents\u002Fcontainer","docs\u002F2.components\u002Fcontainer","A container lets you center and constrain the width of your content.",{"title":368,"path":369,"stem":370,"framework":28,"category":371,"description":372},"ContentNavigation","\u002Fdocs\u002Fcomponents\u002Fcontent-navigation","docs\u002F2.components\u002Fcontent-navigation","content","An accordion-style navigation component for organizing page links.",{"title":374,"path":375,"stem":376,"framework":28,"category":371,"description":377},"ContentSearch","\u002Fdocs\u002Fcomponents\u002Fcontent-search","docs\u002F2.components\u002Fcontent-search","A ready to use CommandPalette to add to your documentation.",{"title":379,"path":380,"stem":381,"framework":28,"category":371,"description":382},"ContentSearchButton","\u002Fdocs\u002Fcomponents\u002Fcontent-search-button","docs\u002F2.components\u002Fcontent-search-button","A pre-styled Button to open the ContentSearch modal.",{"title":384,"path":385,"stem":386,"framework":28,"category":371,"description":387},"ContentSurround","\u002Fdocs\u002Fcomponents\u002Fcontent-surround","docs\u002F2.components\u002Fcontent-surround","A pair of prev and next links to navigate between pages.",{"title":389,"path":390,"stem":391,"framework":28,"category":371,"description":392},"ContentToc","\u002Fdocs\u002Fcomponents\u002Fcontent-toc","docs\u002F2.components\u002Fcontent-toc","A sticky Table of Contents with automatic active anchor link highlighting.",{"title":394,"path":395,"stem":396,"framework":16,"category":397,"description":398},"ContextMenu","\u002Fdocs\u002Fcomponents\u002Fcontext-menu","docs\u002F2.components\u002Fcontext-menu","overlay","A menu to display actions when right-clicking on an element.",{"title":400,"path":401,"stem":402,"framework":16,"category":403,"description":404},"DashboardGroup","\u002Fdocs\u002Fcomponents\u002Fdashboard-group","docs\u002F2.components\u002Fdashboard-group","dashboard","A fixed layout component that provides context for dashboard components with sidebar state management and persistence.",{"title":406,"path":407,"stem":408,"framework":16,"category":403,"description":409},"DashboardNavbar","\u002Fdocs\u002Fcomponents\u002Fdashboard-navbar","docs\u002F2.components\u002Fdashboard-navbar","A responsive navbar to display in a dashboard.",{"title":411,"path":412,"stem":413,"framework":16,"category":403,"description":414},"DashboardPanel","\u002Fdocs\u002Fcomponents\u002Fdashboard-panel","docs\u002F2.components\u002Fdashboard-panel","A resizable panel to display in a dashboard.",{"title":416,"path":417,"stem":418,"framework":16,"category":403,"description":419},"DashboardResizeHandle","\u002Fdocs\u002Fcomponents\u002Fdashboard-resize-handle","docs\u002F2.components\u002Fdashboard-resize-handle","A handle to resize a sidebar or panel.",{"title":421,"path":422,"stem":423,"framework":16,"category":403,"description":424},"DashboardSearch","\u002Fdocs\u002Fcomponents\u002Fdashboard-search","docs\u002F2.components\u002Fdashboard-search","A ready to use CommandPalette to add to your dashboard.",{"title":426,"path":427,"stem":428,"framework":16,"category":403,"description":429},"DashboardSearchButton","\u002Fdocs\u002Fcomponents\u002Fdashboard-search-button","docs\u002F2.components\u002Fdashboard-search-button","A pre-styled Button to open the DashboardSearch modal.",{"title":431,"path":432,"stem":433,"framework":16,"category":403,"description":434},"DashboardSidebar","\u002Fdocs\u002Fcomponents\u002Fdashboard-sidebar","docs\u002F2.components\u002Fdashboard-sidebar","A resizable and collapsible sidebar to display in a dashboard.",{"title":436,"path":437,"stem":438,"framework":16,"category":403,"description":439},"DashboardSidebarCollapse","\u002Fdocs\u002Fcomponents\u002Fdashboard-sidebar-collapse","docs\u002F2.components\u002Fdashboard-sidebar-collapse","A Button to collapse the sidebar on desktop.",{"title":441,"path":442,"stem":443,"framework":16,"category":403,"description":444},"DashboardSidebarToggle","\u002Fdocs\u002Fcomponents\u002Fdashboard-sidebar-toggle","docs\u002F2.components\u002Fdashboard-sidebar-toggle","A Button to toggle the sidebar on mobile.",{"title":446,"path":447,"stem":448,"framework":16,"category":403,"description":449},"DashboardToolbar","\u002Fdocs\u002Fcomponents\u002Fdashboard-toolbar","docs\u002F2.components\u002Fdashboard-toolbar","A toolbar to display under the navbar in a dashboard.",{"title":451,"path":452,"stem":453,"framework":16,"category":397,"description":454},"Drawer","\u002Fdocs\u002Fcomponents\u002Fdrawer","docs\u002F2.components\u002Fdrawer","A drawer that smoothly slides in & out of the screen.",{"title":456,"path":457,"stem":458,"framework":16,"category":397,"description":459},"DropdownMenu","\u002Fdocs\u002Fcomponents\u002Fdropdown-menu","docs\u002F2.components\u002Fdropdown-menu","A menu to display actions when clicking on an element.",{"title":461,"path":462,"stem":463,"framework":16,"category":464,"description":465},"Editor","\u002Fdocs\u002Fcomponents\u002Feditor","docs\u002F2.components\u002Feditor","editor","A rich text editor component based on TipTap with support for markdown, HTML, and JSON content types.",{"title":467,"path":468,"stem":469,"framework":16,"category":464,"description":470},"EditorDragHandle","\u002Fdocs\u002Fcomponents\u002Feditor-drag-handle","docs\u002F2.components\u002Feditor-drag-handle","A draggable handle for reordering and selecting blocks in the editor.",{"title":472,"path":473,"stem":474,"framework":16,"category":464,"description":475},"EditorEmojiMenu","\u002Fdocs\u002Fcomponents\u002Feditor-emoji-menu","docs\u002F2.components\u002Feditor-emoji-menu","An emoji picker menu that displays emoji suggestions when typing the : character in the editor.",{"title":477,"path":478,"stem":479,"framework":16,"category":464,"description":480},"EditorMentionMenu","\u002Fdocs\u002Fcomponents\u002Feditor-mention-menu","docs\u002F2.components\u002Feditor-mention-menu","A mention menu that displays user suggestions when typing a trigger character in the editor.",{"title":482,"path":483,"stem":484,"framework":16,"category":464,"description":485},"EditorSuggestionMenu","\u002Fdocs\u002Fcomponents\u002Feditor-suggestion-menu","docs\u002F2.components\u002Feditor-suggestion-menu","A command menu that displays formatting and action suggestions when typing the \u002F character in the editor.",{"title":487,"path":488,"stem":489,"framework":16,"category":464,"description":490},"EditorToolbar","\u002Fdocs\u002Fcomponents\u002Feditor-toolbar","docs\u002F2.components\u002Feditor-toolbar","A customizable toolbar for editor actions that can be displayed as fixed, bubble, or floating menu.",{"title":492,"path":493,"stem":494,"framework":16,"category":172,"description":495},"Empty","\u002Fdocs\u002Fcomponents\u002Fempty","docs\u002F2.components\u002Fempty","A component to display an empty state.",{"title":497,"path":498,"stem":499,"framework":16,"category":184,"description":500},"Error","\u002Fdocs\u002Fcomponents\u002Ferror","docs\u002F2.components\u002Ferror","A pre-built error component with NuxtError support.",{"title":502,"path":503,"stem":504,"framework":16,"category":178,"description":505},"FieldGroup","\u002Fdocs\u002Fcomponents\u002Ffield-group","docs\u002F2.components\u002Ffield-group","Group multiple button-like elements together.",{"title":507,"path":508,"stem":509,"framework":16,"category":309,"description":510},"FileUpload","\u002Fdocs\u002Fcomponents\u002Ffile-upload","docs\u002F2.components\u002Ffile-upload","An input element to upload files.",{"title":512,"path":513,"stem":514,"framework":16,"category":184,"description":515},"Footer","\u002Fdocs\u002Fcomponents\u002Ffooter","docs\u002F2.components\u002Ffooter","A responsive footer component.",{"title":517,"path":518,"stem":519,"framework":16,"category":226,"description":520},"FooterColumns","\u002Fdocs\u002Fcomponents\u002Ffooter-columns","docs\u002F2.components\u002Ffooter-columns","A list of links as columns to display in your Footer.",{"title":522,"path":523,"stem":524,"framework":16,"category":309,"description":525},"Form","\u002Fdocs\u002Fcomponents\u002Fform","docs\u002F2.components\u002Fform","A form component with built-in validation and submission handling.",{"title":527,"path":528,"stem":529,"framework":16,"category":309,"description":530},"FormField","\u002Fdocs\u002Fcomponents\u002Fform-field","docs\u002F2.components\u002Fform-field","A wrapper for form elements that provides validation and error handling.",{"title":532,"path":533,"stem":534,"framework":16,"category":184,"description":535},"Header","\u002Fdocs\u002Fcomponents\u002Fheader","docs\u002F2.components\u002Fheader","A responsive header component.",{"title":537,"path":538,"stem":539,"framework":16,"category":178,"description":540},"Icon","\u002Fdocs\u002Fcomponents\u002Ficon","docs\u002F2.components\u002Ficon","A component to display any icon from Iconify or another component.",{"title":542,"path":543,"stem":544,"framework":16,"category":309,"description":545},"Input","\u002Fdocs\u002Fcomponents\u002Finput","docs\u002F2.components\u002Finput","An input element to enter text.",{"title":547,"path":548,"stem":549,"framework":16,"category":309,"description":550},"InputDate","\u002Fdocs\u002Fcomponents\u002Finput-date","docs\u002F2.components\u002Finput-date","An input component for date selection.",{"title":552,"path":553,"stem":554,"framework":16,"category":309,"description":555},"InputMenu","\u002Fdocs\u002Fcomponents\u002Finput-menu","docs\u002F2.components\u002Finput-menu","An autocomplete input with real-time suggestions.",{"title":557,"path":558,"stem":559,"framework":16,"category":309,"description":560},"InputNumber","\u002Fdocs\u002Fcomponents\u002Finput-number","docs\u002F2.components\u002Finput-number","An input for numerical values with a customizable range.",{"title":562,"path":563,"stem":564,"framework":16,"category":309,"description":565},"InputTags","\u002Fdocs\u002Fcomponents\u002Finput-tags","docs\u002F2.components\u002Finput-tags","An input element that displays interactive tags.",{"title":567,"path":568,"stem":569,"framework":16,"category":309,"description":570},"InputTime","\u002Fdocs\u002Fcomponents\u002Finput-time","docs\u002F2.components\u002Finput-time","An input for selecting a time.",{"title":572,"path":573,"stem":574,"framework":16,"category":178,"description":575},"Kbd","\u002Fdocs\u002Fcomponents\u002Fkbd","docs\u002F2.components\u002Fkbd","A kbd element to display a keyboard key.",{"title":577,"path":578,"stem":579,"framework":16,"category":226,"description":580},"Link","\u002Fdocs\u002Fcomponents\u002Flink","docs\u002F2.components\u002Flink","A wrapper around \u003CNuxtLink> with extra props.",{"title":582,"path":583,"stem":584,"framework":16,"category":585,"description":586},"LocaleSelect","\u002Fdocs\u002Fcomponents\u002Flocale-select","docs\u002F2.components\u002Flocale-select","i18n","A Select to switch between locales.",{"title":588,"path":589,"stem":590,"framework":16,"category":184,"description":591},"Main","\u002Fdocs\u002Fcomponents\u002Fmain","docs\u002F2.components\u002Fmain","A main element that fills the available viewport height.",{"title":593,"path":594,"stem":595,"framework":16,"category":172,"description":596},"Marquee","\u002Fdocs\u002Fcomponents\u002Fmarquee","docs\u002F2.components\u002Fmarquee","A component to create infinite scrolling content.",{"title":598,"path":599,"stem":600,"framework":16,"category":397,"description":601},"Modal","\u002Fdocs\u002Fcomponents\u002Fmodal","docs\u002F2.components\u002Fmodal","A dialog window that can be used to display a message or request user input.",{"title":603,"path":604,"stem":605,"framework":16,"category":226,"description":606},"NavigationMenu","\u002Fdocs\u002Fcomponents\u002Fnavigation-menu","docs\u002F2.components\u002Fnavigation-menu","A list of links that can be displayed horizontally or vertically.",{"title":608,"path":609,"stem":610,"framework":16,"category":190,"description":611},"Page","\u002Fdocs\u002Fcomponents\u002Fpage","docs\u002F2.components\u002Fpage","A grid layout for your pages with left and right columns.",{"title":613,"path":614,"stem":615,"framework":16,"category":190,"description":616},"PageAnchors","\u002Fdocs\u002Fcomponents\u002Fpage-anchors","docs\u002F2.components\u002Fpage-anchors","A list of anchors to be displayed in the page.",{"title":618,"path":619,"stem":620,"framework":16,"category":190,"description":621},"PageAside","\u002Fdocs\u002Fcomponents\u002Fpage-aside","docs\u002F2.components\u002Fpage-aside","A sticky aside to display your page navigation.",{"title":623,"path":624,"stem":625,"framework":16,"category":190,"description":626},"PageBody","\u002Fdocs\u002Fcomponents\u002Fpage-body","docs\u002F2.components\u002Fpage-body","The main content of your page.",{"title":628,"path":629,"stem":630,"framework":16,"category":190,"description":631},"PageCard","\u002Fdocs\u002Fcomponents\u002Fpage-card","docs\u002F2.components\u002Fpage-card","A pre-styled card component that displays a title, description and optional link.",{"title":633,"path":634,"stem":635,"framework":16,"category":190,"description":636},"PageColumns","\u002Fdocs\u002Fcomponents\u002Fpage-columns","docs\u002F2.components\u002Fpage-columns","A responsive multi-column layout system for organizing content side-by-side.",{"title":638,"path":639,"stem":640,"framework":16,"category":190,"description":641},"PageCTA","\u002Fdocs\u002Fcomponents\u002Fpage-cta","docs\u002F2.components\u002Fpage-cta","A call to action section to display in your pages.",{"title":643,"path":644,"stem":645,"framework":16,"category":190,"description":646},"PageFeature","\u002Fdocs\u002Fcomponents\u002Fpage-feature","docs\u002F2.components\u002Fpage-feature","A component to showcase key features of your application.",{"title":648,"path":649,"stem":650,"framework":16,"category":190,"description":651},"PageGrid","\u002Fdocs\u002Fcomponents\u002Fpage-grid","docs\u002F2.components\u002Fpage-grid","A responsive grid system for displaying content in a flexible layout.",{"title":653,"path":654,"stem":655,"framework":16,"category":190,"description":656},"PageHeader","\u002Fdocs\u002Fcomponents\u002Fpage-header","docs\u002F2.components\u002Fpage-header","A responsive header for your pages.",{"title":658,"path":659,"stem":660,"framework":16,"category":190,"description":661},"PageHero","\u002Fdocs\u002Fcomponents\u002Fpage-hero","docs\u002F2.components\u002Fpage-hero","A responsive hero for your pages.",{"title":663,"path":664,"stem":665,"framework":16,"category":190,"description":666},"PageLinks","\u002Fdocs\u002Fcomponents\u002Fpage-links","docs\u002F2.components\u002Fpage-links","A list of links to be displayed in the page.",{"title":668,"path":669,"stem":670,"framework":16,"category":190,"description":671},"PageList","\u002Fdocs\u002Fcomponents\u002Fpage-list","docs\u002F2.components\u002Fpage-list","A vertical list layout for displaying content in a stacked format.",{"title":673,"path":674,"stem":675,"framework":16,"category":190,"description":676},"PageLogos","\u002Fdocs\u002Fcomponents\u002Fpage-logos","docs\u002F2.components\u002Fpage-logos","A list of logos or images to display on your pages.",{"title":678,"path":679,"stem":680,"framework":16,"category":190,"description":681},"PageSection","\u002Fdocs\u002Fcomponents\u002Fpage-section","docs\u002F2.components\u002Fpage-section","A responsive section for your pages.",{"title":683,"path":684,"stem":685,"framework":16,"category":226,"description":686},"Pagination","\u002Fdocs\u002Fcomponents\u002Fpagination","docs\u002F2.components\u002Fpagination","A list of buttons or links to navigate through pages.",{"title":688,"path":689,"stem":690,"framework":16,"category":309,"description":691},"PinInput","\u002Fdocs\u002Fcomponents\u002Fpin-input","docs\u002F2.components\u002Fpin-input","An input element to enter a pin.",{"title":693,"path":694,"stem":695,"framework":16,"category":397,"description":696},"Popover","\u002Fdocs\u002Fcomponents\u002Fpopover","docs\u002F2.components\u002Fpopover","A non-modal dialog that floats around a trigger element.",{"title":698,"path":699,"stem":700,"framework":16,"category":190,"description":701},"PricingPlan","\u002Fdocs\u002Fcomponents\u002Fpricing-plan","docs\u002F2.components\u002Fpricing-plan","A customizable pricing plan to display in a pricing page.",{"title":703,"path":704,"stem":705,"framework":16,"category":190,"description":706},"PricingPlans","\u002Fdocs\u002Fcomponents\u002Fpricing-plans","docs\u002F2.components\u002Fpricing-plans","Display a list of pricing plans in a responsive grid layout.",{"title":708,"path":709,"stem":710,"framework":16,"category":190,"description":711},"PricingTable","\u002Fdocs\u002Fcomponents\u002Fpricing-table","docs\u002F2.components\u002Fpricing-table","A responsive pricing table component that displays tiered pricing plans with feature comparisons.",{"title":713,"path":714,"stem":715,"framework":16,"category":178,"description":716},"Progress","\u002Fdocs\u002Fcomponents\u002Fprogress","docs\u002F2.components\u002Fprogress","An indicator showing the progress of a task.",{"title":718,"path":719,"stem":720,"framework":16,"category":309,"description":721},"RadioGroup","\u002Fdocs\u002Fcomponents\u002Fradio-group","docs\u002F2.components\u002Fradio-group","A set of radio buttons to select a single option from a list.",{"title":723,"path":724,"stem":725,"framework":16,"category":172,"description":726},"ScrollArea","\u002Fdocs\u002Fcomponents\u002Fscroll-area","docs\u002F2.components\u002Fscroll-area","A flexible scroll container with virtualization support.",{"title":728,"path":729,"stem":730,"framework":16,"category":309,"description":731},"Select","\u002Fdocs\u002Fcomponents\u002Fselect","docs\u002F2.components\u002Fselect","A select element to choose from a list of options.",{"title":733,"path":734,"stem":735,"framework":16,"category":309,"description":736},"SelectMenu","\u002Fdocs\u002Fcomponents\u002Fselect-menu","docs\u002F2.components\u002Fselect-menu","An advanced searchable select element.",{"title":738,"path":739,"stem":740,"framework":16,"category":178,"description":741},"Separator","\u002Fdocs\u002Fcomponents\u002Fseparator","docs\u002F2.components\u002Fseparator","Separates content horizontally or vertically.",{"title":743,"path":744,"stem":745,"framework":16,"category":184,"description":746,"badge":294},"Sidebar","\u002Fdocs\u002Fcomponents\u002Fsidebar","docs\u002F2.components\u002Fsidebar","A collapsible sidebar with multiple visual variants.",{"title":748,"path":749,"stem":750,"framework":16,"category":178,"description":751},"Skeleton","\u002Fdocs\u002Fcomponents\u002Fskeleton","docs\u002F2.components\u002Fskeleton","A placeholder to show while content is loading.",{"title":753,"path":754,"stem":755,"framework":16,"category":397,"description":756},"Slideover","\u002Fdocs\u002Fcomponents\u002Fslideover","docs\u002F2.components\u002Fslideover","A dialog that slides in from any side of the screen.",{"title":758,"path":759,"stem":760,"framework":16,"category":309,"description":761},"Slider","\u002Fdocs\u002Fcomponents\u002Fslider","docs\u002F2.components\u002Fslider","An input to select a numeric value within a range.",{"title":763,"path":764,"stem":765,"framework":16,"category":226,"description":766},"Stepper","\u002Fdocs\u002Fcomponents\u002Fstepper","docs\u002F2.components\u002Fstepper","A set of steps that are used to indicate progress through a multi-step process.",{"title":768,"path":769,"stem":770,"framework":16,"category":309,"description":771},"Switch","\u002Fdocs\u002Fcomponents\u002Fswitch","docs\u002F2.components\u002Fswitch","A control that toggles between two states.",{"title":773,"path":774,"stem":775,"framework":16,"category":172,"description":776},"Table","\u002Fdocs\u002Fcomponents\u002Ftable","docs\u002F2.components\u002Ftable","A responsive table element to display data in rows and columns.",{"title":778,"path":779,"stem":780,"framework":16,"category":226,"description":781},"Tabs","\u002Fdocs\u002Fcomponents\u002Ftabs","docs\u002F2.components\u002Ftabs","A set of tab panels that are displayed one at a time.",{"title":783,"path":784,"stem":785,"framework":16,"category":309,"description":786},"Textarea","\u002Fdocs\u002Fcomponents\u002Ftextarea","docs\u002F2.components\u002Ftextarea","A textarea element to input multi-line text.",{"title":54,"path":788,"stem":789,"framework":16,"category":184,"description":790},"\u002Fdocs\u002Fcomponents\u002Ftheme","docs\u002F2.components\u002Ftheme","A headless component to theme child components.",{"title":792,"path":793,"stem":794,"framework":16,"category":172,"description":795},"Timeline","\u002Fdocs\u002Fcomponents\u002Ftimeline","docs\u002F2.components\u002Ftimeline","A component that displays a sequence of events with dates, titles, icons or avatars.",{"title":797,"path":798,"stem":799,"framework":16,"category":397,"description":800},"Toast","\u002Fdocs\u002Fcomponents\u002Ftoast","docs\u002F2.components\u002Ftoast","A succinct message to provide information or feedback to the user.",{"title":802,"path":803,"stem":804,"framework":16,"category":397,"description":805},"Tooltip","\u002Fdocs\u002Fcomponents\u002Ftooltip","docs\u002F2.components\u002Ftooltip","A popup that reveals information when hovering over an element.",{"title":807,"path":808,"stem":809,"framework":16,"category":172,"description":810},"Tree","\u002Fdocs\u002Fcomponents\u002Ftree","docs\u002F2.components\u002Ftree","A tree view component to display and interact with hierarchical data structures.",{"title":812,"path":813,"stem":814,"framework":16,"category":172,"description":815},"User","\u002Fdocs\u002Fcomponents\u002Fuser","docs\u002F2.components\u002Fuser","Display user information with name, description and avatar.",{"title":817,"framework":16,"category":16,"description":16,"icon":818,"path":819,"stem":820,"children":821,"page":36},"Composables","i-lucide-square-function","\u002Fdocs\u002Fcomposables","docs\u002F3.composables",[822,827,832,837,842,847,852],{"title":823,"path":824,"stem":825,"framework":16,"category":16,"description":826},"defineLocale","\u002Fdocs\u002Fcomposables\u002Fdefine-locale","docs\u002F3.composables\u002Fdefine-locale","A utility to create a custom locale for your app.",{"title":828,"path":829,"stem":830,"framework":16,"category":16,"description":831},"defineShortcuts","\u002Fdocs\u002Fcomposables\u002Fdefine-shortcuts","docs\u002F3.composables\u002Fdefine-shortcuts","A composable to define keyboard shortcuts in your app.",{"title":833,"path":834,"stem":835,"framework":16,"category":16,"description":836},"extendLocale","\u002Fdocs\u002Fcomposables\u002Fextend-locale","docs\u002F3.composables\u002Fextend-locale","A utility to extend an existing locale with custom translations.",{"title":838,"path":839,"stem":840,"framework":16,"category":16,"description":841},"extractShortcuts","\u002Fdocs\u002Fcomposables\u002Fextract-shortcuts","docs\u002F3.composables\u002Fextract-shortcuts","A utility to extract keyboard shortcuts from menu items.",{"title":843,"path":844,"stem":845,"framework":16,"category":16,"description":846},"useOverlay","\u002Fdocs\u002Fcomposables\u002Fuse-overlay","docs\u002F3.composables\u002Fuse-overlay","A composable to programmatically control overlays.",{"title":848,"path":849,"stem":850,"framework":16,"category":16,"description":851,"badge":294},"useScrollShadow","\u002Fdocs\u002Fcomposables\u002Fuse-scroll-shadow","docs\u002F3.composables\u002Fuse-scroll-shadow","A composable to apply scroll shadow effects on any scrollable element.",{"title":853,"path":854,"stem":855,"framework":16,"category":16,"description":856},"useToast","\u002Fdocs\u002Fcomposables\u002Fuse-toast","docs\u002F3.composables\u002Fuse-toast","A composable to display toast notifications in your app.",{"title":858,"path":859,"stem":860,"children":861,"framework":28,"category":16,"description":16,"icon":957},"Typography","\u002Fdocs\u002Ftypography","docs\u002F4.typography\u002F1.index",[862,864,869,874,879,884,889,893,898,902,907,912,917,922,927,931,936,940,944,948,953],{"title":15,"path":859,"stem":860,"framework":28,"category":16,"description":863},"Beautiful typography components and utilities to style your content with Nuxt UI.",{"title":865,"path":866,"stem":867,"framework":28,"category":16,"description":868},"Headers and text","\u002Fdocs\u002Ftypography\u002Fheaders-and-text","docs\u002F4.typography\u002F2.headers-and-text","Beautifully styled headings, paragraphs, text formatting, and links for optimal readability.",{"title":870,"path":871,"stem":872,"framework":28,"category":16,"description":873},"Lists and tables","\u002Fdocs\u002Ftypography\u002Flists-and-tables","docs\u002F4.typography\u002F3.lists-and-tables","Organize information with styled lists and responsive tables for clear, consistent readability.",{"title":875,"path":876,"stem":877,"framework":28,"category":16,"description":878},"Images and embeds","\u002Fdocs\u002Ftypography\u002Fimages-and-embeds","docs\u002F4.typography\u002F4.images-and-embeds","Responsive images, videos, and rich media embeds to enhance and illustrate your documentation.",{"title":880,"path":881,"stem":882,"framework":28,"category":16,"description":883},"Code","\u002Fdocs\u002Ftypography\u002Fcode","docs\u002F4.typography\u002F5.code","Display inline code and syntax-highlighted code blocks with copy-to-clipboard support.",{"title":169,"path":885,"stem":886,"framework":28,"category":887,"description":888},"\u002Fdocs\u002Ftypography\u002Faccordion","docs\u002F4.typography\u002Faccordion","components","Create expandable content sections for better information organization.",{"title":203,"path":890,"stem":891,"framework":28,"category":887,"description":892},"\u002Fdocs\u002Ftypography\u002Fbadge","docs\u002F4.typography\u002Fbadge","Display version numbers, status labels, and tags within your content.",{"title":894,"path":895,"stem":896,"framework":28,"category":887,"description":897},"Callout","\u002Fdocs\u002Ftypography\u002Fcallout","docs\u002F4.typography\u002Fcallout","Highlight important information with eye-catching colored boxes and icons.",{"title":239,"path":899,"stem":900,"framework":28,"category":887,"description":901},"\u002Fdocs\u002Ftypography\u002Fcard","docs\u002F4.typography\u002Fcard","Create highlighted content blocks with optional links and navigation.",{"title":903,"path":904,"stem":905,"framework":28,"category":887,"description":906},"CardGroup","\u002Fdocs\u002Ftypography\u002Fcard-group","docs\u002F4.typography\u002Fcard-group","Organize multiple cards in responsive grid layouts for better content presentation.",{"title":908,"path":909,"stem":910,"framework":28,"category":887,"description":911},"CodeCollapse","\u002Fdocs\u002Ftypography\u002Fcode-collapse","docs\u002F4.typography\u002Fcode-collapse","Make long code blocks collapsible to save space and improve readability.",{"title":913,"path":914,"stem":915,"framework":28,"category":887,"description":916},"CodeGroup","\u002Fdocs\u002Ftypography\u002Fcode-group","docs\u002F4.typography\u002Fcode-group","Group multiple code examples in tabbed interfaces for easy comparison.",{"title":918,"path":919,"stem":920,"framework":28,"category":887,"description":921},"CodePreview","\u002Fdocs\u002Ftypography\u002Fcode-preview","docs\u002F4.typography\u002Fcode-preview","Display code examples with a preview and their source for clearer documentation.",{"title":923,"path":924,"stem":925,"framework":28,"category":887,"description":926},"CodeTree","\u002Fdocs\u002Ftypography\u002Fcode-tree","docs\u002F4.typography\u002Fcode-tree","Visualize file and folder structures with syntax-highlighted code.",{"title":322,"path":928,"stem":929,"framework":28,"category":887,"description":930},"\u002Fdocs\u002Ftypography\u002Fcollapsible","docs\u002F4.typography\u002Fcollapsible","Toggle content visibility with smooth expand and collapse animations.",{"title":932,"path":933,"stem":934,"framework":28,"category":887,"description":935},"Field","\u002Fdocs\u002Ftypography\u002Ffield","docs\u002F4.typography\u002Ffield","Document API parameters, props, and configuration options clearly.",{"title":502,"path":937,"stem":938,"framework":28,"category":887,"description":939},"\u002Fdocs\u002Ftypography\u002Ffield-group","docs\u002F4.typography\u002Ffield-group","Group related fields together for comprehensive API documentation.",{"title":537,"path":941,"stem":942,"framework":28,"category":887,"description":943},"\u002Fdocs\u002Ftypography\u002Ficon","docs\u002F4.typography\u002Ficon","Display icons from popular icon libraries to enhance your content.",{"title":572,"path":945,"stem":946,"framework":28,"category":887,"description":947},"\u002Fdocs\u002Ftypography\u002Fkbd","docs\u002F4.typography\u002Fkbd","Display keyboard shortcuts and key combinations with proper styling.",{"title":949,"path":950,"stem":951,"framework":28,"category":887,"description":952},"Steps","\u002Fdocs\u002Ftypography\u002Fsteps","docs\u002F4.typography\u002Fsteps","Transform headings into numbered step-by-step guides and tutorials.",{"title":778,"path":954,"stem":955,"framework":28,"category":887,"description":956},"\u002Fdocs\u002Ftypography\u002Ftabs","docs\u002F4.typography\u002Ftabs","Organize related content in interactive tabbed interfaces.","i-lucide-square-pilcrow",{"id":959,"title":960,"authors":961,"body":972,"date":12071,"description":12072,"extension":12073,"image":12074,"meta":12075,"navigation":36,"path":12077,"seo":12078,"stem":12079,"__hash__":12080},"posts\u002Fblog\u002Fhow-to-build-an-ai-chat.md","Build an AI Chatbot with Nuxt, Nuxt UI, and AI SDK",[962,967],{"name":963,"avatar":964,"to":966},"Hugo Richard",{"src":965},"https:\u002F\u002Fgithub.com\u002Fhugorcd.png","https:\u002F\u002Fx.com\u002Fhugorcd",{"name":968,"avatar":969,"to":971},"Benjamin Canac",{"src":970},"https:\u002F\u002Fgithub.com\u002Fbenjamincanac.png","https:\u002F\u002Fx.com\u002Fbenjamincanac",{"type":973,"value":974,"toc":12038},"minimark",[975,979,984,987,1022,1049,1053,1056,1070,1074,1077,1114,1119,1122,1266,1270,1277,1493,1496,1535,1539,1546,1641,1648,1665,1675,1679,1693,2424,2427,2445,2455,2459,2467,2471,2482,2850,2854,2881,4588,4591,4596,4603,4608,4619,4624,4633,4651,4656,4671,4684,4688,4691,5066,5070,5085,5089,5097,5670,5677,5702,5706,5724,7099,7102,7107,7118,7156,7171,7176,7183,7197,7202,7242,7247,7252,7259,7270,7274,7277,7281,7284,7437,7441,7466,7937,7941,8480,8484,9749,9758,9762,9769,9773,9783,10032,10036,10044,10291,10295,10298,11644,11648,11651,11656,11665,11670,11679,11882,11886,11889,11904,11907,11922,11937,11945,11949,11952,11982,11985,11990,12031,12034],[976,977,978],"p",{},"Building AI-powered applications has never been more accessible. This guide walks through creating a full-featured AI chatbot using Nuxt, Nuxt UI, and the Vercel AI SDK. Each step is explained in detail so you understand how every piece works together.",[980,981,983],"h2",{"id":982},"what-were-building","What we're building",[976,985,986],{},"By the end of this tutorial, you'll have a fully functional AI chatbot with:",[988,989,990,998,1004,1010,1016],"ul",{},[991,992,993,997],"li",{},[994,995,996],"strong",{},"Streaming responses"," that appear in real-time as the AI generates them",[991,999,1000,1003],{},[994,1001,1002],{},"A beautiful chat interface"," built with Nuxt UI's purpose-built chat components",[991,1005,1006,1009],{},[994,1007,1008],{},"Markdown rendering"," for rich AI responses with code highlighting",[991,1011,1012,1015],{},[994,1013,1014],{},"Multi-model support"," allowing users to switch between OpenAI, Anthropic, and Google models",[991,1017,1018,1021],{},[994,1019,1020],{},"Server-side AI integration"," using Nitro API routes and the AI SDK",[1023,1024,1026],"callout",{"icon":1025},"i-simple-icons-github",[976,1027,1028,1029,1040,1041,1048],{},"Check out the ",[1030,1031,1036],"a",{"href":1032,"rel":1033,"target":1035},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat",[1034],"nofollow","_blank",[1037,1038,1039],"code",{},"Nuxt"," and ",[1030,1042,1045],{"href":1043,"rel":1044,"target":1035},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat-vue",[1034],[1037,1046,1047],{},"Vue"," AI Chat templates on GitHub for production-ready implementations with authentication, database persistence, and more.",[980,1050,1052],{"id":1051},"prerequisites","Prerequisites",[976,1054,1055],{},"Before we start, make sure you have:",[988,1057,1058,1061],{},[991,1059,1060],{},"Node.js 20+ installed",[991,1062,1063,1064,1069],{},"A ",[1030,1065,1068],{"href":1066,"rel":1067},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fai-gateway",[1034],"Vercel AI Gateway"," API key (provides access to multiple AI providers through a single endpoint)",[980,1071,1073],{"id":1072},"project-setup","Project setup",[976,1075,1076],{},"Start by creating a new Nuxt project:",[1078,1079,1084],"pre",{"className":1080,"code":1081,"language":1082,"meta":1083,"style":1083},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx nuxi@latest init nuxt-ai-chat\ncd nuxt-ai-chat\n","bash","",[1037,1085,1086,1105],{"__ignoreMap":1083},[1087,1088,1091,1095,1099,1102],"span",{"class":1089,"line":1090},"line",1,[1087,1092,1094],{"class":1093},"sBMFI","npx",[1087,1096,1098],{"class":1097},"sfazB"," nuxi@latest",[1087,1100,1101],{"class":1097}," init",[1087,1103,1104],{"class":1097}," nuxt-ai-chat\n",[1087,1106,1108,1112],{"class":1089,"line":1107},2,[1087,1109,1111],{"class":1110},"s2Zo4","cd",[1087,1113,1104],{"class":1097},[1115,1116,1118],"h3",{"id":1117},"installing-dependencies","Installing dependencies",[976,1120,1121],{},"Install Nuxt UI and the AI-specific dependencies:",[1123,1124,1126,1169,1201,1234],"code-group",{"sync":1125},"pm",[1078,1127,1130],{"className":1080,"code":1128,"filename":1129,"language":1082,"meta":1083,"style":1083},"pnpm add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","pnpm",[1037,1131,1132],{"__ignoreMap":1083},[1087,1133,1134,1136,1139,1142,1145,1148,1151,1154,1157,1160,1163,1166],{"class":1089,"line":1090},[1087,1135,1129],{"class":1093},[1087,1137,1138],{"class":1097}," add",[1087,1140,1141],{"class":1097}," @nuxt\u002Fui",[1087,1143,1144],{"class":1097}," tailwindcss",[1087,1146,1147],{"class":1097}," @nuxtjs\u002Fmdc",[1087,1149,1150],{"class":1097}," @nuxthub\u002Fcore",[1087,1152,1153],{"class":1097}," drizzle-orm",[1087,1155,1156],{"class":1097}," drizzle-kit",[1087,1158,1159],{"class":1097}," @libsql\u002Fclient",[1087,1161,1162],{"class":1097}," ai",[1087,1164,1165],{"class":1097}," @ai-sdk\u002Fvue",[1087,1167,1168],{"class":1097}," zod\n",[1078,1170,1173],{"className":1080,"code":1171,"filename":1172,"language":1082,"meta":1083,"style":1083},"yarn add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","yarn",[1037,1174,1175],{"__ignoreMap":1083},[1087,1176,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199],{"class":1089,"line":1090},[1087,1178,1172],{"class":1093},[1087,1180,1138],{"class":1097},[1087,1182,1141],{"class":1097},[1087,1184,1144],{"class":1097},[1087,1186,1147],{"class":1097},[1087,1188,1150],{"class":1097},[1087,1190,1153],{"class":1097},[1087,1192,1156],{"class":1097},[1087,1194,1159],{"class":1097},[1087,1196,1162],{"class":1097},[1087,1198,1165],{"class":1097},[1087,1200,1168],{"class":1097},[1078,1202,1205],{"className":1080,"code":1203,"filename":1204,"language":1082,"meta":1083,"style":1083},"npm install @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","npm",[1037,1206,1207],{"__ignoreMap":1083},[1087,1208,1209,1211,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232],{"class":1089,"line":1090},[1087,1210,1204],{"class":1093},[1087,1212,1213],{"class":1097}," install",[1087,1215,1141],{"class":1097},[1087,1217,1144],{"class":1097},[1087,1219,1147],{"class":1097},[1087,1221,1150],{"class":1097},[1087,1223,1153],{"class":1097},[1087,1225,1156],{"class":1097},[1087,1227,1159],{"class":1097},[1087,1229,1162],{"class":1097},[1087,1231,1165],{"class":1097},[1087,1233,1168],{"class":1097},[1078,1235,1238],{"className":1080,"code":1236,"filename":1237,"language":1082,"meta":1083,"style":1083},"bun add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","bun",[1037,1239,1240],{"__ignoreMap":1083},[1087,1241,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264],{"class":1089,"line":1090},[1087,1243,1237],{"class":1093},[1087,1245,1138],{"class":1097},[1087,1247,1141],{"class":1097},[1087,1249,1144],{"class":1097},[1087,1251,1147],{"class":1097},[1087,1253,1150],{"class":1097},[1087,1255,1153],{"class":1097},[1087,1257,1156],{"class":1097},[1087,1259,1159],{"class":1097},[1087,1261,1162],{"class":1097},[1087,1263,1165],{"class":1097},[1087,1265,1168],{"class":1097},[1115,1267,1269],{"id":1268},"configuration","Configuration",[976,1271,1272,1273,1276],{},"Update your ",[1037,1274,1275],{},"nuxt.config.ts"," to register the modules:",[1278,1279,1280],"code-tree-intersection",{},[1078,1281,1285],{"className":1282,"code":1283,"filename":1275,"language":1284,"meta":1083,"style":1083},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: [\n    '@nuxt\u002Fui',\n    '@nuxtjs\u002Fmdc',\n    '@nuxthub\u002Fcore'\n  ],\n\n  hub: {\n    db: 'sqlite'\n  },\n\n  css: ['~\u002Fassets\u002Fcss\u002Fmain.css'],\n\n  mdc: {\n    headings: {\n      anchorLinks: false \u002F\u002F Disable anchor links in AI responses\n    }\n  },\n})\n","ts",[1037,1286,1287,1307,1319,1334,1346,1357,1365,1371,1382,1398,1404,1409,1432,1437,1447,1457,1473,1479,1484],{"__ignoreMap":1083},[1087,1288,1289,1293,1296,1299,1303],{"class":1089,"line":1090},[1087,1290,1292],{"class":1291},"s7zQu","export",[1087,1294,1295],{"class":1291}," default",[1087,1297,1298],{"class":1110}," defineNuxtConfig",[1087,1300,1302],{"class":1301},"sTEyZ","(",[1087,1304,1306],{"class":1305},"sMK4o","{\n",[1087,1308,1309,1313,1316],{"class":1089,"line":1107},[1087,1310,1312],{"class":1311},"swJcz","  modules",[1087,1314,1315],{"class":1305},":",[1087,1317,1318],{"class":1301}," [\n",[1087,1320,1322,1325,1328,1331],{"class":1089,"line":1321},3,[1087,1323,1324],{"class":1305},"    '",[1087,1326,1327],{"class":1097},"@nuxt\u002Fui",[1087,1329,1330],{"class":1305},"'",[1087,1332,1333],{"class":1305},",\n",[1087,1335,1337,1339,1342,1344],{"class":1089,"line":1336},4,[1087,1338,1324],{"class":1305},[1087,1340,1341],{"class":1097},"@nuxtjs\u002Fmdc",[1087,1343,1330],{"class":1305},[1087,1345,1333],{"class":1305},[1087,1347,1349,1351,1354],{"class":1089,"line":1348},5,[1087,1350,1324],{"class":1305},[1087,1352,1353],{"class":1097},"@nuxthub\u002Fcore",[1087,1355,1356],{"class":1305},"'\n",[1087,1358,1360,1363],{"class":1089,"line":1359},6,[1087,1361,1362],{"class":1301},"  ]",[1087,1364,1333],{"class":1305},[1087,1366,1368],{"class":1089,"line":1367},7,[1087,1369,1370],{"emptyLinePlaceholder":21},"\n",[1087,1372,1374,1377,1379],{"class":1089,"line":1373},8,[1087,1375,1376],{"class":1311},"  hub",[1087,1378,1315],{"class":1305},[1087,1380,1381],{"class":1305}," {\n",[1087,1383,1385,1388,1390,1393,1396],{"class":1089,"line":1384},9,[1087,1386,1387],{"class":1311},"    db",[1087,1389,1315],{"class":1305},[1087,1391,1392],{"class":1305}," '",[1087,1394,1395],{"class":1097},"sqlite",[1087,1397,1356],{"class":1305},[1087,1399,1401],{"class":1089,"line":1400},10,[1087,1402,1403],{"class":1305},"  },\n",[1087,1405,1407],{"class":1089,"line":1406},11,[1087,1408,1370],{"emptyLinePlaceholder":21},[1087,1410,1412,1415,1417,1420,1422,1425,1427,1430],{"class":1089,"line":1411},12,[1087,1413,1414],{"class":1311},"  css",[1087,1416,1315],{"class":1305},[1087,1418,1419],{"class":1301}," [",[1087,1421,1330],{"class":1305},[1087,1423,1424],{"class":1097},"~\u002Fassets\u002Fcss\u002Fmain.css",[1087,1426,1330],{"class":1305},[1087,1428,1429],{"class":1301},"]",[1087,1431,1333],{"class":1305},[1087,1433,1435],{"class":1089,"line":1434},13,[1087,1436,1370],{"emptyLinePlaceholder":21},[1087,1438,1440,1443,1445],{"class":1089,"line":1439},14,[1087,1441,1442],{"class":1311},"  mdc",[1087,1444,1315],{"class":1305},[1087,1446,1381],{"class":1305},[1087,1448,1450,1453,1455],{"class":1089,"line":1449},15,[1087,1451,1452],{"class":1311},"    headings",[1087,1454,1315],{"class":1305},[1087,1456,1381],{"class":1305},[1087,1458,1460,1463,1465,1469],{"class":1089,"line":1459},16,[1087,1461,1462],{"class":1311},"      anchorLinks",[1087,1464,1315],{"class":1305},[1087,1466,1468],{"class":1467},"sfNiH"," false",[1087,1470,1472],{"class":1471},"sHwdD"," \u002F\u002F Disable anchor links in AI responses\n",[1087,1474,1476],{"class":1089,"line":1475},17,[1087,1477,1478],{"class":1305},"    }\n",[1087,1480,1482],{"class":1089,"line":1481},18,[1087,1483,1403],{"class":1305},[1087,1485,1487,1490],{"class":1089,"line":1486},19,[1087,1488,1489],{"class":1305},"}",[1087,1491,1492],{"class":1301},")\n",[976,1494,1495],{},"Create the main CSS file to import Tailwind CSS and Nuxt UI:",[1278,1497,1498],{},[1078,1499,1504],{"className":1500,"code":1501,"filename":1502,"language":1503,"meta":1083,"style":1083},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@import \"tailwindcss\";\n@import \"@nuxt\u002Fui\";\n","app\u002Fassets\u002Fcss\u002Fmain.css","css",[1037,1505,1506,1523],{"__ignoreMap":1083},[1087,1507,1508,1511,1514,1517,1520],{"class":1089,"line":1090},[1087,1509,1510],{"class":1291},"@import",[1087,1512,1513],{"class":1305}," \"",[1087,1515,1516],{"class":1097},"tailwindcss",[1087,1518,1519],{"class":1305},"\"",[1087,1521,1522],{"class":1305},";\n",[1087,1524,1525,1527,1529,1531,1533],{"class":1089,"line":1107},[1087,1526,1510],{"class":1291},[1087,1528,1513],{"class":1305},[1087,1530,1327],{"class":1097},[1087,1532,1519],{"class":1305},[1087,1534,1522],{"class":1305},[1115,1536,1538],{"id":1537},"setting-up-the-app","Setting up the app",[976,1540,1541,1542,1545],{},"Nuxt UI requires wrapping your app with ",[1037,1543,1544],{},"UApp"," for modals, toasts, and overlays to work properly:",[1278,1547,1548],{},[1078,1549,1554],{"className":1550,"code":1551,"filename":1552,"highlights":1553,"language":34,"meta":1083,"style":1083},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003CUApp>\n    \u003CUDashboardGroup unit=\"rem\">\n      \u003CNuxtPage \u002F>\n    \u003C\u002FUDashboardGroup>\n  \u003C\u002FUApp>\n\u003C\u002Ftemplate>\n","app\u002Fapp.vue",[1107,1359],[1037,1555,1556,1567,1578,1602,1613,1622,1632],{"__ignoreMap":1083},[1087,1557,1558,1561,1564],{"class":1089,"line":1090},[1087,1559,1560],{"class":1305},"\u003C",[1087,1562,1563],{"class":1311},"template",[1087,1565,1566],{"class":1305},">\n",[1087,1568,1571,1574,1576],{"class":1569,"line":1107},[1089,1570],"highlight",[1087,1572,1573],{"class":1305},"  \u003C",[1087,1575,1544],{"class":1311},[1087,1577,1566],{"class":1305},[1087,1579,1580,1583,1586,1590,1593,1595,1598,1600],{"class":1089,"line":1321},[1087,1581,1582],{"class":1305},"    \u003C",[1087,1584,1585],{"class":1311},"UDashboardGroup",[1087,1587,1589],{"class":1588},"spNyl"," unit",[1087,1591,1592],{"class":1305},"=",[1087,1594,1519],{"class":1305},[1087,1596,1597],{"class":1097},"rem",[1087,1599,1519],{"class":1305},[1087,1601,1566],{"class":1305},[1087,1603,1604,1607,1610],{"class":1089,"line":1336},[1087,1605,1606],{"class":1305},"      \u003C",[1087,1608,1609],{"class":1311},"NuxtPage",[1087,1611,1612],{"class":1305}," \u002F>\n",[1087,1614,1615,1618,1620],{"class":1089,"line":1348},[1087,1616,1617],{"class":1305},"    \u003C\u002F",[1087,1619,1585],{"class":1311},[1087,1621,1566],{"class":1305},[1087,1623,1625,1628,1630],{"class":1624,"line":1359},[1089,1570],[1087,1626,1627],{"class":1305},"  \u003C\u002F",[1087,1629,1544],{"class":1311},[1087,1631,1566],{"class":1305},[1087,1633,1634,1637,1639],{"class":1089,"line":1367},[1087,1635,1636],{"class":1305},"\u003C\u002F",[1087,1638,1563],{"class":1311},[1087,1640,1566],{"class":1305},[976,1642,1643,1644,1647],{},"Create a ",[1037,1645,1646],{},".env"," file with your AI Gateway API key:",[1278,1649,1650],{},[1078,1651,1653],{"className":1080,"code":1652,"filename":1646,"language":1082,"meta":1083,"style":1083},"AI_GATEWAY_API_KEY=your-api-key-here\n",[1037,1654,1655],{"__ignoreMap":1083},[1087,1656,1657,1660,1662],{"class":1089,"line":1090},[1087,1658,1659],{"class":1301},"AI_GATEWAY_API_KEY",[1087,1661,1592],{"class":1305},[1087,1663,1664],{"class":1097},"your-api-key-here\n",[1666,1667,1668],"note",{},[976,1669,1670,1671,1674],{},"With ",[1030,1672,1068],{"href":1066,"rel":1673},[1034],", you don't need individual API keys for OpenAI, Anthropic, or Google. The AI Gateway provides a unified API to access hundreds of models through a single endpoint.",[1115,1676,1678],{"id":1677},"setting-up-the-database","Setting up the database",[976,1680,1681,1686,1687,1692],{},[1030,1682,1685],{"href":1683,"rel":1684},"https:\u002F\u002Fhub.nuxt.com",[1034],"NuxtHub"," provides a zero-config database powered by ",[1030,1688,1691],{"href":1689,"rel":1690},"https:\u002F\u002Form.drizzle.team",[1034],"Drizzle ORM",". Here is the schema for the chat application:",[1278,1694,1695],{},[1696,1697,1698],"code-collapse",{},[1078,1699,1702],{"className":1282,"code":1700,"filename":1701,"language":1284,"meta":1083,"style":1083},"import { sqliteTable, text, integer, index } from 'drizzle-orm\u002Fsqlite-core'\nimport { relations } from 'drizzle-orm'\n\nexport const chats = sqliteTable('chats', {\n  id: text().primaryKey().$defaultFn(() => crypto.randomUUID()),\n  title: text(),\n  createdAt: integer({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date())\n})\n\nexport const chatsRelations = relations(chats, ({ many }) => ({\n  messages: many(messages)\n}))\n\nexport const messages = sqliteTable('messages', {\n  id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n  chatId: text('chat_id').notNull().references(() => chats.id, { onDelete: 'cascade' }),\n  role: text('role', { enum: ['user', 'assistant', 'system'] }).notNull(),\n  parts: text('parts', { mode: 'json' }),\n  createdAt: integer({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n}, table => [\n  index('messages_chat_id_idx').on(table.chatId)\n])\n\nexport const messagesRelations = relations(messages, ({ one }) => ({\n  chat: one(chats, {\n    fields: [messages.chatId],\n    references: [chats.id]\n  })\n}))\n","server\u002Fdb\u002Fschema.ts",[1037,1703,1704,1744,1764,1768,1795,1840,1853,1910,1916,1920,1955,1967,1974,1978,2004,2049,2115,2184,2223,2273,2286,2316,2322,2327,2359,2375,2393,2409,2417],{"__ignoreMap":1083},[1087,1705,1706,1709,1712,1715,1718,1721,1723,1726,1728,1731,1734,1737,1739,1742],{"class":1089,"line":1090},[1087,1707,1708],{"class":1291},"import",[1087,1710,1711],{"class":1305}," {",[1087,1713,1714],{"class":1301}," sqliteTable",[1087,1716,1717],{"class":1305},",",[1087,1719,1720],{"class":1301}," text",[1087,1722,1717],{"class":1305},[1087,1724,1725],{"class":1301}," integer",[1087,1727,1717],{"class":1305},[1087,1729,1730],{"class":1301}," index",[1087,1732,1733],{"class":1305}," }",[1087,1735,1736],{"class":1291}," from",[1087,1738,1392],{"class":1305},[1087,1740,1741],{"class":1097},"drizzle-orm\u002Fsqlite-core",[1087,1743,1356],{"class":1305},[1087,1745,1746,1748,1750,1753,1755,1757,1759,1762],{"class":1089,"line":1107},[1087,1747,1708],{"class":1291},[1087,1749,1711],{"class":1305},[1087,1751,1752],{"class":1301}," relations",[1087,1754,1733],{"class":1305},[1087,1756,1736],{"class":1291},[1087,1758,1392],{"class":1305},[1087,1760,1761],{"class":1097},"drizzle-orm",[1087,1763,1356],{"class":1305},[1087,1765,1766],{"class":1089,"line":1321},[1087,1767,1370],{"emptyLinePlaceholder":21},[1087,1769,1770,1772,1775,1778,1780,1782,1784,1786,1789,1791,1793],{"class":1089,"line":1336},[1087,1771,1292],{"class":1291},[1087,1773,1774],{"class":1588}," const",[1087,1776,1777],{"class":1301}," chats ",[1087,1779,1592],{"class":1305},[1087,1781,1714],{"class":1110},[1087,1783,1302],{"class":1301},[1087,1785,1330],{"class":1305},[1087,1787,1788],{"class":1097},"chats",[1087,1790,1330],{"class":1305},[1087,1792,1717],{"class":1305},[1087,1794,1381],{"class":1305},[1087,1796,1797,1800,1802,1804,1807,1810,1813,1815,1817,1820,1822,1824,1827,1830,1832,1835,1838],{"class":1089,"line":1348},[1087,1798,1799],{"class":1311},"  id",[1087,1801,1315],{"class":1305},[1087,1803,1720],{"class":1110},[1087,1805,1806],{"class":1301},"()",[1087,1808,1809],{"class":1305},".",[1087,1811,1812],{"class":1110},"primaryKey",[1087,1814,1806],{"class":1301},[1087,1816,1809],{"class":1305},[1087,1818,1819],{"class":1110},"$defaultFn",[1087,1821,1302],{"class":1301},[1087,1823,1806],{"class":1305},[1087,1825,1826],{"class":1588}," =>",[1087,1828,1829],{"class":1301}," crypto",[1087,1831,1809],{"class":1305},[1087,1833,1834],{"class":1110},"randomUUID",[1087,1836,1837],{"class":1301},"())",[1087,1839,1333],{"class":1305},[1087,1841,1842,1845,1847,1849,1851],{"class":1089,"line":1359},[1087,1843,1844],{"class":1311},"  title",[1087,1846,1315],{"class":1305},[1087,1848,1720],{"class":1110},[1087,1850,1806],{"class":1301},[1087,1852,1333],{"class":1305},[1087,1854,1855,1858,1860,1862,1864,1867,1870,1872,1874,1877,1879,1881,1884,1886,1889,1891,1893,1895,1897,1899,1901,1904,1907],{"class":1089,"line":1367},[1087,1856,1857],{"class":1311},"  createdAt",[1087,1859,1315],{"class":1305},[1087,1861,1725],{"class":1110},[1087,1863,1302],{"class":1301},[1087,1865,1866],{"class":1305},"{",[1087,1868,1869],{"class":1311}," mode",[1087,1871,1315],{"class":1305},[1087,1873,1392],{"class":1305},[1087,1875,1876],{"class":1097},"timestamp",[1087,1878,1330],{"class":1305},[1087,1880,1733],{"class":1305},[1087,1882,1883],{"class":1301},")",[1087,1885,1809],{"class":1305},[1087,1887,1888],{"class":1110},"notNull",[1087,1890,1806],{"class":1301},[1087,1892,1809],{"class":1305},[1087,1894,1819],{"class":1110},[1087,1896,1302],{"class":1301},[1087,1898,1806],{"class":1305},[1087,1900,1826],{"class":1588},[1087,1902,1903],{"class":1305}," new",[1087,1905,1906],{"class":1110}," Date",[1087,1908,1909],{"class":1301},"())\n",[1087,1911,1912,1914],{"class":1089,"line":1373},[1087,1913,1489],{"class":1305},[1087,1915,1492],{"class":1301},[1087,1917,1918],{"class":1089,"line":1384},[1087,1919,1370],{"emptyLinePlaceholder":21},[1087,1921,1922,1924,1926,1929,1931,1933,1936,1938,1941,1945,1948,1950,1953],{"class":1089,"line":1400},[1087,1923,1292],{"class":1291},[1087,1925,1774],{"class":1588},[1087,1927,1928],{"class":1301}," chatsRelations ",[1087,1930,1592],{"class":1305},[1087,1932,1752],{"class":1110},[1087,1934,1935],{"class":1301},"(chats",[1087,1937,1717],{"class":1305},[1087,1939,1940],{"class":1305}," ({",[1087,1942,1944],{"class":1943},"sHdIc"," many",[1087,1946,1947],{"class":1305}," })",[1087,1949,1826],{"class":1588},[1087,1951,1952],{"class":1301}," (",[1087,1954,1306],{"class":1305},[1087,1956,1957,1960,1962,1964],{"class":1089,"line":1406},[1087,1958,1959],{"class":1311},"  messages",[1087,1961,1315],{"class":1305},[1087,1963,1944],{"class":1110},[1087,1965,1966],{"class":1301},"(messages)\n",[1087,1968,1969,1971],{"class":1089,"line":1411},[1087,1970,1489],{"class":1305},[1087,1972,1973],{"class":1301},"))\n",[1087,1975,1976],{"class":1089,"line":1434},[1087,1977,1370],{"emptyLinePlaceholder":21},[1087,1979,1980,1982,1984,1987,1989,1991,1993,1995,1998,2000,2002],{"class":1089,"line":1439},[1087,1981,1292],{"class":1291},[1087,1983,1774],{"class":1588},[1087,1985,1986],{"class":1301}," messages ",[1087,1988,1592],{"class":1305},[1087,1990,1714],{"class":1110},[1087,1992,1302],{"class":1301},[1087,1994,1330],{"class":1305},[1087,1996,1997],{"class":1097},"messages",[1087,1999,1330],{"class":1305},[1087,2001,1717],{"class":1305},[1087,2003,1381],{"class":1305},[1087,2005,2006,2008,2010,2012,2014,2016,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047],{"class":1089,"line":1449},[1087,2007,1799],{"class":1311},[1087,2009,1315],{"class":1305},[1087,2011,1720],{"class":1110},[1087,2013,1302],{"class":1301},[1087,2015,1330],{"class":1305},[1087,2017,2018],{"class":1097},"id",[1087,2020,1330],{"class":1305},[1087,2022,1883],{"class":1301},[1087,2024,1809],{"class":1305},[1087,2026,1812],{"class":1110},[1087,2028,1806],{"class":1301},[1087,2030,1809],{"class":1305},[1087,2032,1819],{"class":1110},[1087,2034,1302],{"class":1301},[1087,2036,1806],{"class":1305},[1087,2038,1826],{"class":1588},[1087,2040,1829],{"class":1301},[1087,2042,1809],{"class":1305},[1087,2044,1834],{"class":1110},[1087,2046,1837],{"class":1301},[1087,2048,1333],{"class":1305},[1087,2050,2051,2054,2056,2058,2060,2062,2065,2067,2069,2071,2073,2075,2077,2080,2082,2084,2086,2089,2091,2093,2095,2097,2100,2102,2104,2107,2109,2111,2113],{"class":1089,"line":1459},[1087,2052,2053],{"class":1311},"  chatId",[1087,2055,1315],{"class":1305},[1087,2057,1720],{"class":1110},[1087,2059,1302],{"class":1301},[1087,2061,1330],{"class":1305},[1087,2063,2064],{"class":1097},"chat_id",[1087,2066,1330],{"class":1305},[1087,2068,1883],{"class":1301},[1087,2070,1809],{"class":1305},[1087,2072,1888],{"class":1110},[1087,2074,1806],{"class":1301},[1087,2076,1809],{"class":1305},[1087,2078,2079],{"class":1110},"references",[1087,2081,1302],{"class":1301},[1087,2083,1806],{"class":1305},[1087,2085,1826],{"class":1588},[1087,2087,2088],{"class":1301}," chats",[1087,2090,1809],{"class":1305},[1087,2092,2018],{"class":1301},[1087,2094,1717],{"class":1305},[1087,2096,1711],{"class":1305},[1087,2098,2099],{"class":1311}," onDelete",[1087,2101,1315],{"class":1305},[1087,2103,1392],{"class":1305},[1087,2105,2106],{"class":1097},"cascade",[1087,2108,1330],{"class":1305},[1087,2110,1733],{"class":1305},[1087,2112,1883],{"class":1301},[1087,2114,1333],{"class":1305},[1087,2116,2117,2120,2122,2124,2126,2128,2131,2133,2135,2137,2140,2142,2144,2146,2149,2151,2153,2155,2158,2160,2162,2164,2167,2169,2172,2174,2176,2178,2180,2182],{"class":1089,"line":1475},[1087,2118,2119],{"class":1311},"  role",[1087,2121,1315],{"class":1305},[1087,2123,1720],{"class":1110},[1087,2125,1302],{"class":1301},[1087,2127,1330],{"class":1305},[1087,2129,2130],{"class":1097},"role",[1087,2132,1330],{"class":1305},[1087,2134,1717],{"class":1305},[1087,2136,1711],{"class":1305},[1087,2138,2139],{"class":1311}," enum",[1087,2141,1315],{"class":1305},[1087,2143,1419],{"class":1301},[1087,2145,1330],{"class":1305},[1087,2147,2148],{"class":1097},"user",[1087,2150,1330],{"class":1305},[1087,2152,1717],{"class":1305},[1087,2154,1392],{"class":1305},[1087,2156,2157],{"class":1097},"assistant",[1087,2159,1330],{"class":1305},[1087,2161,1717],{"class":1305},[1087,2163,1392],{"class":1305},[1087,2165,2166],{"class":1097},"system",[1087,2168,1330],{"class":1305},[1087,2170,2171],{"class":1301},"] ",[1087,2173,1489],{"class":1305},[1087,2175,1883],{"class":1301},[1087,2177,1809],{"class":1305},[1087,2179,1888],{"class":1110},[1087,2181,1806],{"class":1301},[1087,2183,1333],{"class":1305},[1087,2185,2186,2189,2191,2193,2195,2197,2200,2202,2204,2206,2208,2210,2212,2215,2217,2219,2221],{"class":1089,"line":1481},[1087,2187,2188],{"class":1311},"  parts",[1087,2190,1315],{"class":1305},[1087,2192,1720],{"class":1110},[1087,2194,1302],{"class":1301},[1087,2196,1330],{"class":1305},[1087,2198,2199],{"class":1097},"parts",[1087,2201,1330],{"class":1305},[1087,2203,1717],{"class":1305},[1087,2205,1711],{"class":1305},[1087,2207,1869],{"class":1311},[1087,2209,1315],{"class":1305},[1087,2211,1392],{"class":1305},[1087,2213,2214],{"class":1097},"json",[1087,2216,1330],{"class":1305},[1087,2218,1733],{"class":1305},[1087,2220,1883],{"class":1301},[1087,2222,1333],{"class":1305},[1087,2224,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271],{"class":1089,"line":1486},[1087,2226,1857],{"class":1311},[1087,2228,1315],{"class":1305},[1087,2230,1725],{"class":1110},[1087,2232,1302],{"class":1301},[1087,2234,1866],{"class":1305},[1087,2236,1869],{"class":1311},[1087,2238,1315],{"class":1305},[1087,2240,1392],{"class":1305},[1087,2242,1876],{"class":1097},[1087,2244,1330],{"class":1305},[1087,2246,1733],{"class":1305},[1087,2248,1883],{"class":1301},[1087,2250,1809],{"class":1305},[1087,2252,1888],{"class":1110},[1087,2254,1806],{"class":1301},[1087,2256,1809],{"class":1305},[1087,2258,1819],{"class":1110},[1087,2260,1302],{"class":1301},[1087,2262,1806],{"class":1305},[1087,2264,1826],{"class":1588},[1087,2266,1903],{"class":1305},[1087,2268,1906],{"class":1110},[1087,2270,1837],{"class":1301},[1087,2272,1333],{"class":1305},[1087,2274,2276,2279,2282,2284],{"class":1089,"line":2275},20,[1087,2277,2278],{"class":1305},"},",[1087,2280,2281],{"class":1943}," table",[1087,2283,1826],{"class":1588},[1087,2285,1318],{"class":1301},[1087,2287,2289,2292,2294,2296,2299,2301,2303,2305,2308,2311,2313],{"class":1089,"line":2288},21,[1087,2290,2291],{"class":1110},"  index",[1087,2293,1302],{"class":1301},[1087,2295,1330],{"class":1305},[1087,2297,2298],{"class":1097},"messages_chat_id_idx",[1087,2300,1330],{"class":1305},[1087,2302,1883],{"class":1301},[1087,2304,1809],{"class":1305},[1087,2306,2307],{"class":1110},"on",[1087,2309,2310],{"class":1301},"(table",[1087,2312,1809],{"class":1305},[1087,2314,2315],{"class":1301},"chatId)\n",[1087,2317,2319],{"class":1089,"line":2318},22,[1087,2320,2321],{"class":1301},"])\n",[1087,2323,2325],{"class":1089,"line":2324},23,[1087,2326,1370],{"emptyLinePlaceholder":21},[1087,2328,2330,2332,2334,2337,2339,2341,2344,2346,2348,2351,2353,2355,2357],{"class":1089,"line":2329},24,[1087,2331,1292],{"class":1291},[1087,2333,1774],{"class":1588},[1087,2335,2336],{"class":1301}," messagesRelations ",[1087,2338,1592],{"class":1305},[1087,2340,1752],{"class":1110},[1087,2342,2343],{"class":1301},"(messages",[1087,2345,1717],{"class":1305},[1087,2347,1940],{"class":1305},[1087,2349,2350],{"class":1943}," one",[1087,2352,1947],{"class":1305},[1087,2354,1826],{"class":1588},[1087,2356,1952],{"class":1301},[1087,2358,1306],{"class":1305},[1087,2360,2362,2365,2367,2369,2371,2373],{"class":1089,"line":2361},25,[1087,2363,2364],{"class":1311},"  chat",[1087,2366,1315],{"class":1305},[1087,2368,2350],{"class":1110},[1087,2370,1935],{"class":1301},[1087,2372,1717],{"class":1305},[1087,2374,1381],{"class":1305},[1087,2376,2378,2381,2383,2386,2388,2391],{"class":1089,"line":2377},26,[1087,2379,2380],{"class":1311},"    fields",[1087,2382,1315],{"class":1305},[1087,2384,2385],{"class":1301}," [messages",[1087,2387,1809],{"class":1305},[1087,2389,2390],{"class":1301},"chatId]",[1087,2392,1333],{"class":1305},[1087,2394,2396,2399,2401,2404,2406],{"class":1089,"line":2395},27,[1087,2397,2398],{"class":1311},"    references",[1087,2400,1315],{"class":1305},[1087,2402,2403],{"class":1301}," [chats",[1087,2405,1809],{"class":1305},[1087,2407,2408],{"class":1301},"id]\n",[1087,2410,2412,2415],{"class":1089,"line":2411},28,[1087,2413,2414],{"class":1305},"  }",[1087,2416,1492],{"class":1301},[1087,2418,2420,2422],{"class":1089,"line":2419},29,[1087,2421,1489],{"class":1305},[1087,2423,1973],{"class":1301},[976,2425,2426],{},"Generate the database migrations from your schema:",[1078,2428,2430],{"className":1080,"code":2429,"language":1082,"meta":1083,"style":1083},"npx nuxt db generate\n",[1037,2431,2432],{"__ignoreMap":1083},[1087,2433,2434,2436,2439,2442],{"class":1089,"line":1090},[1087,2435,1094],{"class":1093},[1087,2437,2438],{"class":1097}," nuxt",[1087,2440,2441],{"class":1097}," db",[1087,2443,2444],{"class":1097}," generate\n",[2446,2447,2448],"tip",{},[976,2449,2450,2451,2454],{},"Migrations are automatically applied when you start the development server with ",[1037,2452,2453],{},"npx nuxt dev",". NuxtHub uses SQLite locally, so no external database is required during development.",[980,2456,2458],{"id":2457},"building-the-backend","Building the backend",[976,2460,2461,2462,1809],{},"This section covers integrating AI on the server. The following API endpoints handle chat creation, AI streaming, and data persistence using ",[1030,2463,2466],{"href":2464,"rel":2465},"https:\u002F\u002Fnitro.build",[1034],"Nitro",[1115,2468,2470],{"id":2469},"creating-a-chat","Creating a chat",[976,2472,2473,2474,2481],{},"First, create the endpoint that initializes a new chat and saves the first message to the database. This uses the ",[1030,2475,2478],{"href":2476,"rel":2477},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fui-message",[1034],[1037,2479,2480],{},"UIMessage"," type from the AI SDK:",[1278,2483,2484],{},[1078,2485,2488],{"className":1282,"code":2486,"filename":2487,"language":1284,"meta":1083,"style":1083},"import { defineEventHandler, readValidatedBody } from 'h3'\nimport type { UIMessage } from 'ai'\nimport { db, schema } from 'hub:db'\nimport { z } from 'zod'\n\nexport default defineEventHandler(async (event) => {\n  const { message } = await readValidatedBody(event, z.object({\n    message: z.custom\u003CUIMessage>()\n  }).parse)\n\n  \u002F\u002F Create a new chat\n  const [chat] = await db.insert(schema.chats).values({}).returning()\n\n  \u002F\u002F Save the first user message\n  await db.insert(schema.messages).values({\n    chatId: chat.id,\n    role: 'user',\n    parts: message.parts\n  })\n\n  return chat\n})\n","server\u002Fapi\u002Fchats.post.ts",[1037,2489,2490,2514,2537,2561,2581,2585,2609,2646,2670,2683,2687,2692,2743,2747,2752,2781,2797,2812,2826,2832,2836,2844],{"__ignoreMap":1083},[1087,2491,2492,2494,2496,2499,2501,2504,2506,2508,2510,2512],{"class":1089,"line":1090},[1087,2493,1708],{"class":1291},[1087,2495,1711],{"class":1305},[1087,2497,2498],{"class":1301}," defineEventHandler",[1087,2500,1717],{"class":1305},[1087,2502,2503],{"class":1301}," readValidatedBody",[1087,2505,1733],{"class":1305},[1087,2507,1736],{"class":1291},[1087,2509,1392],{"class":1305},[1087,2511,1115],{"class":1097},[1087,2513,1356],{"class":1305},[1087,2515,2516,2518,2521,2523,2526,2528,2530,2532,2535],{"class":1089,"line":1107},[1087,2517,1708],{"class":1291},[1087,2519,2520],{"class":1291}," type",[1087,2522,1711],{"class":1305},[1087,2524,2525],{"class":1301}," UIMessage",[1087,2527,1733],{"class":1305},[1087,2529,1736],{"class":1291},[1087,2531,1392],{"class":1305},[1087,2533,2534],{"class":1097},"ai",[1087,2536,1356],{"class":1305},[1087,2538,2539,2541,2543,2545,2547,2550,2552,2554,2556,2559],{"class":1089,"line":1321},[1087,2540,1708],{"class":1291},[1087,2542,1711],{"class":1305},[1087,2544,2441],{"class":1301},[1087,2546,1717],{"class":1305},[1087,2548,2549],{"class":1301}," schema",[1087,2551,1733],{"class":1305},[1087,2553,1736],{"class":1291},[1087,2555,1392],{"class":1305},[1087,2557,2558],{"class":1097},"hub:db",[1087,2560,1356],{"class":1305},[1087,2562,2563,2565,2567,2570,2572,2574,2576,2579],{"class":1089,"line":1336},[1087,2564,1708],{"class":1291},[1087,2566,1711],{"class":1305},[1087,2568,2569],{"class":1301}," z",[1087,2571,1733],{"class":1305},[1087,2573,1736],{"class":1291},[1087,2575,1392],{"class":1305},[1087,2577,2578],{"class":1097},"zod",[1087,2580,1356],{"class":1305},[1087,2582,2583],{"class":1089,"line":1348},[1087,2584,1370],{"emptyLinePlaceholder":21},[1087,2586,2587,2589,2591,2593,2595,2598,2600,2603,2605,2607],{"class":1089,"line":1359},[1087,2588,1292],{"class":1291},[1087,2590,1295],{"class":1291},[1087,2592,2498],{"class":1110},[1087,2594,1302],{"class":1301},[1087,2596,2597],{"class":1588},"async",[1087,2599,1952],{"class":1305},[1087,2601,2602],{"class":1943},"event",[1087,2604,1883],{"class":1305},[1087,2606,1826],{"class":1588},[1087,2608,1381],{"class":1305},[1087,2610,2611,2614,2616,2619,2621,2624,2627,2629,2631,2633,2635,2637,2639,2642,2644],{"class":1089,"line":1367},[1087,2612,2613],{"class":1588},"  const",[1087,2615,1711],{"class":1305},[1087,2617,2618],{"class":1301}," message",[1087,2620,1733],{"class":1305},[1087,2622,2623],{"class":1305}," =",[1087,2625,2626],{"class":1291}," await",[1087,2628,2503],{"class":1110},[1087,2630,1302],{"class":1311},[1087,2632,2602],{"class":1301},[1087,2634,1717],{"class":1305},[1087,2636,2569],{"class":1301},[1087,2638,1809],{"class":1305},[1087,2640,2641],{"class":1110},"object",[1087,2643,1302],{"class":1311},[1087,2645,1306],{"class":1305},[1087,2647,2648,2651,2653,2655,2657,2660,2662,2664,2667],{"class":1089,"line":1373},[1087,2649,2650],{"class":1311},"    message",[1087,2652,1315],{"class":1305},[1087,2654,2569],{"class":1301},[1087,2656,1809],{"class":1305},[1087,2658,2659],{"class":1110},"custom",[1087,2661,1560],{"class":1305},[1087,2663,2480],{"class":1093},[1087,2665,2666],{"class":1305},">",[1087,2668,2669],{"class":1311},"()\n",[1087,2671,2672,2674,2676,2678,2681],{"class":1089,"line":1384},[1087,2673,2414],{"class":1305},[1087,2675,1883],{"class":1311},[1087,2677,1809],{"class":1305},[1087,2679,2680],{"class":1301},"parse",[1087,2682,1492],{"class":1311},[1087,2684,2685],{"class":1089,"line":1400},[1087,2686,1370],{"emptyLinePlaceholder":21},[1087,2688,2689],{"class":1089,"line":1406},[1087,2690,2691],{"class":1471},"  \u002F\u002F Create a new chat\n",[1087,2693,2694,2696,2698,2700,2702,2704,2706,2708,2710,2713,2715,2718,2720,2722,2724,2726,2729,2731,2734,2736,2738,2741],{"class":1089,"line":1411},[1087,2695,2613],{"class":1588},[1087,2697,1419],{"class":1305},[1087,2699,262],{"class":1301},[1087,2701,1429],{"class":1305},[1087,2703,2623],{"class":1305},[1087,2705,2626],{"class":1291},[1087,2707,2441],{"class":1301},[1087,2709,1809],{"class":1305},[1087,2711,2712],{"class":1110},"insert",[1087,2714,1302],{"class":1311},[1087,2716,2717],{"class":1301},"schema",[1087,2719,1809],{"class":1305},[1087,2721,1788],{"class":1301},[1087,2723,1883],{"class":1311},[1087,2725,1809],{"class":1305},[1087,2727,2728],{"class":1110},"values",[1087,2730,1302],{"class":1311},[1087,2732,2733],{"class":1305},"{}",[1087,2735,1883],{"class":1311},[1087,2737,1809],{"class":1305},[1087,2739,2740],{"class":1110},"returning",[1087,2742,2669],{"class":1311},[1087,2744,2745],{"class":1089,"line":1434},[1087,2746,1370],{"emptyLinePlaceholder":21},[1087,2748,2749],{"class":1089,"line":1439},[1087,2750,2751],{"class":1471},"  \u002F\u002F Save the first user message\n",[1087,2753,2754,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779],{"class":1089,"line":1449},[1087,2755,2756],{"class":1291},"  await",[1087,2758,2441],{"class":1301},[1087,2760,1809],{"class":1305},[1087,2762,2712],{"class":1110},[1087,2764,1302],{"class":1311},[1087,2766,2717],{"class":1301},[1087,2768,1809],{"class":1305},[1087,2770,1997],{"class":1301},[1087,2772,1883],{"class":1311},[1087,2774,1809],{"class":1305},[1087,2776,2728],{"class":1110},[1087,2778,1302],{"class":1311},[1087,2780,1306],{"class":1305},[1087,2782,2783,2786,2788,2791,2793,2795],{"class":1089,"line":1459},[1087,2784,2785],{"class":1311},"    chatId",[1087,2787,1315],{"class":1305},[1087,2789,2790],{"class":1301}," chat",[1087,2792,1809],{"class":1305},[1087,2794,2018],{"class":1301},[1087,2796,1333],{"class":1305},[1087,2798,2799,2802,2804,2806,2808,2810],{"class":1089,"line":1475},[1087,2800,2801],{"class":1311},"    role",[1087,2803,1315],{"class":1305},[1087,2805,1392],{"class":1305},[1087,2807,2148],{"class":1097},[1087,2809,1330],{"class":1305},[1087,2811,1333],{"class":1305},[1087,2813,2814,2817,2819,2821,2823],{"class":1089,"line":1481},[1087,2815,2816],{"class":1311},"    parts",[1087,2818,1315],{"class":1305},[1087,2820,2618],{"class":1301},[1087,2822,1809],{"class":1305},[1087,2824,2825],{"class":1301},"parts\n",[1087,2827,2828,2830],{"class":1089,"line":1486},[1087,2829,2414],{"class":1305},[1087,2831,1492],{"class":1311},[1087,2833,2834],{"class":1089,"line":2275},[1087,2835,1370],{"emptyLinePlaceholder":21},[1087,2837,2838,2841],{"class":1089,"line":2288},[1087,2839,2840],{"class":1291},"  return",[1087,2842,2843],{"class":1301}," chat\n",[1087,2845,2846,2848],{"class":1089,"line":2318},[1087,2847,1489],{"class":1305},[1087,2849,1492],{"class":1301},[1115,2851,2853],{"id":2852},"streaming-ai-responses","Streaming AI responses",[976,2855,2856,2857,2864,2865,2872,2873,2880],{},"Next, create the endpoint that handles the AI conversation. This endpoint uses ",[1030,2858,2861],{"href":2859,"rel":2860},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fstream-text",[1034],[1037,2862,2863],{},"streamText",", ",[1030,2866,2869],{"href":2867,"rel":2868},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream",[1034],[1037,2870,2871],{},"createUIMessageStream",", and ",[1030,2874,2877],{"href":2875,"rel":2876},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response",[1034],[1037,2878,2879],{},"createUIMessageStreamResponse"," from the AI SDK:",[1278,2882,2883],{},[1696,2884,2885],{},[1078,2886,2889],{"className":1282,"code":2887,"filename":2888,"language":1284,"meta":1083,"style":1083},"import { createError, defineEventHandler, getValidatedRouterParams, readValidatedBody } from 'h3'\nimport { eq } from 'drizzle-orm'\nimport { db, schema } from 'hub:db'\nimport { z } from 'zod'\nimport {\n  convertToModelMessages,\n  createUIMessageStream,\n  createUIMessageStreamResponse,\n  generateText,\n  streamText\n} from 'ai'\nimport type { UIMessage } from 'ai'\n\nconst MODELS = [\n  { value: 'openai\u002Fgpt-5-nano', label: 'GPT-5 Nano' },\n  { value: 'anthropic\u002Fclaude-haiku-4.5', label: 'Claude Haiku 4.5' },\n  { value: 'google\u002Fgemini-3-flash', label: 'Gemini 3 Flash' }\n]\n\nexport default defineEventHandler(async (event) => {\n  const { id } = await getValidatedRouterParams(event, z.object({\n    id: z.string()\n  }).parse)\n\n  const { model, messages } = await readValidatedBody(event, z.object({\n    model: z.string().refine(value => MODELS.some(m => m.value === value), {\n      message: 'Invalid model'\n    }),\n    messages: z.array(z.custom\u003CUIMessage>())\n  }).parse)\n\n  \u002F\u002F Fetch the chat from the database\n  const chat = await db.query.chats.findFirst({\n    where: (chat, { eq }) => eq(chat.id, id as string)\n  })\n\n  if (!chat) {\n    throw createError({ statusCode: 404, statusMessage: 'Chat not found' })\n  }\n\n  \u002F\u002F Generate a title for the chat if it doesn't have one\n  if (!chat.title) {\n    const { text: title } = await generateText({\n      model: 'anthropic\u002Fclaude-haiku-4.5',\n      system: `Generate a short title (max 30 characters) based on the user's message. No quotes or punctuation.`,\n      prompt: JSON.stringify(messages[0])\n    })\n\n    await db.update(schema.chats).set({ title }).where(eq(schema.chats.id, id))\n  }\n\n  \u002F\u002F Save the user message if it's a follow-up\n  const lastMessage = messages[messages.length - 1]\n  if (lastMessage?.role === 'user' && messages.length > 1) {\n    await db.insert(schema.messages).values({\n      chatId: id,\n      role: 'user',\n      parts: lastMessage.parts\n    })\n  }\n\n  \u002F\u002F Create the streaming response\n  const stream = createUIMessageStream({\n    execute: async ({ writer }) => {\n      const result = streamText({\n        model,\n        system: `You are a helpful AI assistant. Be concise and friendly.`,\n        messages: await convertToModelMessages(messages),\n        providerOptions: {\n          anthropic: {\n            thinking: {\n              type: 'enabled',\n              budgetTokens: 2048\n            }\n          },\n          google: {\n            thinkingConfig: {\n              includeThoughts: true,\n              thinkingLevel: 'low'\n            }\n          },\n          openai: {\n            reasoningEffort: 'low',\n            reasoningSummary: 'detailed'\n          }\n        }\n      })\n\n      \u002F\u002F Notify the client that a title was generated\n      if (!chat.title) {\n        writer.write({\n          type: 'data-chat-title',\n          data: { message: 'Title generated' },\n          transient: true\n        })\n      }\n\n      writer.merge(result.toUIMessageStream())\n    },\n    onFinish: async ({ messages }) => {\n      \u002F\u002F Save the assistant's response to the database\n      await db.insert(schema.messages).values(messages.map(message => ({\n        chatId: chat.id,\n        role: message.role as 'user' | 'assistant',\n        parts: message.parts\n      })))\n    }\n  })\n\n  return createUIMessageStreamResponse({ stream })\n})\n","server\u002Fapi\u002Fchats\u002F[id].post.ts",[1037,2890,2891,2923,2942,2964,2982,2988,2995,3002,3009,3016,3021,3033,3053,3057,3069,3103,3133,3164,3169,3173,3195,3228,3244,3256,3260,3298,3358,3372,3381,3412,3425,3430,3436,3467,3511,3518,3523,3541,3580,3586,3591,3597,3617,3645,3661,3680,3708,3715,3720,3786,3791,3796,3802,3831,3872,3901,3913,3929,3943,3950,3955,3960,3966,3983,4005,4023,4031,4048,4069,4079,4089,4099,4116,4127,4133,4139,4149,4159,4172,4187,4192,4197,4207,4223,4238,4244,4250,4258,4263,4269,4289,4304,4321,4344,4355,4363,4369,4374,4397,4403,4423,4429,4475,4491,4524,4538,4546,4551,4558,4563,4581],{"__ignoreMap":1083},[1087,2892,2893,2895,2897,2900,2902,2904,2906,2909,2911,2913,2915,2917,2919,2921],{"class":1089,"line":1090},[1087,2894,1708],{"class":1291},[1087,2896,1711],{"class":1305},[1087,2898,2899],{"class":1301}," createError",[1087,2901,1717],{"class":1305},[1087,2903,2498],{"class":1301},[1087,2905,1717],{"class":1305},[1087,2907,2908],{"class":1301}," getValidatedRouterParams",[1087,2910,1717],{"class":1305},[1087,2912,2503],{"class":1301},[1087,2914,1733],{"class":1305},[1087,2916,1736],{"class":1291},[1087,2918,1392],{"class":1305},[1087,2920,1115],{"class":1097},[1087,2922,1356],{"class":1305},[1087,2924,2925,2927,2929,2932,2934,2936,2938,2940],{"class":1089,"line":1107},[1087,2926,1708],{"class":1291},[1087,2928,1711],{"class":1305},[1087,2930,2931],{"class":1301}," eq",[1087,2933,1733],{"class":1305},[1087,2935,1736],{"class":1291},[1087,2937,1392],{"class":1305},[1087,2939,1761],{"class":1097},[1087,2941,1356],{"class":1305},[1087,2943,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962],{"class":1089,"line":1321},[1087,2945,1708],{"class":1291},[1087,2947,1711],{"class":1305},[1087,2949,2441],{"class":1301},[1087,2951,1717],{"class":1305},[1087,2953,2549],{"class":1301},[1087,2955,1733],{"class":1305},[1087,2957,1736],{"class":1291},[1087,2959,1392],{"class":1305},[1087,2961,2558],{"class":1097},[1087,2963,1356],{"class":1305},[1087,2965,2966,2968,2970,2972,2974,2976,2978,2980],{"class":1089,"line":1336},[1087,2967,1708],{"class":1291},[1087,2969,1711],{"class":1305},[1087,2971,2569],{"class":1301},[1087,2973,1733],{"class":1305},[1087,2975,1736],{"class":1291},[1087,2977,1392],{"class":1305},[1087,2979,2578],{"class":1097},[1087,2981,1356],{"class":1305},[1087,2983,2984,2986],{"class":1089,"line":1348},[1087,2985,1708],{"class":1291},[1087,2987,1381],{"class":1305},[1087,2989,2990,2993],{"class":1089,"line":1359},[1087,2991,2992],{"class":1301},"  convertToModelMessages",[1087,2994,1333],{"class":1305},[1087,2996,2997,3000],{"class":1089,"line":1367},[1087,2998,2999],{"class":1301},"  createUIMessageStream",[1087,3001,1333],{"class":1305},[1087,3003,3004,3007],{"class":1089,"line":1373},[1087,3005,3006],{"class":1301},"  createUIMessageStreamResponse",[1087,3008,1333],{"class":1305},[1087,3010,3011,3014],{"class":1089,"line":1384},[1087,3012,3013],{"class":1301},"  generateText",[1087,3015,1333],{"class":1305},[1087,3017,3018],{"class":1089,"line":1400},[1087,3019,3020],{"class":1301},"  streamText\n",[1087,3022,3023,3025,3027,3029,3031],{"class":1089,"line":1406},[1087,3024,1489],{"class":1305},[1087,3026,1736],{"class":1291},[1087,3028,1392],{"class":1305},[1087,3030,2534],{"class":1097},[1087,3032,1356],{"class":1305},[1087,3034,3035,3037,3039,3041,3043,3045,3047,3049,3051],{"class":1089,"line":1411},[1087,3036,1708],{"class":1291},[1087,3038,2520],{"class":1291},[1087,3040,1711],{"class":1305},[1087,3042,2525],{"class":1301},[1087,3044,1733],{"class":1305},[1087,3046,1736],{"class":1291},[1087,3048,1392],{"class":1305},[1087,3050,2534],{"class":1097},[1087,3052,1356],{"class":1305},[1087,3054,3055],{"class":1089,"line":1434},[1087,3056,1370],{"emptyLinePlaceholder":21},[1087,3058,3059,3062,3065,3067],{"class":1089,"line":1439},[1087,3060,3061],{"class":1588},"const",[1087,3063,3064],{"class":1301}," MODELS ",[1087,3066,1592],{"class":1305},[1087,3068,1318],{"class":1301},[1087,3070,3071,3074,3077,3079,3081,3084,3086,3088,3091,3093,3095,3098,3100],{"class":1089,"line":1449},[1087,3072,3073],{"class":1305},"  {",[1087,3075,3076],{"class":1311}," value",[1087,3078,1315],{"class":1305},[1087,3080,1392],{"class":1305},[1087,3082,3083],{"class":1097},"openai\u002Fgpt-5-nano",[1087,3085,1330],{"class":1305},[1087,3087,1717],{"class":1305},[1087,3089,3090],{"class":1311}," label",[1087,3092,1315],{"class":1305},[1087,3094,1392],{"class":1305},[1087,3096,3097],{"class":1097},"GPT-5 Nano",[1087,3099,1330],{"class":1305},[1087,3101,3102],{"class":1305}," },\n",[1087,3104,3105,3107,3109,3111,3113,3116,3118,3120,3122,3124,3126,3129,3131],{"class":1089,"line":1459},[1087,3106,3073],{"class":1305},[1087,3108,3076],{"class":1311},[1087,3110,1315],{"class":1305},[1087,3112,1392],{"class":1305},[1087,3114,3115],{"class":1097},"anthropic\u002Fclaude-haiku-4.5",[1087,3117,1330],{"class":1305},[1087,3119,1717],{"class":1305},[1087,3121,3090],{"class":1311},[1087,3123,1315],{"class":1305},[1087,3125,1392],{"class":1305},[1087,3127,3128],{"class":1097},"Claude Haiku 4.5",[1087,3130,1330],{"class":1305},[1087,3132,3102],{"class":1305},[1087,3134,3135,3137,3139,3141,3143,3146,3148,3150,3152,3154,3156,3159,3161],{"class":1089,"line":1475},[1087,3136,3073],{"class":1305},[1087,3138,3076],{"class":1311},[1087,3140,1315],{"class":1305},[1087,3142,1392],{"class":1305},[1087,3144,3145],{"class":1097},"google\u002Fgemini-3-flash",[1087,3147,1330],{"class":1305},[1087,3149,1717],{"class":1305},[1087,3151,3090],{"class":1311},[1087,3153,1315],{"class":1305},[1087,3155,1392],{"class":1305},[1087,3157,3158],{"class":1097},"Gemini 3 Flash",[1087,3160,1330],{"class":1305},[1087,3162,3163],{"class":1305}," }\n",[1087,3165,3166],{"class":1089,"line":1481},[1087,3167,3168],{"class":1301},"]\n",[1087,3170,3171],{"class":1089,"line":1486},[1087,3172,1370],{"emptyLinePlaceholder":21},[1087,3174,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193],{"class":1089,"line":2275},[1087,3176,1292],{"class":1291},[1087,3178,1295],{"class":1291},[1087,3180,2498],{"class":1110},[1087,3182,1302],{"class":1301},[1087,3184,2597],{"class":1588},[1087,3186,1952],{"class":1305},[1087,3188,2602],{"class":1943},[1087,3190,1883],{"class":1305},[1087,3192,1826],{"class":1588},[1087,3194,1381],{"class":1305},[1087,3196,3197,3199,3201,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226],{"class":1089,"line":2288},[1087,3198,2613],{"class":1588},[1087,3200,1711],{"class":1305},[1087,3202,3203],{"class":1301}," id",[1087,3205,1733],{"class":1305},[1087,3207,2623],{"class":1305},[1087,3209,2626],{"class":1291},[1087,3211,2908],{"class":1110},[1087,3213,1302],{"class":1311},[1087,3215,2602],{"class":1301},[1087,3217,1717],{"class":1305},[1087,3219,2569],{"class":1301},[1087,3221,1809],{"class":1305},[1087,3223,2641],{"class":1110},[1087,3225,1302],{"class":1311},[1087,3227,1306],{"class":1305},[1087,3229,3230,3233,3235,3237,3239,3242],{"class":1089,"line":2318},[1087,3231,3232],{"class":1311},"    id",[1087,3234,1315],{"class":1305},[1087,3236,2569],{"class":1301},[1087,3238,1809],{"class":1305},[1087,3240,3241],{"class":1110},"string",[1087,3243,2669],{"class":1311},[1087,3245,3246,3248,3250,3252,3254],{"class":1089,"line":2324},[1087,3247,2414],{"class":1305},[1087,3249,1883],{"class":1311},[1087,3251,1809],{"class":1305},[1087,3253,2680],{"class":1301},[1087,3255,1492],{"class":1311},[1087,3257,3258],{"class":1089,"line":2329},[1087,3259,1370],{"emptyLinePlaceholder":21},[1087,3261,3262,3264,3266,3269,3271,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296],{"class":1089,"line":2361},[1087,3263,2613],{"class":1588},[1087,3265,1711],{"class":1305},[1087,3267,3268],{"class":1301}," model",[1087,3270,1717],{"class":1305},[1087,3272,3273],{"class":1301}," messages",[1087,3275,1733],{"class":1305},[1087,3277,2623],{"class":1305},[1087,3279,2626],{"class":1291},[1087,3281,2503],{"class":1110},[1087,3283,1302],{"class":1311},[1087,3285,2602],{"class":1301},[1087,3287,1717],{"class":1305},[1087,3289,2569],{"class":1301},[1087,3291,1809],{"class":1305},[1087,3293,2641],{"class":1110},[1087,3295,1302],{"class":1311},[1087,3297,1306],{"class":1305},[1087,3299,3300,3303,3305,3307,3309,3311,3313,3315,3318,3320,3323,3325,3328,3330,3333,3335,3338,3340,3343,3345,3347,3350,3352,3354,3356],{"class":1089,"line":2377},[1087,3301,3302],{"class":1311},"    model",[1087,3304,1315],{"class":1305},[1087,3306,2569],{"class":1301},[1087,3308,1809],{"class":1305},[1087,3310,3241],{"class":1110},[1087,3312,1806],{"class":1311},[1087,3314,1809],{"class":1305},[1087,3316,3317],{"class":1110},"refine",[1087,3319,1302],{"class":1311},[1087,3321,3322],{"class":1943},"value",[1087,3324,1826],{"class":1588},[1087,3326,3327],{"class":1301}," MODELS",[1087,3329,1809],{"class":1305},[1087,3331,3332],{"class":1110},"some",[1087,3334,1302],{"class":1311},[1087,3336,3337],{"class":1943},"m",[1087,3339,1826],{"class":1588},[1087,3341,3342],{"class":1301}," m",[1087,3344,1809],{"class":1305},[1087,3346,3322],{"class":1301},[1087,3348,3349],{"class":1305}," ===",[1087,3351,3076],{"class":1301},[1087,3353,1883],{"class":1311},[1087,3355,1717],{"class":1305},[1087,3357,1381],{"class":1305},[1087,3359,3360,3363,3365,3367,3370],{"class":1089,"line":2395},[1087,3361,3362],{"class":1311},"      message",[1087,3364,1315],{"class":1305},[1087,3366,1392],{"class":1305},[1087,3368,3369],{"class":1097},"Invalid model",[1087,3371,1356],{"class":1305},[1087,3373,3374,3377,3379],{"class":1089,"line":2411},[1087,3375,3376],{"class":1305},"    }",[1087,3378,1883],{"class":1311},[1087,3380,1333],{"class":1305},[1087,3382,3383,3386,3388,3390,3392,3395,3397,3400,3402,3404,3406,3408,3410],{"class":1089,"line":2419},[1087,3384,3385],{"class":1311},"    messages",[1087,3387,1315],{"class":1305},[1087,3389,2569],{"class":1301},[1087,3391,1809],{"class":1305},[1087,3393,3394],{"class":1110},"array",[1087,3396,1302],{"class":1311},[1087,3398,3399],{"class":1301},"z",[1087,3401,1809],{"class":1305},[1087,3403,2659],{"class":1110},[1087,3405,1560],{"class":1305},[1087,3407,2480],{"class":1093},[1087,3409,2666],{"class":1305},[1087,3411,1909],{"class":1311},[1087,3413,3415,3417,3419,3421,3423],{"class":1089,"line":3414},30,[1087,3416,2414],{"class":1305},[1087,3418,1883],{"class":1311},[1087,3420,1809],{"class":1305},[1087,3422,2680],{"class":1301},[1087,3424,1492],{"class":1311},[1087,3426,3428],{"class":1089,"line":3427},31,[1087,3429,1370],{"emptyLinePlaceholder":21},[1087,3431,3433],{"class":1089,"line":3432},32,[1087,3434,3435],{"class":1471},"  \u002F\u002F Fetch the chat from the database\n",[1087,3437,3439,3441,3443,3445,3447,3449,3451,3454,3456,3458,3460,3463,3465],{"class":1089,"line":3438},33,[1087,3440,2613],{"class":1588},[1087,3442,2790],{"class":1301},[1087,3444,2623],{"class":1305},[1087,3446,2626],{"class":1291},[1087,3448,2441],{"class":1301},[1087,3450,1809],{"class":1305},[1087,3452,3453],{"class":1301},"query",[1087,3455,1809],{"class":1305},[1087,3457,1788],{"class":1301},[1087,3459,1809],{"class":1305},[1087,3461,3462],{"class":1110},"findFirst",[1087,3464,1302],{"class":1311},[1087,3466,1306],{"class":1305},[1087,3468,3470,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497,3499,3501,3503,3506,3509],{"class":1089,"line":3469},34,[1087,3471,3472],{"class":1110},"    where",[1087,3474,1315],{"class":1305},[1087,3476,1952],{"class":1305},[1087,3478,262],{"class":1943},[1087,3480,1717],{"class":1305},[1087,3482,1711],{"class":1305},[1087,3484,2931],{"class":1943},[1087,3486,1947],{"class":1305},[1087,3488,1826],{"class":1588},[1087,3490,2931],{"class":1110},[1087,3492,1302],{"class":1311},[1087,3494,262],{"class":1301},[1087,3496,1809],{"class":1305},[1087,3498,2018],{"class":1301},[1087,3500,1717],{"class":1305},[1087,3502,3203],{"class":1301},[1087,3504,3505],{"class":1291}," as",[1087,3507,3508],{"class":1093}," string",[1087,3510,1492],{"class":1311},[1087,3512,3514,3516],{"class":1089,"line":3513},35,[1087,3515,2414],{"class":1305},[1087,3517,1492],{"class":1311},[1087,3519,3521],{"class":1089,"line":3520},36,[1087,3522,1370],{"emptyLinePlaceholder":21},[1087,3524,3526,3529,3531,3534,3536,3539],{"class":1089,"line":3525},37,[1087,3527,3528],{"class":1291},"  if",[1087,3530,1952],{"class":1311},[1087,3532,3533],{"class":1305},"!",[1087,3535,262],{"class":1301},[1087,3537,3538],{"class":1311},") ",[1087,3540,1306],{"class":1305},[1087,3542,3544,3547,3549,3551,3553,3556,3558,3562,3564,3567,3569,3571,3574,3576,3578],{"class":1089,"line":3543},38,[1087,3545,3546],{"class":1291},"    throw",[1087,3548,2899],{"class":1110},[1087,3550,1302],{"class":1311},[1087,3552,1866],{"class":1305},[1087,3554,3555],{"class":1311}," statusCode",[1087,3557,1315],{"class":1305},[1087,3559,3561],{"class":3560},"sbssI"," 404",[1087,3563,1717],{"class":1305},[1087,3565,3566],{"class":1311}," statusMessage",[1087,3568,1315],{"class":1305},[1087,3570,1392],{"class":1305},[1087,3572,3573],{"class":1097},"Chat not found",[1087,3575,1330],{"class":1305},[1087,3577,1733],{"class":1305},[1087,3579,1492],{"class":1311},[1087,3581,3583],{"class":1089,"line":3582},39,[1087,3584,3585],{"class":1305},"  }\n",[1087,3587,3589],{"class":1089,"line":3588},40,[1087,3590,1370],{"emptyLinePlaceholder":21},[1087,3592,3594],{"class":1089,"line":3593},41,[1087,3595,3596],{"class":1471},"  \u002F\u002F Generate a title for the chat if it doesn't have one\n",[1087,3598,3600,3602,3604,3606,3608,3610,3613,3615],{"class":1089,"line":3599},42,[1087,3601,3528],{"class":1291},[1087,3603,1952],{"class":1311},[1087,3605,3533],{"class":1305},[1087,3607,262],{"class":1301},[1087,3609,1809],{"class":1305},[1087,3611,3612],{"class":1301},"title",[1087,3614,3538],{"class":1311},[1087,3616,1306],{"class":1305},[1087,3618,3620,3623,3625,3627,3629,3632,3634,3636,3638,3641,3643],{"class":1089,"line":3619},43,[1087,3621,3622],{"class":1588},"    const",[1087,3624,1711],{"class":1305},[1087,3626,1720],{"class":1311},[1087,3628,1315],{"class":1305},[1087,3630,3631],{"class":1301}," title",[1087,3633,1733],{"class":1305},[1087,3635,2623],{"class":1305},[1087,3637,2626],{"class":1291},[1087,3639,3640],{"class":1110}," generateText",[1087,3642,1302],{"class":1311},[1087,3644,1306],{"class":1305},[1087,3646,3648,3651,3653,3655,3657,3659],{"class":1089,"line":3647},44,[1087,3649,3650],{"class":1311},"      model",[1087,3652,1315],{"class":1305},[1087,3654,1392],{"class":1305},[1087,3656,3115],{"class":1097},[1087,3658,1330],{"class":1305},[1087,3660,1333],{"class":1305},[1087,3662,3664,3667,3669,3672,3675,3678],{"class":1089,"line":3663},45,[1087,3665,3666],{"class":1311},"      system",[1087,3668,1315],{"class":1305},[1087,3670,3671],{"class":1305}," `",[1087,3673,3674],{"class":1097},"Generate a short title (max 30 characters) based on the user's message. No quotes or punctuation.",[1087,3676,3677],{"class":1305},"`",[1087,3679,1333],{"class":1305},[1087,3681,3683,3686,3688,3691,3693,3696,3698,3700,3703,3706],{"class":1089,"line":3682},46,[1087,3684,3685],{"class":1311},"      prompt",[1087,3687,1315],{"class":1305},[1087,3689,3690],{"class":1301}," JSON",[1087,3692,1809],{"class":1305},[1087,3694,3695],{"class":1110},"stringify",[1087,3697,1302],{"class":1311},[1087,3699,1997],{"class":1301},[1087,3701,3702],{"class":1311},"[",[1087,3704,3705],{"class":3560},"0",[1087,3707,2321],{"class":1311},[1087,3709,3711,3713],{"class":1089,"line":3710},47,[1087,3712,3376],{"class":1305},[1087,3714,1492],{"class":1311},[1087,3716,3718],{"class":1089,"line":3717},48,[1087,3719,1370],{"emptyLinePlaceholder":21},[1087,3721,3723,3726,3728,3730,3733,3735,3737,3739,3741,3743,3745,3748,3750,3752,3754,3756,3758,3760,3763,3765,3768,3770,3772,3774,3776,3778,3780,3782,3784],{"class":1089,"line":3722},49,[1087,3724,3725],{"class":1291},"    await",[1087,3727,2441],{"class":1301},[1087,3729,1809],{"class":1305},[1087,3731,3732],{"class":1110},"update",[1087,3734,1302],{"class":1311},[1087,3736,2717],{"class":1301},[1087,3738,1809],{"class":1305},[1087,3740,1788],{"class":1301},[1087,3742,1883],{"class":1311},[1087,3744,1809],{"class":1305},[1087,3746,3747],{"class":1110},"set",[1087,3749,1302],{"class":1311},[1087,3751,1866],{"class":1305},[1087,3753,3631],{"class":1301},[1087,3755,1733],{"class":1305},[1087,3757,1883],{"class":1311},[1087,3759,1809],{"class":1305},[1087,3761,3762],{"class":1110},"where",[1087,3764,1302],{"class":1311},[1087,3766,3767],{"class":1110},"eq",[1087,3769,1302],{"class":1311},[1087,3771,2717],{"class":1301},[1087,3773,1809],{"class":1305},[1087,3775,1788],{"class":1301},[1087,3777,1809],{"class":1305},[1087,3779,2018],{"class":1301},[1087,3781,1717],{"class":1305},[1087,3783,3203],{"class":1301},[1087,3785,1973],{"class":1311},[1087,3787,3789],{"class":1089,"line":3788},50,[1087,3790,3585],{"class":1305},[1087,3792,3794],{"class":1089,"line":3793},51,[1087,3795,1370],{"emptyLinePlaceholder":21},[1087,3797,3799],{"class":1089,"line":3798},52,[1087,3800,3801],{"class":1471},"  \u002F\u002F Save the user message if it's a follow-up\n",[1087,3803,3805,3807,3810,3812,3814,3816,3818,3820,3823,3826,3829],{"class":1089,"line":3804},53,[1087,3806,2613],{"class":1588},[1087,3808,3809],{"class":1301}," lastMessage",[1087,3811,2623],{"class":1305},[1087,3813,3273],{"class":1301},[1087,3815,3702],{"class":1311},[1087,3817,1997],{"class":1301},[1087,3819,1809],{"class":1305},[1087,3821,3822],{"class":1301},"length",[1087,3824,3825],{"class":1305}," -",[1087,3827,3828],{"class":3560}," 1",[1087,3830,3168],{"class":1311},[1087,3832,3834,3836,3838,3841,3844,3846,3848,3850,3852,3854,3857,3859,3861,3863,3866,3868,3870],{"class":1089,"line":3833},54,[1087,3835,3528],{"class":1291},[1087,3837,1952],{"class":1311},[1087,3839,3840],{"class":1301},"lastMessage",[1087,3842,3843],{"class":1305},"?.",[1087,3845,2130],{"class":1301},[1087,3847,3349],{"class":1305},[1087,3849,1392],{"class":1305},[1087,3851,2148],{"class":1097},[1087,3853,1330],{"class":1305},[1087,3855,3856],{"class":1305}," &&",[1087,3858,3273],{"class":1301},[1087,3860,1809],{"class":1305},[1087,3862,3822],{"class":1301},[1087,3864,3865],{"class":1305}," >",[1087,3867,3828],{"class":3560},[1087,3869,3538],{"class":1311},[1087,3871,1306],{"class":1305},[1087,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899],{"class":1089,"line":3874},55,[1087,3876,3725],{"class":1291},[1087,3878,2441],{"class":1301},[1087,3880,1809],{"class":1305},[1087,3882,2712],{"class":1110},[1087,3884,1302],{"class":1311},[1087,3886,2717],{"class":1301},[1087,3888,1809],{"class":1305},[1087,3890,1997],{"class":1301},[1087,3892,1883],{"class":1311},[1087,3894,1809],{"class":1305},[1087,3896,2728],{"class":1110},[1087,3898,1302],{"class":1311},[1087,3900,1306],{"class":1305},[1087,3902,3904,3907,3909,3911],{"class":1089,"line":3903},56,[1087,3905,3906],{"class":1311},"      chatId",[1087,3908,1315],{"class":1305},[1087,3910,3203],{"class":1301},[1087,3912,1333],{"class":1305},[1087,3914,3916,3919,3921,3923,3925,3927],{"class":1089,"line":3915},57,[1087,3917,3918],{"class":1311},"      role",[1087,3920,1315],{"class":1305},[1087,3922,1392],{"class":1305},[1087,3924,2148],{"class":1097},[1087,3926,1330],{"class":1305},[1087,3928,1333],{"class":1305},[1087,3930,3932,3935,3937,3939,3941],{"class":1089,"line":3931},58,[1087,3933,3934],{"class":1311},"      parts",[1087,3936,1315],{"class":1305},[1087,3938,3809],{"class":1301},[1087,3940,1809],{"class":1305},[1087,3942,2825],{"class":1301},[1087,3944,3946,3948],{"class":1089,"line":3945},59,[1087,3947,3376],{"class":1305},[1087,3949,1492],{"class":1311},[1087,3951,3953],{"class":1089,"line":3952},60,[1087,3954,3585],{"class":1305},[1087,3956,3958],{"class":1089,"line":3957},61,[1087,3959,1370],{"emptyLinePlaceholder":21},[1087,3961,3963],{"class":1089,"line":3962},62,[1087,3964,3965],{"class":1471},"  \u002F\u002F Create the streaming response\n",[1087,3967,3969,3971,3974,3976,3979,3981],{"class":1089,"line":3968},63,[1087,3970,2613],{"class":1588},[1087,3972,3973],{"class":1301}," stream",[1087,3975,2623],{"class":1305},[1087,3977,3978],{"class":1110}," createUIMessageStream",[1087,3980,1302],{"class":1311},[1087,3982,1306],{"class":1305},[1087,3984,3986,3989,3991,3994,3996,3999,4001,4003],{"class":1089,"line":3985},64,[1087,3987,3988],{"class":1110},"    execute",[1087,3990,1315],{"class":1305},[1087,3992,3993],{"class":1588}," async",[1087,3995,1940],{"class":1305},[1087,3997,3998],{"class":1943}," writer",[1087,4000,1947],{"class":1305},[1087,4002,1826],{"class":1588},[1087,4004,1381],{"class":1305},[1087,4006,4008,4011,4014,4016,4019,4021],{"class":1089,"line":4007},65,[1087,4009,4010],{"class":1588},"      const",[1087,4012,4013],{"class":1301}," result",[1087,4015,2623],{"class":1305},[1087,4017,4018],{"class":1110}," streamText",[1087,4020,1302],{"class":1311},[1087,4022,1306],{"class":1305},[1087,4024,4026,4029],{"class":1089,"line":4025},66,[1087,4027,4028],{"class":1301},"        model",[1087,4030,1333],{"class":1305},[1087,4032,4034,4037,4039,4041,4044,4046],{"class":1089,"line":4033},67,[1087,4035,4036],{"class":1311},"        system",[1087,4038,1315],{"class":1305},[1087,4040,3671],{"class":1305},[1087,4042,4043],{"class":1097},"You are a helpful AI assistant. Be concise and friendly.",[1087,4045,3677],{"class":1305},[1087,4047,1333],{"class":1305},[1087,4049,4051,4054,4056,4058,4061,4063,4065,4067],{"class":1089,"line":4050},68,[1087,4052,4053],{"class":1311},"        messages",[1087,4055,1315],{"class":1305},[1087,4057,2626],{"class":1291},[1087,4059,4060],{"class":1110}," convertToModelMessages",[1087,4062,1302],{"class":1311},[1087,4064,1997],{"class":1301},[1087,4066,1883],{"class":1311},[1087,4068,1333],{"class":1305},[1087,4070,4072,4075,4077],{"class":1089,"line":4071},69,[1087,4073,4074],{"class":1311},"        providerOptions",[1087,4076,1315],{"class":1305},[1087,4078,1381],{"class":1305},[1087,4080,4082,4085,4087],{"class":1089,"line":4081},70,[1087,4083,4084],{"class":1311},"          anthropic",[1087,4086,1315],{"class":1305},[1087,4088,1381],{"class":1305},[1087,4090,4092,4095,4097],{"class":1089,"line":4091},71,[1087,4093,4094],{"class":1311},"            thinking",[1087,4096,1315],{"class":1305},[1087,4098,1381],{"class":1305},[1087,4100,4102,4105,4107,4109,4112,4114],{"class":1089,"line":4101},72,[1087,4103,4104],{"class":1311},"              type",[1087,4106,1315],{"class":1305},[1087,4108,1392],{"class":1305},[1087,4110,4111],{"class":1097},"enabled",[1087,4113,1330],{"class":1305},[1087,4115,1333],{"class":1305},[1087,4117,4119,4122,4124],{"class":1089,"line":4118},73,[1087,4120,4121],{"class":1311},"              budgetTokens",[1087,4123,1315],{"class":1305},[1087,4125,4126],{"class":3560}," 2048\n",[1087,4128,4130],{"class":1089,"line":4129},74,[1087,4131,4132],{"class":1305},"            }\n",[1087,4134,4136],{"class":1089,"line":4135},75,[1087,4137,4138],{"class":1305},"          },\n",[1087,4140,4142,4145,4147],{"class":1089,"line":4141},76,[1087,4143,4144],{"class":1311},"          google",[1087,4146,1315],{"class":1305},[1087,4148,1381],{"class":1305},[1087,4150,4152,4155,4157],{"class":1089,"line":4151},77,[1087,4153,4154],{"class":1311},"            thinkingConfig",[1087,4156,1315],{"class":1305},[1087,4158,1381],{"class":1305},[1087,4160,4162,4165,4167,4170],{"class":1089,"line":4161},78,[1087,4163,4164],{"class":1311},"              includeThoughts",[1087,4166,1315],{"class":1305},[1087,4168,4169],{"class":1467}," true",[1087,4171,1333],{"class":1305},[1087,4173,4175,4178,4180,4182,4185],{"class":1089,"line":4174},79,[1087,4176,4177],{"class":1311},"              thinkingLevel",[1087,4179,1315],{"class":1305},[1087,4181,1392],{"class":1305},[1087,4183,4184],{"class":1097},"low",[1087,4186,1356],{"class":1305},[1087,4188,4190],{"class":1089,"line":4189},80,[1087,4191,4132],{"class":1305},[1087,4193,4195],{"class":1089,"line":4194},81,[1087,4196,4138],{"class":1305},[1087,4198,4200,4203,4205],{"class":1089,"line":4199},82,[1087,4201,4202],{"class":1311},"          openai",[1087,4204,1315],{"class":1305},[1087,4206,1381],{"class":1305},[1087,4208,4210,4213,4215,4217,4219,4221],{"class":1089,"line":4209},83,[1087,4211,4212],{"class":1311},"            reasoningEffort",[1087,4214,1315],{"class":1305},[1087,4216,1392],{"class":1305},[1087,4218,4184],{"class":1097},[1087,4220,1330],{"class":1305},[1087,4222,1333],{"class":1305},[1087,4224,4226,4229,4231,4233,4236],{"class":1089,"line":4225},84,[1087,4227,4228],{"class":1311},"            reasoningSummary",[1087,4230,1315],{"class":1305},[1087,4232,1392],{"class":1305},[1087,4234,4235],{"class":1097},"detailed",[1087,4237,1356],{"class":1305},[1087,4239,4241],{"class":1089,"line":4240},85,[1087,4242,4243],{"class":1305},"          }\n",[1087,4245,4247],{"class":1089,"line":4246},86,[1087,4248,4249],{"class":1305},"        }\n",[1087,4251,4253,4256],{"class":1089,"line":4252},87,[1087,4254,4255],{"class":1305},"      }",[1087,4257,1492],{"class":1311},[1087,4259,4261],{"class":1089,"line":4260},88,[1087,4262,1370],{"emptyLinePlaceholder":21},[1087,4264,4266],{"class":1089,"line":4265},89,[1087,4267,4268],{"class":1471},"      \u002F\u002F Notify the client that a title was generated\n",[1087,4270,4272,4275,4277,4279,4281,4283,4285,4287],{"class":1089,"line":4271},90,[1087,4273,4274],{"class":1291},"      if",[1087,4276,1952],{"class":1311},[1087,4278,3533],{"class":1305},[1087,4280,262],{"class":1301},[1087,4282,1809],{"class":1305},[1087,4284,3612],{"class":1301},[1087,4286,3538],{"class":1311},[1087,4288,1306],{"class":1305},[1087,4290,4292,4295,4297,4300,4302],{"class":1089,"line":4291},91,[1087,4293,4294],{"class":1301},"        writer",[1087,4296,1809],{"class":1305},[1087,4298,4299],{"class":1110},"write",[1087,4301,1302],{"class":1311},[1087,4303,1306],{"class":1305},[1087,4305,4307,4310,4312,4314,4317,4319],{"class":1089,"line":4306},92,[1087,4308,4309],{"class":1311},"          type",[1087,4311,1315],{"class":1305},[1087,4313,1392],{"class":1305},[1087,4315,4316],{"class":1097},"data-chat-title",[1087,4318,1330],{"class":1305},[1087,4320,1333],{"class":1305},[1087,4322,4324,4327,4329,4331,4333,4335,4337,4340,4342],{"class":1089,"line":4323},93,[1087,4325,4326],{"class":1311},"          data",[1087,4328,1315],{"class":1305},[1087,4330,1711],{"class":1305},[1087,4332,2618],{"class":1311},[1087,4334,1315],{"class":1305},[1087,4336,1392],{"class":1305},[1087,4338,4339],{"class":1097},"Title generated",[1087,4341,1330],{"class":1305},[1087,4343,3102],{"class":1305},[1087,4345,4347,4350,4352],{"class":1089,"line":4346},94,[1087,4348,4349],{"class":1311},"          transient",[1087,4351,1315],{"class":1305},[1087,4353,4354],{"class":1467}," true\n",[1087,4356,4358,4361],{"class":1089,"line":4357},95,[1087,4359,4360],{"class":1305},"        }",[1087,4362,1492],{"class":1311},[1087,4364,4366],{"class":1089,"line":4365},96,[1087,4367,4368],{"class":1305},"      }\n",[1087,4370,4372],{"class":1089,"line":4371},97,[1087,4373,1370],{"emptyLinePlaceholder":21},[1087,4375,4377,4380,4382,4385,4387,4390,4392,4395],{"class":1089,"line":4376},98,[1087,4378,4379],{"class":1301},"      writer",[1087,4381,1809],{"class":1305},[1087,4383,4384],{"class":1110},"merge",[1087,4386,1302],{"class":1311},[1087,4388,4389],{"class":1301},"result",[1087,4391,1809],{"class":1305},[1087,4393,4394],{"class":1110},"toUIMessageStream",[1087,4396,1909],{"class":1311},[1087,4398,4400],{"class":1089,"line":4399},99,[1087,4401,4402],{"class":1305},"    },\n",[1087,4404,4406,4409,4411,4413,4415,4417,4419,4421],{"class":1089,"line":4405},100,[1087,4407,4408],{"class":1110},"    onFinish",[1087,4410,1315],{"class":1305},[1087,4412,3993],{"class":1588},[1087,4414,1940],{"class":1305},[1087,4416,3273],{"class":1943},[1087,4418,1947],{"class":1305},[1087,4420,1826],{"class":1588},[1087,4422,1381],{"class":1305},[1087,4424,4426],{"class":1089,"line":4425},101,[1087,4427,4428],{"class":1471},"      \u002F\u002F Save the assistant's response to the database\n",[1087,4430,4432,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4464,4466,4469,4471,4473],{"class":1089,"line":4431},102,[1087,4433,4434],{"class":1291},"      await",[1087,4436,2441],{"class":1301},[1087,4438,1809],{"class":1305},[1087,4440,2712],{"class":1110},[1087,4442,1302],{"class":1311},[1087,4444,2717],{"class":1301},[1087,4446,1809],{"class":1305},[1087,4448,1997],{"class":1301},[1087,4450,1883],{"class":1311},[1087,4452,1809],{"class":1305},[1087,4454,2728],{"class":1110},[1087,4456,1302],{"class":1311},[1087,4458,1997],{"class":1301},[1087,4460,1809],{"class":1305},[1087,4462,4463],{"class":1110},"map",[1087,4465,1302],{"class":1311},[1087,4467,4468],{"class":1943},"message",[1087,4470,1826],{"class":1588},[1087,4472,1952],{"class":1311},[1087,4474,1306],{"class":1305},[1087,4476,4478,4481,4483,4485,4487,4489],{"class":1089,"line":4477},103,[1087,4479,4480],{"class":1311},"        chatId",[1087,4482,1315],{"class":1305},[1087,4484,2790],{"class":1301},[1087,4486,1809],{"class":1305},[1087,4488,2018],{"class":1301},[1087,4490,1333],{"class":1305},[1087,4492,4494,4497,4499,4501,4503,4505,4507,4509,4511,4513,4516,4518,4520,4522],{"class":1089,"line":4493},104,[1087,4495,4496],{"class":1311},"        role",[1087,4498,1315],{"class":1305},[1087,4500,2618],{"class":1301},[1087,4502,1809],{"class":1305},[1087,4504,2130],{"class":1301},[1087,4506,3505],{"class":1291},[1087,4508,1392],{"class":1305},[1087,4510,2148],{"class":1097},[1087,4512,1330],{"class":1305},[1087,4514,4515],{"class":1305}," |",[1087,4517,1392],{"class":1305},[1087,4519,2157],{"class":1097},[1087,4521,1330],{"class":1305},[1087,4523,1333],{"class":1305},[1087,4525,4527,4530,4532,4534,4536],{"class":1089,"line":4526},105,[1087,4528,4529],{"class":1311},"        parts",[1087,4531,1315],{"class":1305},[1087,4533,2618],{"class":1301},[1087,4535,1809],{"class":1305},[1087,4537,2825],{"class":1301},[1087,4539,4541,4543],{"class":1089,"line":4540},106,[1087,4542,4255],{"class":1305},[1087,4544,4545],{"class":1311},")))\n",[1087,4547,4549],{"class":1089,"line":4548},107,[1087,4550,1478],{"class":1305},[1087,4552,4554,4556],{"class":1089,"line":4553},108,[1087,4555,2414],{"class":1305},[1087,4557,1492],{"class":1311},[1087,4559,4561],{"class":1089,"line":4560},109,[1087,4562,1370],{"emptyLinePlaceholder":21},[1087,4564,4566,4568,4571,4573,4575,4577,4579],{"class":1089,"line":4565},110,[1087,4567,2840],{"class":1291},[1087,4569,4570],{"class":1110}," createUIMessageStreamResponse",[1087,4572,1302],{"class":1311},[1087,4574,1866],{"class":1305},[1087,4576,3973],{"class":1301},[1087,4578,1733],{"class":1305},[1087,4580,1492],{"class":1311},[1087,4582,4584,4586],{"class":1089,"line":4583},111,[1087,4585,1489],{"class":1305},[1087,4587,1492],{"class":1301},[976,4589,4590],{},"Here's what each part does:",[976,4592,4593],{},[994,4594,4595],{},"AI Gateway",[976,4597,4598,4599,4602],{},"Thanks to ",[1030,4600,1068],{"href":1066,"rel":4601},[1034],", we can use any AI model supported by the gateway just by specifying the model name.",[976,4604,4605],{},[994,4606,4607],{},"Automatic Title Generation",[976,4609,4610,4611,4618],{},"When a chat doesn't have a title yet, we use ",[1030,4612,4615],{"href":4613,"rel":4614},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fgenerate-text#generatetext",[1034],[1037,4616,4617],{},"generateText"," to create one based on the first message. This provides a better UX by showing meaningful titles in the chat history instead of \"Untitled\".",[976,4620,4621],{},[994,4622,4623],{},"Streaming with streamText",[976,4625,4626,4627,4632],{},"The ",[1030,4628,4630],{"href":2859,"rel":4629},[1034],[1037,4631,2863],{}," function generates a streaming response from the AI model. Key options include:",[988,4634,4635,4641,4646],{},[991,4636,4637,4640],{},[1037,4638,4639],{},"model",": The AI model to use",[991,4642,4643,4645],{},[1037,4644,2166],{},": Instructions that guide the AI's behavior",[991,4647,4648,4650],{},[1037,4649,1997],{},": The conversation history",[976,4652,4653],{},[994,4654,4655],{},"UIMessageStream",[976,4657,4626,4658,1040,4664,4670],{},[1030,4659,4662],{"href":4660,"rel":4661},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream#createuimessagestream",[1034],[1037,4663,2871],{},[1030,4665,4668],{"href":4666,"rel":4667},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response#createuimessagestreamresponse",[1034],[1037,4669,2879],{}," functions create a stream that the AI SDK client can consume. The response streams chunks as they're generated, creating the real-time typing effect.",[976,4672,4626,4673,4676,4677,4679,4680,4683],{},[1037,4674,4675],{},"writer.write()"," method allows sending custom data events to the client (like ",[1037,4678,4316],{},"), while ",[1037,4681,4682],{},"onFinish"," is called when streaming completes, perfect for persisting the assistant's response.",[1115,4685,4687],{"id":4686},"fetching-a-chat","Fetching a chat",[976,4689,4690],{},"Add an endpoint to fetch existing chat data from your database:",[1278,4692,4693],{},[1078,4694,4697],{"className":1282,"code":4695,"filename":4696,"language":1284,"meta":1083,"style":1083},"import { createError, defineEventHandler, getValidatedRouterParams } from 'h3'\nimport { asc, eq } from 'drizzle-orm'\nimport { db, schema } from 'hub:db'\nimport { z } from 'zod'\n\nexport default defineEventHandler(async (event) => {\n  const { id } = await getValidatedRouterParams(event, z.object({\n    id: z.string()\n  }).parse)\n\n  const chat = await db.query.chats.findFirst({\n    where: (eq(schema.chats.id, id)),\n    with: {\n      messages: {\n        orderBy: () => asc(schema.messages.createdAt)\n      }\n    }\n  })\n\n  if (!chat) {\n    throw createError({ statusCode: 404, statusMessage: 'Chat not found' })\n  }\n\n  return chat\n})\n","server\u002Fapi\u002Fchats\u002F[id].get.ts",[1037,4698,4699,4725,4748,4770,4788,4792,4814,4846,4860,4872,4876,4904,4935,4944,4953,4982,4986,4990,4996,5000,5014,5046,5050,5054,5060],{"__ignoreMap":1083},[1087,4700,4701,4703,4705,4707,4709,4711,4713,4715,4717,4719,4721,4723],{"class":1089,"line":1090},[1087,4702,1708],{"class":1291},[1087,4704,1711],{"class":1305},[1087,4706,2899],{"class":1301},[1087,4708,1717],{"class":1305},[1087,4710,2498],{"class":1301},[1087,4712,1717],{"class":1305},[1087,4714,2908],{"class":1301},[1087,4716,1733],{"class":1305},[1087,4718,1736],{"class":1291},[1087,4720,1392],{"class":1305},[1087,4722,1115],{"class":1097},[1087,4724,1356],{"class":1305},[1087,4726,4727,4729,4731,4734,4736,4738,4740,4742,4744,4746],{"class":1089,"line":1107},[1087,4728,1708],{"class":1291},[1087,4730,1711],{"class":1305},[1087,4732,4733],{"class":1301}," asc",[1087,4735,1717],{"class":1305},[1087,4737,2931],{"class":1301},[1087,4739,1733],{"class":1305},[1087,4741,1736],{"class":1291},[1087,4743,1392],{"class":1305},[1087,4745,1761],{"class":1097},[1087,4747,1356],{"class":1305},[1087,4749,4750,4752,4754,4756,4758,4760,4762,4764,4766,4768],{"class":1089,"line":1321},[1087,4751,1708],{"class":1291},[1087,4753,1711],{"class":1305},[1087,4755,2441],{"class":1301},[1087,4757,1717],{"class":1305},[1087,4759,2549],{"class":1301},[1087,4761,1733],{"class":1305},[1087,4763,1736],{"class":1291},[1087,4765,1392],{"class":1305},[1087,4767,2558],{"class":1097},[1087,4769,1356],{"class":1305},[1087,4771,4772,4774,4776,4778,4780,4782,4784,4786],{"class":1089,"line":1336},[1087,4773,1708],{"class":1291},[1087,4775,1711],{"class":1305},[1087,4777,2569],{"class":1301},[1087,4779,1733],{"class":1305},[1087,4781,1736],{"class":1291},[1087,4783,1392],{"class":1305},[1087,4785,2578],{"class":1097},[1087,4787,1356],{"class":1305},[1087,4789,4790],{"class":1089,"line":1348},[1087,4791,1370],{"emptyLinePlaceholder":21},[1087,4793,4794,4796,4798,4800,4802,4804,4806,4808,4810,4812],{"class":1089,"line":1359},[1087,4795,1292],{"class":1291},[1087,4797,1295],{"class":1291},[1087,4799,2498],{"class":1110},[1087,4801,1302],{"class":1301},[1087,4803,2597],{"class":1588},[1087,4805,1952],{"class":1305},[1087,4807,2602],{"class":1943},[1087,4809,1883],{"class":1305},[1087,4811,1826],{"class":1588},[1087,4813,1381],{"class":1305},[1087,4815,4816,4818,4820,4822,4824,4826,4828,4830,4832,4834,4836,4838,4840,4842,4844],{"class":1089,"line":1367},[1087,4817,2613],{"class":1588},[1087,4819,1711],{"class":1305},[1087,4821,3203],{"class":1301},[1087,4823,1733],{"class":1305},[1087,4825,2623],{"class":1305},[1087,4827,2626],{"class":1291},[1087,4829,2908],{"class":1110},[1087,4831,1302],{"class":1311},[1087,4833,2602],{"class":1301},[1087,4835,1717],{"class":1305},[1087,4837,2569],{"class":1301},[1087,4839,1809],{"class":1305},[1087,4841,2641],{"class":1110},[1087,4843,1302],{"class":1311},[1087,4845,1306],{"class":1305},[1087,4847,4848,4850,4852,4854,4856,4858],{"class":1089,"line":1373},[1087,4849,3232],{"class":1311},[1087,4851,1315],{"class":1305},[1087,4853,2569],{"class":1301},[1087,4855,1809],{"class":1305},[1087,4857,3241],{"class":1110},[1087,4859,2669],{"class":1311},[1087,4861,4862,4864,4866,4868,4870],{"class":1089,"line":1384},[1087,4863,2414],{"class":1305},[1087,4865,1883],{"class":1311},[1087,4867,1809],{"class":1305},[1087,4869,2680],{"class":1301},[1087,4871,1492],{"class":1311},[1087,4873,4874],{"class":1089,"line":1400},[1087,4875,1370],{"emptyLinePlaceholder":21},[1087,4877,4878,4880,4882,4884,4886,4888,4890,4892,4894,4896,4898,4900,4902],{"class":1089,"line":1406},[1087,4879,2613],{"class":1588},[1087,4881,2790],{"class":1301},[1087,4883,2623],{"class":1305},[1087,4885,2626],{"class":1291},[1087,4887,2441],{"class":1301},[1087,4889,1809],{"class":1305},[1087,4891,3453],{"class":1301},[1087,4893,1809],{"class":1305},[1087,4895,1788],{"class":1301},[1087,4897,1809],{"class":1305},[1087,4899,3462],{"class":1110},[1087,4901,1302],{"class":1311},[1087,4903,1306],{"class":1305},[1087,4905,4906,4908,4910,4912,4914,4916,4918,4920,4922,4924,4926,4928,4930,4933],{"class":1089,"line":1411},[1087,4907,3472],{"class":1311},[1087,4909,1315],{"class":1305},[1087,4911,1952],{"class":1311},[1087,4913,3767],{"class":1110},[1087,4915,1302],{"class":1311},[1087,4917,2717],{"class":1301},[1087,4919,1809],{"class":1305},[1087,4921,1788],{"class":1301},[1087,4923,1809],{"class":1305},[1087,4925,2018],{"class":1301},[1087,4927,1717],{"class":1305},[1087,4929,3203],{"class":1301},[1087,4931,4932],{"class":1311},"))",[1087,4934,1333],{"class":1305},[1087,4936,4937,4940,4942],{"class":1089,"line":1434},[1087,4938,4939],{"class":1311},"    with",[1087,4941,1315],{"class":1305},[1087,4943,1381],{"class":1305},[1087,4945,4946,4949,4951],{"class":1089,"line":1439},[1087,4947,4948],{"class":1311},"      messages",[1087,4950,1315],{"class":1305},[1087,4952,1381],{"class":1305},[1087,4954,4955,4958,4960,4963,4965,4967,4969,4971,4973,4975,4977,4980],{"class":1089,"line":1449},[1087,4956,4957],{"class":1110},"        orderBy",[1087,4959,1315],{"class":1305},[1087,4961,4962],{"class":1305}," ()",[1087,4964,1826],{"class":1588},[1087,4966,4733],{"class":1110},[1087,4968,1302],{"class":1311},[1087,4970,2717],{"class":1301},[1087,4972,1809],{"class":1305},[1087,4974,1997],{"class":1301},[1087,4976,1809],{"class":1305},[1087,4978,4979],{"class":1301},"createdAt",[1087,4981,1492],{"class":1311},[1087,4983,4984],{"class":1089,"line":1459},[1087,4985,4368],{"class":1305},[1087,4987,4988],{"class":1089,"line":1475},[1087,4989,1478],{"class":1305},[1087,4991,4992,4994],{"class":1089,"line":1481},[1087,4993,2414],{"class":1305},[1087,4995,1492],{"class":1311},[1087,4997,4998],{"class":1089,"line":1486},[1087,4999,1370],{"emptyLinePlaceholder":21},[1087,5001,5002,5004,5006,5008,5010,5012],{"class":1089,"line":2275},[1087,5003,3528],{"class":1291},[1087,5005,1952],{"class":1311},[1087,5007,3533],{"class":1305},[1087,5009,262],{"class":1301},[1087,5011,3538],{"class":1311},[1087,5013,1306],{"class":1305},[1087,5015,5016,5018,5020,5022,5024,5026,5028,5030,5032,5034,5036,5038,5040,5042,5044],{"class":1089,"line":2288},[1087,5017,3546],{"class":1291},[1087,5019,2899],{"class":1110},[1087,5021,1302],{"class":1311},[1087,5023,1866],{"class":1305},[1087,5025,3555],{"class":1311},[1087,5027,1315],{"class":1305},[1087,5029,3561],{"class":3560},[1087,5031,1717],{"class":1305},[1087,5033,3566],{"class":1311},[1087,5035,1315],{"class":1305},[1087,5037,1392],{"class":1305},[1087,5039,3573],{"class":1097},[1087,5041,1330],{"class":1305},[1087,5043,1733],{"class":1305},[1087,5045,1492],{"class":1311},[1087,5047,5048],{"class":1089,"line":2318},[1087,5049,3585],{"class":1305},[1087,5051,5052],{"class":1089,"line":2324},[1087,5053,1370],{"emptyLinePlaceholder":21},[1087,5055,5056,5058],{"class":1089,"line":2329},[1087,5057,2840],{"class":1291},[1087,5059,2843],{"class":1301},[1087,5061,5062,5064],{"class":1089,"line":2361},[1087,5063,1489],{"class":1305},[1087,5065,1492],{"class":1301},[980,5067,5069],{"id":5068},"wire-up-the-ui","Wire up the UI",[976,5071,5072,5073,5078,5079,5084],{},"Nuxt UI provides purpose-built components for AI chat interfaces: ",[1030,5074,5075],{"href":281},[1037,5076,5077],{},"UChatPrompt"," for the input area and ",[1030,5080,5081],{"href":271},[1037,5082,5083],{},"UChatMessages"," for displaying the conversation.",[1115,5086,5088],{"id":5087},"creating-the-home-page","Creating the home page",[976,5090,5091,5092,5096],{},"The home page is where users start a new conversation. The ",[1030,5093,5094],{"href":281},[1037,5095,5077],{}," component provides a textarea with auto-resize, keyboard shortcuts, and a submit button:",[1278,5098,5099],{},[1078,5100,5104],{"className":1550,"code":5101,"filename":5102,"highlights":5103,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst input = ref('')\nconst loading = ref(false)\n\nasync function createChat() {\n  if (!input.value.trim()) return\n\n  loading.value = true\n\n  \u002F\u002F Create a new chat on the server\n  const chat = await $fetch('\u002Fapi\u002Fchats', {\n    method: 'POST',\n    body: {\n      message: {\n        role: 'user',\n        parts: [{ type: 'text', text: input.value }]\n      }\n    }\n  })\n\n  \u002F\u002F Navigate to the chat page\n  navigateTo(`\u002Fchat\u002F${chat.id}`)\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col justify-center gap-6 py-8\">\n        \u003Ch1 class=\"text-3xl sm:text-4xl text-highlighted font-bold\">\n          How can I help you today?\n        \u003C\u002Fh1>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :status=\"loading ? 'streaming' : 'ready'\"\n          variant=\"subtle\"\n          placeholder=\"Ask me anything...\"\n          @submit=\"createChat\"\n        >\n          \u003CUChatPromptSubmit color=\"neutral\" \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n","app\u002Fpages\u002Findex.vue",[3469,3513,3520,3525,3543,3582,3588,3593,3599],[1037,5105,5106,5129,5148,5166,5170,5184,5210,5214,5227,5231,5236,5262,5278,5287,5295,5309,5347,5351,5355,5361,5365,5370,5396,5401,5409,5413,5421,5442,5456,5477,5498,5503,5512,5516,5524,5539,5554,5569,5584,5599,5605,5628,5637,5646,5654,5662],{"__ignoreMap":1083},[1087,5107,5108,5110,5113,5116,5119,5121,5123,5125,5127],{"class":1089,"line":1090},[1087,5109,1560],{"class":1305},[1087,5111,5112],{"class":1311},"script",[1087,5114,5115],{"class":1588}," setup",[1087,5117,5118],{"class":1588}," lang",[1087,5120,1592],{"class":1305},[1087,5122,1519],{"class":1305},[1087,5124,1284],{"class":1097},[1087,5126,1519],{"class":1305},[1087,5128,1566],{"class":1305},[1087,5130,5131,5133,5136,5138,5141,5143,5146],{"class":1089,"line":1107},[1087,5132,3061],{"class":1588},[1087,5134,5135],{"class":1301}," input ",[1087,5137,1592],{"class":1305},[1087,5139,5140],{"class":1110}," ref",[1087,5142,1302],{"class":1301},[1087,5144,5145],{"class":1305},"''",[1087,5147,1492],{"class":1301},[1087,5149,5150,5152,5155,5157,5159,5161,5164],{"class":1089,"line":1321},[1087,5151,3061],{"class":1588},[1087,5153,5154],{"class":1301}," loading ",[1087,5156,1592],{"class":1305},[1087,5158,5140],{"class":1110},[1087,5160,1302],{"class":1301},[1087,5162,5163],{"class":1467},"false",[1087,5165,1492],{"class":1301},[1087,5167,5168],{"class":1089,"line":1336},[1087,5169,1370],{"emptyLinePlaceholder":21},[1087,5171,5172,5174,5177,5180,5182],{"class":1089,"line":1348},[1087,5173,2597],{"class":1588},[1087,5175,5176],{"class":1588}," function",[1087,5178,5179],{"class":1110}," createChat",[1087,5181,1806],{"class":1305},[1087,5183,1381],{"class":1305},[1087,5185,5186,5188,5190,5192,5195,5197,5199,5201,5204,5207],{"class":1089,"line":1359},[1087,5187,3528],{"class":1291},[1087,5189,1952],{"class":1311},[1087,5191,3533],{"class":1305},[1087,5193,5194],{"class":1301},"input",[1087,5196,1809],{"class":1305},[1087,5198,3322],{"class":1301},[1087,5200,1809],{"class":1305},[1087,5202,5203],{"class":1110},"trim",[1087,5205,5206],{"class":1311},"()) ",[1087,5208,5209],{"class":1291},"return\n",[1087,5211,5212],{"class":1089,"line":1367},[1087,5213,1370],{"emptyLinePlaceholder":21},[1087,5215,5216,5219,5221,5223,5225],{"class":1089,"line":1373},[1087,5217,5218],{"class":1301},"  loading",[1087,5220,1809],{"class":1305},[1087,5222,3322],{"class":1301},[1087,5224,2623],{"class":1305},[1087,5226,4354],{"class":1467},[1087,5228,5229],{"class":1089,"line":1384},[1087,5230,1370],{"emptyLinePlaceholder":21},[1087,5232,5233],{"class":1089,"line":1400},[1087,5234,5235],{"class":1471},"  \u002F\u002F Create a new chat on the server\n",[1087,5237,5238,5240,5242,5244,5246,5249,5251,5253,5256,5258,5260],{"class":1089,"line":1406},[1087,5239,2613],{"class":1588},[1087,5241,2790],{"class":1301},[1087,5243,2623],{"class":1305},[1087,5245,2626],{"class":1291},[1087,5247,5248],{"class":1110}," $fetch",[1087,5250,1302],{"class":1311},[1087,5252,1330],{"class":1305},[1087,5254,5255],{"class":1097},"\u002Fapi\u002Fchats",[1087,5257,1330],{"class":1305},[1087,5259,1717],{"class":1305},[1087,5261,1381],{"class":1305},[1087,5263,5264,5267,5269,5271,5274,5276],{"class":1089,"line":1411},[1087,5265,5266],{"class":1311},"    method",[1087,5268,1315],{"class":1305},[1087,5270,1392],{"class":1305},[1087,5272,5273],{"class":1097},"POST",[1087,5275,1330],{"class":1305},[1087,5277,1333],{"class":1305},[1087,5279,5280,5283,5285],{"class":1089,"line":1434},[1087,5281,5282],{"class":1311},"    body",[1087,5284,1315],{"class":1305},[1087,5286,1381],{"class":1305},[1087,5288,5289,5291,5293],{"class":1089,"line":1439},[1087,5290,3362],{"class":1311},[1087,5292,1315],{"class":1305},[1087,5294,1381],{"class":1305},[1087,5296,5297,5299,5301,5303,5305,5307],{"class":1089,"line":1449},[1087,5298,4496],{"class":1311},[1087,5300,1315],{"class":1305},[1087,5302,1392],{"class":1305},[1087,5304,2148],{"class":1097},[1087,5306,1330],{"class":1305},[1087,5308,1333],{"class":1305},[1087,5310,5311,5313,5315,5317,5319,5321,5323,5325,5328,5330,5332,5334,5336,5339,5341,5343,5345],{"class":1089,"line":1459},[1087,5312,4529],{"class":1311},[1087,5314,1315],{"class":1305},[1087,5316,1419],{"class":1311},[1087,5318,1866],{"class":1305},[1087,5320,2520],{"class":1311},[1087,5322,1315],{"class":1305},[1087,5324,1392],{"class":1305},[1087,5326,5327],{"class":1097},"text",[1087,5329,1330],{"class":1305},[1087,5331,1717],{"class":1305},[1087,5333,1720],{"class":1311},[1087,5335,1315],{"class":1305},[1087,5337,5338],{"class":1301}," input",[1087,5340,1809],{"class":1305},[1087,5342,3322],{"class":1301},[1087,5344,1733],{"class":1305},[1087,5346,3168],{"class":1311},[1087,5348,5349],{"class":1089,"line":1475},[1087,5350,4368],{"class":1305},[1087,5352,5353],{"class":1089,"line":1481},[1087,5354,1478],{"class":1305},[1087,5356,5357,5359],{"class":1089,"line":1486},[1087,5358,2414],{"class":1305},[1087,5360,1492],{"class":1311},[1087,5362,5363],{"class":1089,"line":2275},[1087,5364,1370],{"emptyLinePlaceholder":21},[1087,5366,5367],{"class":1089,"line":2288},[1087,5368,5369],{"class":1471},"  \u002F\u002F Navigate to the chat page\n",[1087,5371,5372,5375,5377,5379,5382,5385,5387,5389,5391,5394],{"class":1089,"line":2318},[1087,5373,5374],{"class":1110},"  navigateTo",[1087,5376,1302],{"class":1311},[1087,5378,3677],{"class":1305},[1087,5380,5381],{"class":1097},"\u002Fchat\u002F",[1087,5383,5384],{"class":1305},"${",[1087,5386,262],{"class":1301},[1087,5388,1809],{"class":1305},[1087,5390,2018],{"class":1301},[1087,5392,5393],{"class":1305},"}`",[1087,5395,1492],{"class":1311},[1087,5397,5398],{"class":1089,"line":2324},[1087,5399,5400],{"class":1305},"}\n",[1087,5402,5403,5405,5407],{"class":1089,"line":2329},[1087,5404,1636],{"class":1305},[1087,5406,5112],{"class":1311},[1087,5408,1566],{"class":1305},[1087,5410,5411],{"class":1089,"line":2361},[1087,5412,1370],{"emptyLinePlaceholder":21},[1087,5414,5415,5417,5419],{"class":1089,"line":2377},[1087,5416,1560],{"class":1305},[1087,5418,1563],{"class":1311},[1087,5420,1566],{"class":1305},[1087,5422,5423,5425,5428,5431,5433,5435,5438,5440],{"class":1089,"line":2395},[1087,5424,1573],{"class":1305},[1087,5426,5427],{"class":1311},"UDashboardPanel",[1087,5429,5430],{"class":1588}," :ui",[1087,5432,1592],{"class":1305},[1087,5434,1519],{"class":1305},[1087,5436,5437],{"class":1097},"{ body: 'p-0 sm:p-0' }",[1087,5439,1519],{"class":1305},[1087,5441,1566],{"class":1305},[1087,5443,5444,5446,5448,5451,5454],{"class":1089,"line":2411},[1087,5445,1582],{"class":1305},[1087,5447,1563],{"class":1311},[1087,5449,5450],{"class":1305}," #",[1087,5452,5453],{"class":1588},"body",[1087,5455,1566],{"class":1305},[1087,5457,5458,5460,5463,5466,5468,5470,5473,5475],{"class":1089,"line":2419},[1087,5459,1606],{"class":1305},[1087,5461,5462],{"class":1311},"UContainer",[1087,5464,5465],{"class":1588}," class",[1087,5467,1592],{"class":1305},[1087,5469,1519],{"class":1305},[1087,5471,5472],{"class":1097},"min-h-dvh flex flex-col justify-center gap-6 py-8",[1087,5474,1519],{"class":1305},[1087,5476,1566],{"class":1305},[1087,5478,5479,5482,5485,5487,5489,5491,5494,5496],{"class":1089,"line":3414},[1087,5480,5481],{"class":1305},"        \u003C",[1087,5483,5484],{"class":1311},"h1",[1087,5486,5465],{"class":1588},[1087,5488,1592],{"class":1305},[1087,5490,1519],{"class":1305},[1087,5492,5493],{"class":1097},"text-3xl sm:text-4xl text-highlighted font-bold",[1087,5495,1519],{"class":1305},[1087,5497,1566],{"class":1305},[1087,5499,5500],{"class":1089,"line":3427},[1087,5501,5502],{"class":1301},"          How can I help you today?\n",[1087,5504,5505,5508,5510],{"class":1089,"line":3432},[1087,5506,5507],{"class":1305},"        \u003C\u002F",[1087,5509,5484],{"class":1311},[1087,5511,1566],{"class":1305},[1087,5513,5514],{"class":1089,"line":3438},[1087,5515,1370],{"emptyLinePlaceholder":21},[1087,5517,5519,5521],{"class":5518,"line":3469},[1089,1570],[1087,5520,5481],{"class":1305},[1087,5522,5523],{"class":1311},"UChatPrompt\n",[1087,5525,5527,5530,5532,5534,5536],{"class":5526,"line":3513},[1089,1570],[1087,5528,5529],{"class":1588},"          v-model",[1087,5531,1592],{"class":1305},[1087,5533,1519],{"class":1305},[1087,5535,5194],{"class":1097},[1087,5537,5538],{"class":1305},"\"\n",[1087,5540,5542,5545,5547,5549,5552],{"class":5541,"line":3520},[1089,1570],[1087,5543,5544],{"class":1588},"          :status",[1087,5546,1592],{"class":1305},[1087,5548,1519],{"class":1305},[1087,5550,5551],{"class":1097},"loading ? 'streaming' : 'ready'",[1087,5553,5538],{"class":1305},[1087,5555,5557,5560,5562,5564,5567],{"class":5556,"line":3525},[1089,1570],[1087,5558,5559],{"class":1588},"          variant",[1087,5561,1592],{"class":1305},[1087,5563,1519],{"class":1305},[1087,5565,5566],{"class":1097},"subtle",[1087,5568,5538],{"class":1305},[1087,5570,5572,5575,5577,5579,5582],{"class":5571,"line":3543},[1089,1570],[1087,5573,5574],{"class":1588},"          placeholder",[1087,5576,1592],{"class":1305},[1087,5578,1519],{"class":1305},[1087,5580,5581],{"class":1097},"Ask me anything...",[1087,5583,5538],{"class":1305},[1087,5585,5587,5590,5592,5594,5597],{"class":5586,"line":3582},[1089,1570],[1087,5588,5589],{"class":1588},"          @submit",[1087,5591,1592],{"class":1305},[1087,5593,1519],{"class":1305},[1087,5595,5596],{"class":1097},"createChat",[1087,5598,5538],{"class":1305},[1087,5600,5602],{"class":5601,"line":3588},[1089,1570],[1087,5603,5604],{"class":1305},"        >\n",[1087,5606,5608,5611,5614,5617,5619,5621,5624,5626],{"class":5607,"line":3593},[1089,1570],[1087,5609,5610],{"class":1305},"          \u003C",[1087,5612,5613],{"class":1311},"UChatPromptSubmit",[1087,5615,5616],{"class":1588}," color",[1087,5618,1592],{"class":1305},[1087,5620,1519],{"class":1305},[1087,5622,5623],{"class":1097},"neutral",[1087,5625,1519],{"class":1305},[1087,5627,1612],{"class":1305},[1087,5629,5631,5633,5635],{"class":5630,"line":3599},[1089,1570],[1087,5632,5507],{"class":1305},[1087,5634,5077],{"class":1311},[1087,5636,1566],{"class":1305},[1087,5638,5639,5642,5644],{"class":1089,"line":3619},[1087,5640,5641],{"class":1305},"      \u003C\u002F",[1087,5643,5462],{"class":1311},[1087,5645,1566],{"class":1305},[1087,5647,5648,5650,5652],{"class":1089,"line":3647},[1087,5649,1617],{"class":1305},[1087,5651,1563],{"class":1311},[1087,5653,1566],{"class":1305},[1087,5655,5656,5658,5660],{"class":1089,"line":3663},[1087,5657,1627],{"class":1305},[1087,5659,5427],{"class":1311},[1087,5661,1566],{"class":1305},[1087,5663,5664,5666,5668],{"class":1089,"line":3682},[1087,5665,1636],{"class":1305},[1087,5667,1563],{"class":1311},[1087,5669,1566],{"class":1305},[976,5671,4626,5672,5676],{},[1030,5673,5674],{"href":281},[1037,5675,5077],{}," component automatically handles:",[988,5678,5679,5686,5689,5699],{},[991,5680,5681,5682],{},"Form submission when pressing ",[5683,5684],"kbd",{"value":5685},"enter",[991,5687,5688],{},"Auto-resizing as you type",[991,5690,5691,5692,5695,5696],{},"A loading state when ",[1037,5693,5694],{},"status"," is set to ",[1037,5697,5698],{},"streaming",[991,5700,5701],{},"Focus management and keyboard shortcuts",[980,5703,5705],{"id":5704},"creating-the-chat-page","Creating the chat page",[976,5707,5708,5709,5715,5716,5723],{},"The chat page is where the actual conversation happens. It integrates the AI SDK's ",[1030,5710,5713],{"href":5711,"rel":5712},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fchat",[1034],[1037,5714,259],{}," class and ",[1030,5717,5720],{"href":5718,"rel":5719},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fdefault-chat-transport",[1034],[1037,5721,5722],{},"DefaultChatTransport"," for real-time streaming.",[1278,5725,5726],{},[1696,5727,5728],{},[1078,5729,5733],{"className":1550,"code":5730,"filename":5731,"highlights":5732,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nimport { DefaultChatTransport, isReasoningUIPart, isTextUIPart } from 'ai'\nimport { Chat } from '@ai-sdk\u002Fvue'\nimport { isReasoningStreaming } from '@nuxt\u002Fui\u002Futils\u002Fai'\n\nconst route = useRoute()\nconst toast = useToast()\n\n\u002F\u002F Fetch existing chat data\nconst { data: chatData } = await useFetch(`\u002Fapi\u002Fchats\u002F${route.params.id}`)\n\nif (!chatData.value) {\n  throw createError({ statusCode: 404, statusMessage: 'Chat not found', fatal: true })\n}\n\nconst input = ref('')\n\n\u002F\u002F Initialize the Chat class from AI SDK\nconst chat = new Chat({\n  id: chatData.value.id,\n  messages: chatData.value.messages,\n  transport: new DefaultChatTransport({\n    api: `\u002Fapi\u002Fchats\u002F${chatData.value.id}`\n  }),\n  onData(dataPart) {\n    \u002F\u002F Refresh the chat list when a title is generated\n    if (dataPart.type === 'data-chat-title') {\n      refreshNuxtData('chats')\n    }\n  },\n  onError(error) {\n    toast.add({\n      title: 'Error',\n      description: error.message,\n      color: 'error'\n    })\n  }\n})\n\nfunction handleSubmit(e: Event) {\n  e.preventDefault()\n  if (input.value.trim()) {\n    chat.sendMessage({ text: input.value })\n    input.value = ''\n  }\n}\n\n\u002F\u002F Auto-generate response for first message\nonMounted(() => {\n  if (chatData.value?.messages.length === 1) {\n    chat.regenerate()\n  }\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col py-4 sm:py-6\">\n        \u003CUChatMessages\n          :messages=\"chat.messages\"\n          :status=\"chat.status\"\n          should-auto-scroll\n          class=\"flex-1\"\n        >\n          \u003Ctemplate #content=\"{ message }\">\n            \u003Ctemplate v-for=\"(part, index) in message.parts\" :key=\"`${message.id}-${part.type}-${index}`\">\n              \u003CUChatReasoning\n                v-if=\"isReasoningUIPart(part)\"\n                :text=\"part.text\"\n                :streaming=\"isReasoningStreaming(message, index, chat)\"\n              >\n                \u003CMDC\n                  :value=\"part.text\"\n                  :cache-key=\"`reasoning-${message.id}-${index}`\"\n                  class=\"*:first:mt-0 *:last:mb-0\"\n                \u002F>\n              \u003C\u002FUChatReasoning>\n\n              \u003CMDC\n                v-else-if=\"isTextUIPart(part)\"\n                :value=\"part.text\"\n                :cache-key=\"`${message.id}-${index}`\"\n                class=\"*:first:mt-0 *:last:mb-0\"\n              \u002F>\n            \u003C\u002Ftemplate>\n          \u003C\u002Ftemplate>\n        \u003C\u002FUChatMessages>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :error=\"chat.error\"\n          variant=\"subtle\"\n          class=\"sticky bottom-0\"\n          @submit=\"handleSubmit\"\n        >\n          \u003CUChatPromptSubmit\n            :status=\"chat.status\"\n            color=\"neutral\"\n            @stop=\"chat.stop()\"\n            @reload=\"chat.regenerate()\"\n          \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n","app\u002Fpages\u002Fchat\u002F[id].vue",[1107,1321,1336,1486,2275,2288,2318,2324,2329,2361,2377,2395,2411,2419,3414,3427,3432,3438,3469,3513,3520,3525,3543],[1037,5734,5735,5755,5785,5806,5827,5831,5845,5859,5863,5868,5916,5920,5939,5981,5985,5989,6005,6009,6014,6032,6052,6071,6087,6114,6123,6138,6144,6171,6187,6192,6197,6212,6227,6243,6260,6274,6281,6286,6293,6297,6319,6331,6351,6379,6393,6397,6401,6405,6410,6423,6451,6462,6466,6472,6480,6484,6492,6510,6522,6541,6548,6562,6575,6580,6594,6598,6623,6701,6709,6723,6737,6751,6756,6764,6777,6791,6805,6810,6820,6824,6830,6844,6857,6871,6884,6889,6898,6907,6915,6919,6925,6937,6951,6963,6976,6989,6993,7000,7013,7026,7040,7054,7059,7067,7075,7083,7091],{"__ignoreMap":1083},[1087,5736,5737,5739,5741,5743,5745,5747,5749,5751,5753],{"class":1089,"line":1090},[1087,5738,1560],{"class":1305},[1087,5740,5112],{"class":1311},[1087,5742,5115],{"class":1588},[1087,5744,5118],{"class":1588},[1087,5746,1592],{"class":1305},[1087,5748,1519],{"class":1305},[1087,5750,1284],{"class":1097},[1087,5752,1519],{"class":1305},[1087,5754,1566],{"class":1305},[1087,5756,5758,5760,5762,5765,5767,5770,5772,5775,5777,5779,5781,5783],{"class":5757,"line":1107},[1089,1570],[1087,5759,1708],{"class":1291},[1087,5761,1711],{"class":1305},[1087,5763,5764],{"class":1301}," DefaultChatTransport",[1087,5766,1717],{"class":1305},[1087,5768,5769],{"class":1301}," isReasoningUIPart",[1087,5771,1717],{"class":1305},[1087,5773,5774],{"class":1301}," isTextUIPart",[1087,5776,1733],{"class":1305},[1087,5778,1736],{"class":1291},[1087,5780,1392],{"class":1305},[1087,5782,2534],{"class":1097},[1087,5784,1356],{"class":1305},[1087,5786,5788,5790,5792,5795,5797,5799,5801,5804],{"class":5787,"line":1321},[1089,1570],[1087,5789,1708],{"class":1291},[1087,5791,1711],{"class":1305},[1087,5793,5794],{"class":1301}," Chat",[1087,5796,1733],{"class":1305},[1087,5798,1736],{"class":1291},[1087,5800,1392],{"class":1305},[1087,5802,5803],{"class":1097},"@ai-sdk\u002Fvue",[1087,5805,1356],{"class":1305},[1087,5807,5809,5811,5813,5816,5818,5820,5822,5825],{"class":5808,"line":1336},[1089,1570],[1087,5810,1708],{"class":1291},[1087,5812,1711],{"class":1305},[1087,5814,5815],{"class":1301}," isReasoningStreaming",[1087,5817,1733],{"class":1305},[1087,5819,1736],{"class":1291},[1087,5821,1392],{"class":1305},[1087,5823,5824],{"class":1097},"@nuxt\u002Fui\u002Futils\u002Fai",[1087,5826,1356],{"class":1305},[1087,5828,5829],{"class":1089,"line":1348},[1087,5830,1370],{"emptyLinePlaceholder":21},[1087,5832,5833,5835,5838,5840,5843],{"class":1089,"line":1359},[1087,5834,3061],{"class":1588},[1087,5836,5837],{"class":1301}," route ",[1087,5839,1592],{"class":1305},[1087,5841,5842],{"class":1110}," useRoute",[1087,5844,2669],{"class":1301},[1087,5846,5847,5849,5852,5854,5857],{"class":1089,"line":1367},[1087,5848,3061],{"class":1588},[1087,5850,5851],{"class":1301}," toast ",[1087,5853,1592],{"class":1305},[1087,5855,5856],{"class":1110}," useToast",[1087,5858,2669],{"class":1301},[1087,5860,5861],{"class":1089,"line":1373},[1087,5862,1370],{"emptyLinePlaceholder":21},[1087,5864,5865],{"class":1089,"line":1384},[1087,5866,5867],{"class":1471},"\u002F\u002F Fetch existing chat data\n",[1087,5869,5870,5872,5874,5877,5879,5882,5884,5886,5888,5891,5893,5895,5898,5900,5903,5905,5908,5910,5912,5914],{"class":1089,"line":1400},[1087,5871,3061],{"class":1588},[1087,5873,1711],{"class":1305},[1087,5875,5876],{"class":1311}," data",[1087,5878,1315],{"class":1305},[1087,5880,5881],{"class":1301}," chatData ",[1087,5883,1489],{"class":1305},[1087,5885,2623],{"class":1305},[1087,5887,2626],{"class":1291},[1087,5889,5890],{"class":1110}," useFetch",[1087,5892,1302],{"class":1301},[1087,5894,3677],{"class":1305},[1087,5896,5897],{"class":1097},"\u002Fapi\u002Fchats\u002F",[1087,5899,5384],{"class":1305},[1087,5901,5902],{"class":1301},"route",[1087,5904,1809],{"class":1305},[1087,5906,5907],{"class":1301},"params",[1087,5909,1809],{"class":1305},[1087,5911,2018],{"class":1301},[1087,5913,5393],{"class":1305},[1087,5915,1492],{"class":1301},[1087,5917,5918],{"class":1089,"line":1406},[1087,5919,1370],{"emptyLinePlaceholder":21},[1087,5921,5922,5925,5927,5929,5932,5934,5937],{"class":1089,"line":1411},[1087,5923,5924],{"class":1291},"if",[1087,5926,1952],{"class":1301},[1087,5928,3533],{"class":1305},[1087,5930,5931],{"class":1301},"chatData",[1087,5933,1809],{"class":1305},[1087,5935,5936],{"class":1301},"value) ",[1087,5938,1306],{"class":1305},[1087,5940,5941,5944,5946,5948,5950,5952,5954,5956,5958,5960,5962,5964,5966,5968,5970,5973,5975,5977,5979],{"class":1089,"line":1434},[1087,5942,5943],{"class":1291},"  throw",[1087,5945,2899],{"class":1110},[1087,5947,1302],{"class":1311},[1087,5949,1866],{"class":1305},[1087,5951,3555],{"class":1311},[1087,5953,1315],{"class":1305},[1087,5955,3561],{"class":3560},[1087,5957,1717],{"class":1305},[1087,5959,3566],{"class":1311},[1087,5961,1315],{"class":1305},[1087,5963,1392],{"class":1305},[1087,5965,3573],{"class":1097},[1087,5967,1330],{"class":1305},[1087,5969,1717],{"class":1305},[1087,5971,5972],{"class":1311}," fatal",[1087,5974,1315],{"class":1305},[1087,5976,4169],{"class":1467},[1087,5978,1733],{"class":1305},[1087,5980,1492],{"class":1311},[1087,5982,5983],{"class":1089,"line":1439},[1087,5984,5400],{"class":1305},[1087,5986,5987],{"class":1089,"line":1449},[1087,5988,1370],{"emptyLinePlaceholder":21},[1087,5990,5991,5993,5995,5997,5999,6001,6003],{"class":1089,"line":1459},[1087,5992,3061],{"class":1588},[1087,5994,5135],{"class":1301},[1087,5996,1592],{"class":1305},[1087,5998,5140],{"class":1110},[1087,6000,1302],{"class":1301},[1087,6002,5145],{"class":1305},[1087,6004,1492],{"class":1301},[1087,6006,6007],{"class":1089,"line":1475},[1087,6008,1370],{"emptyLinePlaceholder":21},[1087,6010,6011],{"class":1089,"line":1481},[1087,6012,6013],{"class":1471},"\u002F\u002F Initialize the Chat class from AI SDK\n",[1087,6015,6017,6019,6022,6024,6026,6028,6030],{"class":6016,"line":1486},[1089,1570],[1087,6018,3061],{"class":1588},[1087,6020,6021],{"class":1301}," chat ",[1087,6023,1592],{"class":1305},[1087,6025,1903],{"class":1305},[1087,6027,5794],{"class":1110},[1087,6029,1302],{"class":1301},[1087,6031,1306],{"class":1305},[1087,6033,6035,6037,6039,6042,6044,6046,6048,6050],{"class":6034,"line":2275},[1089,1570],[1087,6036,1799],{"class":1311},[1087,6038,1315],{"class":1305},[1087,6040,6041],{"class":1301}," chatData",[1087,6043,1809],{"class":1305},[1087,6045,3322],{"class":1301},[1087,6047,1809],{"class":1305},[1087,6049,2018],{"class":1301},[1087,6051,1333],{"class":1305},[1087,6053,6055,6057,6059,6061,6063,6065,6067,6069],{"class":6054,"line":2288},[1089,1570],[1087,6056,1959],{"class":1311},[1087,6058,1315],{"class":1305},[1087,6060,6041],{"class":1301},[1087,6062,1809],{"class":1305},[1087,6064,3322],{"class":1301},[1087,6066,1809],{"class":1305},[1087,6068,1997],{"class":1301},[1087,6070,1333],{"class":1305},[1087,6072,6074,6077,6079,6081,6083,6085],{"class":6073,"line":2318},[1089,1570],[1087,6075,6076],{"class":1311},"  transport",[1087,6078,1315],{"class":1305},[1087,6080,1903],{"class":1305},[1087,6082,5764],{"class":1110},[1087,6084,1302],{"class":1301},[1087,6086,1306],{"class":1305},[1087,6088,6090,6093,6095,6097,6099,6101,6103,6105,6107,6109,6111],{"class":6089,"line":2324},[1089,1570],[1087,6091,6092],{"class":1311},"    api",[1087,6094,1315],{"class":1305},[1087,6096,3671],{"class":1305},[1087,6098,5897],{"class":1097},[1087,6100,5384],{"class":1305},[1087,6102,5931],{"class":1301},[1087,6104,1809],{"class":1305},[1087,6106,3322],{"class":1301},[1087,6108,1809],{"class":1305},[1087,6110,2018],{"class":1301},[1087,6112,6113],{"class":1305},"}`\n",[1087,6115,6117,6119,6121],{"class":6116,"line":2329},[1089,1570],[1087,6118,2414],{"class":1305},[1087,6120,1883],{"class":1301},[1087,6122,1333],{"class":1305},[1087,6124,6126,6129,6131,6134,6136],{"class":6125,"line":2361},[1089,1570],[1087,6127,6128],{"class":1311},"  onData",[1087,6130,1302],{"class":1305},[1087,6132,6133],{"class":1943},"dataPart",[1087,6135,1883],{"class":1305},[1087,6137,1381],{"class":1305},[1087,6139,6141],{"class":6140,"line":2377},[1089,1570],[1087,6142,6143],{"class":1471},"    \u002F\u002F Refresh the chat list when a title is generated\n",[1087,6145,6147,6150,6152,6154,6156,6159,6161,6163,6165,6167,6169],{"class":6146,"line":2395},[1089,1570],[1087,6148,6149],{"class":1291},"    if",[1087,6151,1952],{"class":1311},[1087,6153,6133],{"class":1301},[1087,6155,1809],{"class":1305},[1087,6157,6158],{"class":1301},"type",[1087,6160,3349],{"class":1305},[1087,6162,1392],{"class":1305},[1087,6164,4316],{"class":1097},[1087,6166,1330],{"class":1305},[1087,6168,3538],{"class":1311},[1087,6170,1306],{"class":1305},[1087,6172,6174,6177,6179,6181,6183,6185],{"class":6173,"line":2411},[1089,1570],[1087,6175,6176],{"class":1110},"      refreshNuxtData",[1087,6178,1302],{"class":1311},[1087,6180,1330],{"class":1305},[1087,6182,1788],{"class":1097},[1087,6184,1330],{"class":1305},[1087,6186,1492],{"class":1311},[1087,6188,6190],{"class":6189,"line":2419},[1089,1570],[1087,6191,1478],{"class":1305},[1087,6193,6195],{"class":6194,"line":3414},[1089,1570],[1087,6196,1403],{"class":1305},[1087,6198,6200,6203,6205,6208,6210],{"class":6199,"line":3427},[1089,1570],[1087,6201,6202],{"class":1311},"  onError",[1087,6204,1302],{"class":1305},[1087,6206,6207],{"class":1943},"error",[1087,6209,1883],{"class":1305},[1087,6211,1381],{"class":1305},[1087,6213,6215,6218,6220,6223,6225],{"class":6214,"line":3432},[1089,1570],[1087,6216,6217],{"class":1301},"    toast",[1087,6219,1809],{"class":1305},[1087,6221,6222],{"class":1110},"add",[1087,6224,1302],{"class":1311},[1087,6226,1306],{"class":1305},[1087,6228,6230,6233,6235,6237,6239,6241],{"class":6229,"line":3438},[1089,1570],[1087,6231,6232],{"class":1311},"      title",[1087,6234,1315],{"class":1305},[1087,6236,1392],{"class":1305},[1087,6238,497],{"class":1097},[1087,6240,1330],{"class":1305},[1087,6242,1333],{"class":1305},[1087,6244,6246,6249,6251,6254,6256,6258],{"class":6245,"line":3469},[1089,1570],[1087,6247,6248],{"class":1311},"      description",[1087,6250,1315],{"class":1305},[1087,6252,6253],{"class":1301}," error",[1087,6255,1809],{"class":1305},[1087,6257,4468],{"class":1301},[1087,6259,1333],{"class":1305},[1087,6261,6263,6266,6268,6270,6272],{"class":6262,"line":3513},[1089,1570],[1087,6264,6265],{"class":1311},"      color",[1087,6267,1315],{"class":1305},[1087,6269,1392],{"class":1305},[1087,6271,6207],{"class":1097},[1087,6273,1356],{"class":1305},[1087,6275,6277,6279],{"class":6276,"line":3520},[1089,1570],[1087,6278,3376],{"class":1305},[1087,6280,1492],{"class":1311},[1087,6282,6284],{"class":6283,"line":3525},[1089,1570],[1087,6285,3585],{"class":1305},[1087,6287,6289,6291],{"class":6288,"line":3543},[1089,1570],[1087,6290,1489],{"class":1305},[1087,6292,1492],{"class":1301},[1087,6294,6295],{"class":1089,"line":3582},[1087,6296,1370],{"emptyLinePlaceholder":21},[1087,6298,6299,6302,6305,6307,6310,6312,6315,6317],{"class":1089,"line":3588},[1087,6300,6301],{"class":1588},"function",[1087,6303,6304],{"class":1110}," handleSubmit",[1087,6306,1302],{"class":1305},[1087,6308,6309],{"class":1943},"e",[1087,6311,1315],{"class":1305},[1087,6313,6314],{"class":1093}," Event",[1087,6316,1883],{"class":1305},[1087,6318,1381],{"class":1305},[1087,6320,6321,6324,6326,6329],{"class":1089,"line":3593},[1087,6322,6323],{"class":1301},"  e",[1087,6325,1809],{"class":1305},[1087,6327,6328],{"class":1110},"preventDefault",[1087,6330,2669],{"class":1311},[1087,6332,6333,6335,6337,6339,6341,6343,6345,6347,6349],{"class":1089,"line":3599},[1087,6334,3528],{"class":1291},[1087,6336,1952],{"class":1311},[1087,6338,5194],{"class":1301},[1087,6340,1809],{"class":1305},[1087,6342,3322],{"class":1301},[1087,6344,1809],{"class":1305},[1087,6346,5203],{"class":1110},[1087,6348,5206],{"class":1311},[1087,6350,1306],{"class":1305},[1087,6352,6353,6356,6358,6361,6363,6365,6367,6369,6371,6373,6375,6377],{"class":1089,"line":3619},[1087,6354,6355],{"class":1301},"    chat",[1087,6357,1809],{"class":1305},[1087,6359,6360],{"class":1110},"sendMessage",[1087,6362,1302],{"class":1311},[1087,6364,1866],{"class":1305},[1087,6366,1720],{"class":1311},[1087,6368,1315],{"class":1305},[1087,6370,5338],{"class":1301},[1087,6372,1809],{"class":1305},[1087,6374,3322],{"class":1301},[1087,6376,1733],{"class":1305},[1087,6378,1492],{"class":1311},[1087,6380,6381,6384,6386,6388,6390],{"class":1089,"line":3647},[1087,6382,6383],{"class":1301},"    input",[1087,6385,1809],{"class":1305},[1087,6387,3322],{"class":1301},[1087,6389,2623],{"class":1305},[1087,6391,6392],{"class":1305}," ''\n",[1087,6394,6395],{"class":1089,"line":3663},[1087,6396,3585],{"class":1305},[1087,6398,6399],{"class":1089,"line":3682},[1087,6400,5400],{"class":1305},[1087,6402,6403],{"class":1089,"line":3710},[1087,6404,1370],{"emptyLinePlaceholder":21},[1087,6406,6407],{"class":1089,"line":3717},[1087,6408,6409],{"class":1471},"\u002F\u002F Auto-generate response for first message\n",[1087,6411,6412,6415,6417,6419,6421],{"class":1089,"line":3722},[1087,6413,6414],{"class":1110},"onMounted",[1087,6416,1302],{"class":1301},[1087,6418,1806],{"class":1305},[1087,6420,1826],{"class":1588},[1087,6422,1381],{"class":1305},[1087,6424,6425,6427,6429,6431,6433,6435,6437,6439,6441,6443,6445,6447,6449],{"class":1089,"line":3788},[1087,6426,3528],{"class":1291},[1087,6428,1952],{"class":1311},[1087,6430,5931],{"class":1301},[1087,6432,1809],{"class":1305},[1087,6434,3322],{"class":1301},[1087,6436,3843],{"class":1305},[1087,6438,1997],{"class":1301},[1087,6440,1809],{"class":1305},[1087,6442,3822],{"class":1301},[1087,6444,3349],{"class":1305},[1087,6446,3828],{"class":3560},[1087,6448,3538],{"class":1311},[1087,6450,1306],{"class":1305},[1087,6452,6453,6455,6457,6460],{"class":1089,"line":3793},[1087,6454,6355],{"class":1301},[1087,6456,1809],{"class":1305},[1087,6458,6459],{"class":1110},"regenerate",[1087,6461,2669],{"class":1311},[1087,6463,6464],{"class":1089,"line":3798},[1087,6465,3585],{"class":1305},[1087,6467,6468,6470],{"class":1089,"line":3804},[1087,6469,1489],{"class":1305},[1087,6471,1492],{"class":1301},[1087,6473,6474,6476,6478],{"class":1089,"line":3833},[1087,6475,1636],{"class":1305},[1087,6477,5112],{"class":1311},[1087,6479,1566],{"class":1305},[1087,6481,6482],{"class":1089,"line":3874},[1087,6483,1370],{"emptyLinePlaceholder":21},[1087,6485,6486,6488,6490],{"class":1089,"line":3903},[1087,6487,1560],{"class":1305},[1087,6489,1563],{"class":1311},[1087,6491,1566],{"class":1305},[1087,6493,6494,6496,6498,6500,6502,6504,6506,6508],{"class":1089,"line":3915},[1087,6495,1573],{"class":1305},[1087,6497,5427],{"class":1311},[1087,6499,5430],{"class":1588},[1087,6501,1592],{"class":1305},[1087,6503,1519],{"class":1305},[1087,6505,5437],{"class":1097},[1087,6507,1519],{"class":1305},[1087,6509,1566],{"class":1305},[1087,6511,6512,6514,6516,6518,6520],{"class":1089,"line":3931},[1087,6513,1582],{"class":1305},[1087,6515,1563],{"class":1311},[1087,6517,5450],{"class":1305},[1087,6519,5453],{"class":1588},[1087,6521,1566],{"class":1305},[1087,6523,6524,6526,6528,6530,6532,6534,6537,6539],{"class":1089,"line":3945},[1087,6525,1606],{"class":1305},[1087,6527,5462],{"class":1311},[1087,6529,5465],{"class":1588},[1087,6531,1592],{"class":1305},[1087,6533,1519],{"class":1305},[1087,6535,6536],{"class":1097},"min-h-dvh flex flex-col py-4 sm:py-6",[1087,6538,1519],{"class":1305},[1087,6540,1566],{"class":1305},[1087,6542,6543,6545],{"class":1089,"line":3952},[1087,6544,5481],{"class":1305},[1087,6546,6547],{"class":1311},"UChatMessages\n",[1087,6549,6550,6553,6555,6557,6560],{"class":1089,"line":3957},[1087,6551,6552],{"class":1588},"          :messages",[1087,6554,1592],{"class":1305},[1087,6556,1519],{"class":1305},[1087,6558,6559],{"class":1097},"chat.messages",[1087,6561,5538],{"class":1305},[1087,6563,6564,6566,6568,6570,6573],{"class":1089,"line":3962},[1087,6565,5544],{"class":1588},[1087,6567,1592],{"class":1305},[1087,6569,1519],{"class":1305},[1087,6571,6572],{"class":1097},"chat.status",[1087,6574,5538],{"class":1305},[1087,6576,6577],{"class":1089,"line":3968},[1087,6578,6579],{"class":1588},"          should-auto-scroll\n",[1087,6581,6582,6585,6587,6589,6592],{"class":1089,"line":3985},[1087,6583,6584],{"class":1588},"          class",[1087,6586,1592],{"class":1305},[1087,6588,1519],{"class":1305},[1087,6590,6591],{"class":1097},"flex-1",[1087,6593,5538],{"class":1305},[1087,6595,6596],{"class":1089,"line":4007},[1087,6597,5604],{"class":1305},[1087,6599,6600,6602,6604,6606,6608,6610,6612,6614,6617,6619,6621],{"class":1089,"line":4025},[1087,6601,5610],{"class":1305},[1087,6603,1563],{"class":1311},[1087,6605,5450],{"class":1305},[1087,6607,371],{"class":1588},[1087,6609,1592],{"class":1305},[1087,6611,1519],{"class":1305},[1087,6613,1866],{"class":1305},[1087,6615,6616],{"class":1301}," message ",[1087,6618,1489],{"class":1305},[1087,6620,1519],{"class":1305},[1087,6622,1566],{"class":1305},[1087,6624,6625,6628,6630,6633,6635,6637,6640,6642,6645,6648,6650,6652,6654,6656,6659,6662,6664,6667,6669,6671,6673,6675,6678,6680,6683,6685,6687,6689,6691,6693,6696,6699],{"class":1089,"line":4033},[1087,6626,6627],{"class":1305},"            \u003C",[1087,6629,1563],{"class":1311},[1087,6631,6632],{"class":1291}," v-for",[1087,6634,1592],{"class":1305},[1087,6636,1519],{"class":1305},[1087,6638,6639],{"class":1301},"(part",[1087,6641,1717],{"class":1305},[1087,6643,6644],{"class":1301}," index) ",[1087,6646,6647],{"class":1305},"in",[1087,6649,2618],{"class":1301},[1087,6651,1809],{"class":1305},[1087,6653,2199],{"class":1301},[1087,6655,1519],{"class":1305},[1087,6657,6658],{"class":1305}," :",[1087,6660,6661],{"class":1588},"key",[1087,6663,1592],{"class":1305},[1087,6665,6666],{"class":1305},"\"`${",[1087,6668,4468],{"class":1301},[1087,6670,1809],{"class":1305},[1087,6672,2018],{"class":1301},[1087,6674,1489],{"class":1305},[1087,6676,6677],{"class":1097},"-",[1087,6679,5384],{"class":1305},[1087,6681,6682],{"class":1301},"part",[1087,6684,1809],{"class":1305},[1087,6686,6158],{"class":1301},[1087,6688,1489],{"class":1305},[1087,6690,6677],{"class":1097},[1087,6692,5384],{"class":1305},[1087,6694,6695],{"class":1301},"index",[1087,6697,6698],{"class":1305},"}`\"",[1087,6700,1566],{"class":1305},[1087,6702,6703,6706],{"class":1089,"line":4050},[1087,6704,6705],{"class":1305},"              \u003C",[1087,6707,6708],{"class":1311},"UChatReasoning\n",[1087,6710,6711,6714,6716,6718,6721],{"class":1089,"line":4071},[1087,6712,6713],{"class":1588},"                v-if",[1087,6715,1592],{"class":1305},[1087,6717,1519],{"class":1305},[1087,6719,6720],{"class":1097},"isReasoningUIPart(part)",[1087,6722,5538],{"class":1305},[1087,6724,6725,6728,6730,6732,6735],{"class":1089,"line":4081},[1087,6726,6727],{"class":1588},"                :text",[1087,6729,1592],{"class":1305},[1087,6731,1519],{"class":1305},[1087,6733,6734],{"class":1097},"part.text",[1087,6736,5538],{"class":1305},[1087,6738,6739,6742,6744,6746,6749],{"class":1089,"line":4091},[1087,6740,6741],{"class":1588},"                :streaming",[1087,6743,1592],{"class":1305},[1087,6745,1519],{"class":1305},[1087,6747,6748],{"class":1097},"isReasoningStreaming(message, index, chat)",[1087,6750,5538],{"class":1305},[1087,6752,6753],{"class":1089,"line":4101},[1087,6754,6755],{"class":1305},"              >\n",[1087,6757,6758,6761],{"class":1089,"line":4118},[1087,6759,6760],{"class":1305},"                \u003C",[1087,6762,6763],{"class":1311},"MDC\n",[1087,6765,6766,6769,6771,6773,6775],{"class":1089,"line":4129},[1087,6767,6768],{"class":1588},"                  :value",[1087,6770,1592],{"class":1305},[1087,6772,1519],{"class":1305},[1087,6774,6734],{"class":1097},[1087,6776,5538],{"class":1305},[1087,6778,6779,6782,6784,6786,6789],{"class":1089,"line":4135},[1087,6780,6781],{"class":1588},"                  :cache-key",[1087,6783,1592],{"class":1305},[1087,6785,1519],{"class":1305},[1087,6787,6788],{"class":1097},"`reasoning-${message.id}-${index}`",[1087,6790,5538],{"class":1305},[1087,6792,6793,6796,6798,6800,6803],{"class":1089,"line":4141},[1087,6794,6795],{"class":1588},"                  class",[1087,6797,1592],{"class":1305},[1087,6799,1519],{"class":1305},[1087,6801,6802],{"class":1097},"*:first:mt-0 *:last:mb-0",[1087,6804,5538],{"class":1305},[1087,6806,6807],{"class":1089,"line":4151},[1087,6808,6809],{"class":1305},"                \u002F>\n",[1087,6811,6812,6815,6818],{"class":1089,"line":4161},[1087,6813,6814],{"class":1305},"              \u003C\u002F",[1087,6816,6817],{"class":1311},"UChatReasoning",[1087,6819,1566],{"class":1305},[1087,6821,6822],{"class":1089,"line":4174},[1087,6823,1370],{"emptyLinePlaceholder":21},[1087,6825,6826,6828],{"class":1089,"line":4189},[1087,6827,6705],{"class":1305},[1087,6829,6763],{"class":1311},[1087,6831,6832,6835,6837,6839,6842],{"class":1089,"line":4194},[1087,6833,6834],{"class":1588},"                v-else-if",[1087,6836,1592],{"class":1305},[1087,6838,1519],{"class":1305},[1087,6840,6841],{"class":1097},"isTextUIPart(part)",[1087,6843,5538],{"class":1305},[1087,6845,6846,6849,6851,6853,6855],{"class":1089,"line":4199},[1087,6847,6848],{"class":1588},"                :value",[1087,6850,1592],{"class":1305},[1087,6852,1519],{"class":1305},[1087,6854,6734],{"class":1097},[1087,6856,5538],{"class":1305},[1087,6858,6859,6862,6864,6866,6869],{"class":1089,"line":4209},[1087,6860,6861],{"class":1588},"                :cache-key",[1087,6863,1592],{"class":1305},[1087,6865,1519],{"class":1305},[1087,6867,6868],{"class":1097},"`${message.id}-${index}`",[1087,6870,5538],{"class":1305},[1087,6872,6873,6876,6878,6880,6882],{"class":1089,"line":4225},[1087,6874,6875],{"class":1588},"                class",[1087,6877,1592],{"class":1305},[1087,6879,1519],{"class":1305},[1087,6881,6802],{"class":1097},[1087,6883,5538],{"class":1305},[1087,6885,6886],{"class":1089,"line":4240},[1087,6887,6888],{"class":1305},"              \u002F>\n",[1087,6890,6891,6894,6896],{"class":1089,"line":4246},[1087,6892,6893],{"class":1305},"            \u003C\u002F",[1087,6895,1563],{"class":1311},[1087,6897,1566],{"class":1305},[1087,6899,6900,6903,6905],{"class":1089,"line":4252},[1087,6901,6902],{"class":1305},"          \u003C\u002F",[1087,6904,1563],{"class":1311},[1087,6906,1566],{"class":1305},[1087,6908,6909,6911,6913],{"class":1089,"line":4260},[1087,6910,5507],{"class":1305},[1087,6912,5083],{"class":1311},[1087,6914,1566],{"class":1305},[1087,6916,6917],{"class":1089,"line":4265},[1087,6918,1370],{"emptyLinePlaceholder":21},[1087,6920,6921,6923],{"class":1089,"line":4271},[1087,6922,5481],{"class":1305},[1087,6924,5523],{"class":1311},[1087,6926,6927,6929,6931,6933,6935],{"class":1089,"line":4291},[1087,6928,5529],{"class":1588},[1087,6930,1592],{"class":1305},[1087,6932,1519],{"class":1305},[1087,6934,5194],{"class":1097},[1087,6936,5538],{"class":1305},[1087,6938,6939,6942,6944,6946,6949],{"class":1089,"line":4306},[1087,6940,6941],{"class":1588},"          :error",[1087,6943,1592],{"class":1305},[1087,6945,1519],{"class":1305},[1087,6947,6948],{"class":1097},"chat.error",[1087,6950,5538],{"class":1305},[1087,6952,6953,6955,6957,6959,6961],{"class":1089,"line":4323},[1087,6954,5559],{"class":1588},[1087,6956,1592],{"class":1305},[1087,6958,1519],{"class":1305},[1087,6960,5566],{"class":1097},[1087,6962,5538],{"class":1305},[1087,6964,6965,6967,6969,6971,6974],{"class":1089,"line":4346},[1087,6966,6584],{"class":1588},[1087,6968,1592],{"class":1305},[1087,6970,1519],{"class":1305},[1087,6972,6973],{"class":1097},"sticky bottom-0",[1087,6975,5538],{"class":1305},[1087,6977,6978,6980,6982,6984,6987],{"class":1089,"line":4357},[1087,6979,5589],{"class":1588},[1087,6981,1592],{"class":1305},[1087,6983,1519],{"class":1305},[1087,6985,6986],{"class":1097},"handleSubmit",[1087,6988,5538],{"class":1305},[1087,6990,6991],{"class":1089,"line":4365},[1087,6992,5604],{"class":1305},[1087,6994,6995,6997],{"class":1089,"line":4371},[1087,6996,5610],{"class":1305},[1087,6998,6999],{"class":1311},"UChatPromptSubmit\n",[1087,7001,7002,7005,7007,7009,7011],{"class":1089,"line":4376},[1087,7003,7004],{"class":1588},"            :status",[1087,7006,1592],{"class":1305},[1087,7008,1519],{"class":1305},[1087,7010,6572],{"class":1097},[1087,7012,5538],{"class":1305},[1087,7014,7015,7018,7020,7022,7024],{"class":1089,"line":4399},[1087,7016,7017],{"class":1588},"            color",[1087,7019,1592],{"class":1305},[1087,7021,1519],{"class":1305},[1087,7023,5623],{"class":1097},[1087,7025,5538],{"class":1305},[1087,7027,7028,7031,7033,7035,7038],{"class":1089,"line":4405},[1087,7029,7030],{"class":1588},"            @stop",[1087,7032,1592],{"class":1305},[1087,7034,1519],{"class":1305},[1087,7036,7037],{"class":1097},"chat.stop()",[1087,7039,5538],{"class":1305},[1087,7041,7042,7045,7047,7049,7052],{"class":1089,"line":4425},[1087,7043,7044],{"class":1588},"            @reload",[1087,7046,1592],{"class":1305},[1087,7048,1519],{"class":1305},[1087,7050,7051],{"class":1097},"chat.regenerate()",[1087,7053,5538],{"class":1305},[1087,7055,7056],{"class":1089,"line":4431},[1087,7057,7058],{"class":1305},"          \u002F>\n",[1087,7060,7061,7063,7065],{"class":1089,"line":4477},[1087,7062,5507],{"class":1305},[1087,7064,5077],{"class":1311},[1087,7066,1566],{"class":1305},[1087,7068,7069,7071,7073],{"class":1089,"line":4493},[1087,7070,5641],{"class":1305},[1087,7072,5462],{"class":1311},[1087,7074,1566],{"class":1305},[1087,7076,7077,7079,7081],{"class":1089,"line":4526},[1087,7078,1617],{"class":1305},[1087,7080,1563],{"class":1311},[1087,7082,1566],{"class":1305},[1087,7084,7085,7087,7089],{"class":1089,"line":4540},[1087,7086,1627],{"class":1305},[1087,7088,5427],{"class":1311},[1087,7090,1566],{"class":1305},[1087,7092,7093,7095,7097],{"class":1089,"line":4548},[1087,7094,1636],{"class":1305},[1087,7096,1563],{"class":1311},[1087,7098,1566],{"class":1305},[976,7100,7101],{},"Here's a breakdown of the key parts:",[976,7103,7104],{},[994,7105,7106],{},"The Chat Class",[976,7108,4626,7109,7114,7115,7117],{},[1030,7110,7112],{"href":5711,"rel":7111},[1034],[1037,7113,259],{}," class from ",[1037,7116,5803],{}," manages the entire conversation state. It handles:",[988,7119,7120,7125,7140,7146,7151],{},[991,7121,7122,7123],{},"Message history with ",[1037,7124,6559],{},[991,7126,7127,7128,1952,7130,2864,7133,2864,7136,2864,7138,1883],{},"Connection status with ",[1037,7129,6572],{},[1037,7131,7132],{},"ready",[1037,7134,7135],{},"submitted",[1037,7137,5698],{},[1037,7139,6207],{},[991,7141,7142,7143],{},"Sending messages with ",[1037,7144,7145],{},"chat.sendMessage()",[991,7147,7148,7149],{},"Stopping generation with ",[1037,7150,7037],{},[991,7152,7153,7154],{},"Regenerating responses with ",[1037,7155,7051],{},[976,7157,4626,7158,7161,7162,7167,7168,7170],{},[1037,7159,7160],{},"onData"," callback receives ",[1030,7163,7166],{"href":7164,"rel":7165},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fstreaming-data",[1034],"custom data events"," from the server (like ",[1037,7169,4316],{},"), allowing you to react to server-side events during streaming.",[976,7172,7173],{},[994,7174,7175],{},"UChatMessages Component",[976,7177,4626,7178,7182],{},[1030,7179,7180],{"href":271},[1037,7181,5083],{}," component is purpose-built for AI chatbots with:",[988,7184,7185,7188,7191,7194],{},[991,7186,7187],{},"Auto-scroll to bottom on load",[991,7189,7190],{},"Continuous scrolling as messages stream in",[991,7192,7193],{},"A loading indicator while the assistant processes",[991,7195,7196],{},"An \"Auto scroll\" button when scrolled up",[976,7198,7199],{},[994,7200,7201],{},"Rendering Markdown with MDC",[976,7203,7204,7205,7207,7208,1040,7211,7214,7215,7222,7223,7229,7230,7234,7235,7238,7239,7241],{},"AI models often respond with Markdown formatting (code blocks, lists, bold text, etc.). We iterate over message ",[1037,7206,2199],{}," using AI SDK helpers like ",[1037,7209,7210],{},"isTextUIPart",[1037,7212,7213],{},"isReasoningUIPart",", rendering text with the ",[1030,7216,7219],{"href":7217,"rel":7218},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc#mdc",[1034],[1037,7220,7221],{},"MDC"," component from ",[1030,7224,7227],{"href":7225,"rel":7226},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc",[1034],[1037,7228,1341],{}," and reasoning with ",[1030,7231,7232],{"href":291},[1037,7233,6817],{},". The ",[1037,7236,7237],{},"isReasoningStreaming"," utility from ",[1037,7240,5824],{}," detects if a reasoning part is currently being streamed.",[1666,7243,7244],{"to":859},[976,7245,7246],{},"Nuxt UI provides pre-styled prose components, so your markdown content will be automatically styled to match your theme.",[976,7248,7249],{},[994,7250,7251],{},"UChatPromptSubmit Component",[976,7253,4626,7254,7258],{},[1030,7255,7256],{"href":286},[1037,7257,5613],{}," component adapts based on the chat status:",[988,7260,7261,7264,7267],{},[991,7262,7263],{},"Shows a send button when ready",[991,7265,7266],{},"Shows a stop button while streaming",[991,7268,7269],{},"Shows a reload button after an error",[980,7271,7273],{"id":7272},"adding-chat-history","Adding chat history",[976,7275,7276],{},"This section adds a dropdown menu to list previous chats and navigate between them.",[1115,7278,7280],{"id":7279},"listing-chats-api","Listing chats API",[976,7282,7283],{},"First, create an endpoint to fetch all chats:",[1278,7285,7286],{},[1078,7287,7290],{"className":1282,"code":7288,"filename":7289,"language":1284,"meta":1083,"style":1083},"import { defineEventHandler } from 'h3'\nimport { db, schema } from 'hub:db'\nimport { desc } from 'drizzle-orm'\n\nexport default defineEventHandler(async () => {\n  return await db.query.chats.findMany({\n    orderBy: () => desc(schema.chats.createdAt)\n  })\n})\n","server\u002Fapi\u002Fchats.get.ts",[1037,7291,7292,7310,7332,7351,7355,7373,7398,7425,7431],{"__ignoreMap":1083},[1087,7293,7294,7296,7298,7300,7302,7304,7306,7308],{"class":1089,"line":1090},[1087,7295,1708],{"class":1291},[1087,7297,1711],{"class":1305},[1087,7299,2498],{"class":1301},[1087,7301,1733],{"class":1305},[1087,7303,1736],{"class":1291},[1087,7305,1392],{"class":1305},[1087,7307,1115],{"class":1097},[1087,7309,1356],{"class":1305},[1087,7311,7312,7314,7316,7318,7320,7322,7324,7326,7328,7330],{"class":1089,"line":1107},[1087,7313,1708],{"class":1291},[1087,7315,1711],{"class":1305},[1087,7317,2441],{"class":1301},[1087,7319,1717],{"class":1305},[1087,7321,2549],{"class":1301},[1087,7323,1733],{"class":1305},[1087,7325,1736],{"class":1291},[1087,7327,1392],{"class":1305},[1087,7329,2558],{"class":1097},[1087,7331,1356],{"class":1305},[1087,7333,7334,7336,7338,7341,7343,7345,7347,7349],{"class":1089,"line":1321},[1087,7335,1708],{"class":1291},[1087,7337,1711],{"class":1305},[1087,7339,7340],{"class":1301}," desc",[1087,7342,1733],{"class":1305},[1087,7344,1736],{"class":1291},[1087,7346,1392],{"class":1305},[1087,7348,1761],{"class":1097},[1087,7350,1356],{"class":1305},[1087,7352,7353],{"class":1089,"line":1336},[1087,7354,1370],{"emptyLinePlaceholder":21},[1087,7356,7357,7359,7361,7363,7365,7367,7369,7371],{"class":1089,"line":1348},[1087,7358,1292],{"class":1291},[1087,7360,1295],{"class":1291},[1087,7362,2498],{"class":1110},[1087,7364,1302],{"class":1301},[1087,7366,2597],{"class":1588},[1087,7368,4962],{"class":1305},[1087,7370,1826],{"class":1588},[1087,7372,1381],{"class":1305},[1087,7374,7375,7377,7379,7381,7383,7385,7387,7389,7391,7394,7396],{"class":1089,"line":1359},[1087,7376,2840],{"class":1291},[1087,7378,2626],{"class":1291},[1087,7380,2441],{"class":1301},[1087,7382,1809],{"class":1305},[1087,7384,3453],{"class":1301},[1087,7386,1809],{"class":1305},[1087,7388,1788],{"class":1301},[1087,7390,1809],{"class":1305},[1087,7392,7393],{"class":1110},"findMany",[1087,7395,1302],{"class":1311},[1087,7397,1306],{"class":1305},[1087,7399,7400,7403,7405,7407,7409,7411,7413,7415,7417,7419,7421,7423],{"class":1089,"line":1367},[1087,7401,7402],{"class":1110},"    orderBy",[1087,7404,1315],{"class":1305},[1087,7406,4962],{"class":1305},[1087,7408,1826],{"class":1588},[1087,7410,7340],{"class":1110},[1087,7412,1302],{"class":1311},[1087,7414,2717],{"class":1301},[1087,7416,1809],{"class":1305},[1087,7418,1788],{"class":1301},[1087,7420,1809],{"class":1305},[1087,7422,4979],{"class":1301},[1087,7424,1492],{"class":1311},[1087,7426,7427,7429],{"class":1089,"line":1373},[1087,7428,2414],{"class":1305},[1087,7430,1492],{"class":1311},[1087,7432,7433,7435],{"class":1089,"line":1384},[1087,7434,1489],{"class":1305},[1087,7436,1492],{"class":1301},[1115,7438,7440],{"id":7439},"building-the-chats-history-dropdown","Building the chats history dropdown",[976,7442,7443,7444,7449,7450,7455,7456,7449,7463,7465],{},"The component uses ",[1030,7445,7446],{"href":457},[1037,7447,7448],{},"UDropdownMenu"," with a ",[1030,7451,7452],{"href":230},[1037,7453,7454],{},"UButton"," as trigger. Use ",[1030,7457,7460],{"href":7458,"rel":7459},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-fetch",[1034],[1037,7461,7462],{},"useFetch",[1037,7464,6661],{}," to fetch and cache the chat list:",[1278,7467,7468],{},[1078,7469,7472],{"className":1550,"code":7470,"filename":7471,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\n\nconst { data: chats } = await useFetch('\u002Fapi\u002Fchats', {\n  key: 'chats',\n  default: () => []\n})\n\nconst items = computed(() => [\n  {\n    label: 'New chat',\n    to: '\u002F',\n    icon: 'i-lucide-plus-square',\n    active: route.name === 'index'\n  },\n  ...chats.value.map(chat => ({\n    label: chat.title || 'Untitled',\n    to: `\u002Fchat\u002F${chat.id}`,\n    active: route.params.id === chat.id\n  }))\n])\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDropdownMenu :items=\"items\" class=\"m-2\">\n    \u003CUButton\n      icon=\"i-lucide-messages-square\"\n      variant=\"ghost\"\n      label=\"Chats History\"\n      color=\"neutral\"\n      class=\"w-fit\"\n    \u002F>\n  \u003C\u002FUDropdownMenu>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002FChatsHistory.vue",[1037,7473,7474,7494,7506,7510,7542,7557,7571,7577,7581,7601,7606,7622,7638,7654,7678,7682,7707,7732,7754,7780,7786,7790,7798,7802,7810,7841,7848,7862,7876,7890,7902,7916,7921,7929],{"__ignoreMap":1083},[1087,7475,7476,7478,7480,7482,7484,7486,7488,7490,7492],{"class":1089,"line":1090},[1087,7477,1560],{"class":1305},[1087,7479,5112],{"class":1311},[1087,7481,5115],{"class":1588},[1087,7483,5118],{"class":1588},[1087,7485,1592],{"class":1305},[1087,7487,1519],{"class":1305},[1087,7489,1284],{"class":1097},[1087,7491,1519],{"class":1305},[1087,7493,1566],{"class":1305},[1087,7495,7496,7498,7500,7502,7504],{"class":1089,"line":1107},[1087,7497,3061],{"class":1588},[1087,7499,5837],{"class":1301},[1087,7501,1592],{"class":1305},[1087,7503,5842],{"class":1110},[1087,7505,2669],{"class":1301},[1087,7507,7508],{"class":1089,"line":1321},[1087,7509,1370],{"emptyLinePlaceholder":21},[1087,7511,7512,7514,7516,7518,7520,7522,7524,7526,7528,7530,7532,7534,7536,7538,7540],{"class":1089,"line":1336},[1087,7513,3061],{"class":1588},[1087,7515,1711],{"class":1305},[1087,7517,5876],{"class":1311},[1087,7519,1315],{"class":1305},[1087,7521,1777],{"class":1301},[1087,7523,1489],{"class":1305},[1087,7525,2623],{"class":1305},[1087,7527,2626],{"class":1291},[1087,7529,5890],{"class":1110},[1087,7531,1302],{"class":1301},[1087,7533,1330],{"class":1305},[1087,7535,5255],{"class":1097},[1087,7537,1330],{"class":1305},[1087,7539,1717],{"class":1305},[1087,7541,1381],{"class":1305},[1087,7543,7544,7547,7549,7551,7553,7555],{"class":1089,"line":1348},[1087,7545,7546],{"class":1311},"  key",[1087,7548,1315],{"class":1305},[1087,7550,1392],{"class":1305},[1087,7552,1788],{"class":1097},[1087,7554,1330],{"class":1305},[1087,7556,1333],{"class":1305},[1087,7558,7559,7562,7564,7566,7568],{"class":1089,"line":1359},[1087,7560,7561],{"class":1110},"  default",[1087,7563,1315],{"class":1305},[1087,7565,4962],{"class":1305},[1087,7567,1826],{"class":1588},[1087,7569,7570],{"class":1301}," []\n",[1087,7572,7573,7575],{"class":1089,"line":1367},[1087,7574,1489],{"class":1305},[1087,7576,1492],{"class":1301},[1087,7578,7579],{"class":1089,"line":1373},[1087,7580,1370],{"emptyLinePlaceholder":21},[1087,7582,7583,7585,7588,7590,7593,7595,7597,7599],{"class":1089,"line":1384},[1087,7584,3061],{"class":1588},[1087,7586,7587],{"class":1301}," items ",[1087,7589,1592],{"class":1305},[1087,7591,7592],{"class":1110}," computed",[1087,7594,1302],{"class":1301},[1087,7596,1806],{"class":1305},[1087,7598,1826],{"class":1588},[1087,7600,1318],{"class":1301},[1087,7602,7603],{"class":1089,"line":1400},[1087,7604,7605],{"class":1305},"  {\n",[1087,7607,7608,7611,7613,7615,7618,7620],{"class":1089,"line":1406},[1087,7609,7610],{"class":1311},"    label",[1087,7612,1315],{"class":1305},[1087,7614,1392],{"class":1305},[1087,7616,7617],{"class":1097},"New chat",[1087,7619,1330],{"class":1305},[1087,7621,1333],{"class":1305},[1087,7623,7624,7627,7629,7631,7634,7636],{"class":1089,"line":1411},[1087,7625,7626],{"class":1311},"    to",[1087,7628,1315],{"class":1305},[1087,7630,1392],{"class":1305},[1087,7632,7633],{"class":1097},"\u002F",[1087,7635,1330],{"class":1305},[1087,7637,1333],{"class":1305},[1087,7639,7640,7643,7645,7647,7650,7652],{"class":1089,"line":1434},[1087,7641,7642],{"class":1311},"    icon",[1087,7644,1315],{"class":1305},[1087,7646,1392],{"class":1305},[1087,7648,7649],{"class":1097},"i-lucide-plus-square",[1087,7651,1330],{"class":1305},[1087,7653,1333],{"class":1305},[1087,7655,7656,7659,7661,7664,7666,7669,7672,7674,7676],{"class":1089,"line":1439},[1087,7657,7658],{"class":1311},"    active",[1087,7660,1315],{"class":1305},[1087,7662,7663],{"class":1301}," route",[1087,7665,1809],{"class":1305},[1087,7667,7668],{"class":1301},"name ",[1087,7670,7671],{"class":1305},"===",[1087,7673,1392],{"class":1305},[1087,7675,6695],{"class":1097},[1087,7677,1356],{"class":1305},[1087,7679,7680],{"class":1089,"line":1449},[1087,7681,1403],{"class":1305},[1087,7683,7684,7687,7689,7691,7693,7695,7697,7699,7701,7703,7705],{"class":1089,"line":1459},[1087,7685,7686],{"class":1305},"  ...",[1087,7688,1788],{"class":1301},[1087,7690,1809],{"class":1305},[1087,7692,3322],{"class":1301},[1087,7694,1809],{"class":1305},[1087,7696,4463],{"class":1110},[1087,7698,1302],{"class":1301},[1087,7700,262],{"class":1943},[1087,7702,1826],{"class":1588},[1087,7704,1952],{"class":1301},[1087,7706,1306],{"class":1305},[1087,7708,7709,7711,7713,7715,7717,7720,7723,7725,7728,7730],{"class":1089,"line":1475},[1087,7710,7610],{"class":1311},[1087,7712,1315],{"class":1305},[1087,7714,2790],{"class":1301},[1087,7716,1809],{"class":1305},[1087,7718,7719],{"class":1301},"title ",[1087,7721,7722],{"class":1305},"||",[1087,7724,1392],{"class":1305},[1087,7726,7727],{"class":1097},"Untitled",[1087,7729,1330],{"class":1305},[1087,7731,1333],{"class":1305},[1087,7733,7734,7736,7738,7740,7742,7744,7746,7748,7750,7752],{"class":1089,"line":1481},[1087,7735,7626],{"class":1311},[1087,7737,1315],{"class":1305},[1087,7739,3671],{"class":1305},[1087,7741,5381],{"class":1097},[1087,7743,5384],{"class":1305},[1087,7745,262],{"class":1301},[1087,7747,1809],{"class":1305},[1087,7749,2018],{"class":1301},[1087,7751,5393],{"class":1305},[1087,7753,1333],{"class":1305},[1087,7755,7756,7758,7760,7762,7764,7766,7768,7771,7773,7775,7777],{"class":1089,"line":1486},[1087,7757,7658],{"class":1311},[1087,7759,1315],{"class":1305},[1087,7761,7663],{"class":1301},[1087,7763,1809],{"class":1305},[1087,7765,5907],{"class":1301},[1087,7767,1809],{"class":1305},[1087,7769,7770],{"class":1301},"id ",[1087,7772,7671],{"class":1305},[1087,7774,2790],{"class":1301},[1087,7776,1809],{"class":1305},[1087,7778,7779],{"class":1301},"id\n",[1087,7781,7782,7784],{"class":1089,"line":2275},[1087,7783,2414],{"class":1305},[1087,7785,1973],{"class":1301},[1087,7787,7788],{"class":1089,"line":2288},[1087,7789,2321],{"class":1301},[1087,7791,7792,7794,7796],{"class":1089,"line":2318},[1087,7793,1636],{"class":1305},[1087,7795,5112],{"class":1311},[1087,7797,1566],{"class":1305},[1087,7799,7800],{"class":1089,"line":2324},[1087,7801,1370],{"emptyLinePlaceholder":21},[1087,7803,7804,7806,7808],{"class":1089,"line":2329},[1087,7805,1560],{"class":1305},[1087,7807,1563],{"class":1311},[1087,7809,1566],{"class":1305},[1087,7811,7812,7814,7816,7819,7821,7823,7826,7828,7830,7832,7834,7837,7839],{"class":1089,"line":2361},[1087,7813,1573],{"class":1305},[1087,7815,7448],{"class":1311},[1087,7817,7818],{"class":1588}," :items",[1087,7820,1592],{"class":1305},[1087,7822,1519],{"class":1305},[1087,7824,7825],{"class":1097},"items",[1087,7827,1519],{"class":1305},[1087,7829,5465],{"class":1588},[1087,7831,1592],{"class":1305},[1087,7833,1519],{"class":1305},[1087,7835,7836],{"class":1097},"m-2",[1087,7838,1519],{"class":1305},[1087,7840,1566],{"class":1305},[1087,7842,7843,7845],{"class":1089,"line":2377},[1087,7844,1582],{"class":1305},[1087,7846,7847],{"class":1311},"UButton\n",[1087,7849,7850,7853,7855,7857,7860],{"class":1089,"line":2395},[1087,7851,7852],{"class":1588},"      icon",[1087,7854,1592],{"class":1305},[1087,7856,1519],{"class":1305},[1087,7858,7859],{"class":1097},"i-lucide-messages-square",[1087,7861,5538],{"class":1305},[1087,7863,7864,7867,7869,7871,7874],{"class":1089,"line":2411},[1087,7865,7866],{"class":1588},"      variant",[1087,7868,1592],{"class":1305},[1087,7870,1519],{"class":1305},[1087,7872,7873],{"class":1097},"ghost",[1087,7875,5538],{"class":1305},[1087,7877,7878,7881,7883,7885,7888],{"class":1089,"line":2419},[1087,7879,7880],{"class":1588},"      label",[1087,7882,1592],{"class":1305},[1087,7884,1519],{"class":1305},[1087,7886,7887],{"class":1097},"Chats History",[1087,7889,5538],{"class":1305},[1087,7891,7892,7894,7896,7898,7900],{"class":1089,"line":3414},[1087,7893,6265],{"class":1588},[1087,7895,1592],{"class":1305},[1087,7897,1519],{"class":1305},[1087,7899,5623],{"class":1097},[1087,7901,5538],{"class":1305},[1087,7903,7904,7907,7909,7911,7914],{"class":1089,"line":3427},[1087,7905,7906],{"class":1588},"      class",[1087,7908,1592],{"class":1305},[1087,7910,1519],{"class":1305},[1087,7912,7913],{"class":1097},"w-fit",[1087,7915,5538],{"class":1305},[1087,7917,7918],{"class":1089,"line":3432},[1087,7919,7920],{"class":1305},"    \u002F>\n",[1087,7922,7923,7925,7927],{"class":1089,"line":3438},[1087,7924,1627],{"class":1305},[1087,7926,7448],{"class":1311},[1087,7928,1566],{"class":1305},[1087,7930,7931,7933,7935],{"class":1089,"line":3469},[1087,7932,1636],{"class":1305},[1087,7934,1563],{"class":1311},[1087,7936,1566],{"class":1305},[980,7938,7940],{"id":7939},"integrating-history-in-the-home-page","Integrating history in the home page",[1278,7942,7943],{},[1696,7944,7945],{},[1078,7946,7949],{"className":1550,"code":7947,"filename":5102,"highlights":7948,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst input = ref('')\nconst loading = ref(false)\n\nasync function createChat() {\n  if (!input.value.trim()) return\n\n  loading.value = true\n\n  \u002F\u002F Create a new chat on the server\n  const chat = await $fetch('\u002Fapi\u002Fchats', {\n    method: 'POST',\n    body: {\n      message: {\n        role: 'user',\n        parts: [{ type: 'text', text: input.value }]\n      }\n    }\n  })\n\n  \u002F\u002F Navigate to the chat page\n  navigateTo(`\u002Fchat\u002F${chat.id}`)\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #header>\n      \u003CChatsHistory \u002F>\n    \u003C\u002Ftemplate>\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col justify-center gap-6 py-8\">\n        \u003Ch1 class=\"text-3xl sm:text-4xl text-highlighted font-bold\">\n          How can I help you today?\n        \u003C\u002Fh1>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :status=\"loading ? 'streaming' : 'ready'\"\n          variant=\"subtle\"\n          placeholder=\"Ask me anything...\"\n          @submit=\"createChat\"\n        >\n          \u003CUChatPromptSubmit color=\"neutral\" \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n",[2411,2419,3414],[1037,7950,7951,7971,7987,8003,8007,8019,8041,8045,8057,8061,8065,8089,8103,8111,8119,8133,8169,8173,8177,8183,8187,8191,8213,8217,8225,8229,8237,8255,8269,8279,8288,8300,8318,8336,8340,8348,8352,8358,8370,8382,8394,8406,8418,8422,8440,8448,8456,8464,8472],{"__ignoreMap":1083},[1087,7952,7953,7955,7957,7959,7961,7963,7965,7967,7969],{"class":1089,"line":1090},[1087,7954,1560],{"class":1305},[1087,7956,5112],{"class":1311},[1087,7958,5115],{"class":1588},[1087,7960,5118],{"class":1588},[1087,7962,1592],{"class":1305},[1087,7964,1519],{"class":1305},[1087,7966,1284],{"class":1097},[1087,7968,1519],{"class":1305},[1087,7970,1566],{"class":1305},[1087,7972,7973,7975,7977,7979,7981,7983,7985],{"class":1089,"line":1107},[1087,7974,3061],{"class":1588},[1087,7976,5135],{"class":1301},[1087,7978,1592],{"class":1305},[1087,7980,5140],{"class":1110},[1087,7982,1302],{"class":1301},[1087,7984,5145],{"class":1305},[1087,7986,1492],{"class":1301},[1087,7988,7989,7991,7993,7995,7997,7999,8001],{"class":1089,"line":1321},[1087,7990,3061],{"class":1588},[1087,7992,5154],{"class":1301},[1087,7994,1592],{"class":1305},[1087,7996,5140],{"class":1110},[1087,7998,1302],{"class":1301},[1087,8000,5163],{"class":1467},[1087,8002,1492],{"class":1301},[1087,8004,8005],{"class":1089,"line":1336},[1087,8006,1370],{"emptyLinePlaceholder":21},[1087,8008,8009,8011,8013,8015,8017],{"class":1089,"line":1348},[1087,8010,2597],{"class":1588},[1087,8012,5176],{"class":1588},[1087,8014,5179],{"class":1110},[1087,8016,1806],{"class":1305},[1087,8018,1381],{"class":1305},[1087,8020,8021,8023,8025,8027,8029,8031,8033,8035,8037,8039],{"class":1089,"line":1359},[1087,8022,3528],{"class":1291},[1087,8024,1952],{"class":1311},[1087,8026,3533],{"class":1305},[1087,8028,5194],{"class":1301},[1087,8030,1809],{"class":1305},[1087,8032,3322],{"class":1301},[1087,8034,1809],{"class":1305},[1087,8036,5203],{"class":1110},[1087,8038,5206],{"class":1311},[1087,8040,5209],{"class":1291},[1087,8042,8043],{"class":1089,"line":1367},[1087,8044,1370],{"emptyLinePlaceholder":21},[1087,8046,8047,8049,8051,8053,8055],{"class":1089,"line":1373},[1087,8048,5218],{"class":1301},[1087,8050,1809],{"class":1305},[1087,8052,3322],{"class":1301},[1087,8054,2623],{"class":1305},[1087,8056,4354],{"class":1467},[1087,8058,8059],{"class":1089,"line":1384},[1087,8060,1370],{"emptyLinePlaceholder":21},[1087,8062,8063],{"class":1089,"line":1400},[1087,8064,5235],{"class":1471},[1087,8066,8067,8069,8071,8073,8075,8077,8079,8081,8083,8085,8087],{"class":1089,"line":1406},[1087,8068,2613],{"class":1588},[1087,8070,2790],{"class":1301},[1087,8072,2623],{"class":1305},[1087,8074,2626],{"class":1291},[1087,8076,5248],{"class":1110},[1087,8078,1302],{"class":1311},[1087,8080,1330],{"class":1305},[1087,8082,5255],{"class":1097},[1087,8084,1330],{"class":1305},[1087,8086,1717],{"class":1305},[1087,8088,1381],{"class":1305},[1087,8090,8091,8093,8095,8097,8099,8101],{"class":1089,"line":1411},[1087,8092,5266],{"class":1311},[1087,8094,1315],{"class":1305},[1087,8096,1392],{"class":1305},[1087,8098,5273],{"class":1097},[1087,8100,1330],{"class":1305},[1087,8102,1333],{"class":1305},[1087,8104,8105,8107,8109],{"class":1089,"line":1434},[1087,8106,5282],{"class":1311},[1087,8108,1315],{"class":1305},[1087,8110,1381],{"class":1305},[1087,8112,8113,8115,8117],{"class":1089,"line":1439},[1087,8114,3362],{"class":1311},[1087,8116,1315],{"class":1305},[1087,8118,1381],{"class":1305},[1087,8120,8121,8123,8125,8127,8129,8131],{"class":1089,"line":1449},[1087,8122,4496],{"class":1311},[1087,8124,1315],{"class":1305},[1087,8126,1392],{"class":1305},[1087,8128,2148],{"class":1097},[1087,8130,1330],{"class":1305},[1087,8132,1333],{"class":1305},[1087,8134,8135,8137,8139,8141,8143,8145,8147,8149,8151,8153,8155,8157,8159,8161,8163,8165,8167],{"class":1089,"line":1459},[1087,8136,4529],{"class":1311},[1087,8138,1315],{"class":1305},[1087,8140,1419],{"class":1311},[1087,8142,1866],{"class":1305},[1087,8144,2520],{"class":1311},[1087,8146,1315],{"class":1305},[1087,8148,1392],{"class":1305},[1087,8150,5327],{"class":1097},[1087,8152,1330],{"class":1305},[1087,8154,1717],{"class":1305},[1087,8156,1720],{"class":1311},[1087,8158,1315],{"class":1305},[1087,8160,5338],{"class":1301},[1087,8162,1809],{"class":1305},[1087,8164,3322],{"class":1301},[1087,8166,1733],{"class":1305},[1087,8168,3168],{"class":1311},[1087,8170,8171],{"class":1089,"line":1475},[1087,8172,4368],{"class":1305},[1087,8174,8175],{"class":1089,"line":1481},[1087,8176,1478],{"class":1305},[1087,8178,8179,8181],{"class":1089,"line":1486},[1087,8180,2414],{"class":1305},[1087,8182,1492],{"class":1311},[1087,8184,8185],{"class":1089,"line":2275},[1087,8186,1370],{"emptyLinePlaceholder":21},[1087,8188,8189],{"class":1089,"line":2288},[1087,8190,5369],{"class":1471},[1087,8192,8193,8195,8197,8199,8201,8203,8205,8207,8209,8211],{"class":1089,"line":2318},[1087,8194,5374],{"class":1110},[1087,8196,1302],{"class":1311},[1087,8198,3677],{"class":1305},[1087,8200,5381],{"class":1097},[1087,8202,5384],{"class":1305},[1087,8204,262],{"class":1301},[1087,8206,1809],{"class":1305},[1087,8208,2018],{"class":1301},[1087,8210,5393],{"class":1305},[1087,8212,1492],{"class":1311},[1087,8214,8215],{"class":1089,"line":2324},[1087,8216,5400],{"class":1305},[1087,8218,8219,8221,8223],{"class":1089,"line":2329},[1087,8220,1636],{"class":1305},[1087,8222,5112],{"class":1311},[1087,8224,1566],{"class":1305},[1087,8226,8227],{"class":1089,"line":2361},[1087,8228,1370],{"emptyLinePlaceholder":21},[1087,8230,8231,8233,8235],{"class":1089,"line":2377},[1087,8232,1560],{"class":1305},[1087,8234,1563],{"class":1311},[1087,8236,1566],{"class":1305},[1087,8238,8239,8241,8243,8245,8247,8249,8251,8253],{"class":1089,"line":2395},[1087,8240,1573],{"class":1305},[1087,8242,5427],{"class":1311},[1087,8244,5430],{"class":1588},[1087,8246,1592],{"class":1305},[1087,8248,1519],{"class":1305},[1087,8250,5437],{"class":1097},[1087,8252,1519],{"class":1305},[1087,8254,1566],{"class":1305},[1087,8256,8258,8260,8262,8264,8267],{"class":8257,"line":2411},[1089,1570],[1087,8259,1582],{"class":1305},[1087,8261,1563],{"class":1311},[1087,8263,5450],{"class":1305},[1087,8265,8266],{"class":1588},"header",[1087,8268,1566],{"class":1305},[1087,8270,8272,8274,8277],{"class":8271,"line":2419},[1089,1570],[1087,8273,1606],{"class":1305},[1087,8275,8276],{"class":1311},"ChatsHistory",[1087,8278,1612],{"class":1305},[1087,8280,8282,8284,8286],{"class":8281,"line":3414},[1089,1570],[1087,8283,1617],{"class":1305},[1087,8285,1563],{"class":1311},[1087,8287,1566],{"class":1305},[1087,8289,8290,8292,8294,8296,8298],{"class":1089,"line":3427},[1087,8291,1582],{"class":1305},[1087,8293,1563],{"class":1311},[1087,8295,5450],{"class":1305},[1087,8297,5453],{"class":1588},[1087,8299,1566],{"class":1305},[1087,8301,8302,8304,8306,8308,8310,8312,8314,8316],{"class":1089,"line":3432},[1087,8303,1606],{"class":1305},[1087,8305,5462],{"class":1311},[1087,8307,5465],{"class":1588},[1087,8309,1592],{"class":1305},[1087,8311,1519],{"class":1305},[1087,8313,5472],{"class":1097},[1087,8315,1519],{"class":1305},[1087,8317,1566],{"class":1305},[1087,8319,8320,8322,8324,8326,8328,8330,8332,8334],{"class":1089,"line":3438},[1087,8321,5481],{"class":1305},[1087,8323,5484],{"class":1311},[1087,8325,5465],{"class":1588},[1087,8327,1592],{"class":1305},[1087,8329,1519],{"class":1305},[1087,8331,5493],{"class":1097},[1087,8333,1519],{"class":1305},[1087,8335,1566],{"class":1305},[1087,8337,8338],{"class":1089,"line":3469},[1087,8339,5502],{"class":1301},[1087,8341,8342,8344,8346],{"class":1089,"line":3513},[1087,8343,5507],{"class":1305},[1087,8345,5484],{"class":1311},[1087,8347,1566],{"class":1305},[1087,8349,8350],{"class":1089,"line":3520},[1087,8351,1370],{"emptyLinePlaceholder":21},[1087,8353,8354,8356],{"class":1089,"line":3525},[1087,8355,5481],{"class":1305},[1087,8357,5523],{"class":1311},[1087,8359,8360,8362,8364,8366,8368],{"class":1089,"line":3543},[1087,8361,5529],{"class":1588},[1087,8363,1592],{"class":1305},[1087,8365,1519],{"class":1305},[1087,8367,5194],{"class":1097},[1087,8369,5538],{"class":1305},[1087,8371,8372,8374,8376,8378,8380],{"class":1089,"line":3582},[1087,8373,5544],{"class":1588},[1087,8375,1592],{"class":1305},[1087,8377,1519],{"class":1305},[1087,8379,5551],{"class":1097},[1087,8381,5538],{"class":1305},[1087,8383,8384,8386,8388,8390,8392],{"class":1089,"line":3588},[1087,8385,5559],{"class":1588},[1087,8387,1592],{"class":1305},[1087,8389,1519],{"class":1305},[1087,8391,5566],{"class":1097},[1087,8393,5538],{"class":1305},[1087,8395,8396,8398,8400,8402,8404],{"class":1089,"line":3593},[1087,8397,5574],{"class":1588},[1087,8399,1592],{"class":1305},[1087,8401,1519],{"class":1305},[1087,8403,5581],{"class":1097},[1087,8405,5538],{"class":1305},[1087,8407,8408,8410,8412,8414,8416],{"class":1089,"line":3599},[1087,8409,5589],{"class":1588},[1087,8411,1592],{"class":1305},[1087,8413,1519],{"class":1305},[1087,8415,5596],{"class":1097},[1087,8417,5538],{"class":1305},[1087,8419,8420],{"class":1089,"line":3619},[1087,8421,5604],{"class":1305},[1087,8423,8424,8426,8428,8430,8432,8434,8436,8438],{"class":1089,"line":3647},[1087,8425,5610],{"class":1305},[1087,8427,5613],{"class":1311},[1087,8429,5616],{"class":1588},[1087,8431,1592],{"class":1305},[1087,8433,1519],{"class":1305},[1087,8435,5623],{"class":1097},[1087,8437,1519],{"class":1305},[1087,8439,1612],{"class":1305},[1087,8441,8442,8444,8446],{"class":1089,"line":3663},[1087,8443,5507],{"class":1305},[1087,8445,5077],{"class":1311},[1087,8447,1566],{"class":1305},[1087,8449,8450,8452,8454],{"class":1089,"line":3682},[1087,8451,5641],{"class":1305},[1087,8453,5462],{"class":1311},[1087,8455,1566],{"class":1305},[1087,8457,8458,8460,8462],{"class":1089,"line":3710},[1087,8459,1617],{"class":1305},[1087,8461,1563],{"class":1311},[1087,8463,1566],{"class":1305},[1087,8465,8466,8468,8470],{"class":1089,"line":3717},[1087,8467,1627],{"class":1305},[1087,8469,5427],{"class":1311},[1087,8471,1566],{"class":1305},[1087,8473,8474,8476,8478],{"class":1089,"line":3722},[1087,8475,1636],{"class":1305},[1087,8477,1563],{"class":1311},[1087,8479,1566],{"class":1305},[980,8481,8483],{"id":8482},"integrating-history-in-the-chat-page","Integrating history in the chat page",[1278,8485,8486],{},[1696,8487,8488],{},[1078,8489,8492],{"className":1550,"code":8490,"filename":5731,"highlights":8491,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nimport { DefaultChatTransport, isReasoningUIPart, isTextUIPart } from 'ai'\nimport { Chat } from '@ai-sdk\u002Fvue'\nimport { isReasoningStreaming } from '@nuxt\u002Fui\u002Futils\u002Fai'\n\nconst route = useRoute()\nconst toast = useToast()\n\n\u002F\u002F Fetch existing chat data\nconst { data: chatData } = await useFetch(`\u002Fapi\u002Fchats\u002F${route.params.id}`)\n\nif (!chatData.value) {\n  throw createError({ statusCode: 404, statusMessage: 'Chat not found', fatal: true })\n}\n\nconst input = ref('')\n\n\u002F\u002F Initialize the Chat class from AI SDK\nconst chat = new Chat({\n  id: chatData.value.id,\n  messages: chatData.value.messages,\n  transport: new DefaultChatTransport({\n    api: `\u002Fapi\u002Fchats\u002F${chatData.value.id}`\n  }),\n  onData(dataPart) {\n    \u002F\u002F Refresh the chat list when a title is generated\n    if (dataPart.type === 'data-chat-title') {\n      refreshNuxtData('chats')\n    }\n  },\n  onError(error) {\n    toast.add({\n      title: 'Error',\n      description: error.message,\n      color: 'error'\n    })\n  }\n})\n\nfunction handleSubmit(e: Event) {\n  e.preventDefault()\n  if (input.value.trim()) {\n    chat.sendMessage({ text: input.value })\n    input.value = ''\n  }\n}\n\n\u002F\u002F Auto-generate response for first message\nonMounted(() => {\n  if (chatData.value?.messages.length === 1) {\n    chat.regenerate()\n  }\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #header>\n      \u003CChatsHistory \u002F>\n    \u003C\u002Ftemplate>\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col py-4 sm:py-6\">\n        \u003CUChatMessages\n          :messages=\"chat.messages\"\n          :status=\"chat.status\"\n          should-auto-scroll\n          class=\"flex-1\"\n        >\n          \u003Ctemplate #content=\"{ message }\">\n            \u003Ctemplate v-for=\"(part, index) in message.parts\" :key=\"`${message.id}-${part.type}-${index}`\">\n              \u003CUChatReasoning\n                v-if=\"isReasoningUIPart(part)\"\n                :text=\"part.text\"\n                :streaming=\"isReasoningStreaming(message, index, chat)\"\n              >\n                \u003CMDC\n                  :value=\"part.text\"\n                  :cache-key=\"`reasoning-${message.id}-${index}`\"\n                  class=\"*:first:mt-0 *:last:mb-0\"\n                \u002F>\n              \u003C\u002FUChatReasoning>\n\n              \u003CMDC\n                v-else-if=\"isTextUIPart(part)\"\n                :value=\"part.text\"\n                :cache-key=\"`${message.id}-${index}`\"\n                class=\"*:first:mt-0 *:last:mb-0\"\n              \u002F>\n            \u003C\u002Ftemplate>\n          \u003C\u002Ftemplate>\n        \u003C\u002FUChatMessages>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :error=\"chat.error\"\n          variant=\"subtle\"\n          class=\"sticky bottom-0\"\n          @submit=\"handleSubmit\"\n        >\n          \u003CUChatPromptSubmit\n            :status=\"chat.status\"\n            color=\"neutral\"\n            @stop=\"chat.stop()\"\n            @reload=\"chat.regenerate()\"\n          \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n",[3962,3968,3985],[1037,8493,8494,8514,8540,8558,8576,8580,8592,8604,8608,8612,8654,8658,8674,8714,8718,8722,8738,8742,8746,8762,8780,8798,8812,8836,8844,8856,8860,8884,8898,8902,8906,8918,8930,8944,8958,8970,8976,8980,8986,8990,9008,9018,9038,9064,9076,9080,9084,9088,9092,9104,9132,9142,9146,9152,9160,9164,9172,9190,9202,9210,9218,9230,9249,9256,9269,9281,9285,9297,9301,9325,9391,9397,9409,9421,9433,9437,9443,9455,9467,9479,9483,9491,9495,9501,9513,9525,9537,9549,9553,9561,9569,9577,9581,9587,9599,9611,9623,9635,9647,9651,9657,9669,9681,9693,9705,9709,9717,9725,9733,9741],{"__ignoreMap":1083},[1087,8495,8496,8498,8500,8502,8504,8506,8508,8510,8512],{"class":1089,"line":1090},[1087,8497,1560],{"class":1305},[1087,8499,5112],{"class":1311},[1087,8501,5115],{"class":1588},[1087,8503,5118],{"class":1588},[1087,8505,1592],{"class":1305},[1087,8507,1519],{"class":1305},[1087,8509,1284],{"class":1097},[1087,8511,1519],{"class":1305},[1087,8513,1566],{"class":1305},[1087,8515,8516,8518,8520,8522,8524,8526,8528,8530,8532,8534,8536,8538],{"class":1089,"line":1107},[1087,8517,1708],{"class":1291},[1087,8519,1711],{"class":1305},[1087,8521,5764],{"class":1301},[1087,8523,1717],{"class":1305},[1087,8525,5769],{"class":1301},[1087,8527,1717],{"class":1305},[1087,8529,5774],{"class":1301},[1087,8531,1733],{"class":1305},[1087,8533,1736],{"class":1291},[1087,8535,1392],{"class":1305},[1087,8537,2534],{"class":1097},[1087,8539,1356],{"class":1305},[1087,8541,8542,8544,8546,8548,8550,8552,8554,8556],{"class":1089,"line":1321},[1087,8543,1708],{"class":1291},[1087,8545,1711],{"class":1305},[1087,8547,5794],{"class":1301},[1087,8549,1733],{"class":1305},[1087,8551,1736],{"class":1291},[1087,8553,1392],{"class":1305},[1087,8555,5803],{"class":1097},[1087,8557,1356],{"class":1305},[1087,8559,8560,8562,8564,8566,8568,8570,8572,8574],{"class":1089,"line":1336},[1087,8561,1708],{"class":1291},[1087,8563,1711],{"class":1305},[1087,8565,5815],{"class":1301},[1087,8567,1733],{"class":1305},[1087,8569,1736],{"class":1291},[1087,8571,1392],{"class":1305},[1087,8573,5824],{"class":1097},[1087,8575,1356],{"class":1305},[1087,8577,8578],{"class":1089,"line":1348},[1087,8579,1370],{"emptyLinePlaceholder":21},[1087,8581,8582,8584,8586,8588,8590],{"class":1089,"line":1359},[1087,8583,3061],{"class":1588},[1087,8585,5837],{"class":1301},[1087,8587,1592],{"class":1305},[1087,8589,5842],{"class":1110},[1087,8591,2669],{"class":1301},[1087,8593,8594,8596,8598,8600,8602],{"class":1089,"line":1367},[1087,8595,3061],{"class":1588},[1087,8597,5851],{"class":1301},[1087,8599,1592],{"class":1305},[1087,8601,5856],{"class":1110},[1087,8603,2669],{"class":1301},[1087,8605,8606],{"class":1089,"line":1373},[1087,8607,1370],{"emptyLinePlaceholder":21},[1087,8609,8610],{"class":1089,"line":1384},[1087,8611,5867],{"class":1471},[1087,8613,8614,8616,8618,8620,8622,8624,8626,8628,8630,8632,8634,8636,8638,8640,8642,8644,8646,8648,8650,8652],{"class":1089,"line":1400},[1087,8615,3061],{"class":1588},[1087,8617,1711],{"class":1305},[1087,8619,5876],{"class":1311},[1087,8621,1315],{"class":1305},[1087,8623,5881],{"class":1301},[1087,8625,1489],{"class":1305},[1087,8627,2623],{"class":1305},[1087,8629,2626],{"class":1291},[1087,8631,5890],{"class":1110},[1087,8633,1302],{"class":1301},[1087,8635,3677],{"class":1305},[1087,8637,5897],{"class":1097},[1087,8639,5384],{"class":1305},[1087,8641,5902],{"class":1301},[1087,8643,1809],{"class":1305},[1087,8645,5907],{"class":1301},[1087,8647,1809],{"class":1305},[1087,8649,2018],{"class":1301},[1087,8651,5393],{"class":1305},[1087,8653,1492],{"class":1301},[1087,8655,8656],{"class":1089,"line":1406},[1087,8657,1370],{"emptyLinePlaceholder":21},[1087,8659,8660,8662,8664,8666,8668,8670,8672],{"class":1089,"line":1411},[1087,8661,5924],{"class":1291},[1087,8663,1952],{"class":1301},[1087,8665,3533],{"class":1305},[1087,8667,5931],{"class":1301},[1087,8669,1809],{"class":1305},[1087,8671,5936],{"class":1301},[1087,8673,1306],{"class":1305},[1087,8675,8676,8678,8680,8682,8684,8686,8688,8690,8692,8694,8696,8698,8700,8702,8704,8706,8708,8710,8712],{"class":1089,"line":1434},[1087,8677,5943],{"class":1291},[1087,8679,2899],{"class":1110},[1087,8681,1302],{"class":1311},[1087,8683,1866],{"class":1305},[1087,8685,3555],{"class":1311},[1087,8687,1315],{"class":1305},[1087,8689,3561],{"class":3560},[1087,8691,1717],{"class":1305},[1087,8693,3566],{"class":1311},[1087,8695,1315],{"class":1305},[1087,8697,1392],{"class":1305},[1087,8699,3573],{"class":1097},[1087,8701,1330],{"class":1305},[1087,8703,1717],{"class":1305},[1087,8705,5972],{"class":1311},[1087,8707,1315],{"class":1305},[1087,8709,4169],{"class":1467},[1087,8711,1733],{"class":1305},[1087,8713,1492],{"class":1311},[1087,8715,8716],{"class":1089,"line":1439},[1087,8717,5400],{"class":1305},[1087,8719,8720],{"class":1089,"line":1449},[1087,8721,1370],{"emptyLinePlaceholder":21},[1087,8723,8724,8726,8728,8730,8732,8734,8736],{"class":1089,"line":1459},[1087,8725,3061],{"class":1588},[1087,8727,5135],{"class":1301},[1087,8729,1592],{"class":1305},[1087,8731,5140],{"class":1110},[1087,8733,1302],{"class":1301},[1087,8735,5145],{"class":1305},[1087,8737,1492],{"class":1301},[1087,8739,8740],{"class":1089,"line":1475},[1087,8741,1370],{"emptyLinePlaceholder":21},[1087,8743,8744],{"class":1089,"line":1481},[1087,8745,6013],{"class":1471},[1087,8747,8748,8750,8752,8754,8756,8758,8760],{"class":1089,"line":1486},[1087,8749,3061],{"class":1588},[1087,8751,6021],{"class":1301},[1087,8753,1592],{"class":1305},[1087,8755,1903],{"class":1305},[1087,8757,5794],{"class":1110},[1087,8759,1302],{"class":1301},[1087,8761,1306],{"class":1305},[1087,8763,8764,8766,8768,8770,8772,8774,8776,8778],{"class":1089,"line":2275},[1087,8765,1799],{"class":1311},[1087,8767,1315],{"class":1305},[1087,8769,6041],{"class":1301},[1087,8771,1809],{"class":1305},[1087,8773,3322],{"class":1301},[1087,8775,1809],{"class":1305},[1087,8777,2018],{"class":1301},[1087,8779,1333],{"class":1305},[1087,8781,8782,8784,8786,8788,8790,8792,8794,8796],{"class":1089,"line":2288},[1087,8783,1959],{"class":1311},[1087,8785,1315],{"class":1305},[1087,8787,6041],{"class":1301},[1087,8789,1809],{"class":1305},[1087,8791,3322],{"class":1301},[1087,8793,1809],{"class":1305},[1087,8795,1997],{"class":1301},[1087,8797,1333],{"class":1305},[1087,8799,8800,8802,8804,8806,8808,8810],{"class":1089,"line":2318},[1087,8801,6076],{"class":1311},[1087,8803,1315],{"class":1305},[1087,8805,1903],{"class":1305},[1087,8807,5764],{"class":1110},[1087,8809,1302],{"class":1301},[1087,8811,1306],{"class":1305},[1087,8813,8814,8816,8818,8820,8822,8824,8826,8828,8830,8832,8834],{"class":1089,"line":2324},[1087,8815,6092],{"class":1311},[1087,8817,1315],{"class":1305},[1087,8819,3671],{"class":1305},[1087,8821,5897],{"class":1097},[1087,8823,5384],{"class":1305},[1087,8825,5931],{"class":1301},[1087,8827,1809],{"class":1305},[1087,8829,3322],{"class":1301},[1087,8831,1809],{"class":1305},[1087,8833,2018],{"class":1301},[1087,8835,6113],{"class":1305},[1087,8837,8838,8840,8842],{"class":1089,"line":2329},[1087,8839,2414],{"class":1305},[1087,8841,1883],{"class":1301},[1087,8843,1333],{"class":1305},[1087,8845,8846,8848,8850,8852,8854],{"class":1089,"line":2361},[1087,8847,6128],{"class":1311},[1087,8849,1302],{"class":1305},[1087,8851,6133],{"class":1943},[1087,8853,1883],{"class":1305},[1087,8855,1381],{"class":1305},[1087,8857,8858],{"class":1089,"line":2377},[1087,8859,6143],{"class":1471},[1087,8861,8862,8864,8866,8868,8870,8872,8874,8876,8878,8880,8882],{"class":1089,"line":2395},[1087,8863,6149],{"class":1291},[1087,8865,1952],{"class":1311},[1087,8867,6133],{"class":1301},[1087,8869,1809],{"class":1305},[1087,8871,6158],{"class":1301},[1087,8873,3349],{"class":1305},[1087,8875,1392],{"class":1305},[1087,8877,4316],{"class":1097},[1087,8879,1330],{"class":1305},[1087,8881,3538],{"class":1311},[1087,8883,1306],{"class":1305},[1087,8885,8886,8888,8890,8892,8894,8896],{"class":1089,"line":2411},[1087,8887,6176],{"class":1110},[1087,8889,1302],{"class":1311},[1087,8891,1330],{"class":1305},[1087,8893,1788],{"class":1097},[1087,8895,1330],{"class":1305},[1087,8897,1492],{"class":1311},[1087,8899,8900],{"class":1089,"line":2419},[1087,8901,1478],{"class":1305},[1087,8903,8904],{"class":1089,"line":3414},[1087,8905,1403],{"class":1305},[1087,8907,8908,8910,8912,8914,8916],{"class":1089,"line":3427},[1087,8909,6202],{"class":1311},[1087,8911,1302],{"class":1305},[1087,8913,6207],{"class":1943},[1087,8915,1883],{"class":1305},[1087,8917,1381],{"class":1305},[1087,8919,8920,8922,8924,8926,8928],{"class":1089,"line":3432},[1087,8921,6217],{"class":1301},[1087,8923,1809],{"class":1305},[1087,8925,6222],{"class":1110},[1087,8927,1302],{"class":1311},[1087,8929,1306],{"class":1305},[1087,8931,8932,8934,8936,8938,8940,8942],{"class":1089,"line":3438},[1087,8933,6232],{"class":1311},[1087,8935,1315],{"class":1305},[1087,8937,1392],{"class":1305},[1087,8939,497],{"class":1097},[1087,8941,1330],{"class":1305},[1087,8943,1333],{"class":1305},[1087,8945,8946,8948,8950,8952,8954,8956],{"class":1089,"line":3469},[1087,8947,6248],{"class":1311},[1087,8949,1315],{"class":1305},[1087,8951,6253],{"class":1301},[1087,8953,1809],{"class":1305},[1087,8955,4468],{"class":1301},[1087,8957,1333],{"class":1305},[1087,8959,8960,8962,8964,8966,8968],{"class":1089,"line":3513},[1087,8961,6265],{"class":1311},[1087,8963,1315],{"class":1305},[1087,8965,1392],{"class":1305},[1087,8967,6207],{"class":1097},[1087,8969,1356],{"class":1305},[1087,8971,8972,8974],{"class":1089,"line":3520},[1087,8973,3376],{"class":1305},[1087,8975,1492],{"class":1311},[1087,8977,8978],{"class":1089,"line":3525},[1087,8979,3585],{"class":1305},[1087,8981,8982,8984],{"class":1089,"line":3543},[1087,8983,1489],{"class":1305},[1087,8985,1492],{"class":1301},[1087,8987,8988],{"class":1089,"line":3582},[1087,8989,1370],{"emptyLinePlaceholder":21},[1087,8991,8992,8994,8996,8998,9000,9002,9004,9006],{"class":1089,"line":3588},[1087,8993,6301],{"class":1588},[1087,8995,6304],{"class":1110},[1087,8997,1302],{"class":1305},[1087,8999,6309],{"class":1943},[1087,9001,1315],{"class":1305},[1087,9003,6314],{"class":1093},[1087,9005,1883],{"class":1305},[1087,9007,1381],{"class":1305},[1087,9009,9010,9012,9014,9016],{"class":1089,"line":3593},[1087,9011,6323],{"class":1301},[1087,9013,1809],{"class":1305},[1087,9015,6328],{"class":1110},[1087,9017,2669],{"class":1311},[1087,9019,9020,9022,9024,9026,9028,9030,9032,9034,9036],{"class":1089,"line":3599},[1087,9021,3528],{"class":1291},[1087,9023,1952],{"class":1311},[1087,9025,5194],{"class":1301},[1087,9027,1809],{"class":1305},[1087,9029,3322],{"class":1301},[1087,9031,1809],{"class":1305},[1087,9033,5203],{"class":1110},[1087,9035,5206],{"class":1311},[1087,9037,1306],{"class":1305},[1087,9039,9040,9042,9044,9046,9048,9050,9052,9054,9056,9058,9060,9062],{"class":1089,"line":3619},[1087,9041,6355],{"class":1301},[1087,9043,1809],{"class":1305},[1087,9045,6360],{"class":1110},[1087,9047,1302],{"class":1311},[1087,9049,1866],{"class":1305},[1087,9051,1720],{"class":1311},[1087,9053,1315],{"class":1305},[1087,9055,5338],{"class":1301},[1087,9057,1809],{"class":1305},[1087,9059,3322],{"class":1301},[1087,9061,1733],{"class":1305},[1087,9063,1492],{"class":1311},[1087,9065,9066,9068,9070,9072,9074],{"class":1089,"line":3647},[1087,9067,6383],{"class":1301},[1087,9069,1809],{"class":1305},[1087,9071,3322],{"class":1301},[1087,9073,2623],{"class":1305},[1087,9075,6392],{"class":1305},[1087,9077,9078],{"class":1089,"line":3663},[1087,9079,3585],{"class":1305},[1087,9081,9082],{"class":1089,"line":3682},[1087,9083,5400],{"class":1305},[1087,9085,9086],{"class":1089,"line":3710},[1087,9087,1370],{"emptyLinePlaceholder":21},[1087,9089,9090],{"class":1089,"line":3717},[1087,9091,6409],{"class":1471},[1087,9093,9094,9096,9098,9100,9102],{"class":1089,"line":3722},[1087,9095,6414],{"class":1110},[1087,9097,1302],{"class":1301},[1087,9099,1806],{"class":1305},[1087,9101,1826],{"class":1588},[1087,9103,1381],{"class":1305},[1087,9105,9106,9108,9110,9112,9114,9116,9118,9120,9122,9124,9126,9128,9130],{"class":1089,"line":3788},[1087,9107,3528],{"class":1291},[1087,9109,1952],{"class":1311},[1087,9111,5931],{"class":1301},[1087,9113,1809],{"class":1305},[1087,9115,3322],{"class":1301},[1087,9117,3843],{"class":1305},[1087,9119,1997],{"class":1301},[1087,9121,1809],{"class":1305},[1087,9123,3822],{"class":1301},[1087,9125,3349],{"class":1305},[1087,9127,3828],{"class":3560},[1087,9129,3538],{"class":1311},[1087,9131,1306],{"class":1305},[1087,9133,9134,9136,9138,9140],{"class":1089,"line":3793},[1087,9135,6355],{"class":1301},[1087,9137,1809],{"class":1305},[1087,9139,6459],{"class":1110},[1087,9141,2669],{"class":1311},[1087,9143,9144],{"class":1089,"line":3798},[1087,9145,3585],{"class":1305},[1087,9147,9148,9150],{"class":1089,"line":3804},[1087,9149,1489],{"class":1305},[1087,9151,1492],{"class":1301},[1087,9153,9154,9156,9158],{"class":1089,"line":3833},[1087,9155,1636],{"class":1305},[1087,9157,5112],{"class":1311},[1087,9159,1566],{"class":1305},[1087,9161,9162],{"class":1089,"line":3874},[1087,9163,1370],{"emptyLinePlaceholder":21},[1087,9165,9166,9168,9170],{"class":1089,"line":3903},[1087,9167,1560],{"class":1305},[1087,9169,1563],{"class":1311},[1087,9171,1566],{"class":1305},[1087,9173,9174,9176,9178,9180,9182,9184,9186,9188],{"class":1089,"line":3915},[1087,9175,1573],{"class":1305},[1087,9177,5427],{"class":1311},[1087,9179,5430],{"class":1588},[1087,9181,1592],{"class":1305},[1087,9183,1519],{"class":1305},[1087,9185,5437],{"class":1097},[1087,9187,1519],{"class":1305},[1087,9189,1566],{"class":1305},[1087,9191,9192,9194,9196,9198,9200],{"class":1089,"line":3931},[1087,9193,1582],{"class":1305},[1087,9195,1563],{"class":1311},[1087,9197,5450],{"class":1305},[1087,9199,8266],{"class":1588},[1087,9201,1566],{"class":1305},[1087,9203,9204,9206,9208],{"class":1089,"line":3945},[1087,9205,1606],{"class":1305},[1087,9207,8276],{"class":1311},[1087,9209,1612],{"class":1305},[1087,9211,9212,9214,9216],{"class":1089,"line":3952},[1087,9213,1617],{"class":1305},[1087,9215,1563],{"class":1311},[1087,9217,1566],{"class":1305},[1087,9219,9220,9222,9224,9226,9228],{"class":1089,"line":3957},[1087,9221,1582],{"class":1305},[1087,9223,1563],{"class":1311},[1087,9225,5450],{"class":1305},[1087,9227,5453],{"class":1588},[1087,9229,1566],{"class":1305},[1087,9231,9233,9235,9237,9239,9241,9243,9245,9247],{"class":9232,"line":3962},[1089,1570],[1087,9234,1606],{"class":1305},[1087,9236,5462],{"class":1311},[1087,9238,5465],{"class":1588},[1087,9240,1592],{"class":1305},[1087,9242,1519],{"class":1305},[1087,9244,6536],{"class":1097},[1087,9246,1519],{"class":1305},[1087,9248,1566],{"class":1305},[1087,9250,9252,9254],{"class":9251,"line":3968},[1089,1570],[1087,9253,5481],{"class":1305},[1087,9255,6547],{"class":1311},[1087,9257,9259,9261,9263,9265,9267],{"class":9258,"line":3985},[1089,1570],[1087,9260,6552],{"class":1588},[1087,9262,1592],{"class":1305},[1087,9264,1519],{"class":1305},[1087,9266,6559],{"class":1097},[1087,9268,5538],{"class":1305},[1087,9270,9271,9273,9275,9277,9279],{"class":1089,"line":4007},[1087,9272,5544],{"class":1588},[1087,9274,1592],{"class":1305},[1087,9276,1519],{"class":1305},[1087,9278,6572],{"class":1097},[1087,9280,5538],{"class":1305},[1087,9282,9283],{"class":1089,"line":4025},[1087,9284,6579],{"class":1588},[1087,9286,9287,9289,9291,9293,9295],{"class":1089,"line":4033},[1087,9288,6584],{"class":1588},[1087,9290,1592],{"class":1305},[1087,9292,1519],{"class":1305},[1087,9294,6591],{"class":1097},[1087,9296,5538],{"class":1305},[1087,9298,9299],{"class":1089,"line":4050},[1087,9300,5604],{"class":1305},[1087,9302,9303,9305,9307,9309,9311,9313,9315,9317,9319,9321,9323],{"class":1089,"line":4071},[1087,9304,5610],{"class":1305},[1087,9306,1563],{"class":1311},[1087,9308,5450],{"class":1305},[1087,9310,371],{"class":1588},[1087,9312,1592],{"class":1305},[1087,9314,1519],{"class":1305},[1087,9316,1866],{"class":1305},[1087,9318,6616],{"class":1301},[1087,9320,1489],{"class":1305},[1087,9322,1519],{"class":1305},[1087,9324,1566],{"class":1305},[1087,9326,9327,9329,9331,9333,9335,9337,9339,9341,9343,9345,9347,9349,9351,9353,9355,9357,9359,9361,9363,9365,9367,9369,9371,9373,9375,9377,9379,9381,9383,9385,9387,9389],{"class":1089,"line":4081},[1087,9328,6627],{"class":1305},[1087,9330,1563],{"class":1311},[1087,9332,6632],{"class":1291},[1087,9334,1592],{"class":1305},[1087,9336,1519],{"class":1305},[1087,9338,6639],{"class":1301},[1087,9340,1717],{"class":1305},[1087,9342,6644],{"class":1301},[1087,9344,6647],{"class":1305},[1087,9346,2618],{"class":1301},[1087,9348,1809],{"class":1305},[1087,9350,2199],{"class":1301},[1087,9352,1519],{"class":1305},[1087,9354,6658],{"class":1305},[1087,9356,6661],{"class":1588},[1087,9358,1592],{"class":1305},[1087,9360,6666],{"class":1305},[1087,9362,4468],{"class":1301},[1087,9364,1809],{"class":1305},[1087,9366,2018],{"class":1301},[1087,9368,1489],{"class":1305},[1087,9370,6677],{"class":1097},[1087,9372,5384],{"class":1305},[1087,9374,6682],{"class":1301},[1087,9376,1809],{"class":1305},[1087,9378,6158],{"class":1301},[1087,9380,1489],{"class":1305},[1087,9382,6677],{"class":1097},[1087,9384,5384],{"class":1305},[1087,9386,6695],{"class":1301},[1087,9388,6698],{"class":1305},[1087,9390,1566],{"class":1305},[1087,9392,9393,9395],{"class":1089,"line":4091},[1087,9394,6705],{"class":1305},[1087,9396,6708],{"class":1311},[1087,9398,9399,9401,9403,9405,9407],{"class":1089,"line":4101},[1087,9400,6713],{"class":1588},[1087,9402,1592],{"class":1305},[1087,9404,1519],{"class":1305},[1087,9406,6720],{"class":1097},[1087,9408,5538],{"class":1305},[1087,9410,9411,9413,9415,9417,9419],{"class":1089,"line":4118},[1087,9412,6727],{"class":1588},[1087,9414,1592],{"class":1305},[1087,9416,1519],{"class":1305},[1087,9418,6734],{"class":1097},[1087,9420,5538],{"class":1305},[1087,9422,9423,9425,9427,9429,9431],{"class":1089,"line":4129},[1087,9424,6741],{"class":1588},[1087,9426,1592],{"class":1305},[1087,9428,1519],{"class":1305},[1087,9430,6748],{"class":1097},[1087,9432,5538],{"class":1305},[1087,9434,9435],{"class":1089,"line":4135},[1087,9436,6755],{"class":1305},[1087,9438,9439,9441],{"class":1089,"line":4141},[1087,9440,6760],{"class":1305},[1087,9442,6763],{"class":1311},[1087,9444,9445,9447,9449,9451,9453],{"class":1089,"line":4151},[1087,9446,6768],{"class":1588},[1087,9448,1592],{"class":1305},[1087,9450,1519],{"class":1305},[1087,9452,6734],{"class":1097},[1087,9454,5538],{"class":1305},[1087,9456,9457,9459,9461,9463,9465],{"class":1089,"line":4161},[1087,9458,6781],{"class":1588},[1087,9460,1592],{"class":1305},[1087,9462,1519],{"class":1305},[1087,9464,6788],{"class":1097},[1087,9466,5538],{"class":1305},[1087,9468,9469,9471,9473,9475,9477],{"class":1089,"line":4174},[1087,9470,6795],{"class":1588},[1087,9472,1592],{"class":1305},[1087,9474,1519],{"class":1305},[1087,9476,6802],{"class":1097},[1087,9478,5538],{"class":1305},[1087,9480,9481],{"class":1089,"line":4189},[1087,9482,6809],{"class":1305},[1087,9484,9485,9487,9489],{"class":1089,"line":4194},[1087,9486,6814],{"class":1305},[1087,9488,6817],{"class":1311},[1087,9490,1566],{"class":1305},[1087,9492,9493],{"class":1089,"line":4199},[1087,9494,1370],{"emptyLinePlaceholder":21},[1087,9496,9497,9499],{"class":1089,"line":4209},[1087,9498,6705],{"class":1305},[1087,9500,6763],{"class":1311},[1087,9502,9503,9505,9507,9509,9511],{"class":1089,"line":4225},[1087,9504,6834],{"class":1588},[1087,9506,1592],{"class":1305},[1087,9508,1519],{"class":1305},[1087,9510,6841],{"class":1097},[1087,9512,5538],{"class":1305},[1087,9514,9515,9517,9519,9521,9523],{"class":1089,"line":4240},[1087,9516,6848],{"class":1588},[1087,9518,1592],{"class":1305},[1087,9520,1519],{"class":1305},[1087,9522,6734],{"class":1097},[1087,9524,5538],{"class":1305},[1087,9526,9527,9529,9531,9533,9535],{"class":1089,"line":4246},[1087,9528,6861],{"class":1588},[1087,9530,1592],{"class":1305},[1087,9532,1519],{"class":1305},[1087,9534,6868],{"class":1097},[1087,9536,5538],{"class":1305},[1087,9538,9539,9541,9543,9545,9547],{"class":1089,"line":4252},[1087,9540,6875],{"class":1588},[1087,9542,1592],{"class":1305},[1087,9544,1519],{"class":1305},[1087,9546,6802],{"class":1097},[1087,9548,5538],{"class":1305},[1087,9550,9551],{"class":1089,"line":4260},[1087,9552,6888],{"class":1305},[1087,9554,9555,9557,9559],{"class":1089,"line":4265},[1087,9556,6893],{"class":1305},[1087,9558,1563],{"class":1311},[1087,9560,1566],{"class":1305},[1087,9562,9563,9565,9567],{"class":1089,"line":4271},[1087,9564,6902],{"class":1305},[1087,9566,1563],{"class":1311},[1087,9568,1566],{"class":1305},[1087,9570,9571,9573,9575],{"class":1089,"line":4291},[1087,9572,5507],{"class":1305},[1087,9574,5083],{"class":1311},[1087,9576,1566],{"class":1305},[1087,9578,9579],{"class":1089,"line":4306},[1087,9580,1370],{"emptyLinePlaceholder":21},[1087,9582,9583,9585],{"class":1089,"line":4323},[1087,9584,5481],{"class":1305},[1087,9586,5523],{"class":1311},[1087,9588,9589,9591,9593,9595,9597],{"class":1089,"line":4346},[1087,9590,5529],{"class":1588},[1087,9592,1592],{"class":1305},[1087,9594,1519],{"class":1305},[1087,9596,5194],{"class":1097},[1087,9598,5538],{"class":1305},[1087,9600,9601,9603,9605,9607,9609],{"class":1089,"line":4357},[1087,9602,6941],{"class":1588},[1087,9604,1592],{"class":1305},[1087,9606,1519],{"class":1305},[1087,9608,6948],{"class":1097},[1087,9610,5538],{"class":1305},[1087,9612,9613,9615,9617,9619,9621],{"class":1089,"line":4365},[1087,9614,5559],{"class":1588},[1087,9616,1592],{"class":1305},[1087,9618,1519],{"class":1305},[1087,9620,5566],{"class":1097},[1087,9622,5538],{"class":1305},[1087,9624,9625,9627,9629,9631,9633],{"class":1089,"line":4371},[1087,9626,6584],{"class":1588},[1087,9628,1592],{"class":1305},[1087,9630,1519],{"class":1305},[1087,9632,6973],{"class":1097},[1087,9634,5538],{"class":1305},[1087,9636,9637,9639,9641,9643,9645],{"class":1089,"line":4376},[1087,9638,5589],{"class":1588},[1087,9640,1592],{"class":1305},[1087,9642,1519],{"class":1305},[1087,9644,6986],{"class":1097},[1087,9646,5538],{"class":1305},[1087,9648,9649],{"class":1089,"line":4399},[1087,9650,5604],{"class":1305},[1087,9652,9653,9655],{"class":1089,"line":4405},[1087,9654,5610],{"class":1305},[1087,9656,6999],{"class":1311},[1087,9658,9659,9661,9663,9665,9667],{"class":1089,"line":4425},[1087,9660,7004],{"class":1588},[1087,9662,1592],{"class":1305},[1087,9664,1519],{"class":1305},[1087,9666,6572],{"class":1097},[1087,9668,5538],{"class":1305},[1087,9670,9671,9673,9675,9677,9679],{"class":1089,"line":4431},[1087,9672,7017],{"class":1588},[1087,9674,1592],{"class":1305},[1087,9676,1519],{"class":1305},[1087,9678,5623],{"class":1097},[1087,9680,5538],{"class":1305},[1087,9682,9683,9685,9687,9689,9691],{"class":1089,"line":4477},[1087,9684,7030],{"class":1588},[1087,9686,1592],{"class":1305},[1087,9688,1519],{"class":1305},[1087,9690,7037],{"class":1097},[1087,9692,5538],{"class":1305},[1087,9694,9695,9697,9699,9701,9703],{"class":1089,"line":4493},[1087,9696,7044],{"class":1588},[1087,9698,1592],{"class":1305},[1087,9700,1519],{"class":1305},[1087,9702,7051],{"class":1097},[1087,9704,5538],{"class":1305},[1087,9706,9707],{"class":1089,"line":4526},[1087,9708,7058],{"class":1305},[1087,9710,9711,9713,9715],{"class":1089,"line":4540},[1087,9712,5507],{"class":1305},[1087,9714,5077],{"class":1311},[1087,9716,1566],{"class":1305},[1087,9718,9719,9721,9723],{"class":1089,"line":4548},[1087,9720,5641],{"class":1305},[1087,9722,5462],{"class":1311},[1087,9724,1566],{"class":1305},[1087,9726,9727,9729,9731],{"class":1089,"line":4553},[1087,9728,1617],{"class":1305},[1087,9730,1563],{"class":1311},[1087,9732,1566],{"class":1305},[1087,9734,9735,9737,9739],{"class":1089,"line":4560},[1087,9736,1627],{"class":1305},[1087,9738,5427],{"class":1311},[1087,9740,1566],{"class":1305},[1087,9742,9743,9745,9747],{"class":1089,"line":4565},[1087,9744,1636],{"class":1305},[1087,9746,1563],{"class":1311},[1087,9748,1566],{"class":1305},[976,9750,4626,9751,9754,9755,9757],{},[1037,9752,9753],{},"refreshNuxtData('chats')"," call in the chat page's ",[1037,9756,7160],{}," callback (as shown earlier) ensures the chat list updates automatically when a new title is generated.",[980,9759,9761],{"id":9760},"adding-multi-model-support","Adding multi-model support",[976,9763,9764,9765,9768],{},"One of the benefits of using ",[1030,9766,4595],{"href":1066,"rel":9767},[1034]," is the ability to switch between models seamlessly. This section adds a model selector to the chat.",[1115,9770,9772],{"id":9771},"creating-a-models-composable","Creating a models composable",[976,9774,9775,9776,1315],{},"Define the available models and persist the user's selection using ",[1030,9777,9780],{"href":9778,"rel":9779},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-cookie",[1034],[1037,9781,9782],{},"useCookie",[1278,9784,9785],{},[1078,9786,9789],{"className":1282,"code":9787,"filename":9788,"language":1284,"meta":1083,"style":1083},"export function useModels() {\n  const models = [\n    { label: 'GPT-5 Nano', value: 'openai\u002Fgpt-5-nano', icon: 'i-simple-icons-openai' },\n    { label: 'Claude Haiku 4.5', value: 'anthropic\u002Fclaude-haiku-4.5', icon: 'i-simple-icons-anthropic' },\n    { label: 'Gemini 3 Flash', value: 'google\u002Fgemini-3-flash', icon: 'i-simple-icons-google' }\n  ]\n\n  const model = useCookie\u003Cstring>('ai-model', {\n    default: () => 'anthropic\u002Fclaude-haiku-4.5'\n  })\n\n  return {\n    models,\n    model\n  }\n}\n","app\u002Fcomposables\u002FuseModels.ts",[1037,9790,9791,9804,9815,9858,9899,9940,9945,9949,9979,9996,10002,10006,10012,10019,10024,10028],{"__ignoreMap":1083},[1087,9792,9793,9795,9797,9800,9802],{"class":1089,"line":1090},[1087,9794,1292],{"class":1291},[1087,9796,5176],{"class":1588},[1087,9798,9799],{"class":1110}," useModels",[1087,9801,1806],{"class":1305},[1087,9803,1381],{"class":1305},[1087,9805,9806,9808,9811,9813],{"class":1089,"line":1107},[1087,9807,2613],{"class":1588},[1087,9809,9810],{"class":1301}," models",[1087,9812,2623],{"class":1305},[1087,9814,1318],{"class":1311},[1087,9816,9817,9820,9822,9824,9826,9828,9830,9832,9834,9836,9838,9840,9842,9844,9847,9849,9851,9854,9856],{"class":1089,"line":1321},[1087,9818,9819],{"class":1305},"    {",[1087,9821,3090],{"class":1311},[1087,9823,1315],{"class":1305},[1087,9825,1392],{"class":1305},[1087,9827,3097],{"class":1097},[1087,9829,1330],{"class":1305},[1087,9831,1717],{"class":1305},[1087,9833,3076],{"class":1311},[1087,9835,1315],{"class":1305},[1087,9837,1392],{"class":1305},[1087,9839,3083],{"class":1097},[1087,9841,1330],{"class":1305},[1087,9843,1717],{"class":1305},[1087,9845,9846],{"class":1311}," icon",[1087,9848,1315],{"class":1305},[1087,9850,1392],{"class":1305},[1087,9852,9853],{"class":1097},"i-simple-icons-openai",[1087,9855,1330],{"class":1305},[1087,9857,3102],{"class":1305},[1087,9859,9860,9862,9864,9866,9868,9870,9872,9874,9876,9878,9880,9882,9884,9886,9888,9890,9892,9895,9897],{"class":1089,"line":1336},[1087,9861,9819],{"class":1305},[1087,9863,3090],{"class":1311},[1087,9865,1315],{"class":1305},[1087,9867,1392],{"class":1305},[1087,9869,3128],{"class":1097},[1087,9871,1330],{"class":1305},[1087,9873,1717],{"class":1305},[1087,9875,3076],{"class":1311},[1087,9877,1315],{"class":1305},[1087,9879,1392],{"class":1305},[1087,9881,3115],{"class":1097},[1087,9883,1330],{"class":1305},[1087,9885,1717],{"class":1305},[1087,9887,9846],{"class":1311},[1087,9889,1315],{"class":1305},[1087,9891,1392],{"class":1305},[1087,9893,9894],{"class":1097},"i-simple-icons-anthropic",[1087,9896,1330],{"class":1305},[1087,9898,3102],{"class":1305},[1087,9900,9901,9903,9905,9907,9909,9911,9913,9915,9917,9919,9921,9923,9925,9927,9929,9931,9933,9936,9938],{"class":1089,"line":1348},[1087,9902,9819],{"class":1305},[1087,9904,3090],{"class":1311},[1087,9906,1315],{"class":1305},[1087,9908,1392],{"class":1305},[1087,9910,3158],{"class":1097},[1087,9912,1330],{"class":1305},[1087,9914,1717],{"class":1305},[1087,9916,3076],{"class":1311},[1087,9918,1315],{"class":1305},[1087,9920,1392],{"class":1305},[1087,9922,3145],{"class":1097},[1087,9924,1330],{"class":1305},[1087,9926,1717],{"class":1305},[1087,9928,9846],{"class":1311},[1087,9930,1315],{"class":1305},[1087,9932,1392],{"class":1305},[1087,9934,9935],{"class":1097},"i-simple-icons-google",[1087,9937,1330],{"class":1305},[1087,9939,3163],{"class":1305},[1087,9941,9942],{"class":1089,"line":1359},[1087,9943,9944],{"class":1311},"  ]\n",[1087,9946,9947],{"class":1089,"line":1367},[1087,9948,1370],{"emptyLinePlaceholder":21},[1087,9950,9951,9953,9955,9957,9960,9962,9964,9966,9968,9970,9973,9975,9977],{"class":1089,"line":1373},[1087,9952,2613],{"class":1588},[1087,9954,3268],{"class":1301},[1087,9956,2623],{"class":1305},[1087,9958,9959],{"class":1110}," useCookie",[1087,9961,1560],{"class":1305},[1087,9963,3241],{"class":1093},[1087,9965,2666],{"class":1305},[1087,9967,1302],{"class":1311},[1087,9969,1330],{"class":1305},[1087,9971,9972],{"class":1097},"ai-model",[1087,9974,1330],{"class":1305},[1087,9976,1717],{"class":1305},[1087,9978,1381],{"class":1305},[1087,9980,9981,9984,9986,9988,9990,9992,9994],{"class":1089,"line":1384},[1087,9982,9983],{"class":1110},"    default",[1087,9985,1315],{"class":1305},[1087,9987,4962],{"class":1305},[1087,9989,1826],{"class":1588},[1087,9991,1392],{"class":1305},[1087,9993,3115],{"class":1097},[1087,9995,1356],{"class":1305},[1087,9997,9998,10000],{"class":1089,"line":1400},[1087,9999,2414],{"class":1305},[1087,10001,1492],{"class":1311},[1087,10003,10004],{"class":1089,"line":1406},[1087,10005,1370],{"emptyLinePlaceholder":21},[1087,10007,10008,10010],{"class":1089,"line":1411},[1087,10009,2840],{"class":1291},[1087,10011,1381],{"class":1305},[1087,10013,10014,10017],{"class":1089,"line":1434},[1087,10015,10016],{"class":1301},"    models",[1087,10018,1333],{"class":1305},[1087,10020,10021],{"class":1089,"line":1439},[1087,10022,10023],{"class":1301},"    model\n",[1087,10025,10026],{"class":1089,"line":1449},[1087,10027,3585],{"class":1305},[1087,10029,10030],{"class":1089,"line":1459},[1087,10031,5400],{"class":1305},[1115,10033,10035],{"id":10034},"building-the-model-selector","Building the model selector",[976,10037,1643,10038,10043],{},[1030,10039,10040],{"href":734},[1037,10041,10042],{},"USelectMenu"," component that displays the available models:",[1278,10045,10046],{},[1078,10047,10050],{"className":1550,"code":10048,"filename":10049,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst model = defineModel\u003Cstring>({ required: true })\n\nconst { models } = useModels()\n\nconst selectedModel = computed(() =>\n  models.find(m => m.value === model.value)\n)\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUSelectMenu\n    v-model=\"model\"\n    :items=\"models\"\n    :icon=\"selectedModel?.icon\"\n    variant=\"ghost\"\n    value-key=\"value\"\n  \u002F>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002FModelSelect.vue",[1037,10051,10052,10072,10105,10109,10126,10130,10148,10180,10184,10192,10196,10204,10211,10224,10238,10252,10265,10278,10283],{"__ignoreMap":1083},[1087,10053,10054,10056,10058,10060,10062,10064,10066,10068,10070],{"class":1089,"line":1090},[1087,10055,1560],{"class":1305},[1087,10057,5112],{"class":1311},[1087,10059,5115],{"class":1588},[1087,10061,5118],{"class":1588},[1087,10063,1592],{"class":1305},[1087,10065,1519],{"class":1305},[1087,10067,1284],{"class":1097},[1087,10069,1519],{"class":1305},[1087,10071,1566],{"class":1305},[1087,10073,10074,10076,10079,10081,10084,10086,10088,10090,10092,10094,10097,10099,10101,10103],{"class":1089,"line":1107},[1087,10075,3061],{"class":1588},[1087,10077,10078],{"class":1301}," model ",[1087,10080,1592],{"class":1305},[1087,10082,10083],{"class":1110}," defineModel",[1087,10085,1560],{"class":1305},[1087,10087,3241],{"class":1093},[1087,10089,2666],{"class":1305},[1087,10091,1302],{"class":1301},[1087,10093,1866],{"class":1305},[1087,10095,10096],{"class":1311}," required",[1087,10098,1315],{"class":1305},[1087,10100,4169],{"class":1467},[1087,10102,1733],{"class":1305},[1087,10104,1492],{"class":1301},[1087,10106,10107],{"class":1089,"line":1321},[1087,10108,1370],{"emptyLinePlaceholder":21},[1087,10110,10111,10113,10115,10118,10120,10122,10124],{"class":1089,"line":1336},[1087,10112,3061],{"class":1588},[1087,10114,1711],{"class":1305},[1087,10116,10117],{"class":1301}," models ",[1087,10119,1489],{"class":1305},[1087,10121,2623],{"class":1305},[1087,10123,9799],{"class":1110},[1087,10125,2669],{"class":1301},[1087,10127,10128],{"class":1089,"line":1348},[1087,10129,1370],{"emptyLinePlaceholder":21},[1087,10131,10132,10134,10137,10139,10141,10143,10145],{"class":1089,"line":1359},[1087,10133,3061],{"class":1588},[1087,10135,10136],{"class":1301}," selectedModel ",[1087,10138,1592],{"class":1305},[1087,10140,7592],{"class":1110},[1087,10142,1302],{"class":1301},[1087,10144,1806],{"class":1305},[1087,10146,10147],{"class":1588}," =>\n",[1087,10149,10150,10153,10155,10158,10160,10162,10164,10166,10168,10171,10173,10175,10177],{"class":1089,"line":1367},[1087,10151,10152],{"class":1301},"  models",[1087,10154,1809],{"class":1305},[1087,10156,10157],{"class":1110},"find",[1087,10159,1302],{"class":1301},[1087,10161,3337],{"class":1943},[1087,10163,1826],{"class":1588},[1087,10165,3342],{"class":1301},[1087,10167,1809],{"class":1305},[1087,10169,10170],{"class":1301},"value ",[1087,10172,7671],{"class":1305},[1087,10174,3268],{"class":1301},[1087,10176,1809],{"class":1305},[1087,10178,10179],{"class":1301},"value)\n",[1087,10181,10182],{"class":1089,"line":1373},[1087,10183,1492],{"class":1301},[1087,10185,10186,10188,10190],{"class":1089,"line":1384},[1087,10187,1636],{"class":1305},[1087,10189,5112],{"class":1311},[1087,10191,1566],{"class":1305},[1087,10193,10194],{"class":1089,"line":1400},[1087,10195,1370],{"emptyLinePlaceholder":21},[1087,10197,10198,10200,10202],{"class":1089,"line":1406},[1087,10199,1560],{"class":1305},[1087,10201,1563],{"class":1311},[1087,10203,1566],{"class":1305},[1087,10205,10206,10208],{"class":1089,"line":1411},[1087,10207,1573],{"class":1305},[1087,10209,10210],{"class":1311},"USelectMenu\n",[1087,10212,10213,10216,10218,10220,10222],{"class":1089,"line":1434},[1087,10214,10215],{"class":1588},"    v-model",[1087,10217,1592],{"class":1305},[1087,10219,1519],{"class":1305},[1087,10221,4639],{"class":1097},[1087,10223,5538],{"class":1305},[1087,10225,10226,10229,10231,10233,10236],{"class":1089,"line":1439},[1087,10227,10228],{"class":1588},"    :items",[1087,10230,1592],{"class":1305},[1087,10232,1519],{"class":1305},[1087,10234,10235],{"class":1097},"models",[1087,10237,5538],{"class":1305},[1087,10239,10240,10243,10245,10247,10250],{"class":1089,"line":1449},[1087,10241,10242],{"class":1588},"    :icon",[1087,10244,1592],{"class":1305},[1087,10246,1519],{"class":1305},[1087,10248,10249],{"class":1097},"selectedModel?.icon",[1087,10251,5538],{"class":1305},[1087,10253,10254,10257,10259,10261,10263],{"class":1089,"line":1459},[1087,10255,10256],{"class":1588},"    variant",[1087,10258,1592],{"class":1305},[1087,10260,1519],{"class":1305},[1087,10262,7873],{"class":1097},[1087,10264,5538],{"class":1305},[1087,10266,10267,10270,10272,10274,10276],{"class":1089,"line":1475},[1087,10268,10269],{"class":1588},"    value-key",[1087,10271,1592],{"class":1305},[1087,10273,1519],{"class":1305},[1087,10275,3322],{"class":1097},[1087,10277,5538],{"class":1305},[1087,10279,10280],{"class":1089,"line":1481},[1087,10281,10282],{"class":1305},"  \u002F>\n",[1087,10284,10285,10287,10289],{"class":1089,"line":1486},[1087,10286,1636],{"class":1305},[1087,10288,1563],{"class":1311},[1087,10290,1566],{"class":1305},[1115,10292,10294],{"id":10293},"integrating-with-the-chat","Integrating with the chat",[976,10296,10297],{},"Update the chat page to include the model selector and pass the selected model to the server:",[1278,10299,10300],{},[1696,10301,10302],{},[1078,10303,10306],{"className":1550,"code":10304,"filename":5731,"highlights":10305,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nimport { DefaultChatTransport, isReasoningUIPart, isTextUIPart } from 'ai'\nimport { Chat } from '@ai-sdk\u002Fvue'\nimport { isReasoningStreaming } from '@nuxt\u002Fui\u002Futils\u002Fai'\n\nconst route = useRoute()\nconst toast = useToast()\nconst { model } = useModels()\n\nconst { data: chatData } = await useFetch(`\u002Fapi\u002Fchats\u002F${route.params.id}`)\n\nif (!chatData.value) {\n  throw createError({ statusCode: 404, statusMessage: 'Chat not found', fatal: true })\n}\n\nconst input = ref('')\n\nconst chat = new Chat({\n  id: chatData.value.id,\n  messages: chatData.value.messages,\n  transport: new DefaultChatTransport({\n    api: `\u002Fapi\u002Fchats\u002F${chatData.value.id}`,\n    body: {\n      model: model.value \u002F\u002F Pass the selected model\n    }\n  }),\n  onData(dataPart) {\n    if (dataPart.type === 'data-chat-title') {\n      refreshNuxtData('chats')\n    }\n  },\n  onError(error) {\n    toast.add({\n      title: 'Error',\n      description: error.message,\n      color: 'error'\n    })\n  }\n})\n\nfunction handleSubmit(e: Event) {\n  e.preventDefault()\n  if (input.value.trim()) {\n    chat.sendMessage({ text: input.value })\n    input.value = ''\n  }\n}\n\nonMounted(() => {\n  if (chatData.value?.messages.length === 1) {\n    chat.regenerate()\n  }\n})\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #header>\n      \u003CChatsHistory \u002F>\n    \u003C\u002Ftemplate>\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col py-4 sm:py-6\">\n        \u003CUChatMessages\n          :messages=\"chat.messages\"\n          :status=\"chat.status\"\n          should-auto-scroll\n          class=\"flex-1\"\n        >\n          \u003Ctemplate #content=\"{ message }\">\n            \u003Ctemplate v-for=\"(part, index) in message.parts\" :key=\"`${message.id}-${part.type}-${index}`\">\n              \u003CUChatReasoning\n                v-if=\"isReasoningUIPart(part)\"\n                :text=\"part.text\"\n                :streaming=\"isReasoningStreaming(message, index, chat)\"\n              >\n                \u003CMDC\n                  :value=\"part.text\"\n                  :cache-key=\"`reasoning-${message.id}-${index}`\"\n                  class=\"*:first:mt-0 *:last:mb-0\"\n                \u002F>\n              \u003C\u002FUChatReasoning>\n\n              \u003CMDC\n                v-else-if=\"isTextUIPart(part)\"\n                :value=\"part.text\"\n                :cache-key=\"`${message.id}-${index}`\"\n                class=\"*:first:mt-0 *:last:mb-0\"\n              \u002F>\n            \u003C\u002Ftemplate>\n          \u003C\u002Ftemplate>\n        \u003C\u002FUChatMessages>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :error=\"chat.error\"\n          variant=\"subtle\"\n          class=\"sticky bottom-0\"\n          @submit=\"handleSubmit\"\n        >\n          \u003Ctemplate #footer>\n            \u003CModelSelect v-model=\"model\" \u002F>\n          \u003C\u002Ftemplate>\n\n          \u003CUChatPromptSubmit\n            :status=\"chat.status\"\n            color=\"neutral\"\n            @stop=\"chat.stop()\"\n            @reload=\"chat.regenerate()\"\n          \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n",[1373,2329,2361,2377,4346,4357,4365],[1037,10307,10308,10328,10354,10372,10390,10394,10406,10418,10435,10439,10481,10485,10501,10541,10545,10549,10565,10569,10585,10603,10621,10635,10661,10669,10685,10690,10699,10711,10735,10749,10753,10757,10769,10781,10795,10809,10821,10827,10831,10837,10841,10859,10869,10889,10915,10927,10931,10935,10939,10951,10979,10989,10993,10999,11007,11011,11019,11037,11049,11057,11065,11077,11095,11101,11113,11125,11129,11141,11145,11169,11235,11241,11253,11265,11277,11281,11287,11299,11311,11323,11327,11335,11339,11345,11357,11369,11381,11393,11397,11405,11413,11421,11425,11431,11444,11457,11470,11482,11494,11498,11511,11531,11539,11543,11549,11561,11573,11585,11597,11601,11609,11617,11626,11635],{"__ignoreMap":1083},[1087,10309,10310,10312,10314,10316,10318,10320,10322,10324,10326],{"class":1089,"line":1090},[1087,10311,1560],{"class":1305},[1087,10313,5112],{"class":1311},[1087,10315,5115],{"class":1588},[1087,10317,5118],{"class":1588},[1087,10319,1592],{"class":1305},[1087,10321,1519],{"class":1305},[1087,10323,1284],{"class":1097},[1087,10325,1519],{"class":1305},[1087,10327,1566],{"class":1305},[1087,10329,10330,10332,10334,10336,10338,10340,10342,10344,10346,10348,10350,10352],{"class":1089,"line":1107},[1087,10331,1708],{"class":1291},[1087,10333,1711],{"class":1305},[1087,10335,5764],{"class":1301},[1087,10337,1717],{"class":1305},[1087,10339,5769],{"class":1301},[1087,10341,1717],{"class":1305},[1087,10343,5774],{"class":1301},[1087,10345,1733],{"class":1305},[1087,10347,1736],{"class":1291},[1087,10349,1392],{"class":1305},[1087,10351,2534],{"class":1097},[1087,10353,1356],{"class":1305},[1087,10355,10356,10358,10360,10362,10364,10366,10368,10370],{"class":1089,"line":1321},[1087,10357,1708],{"class":1291},[1087,10359,1711],{"class":1305},[1087,10361,5794],{"class":1301},[1087,10363,1733],{"class":1305},[1087,10365,1736],{"class":1291},[1087,10367,1392],{"class":1305},[1087,10369,5803],{"class":1097},[1087,10371,1356],{"class":1305},[1087,10373,10374,10376,10378,10380,10382,10384,10386,10388],{"class":1089,"line":1336},[1087,10375,1708],{"class":1291},[1087,10377,1711],{"class":1305},[1087,10379,5815],{"class":1301},[1087,10381,1733],{"class":1305},[1087,10383,1736],{"class":1291},[1087,10385,1392],{"class":1305},[1087,10387,5824],{"class":1097},[1087,10389,1356],{"class":1305},[1087,10391,10392],{"class":1089,"line":1348},[1087,10393,1370],{"emptyLinePlaceholder":21},[1087,10395,10396,10398,10400,10402,10404],{"class":1089,"line":1359},[1087,10397,3061],{"class":1588},[1087,10399,5837],{"class":1301},[1087,10401,1592],{"class":1305},[1087,10403,5842],{"class":1110},[1087,10405,2669],{"class":1301},[1087,10407,10408,10410,10412,10414,10416],{"class":1089,"line":1367},[1087,10409,3061],{"class":1588},[1087,10411,5851],{"class":1301},[1087,10413,1592],{"class":1305},[1087,10415,5856],{"class":1110},[1087,10417,2669],{"class":1301},[1087,10419,10421,10423,10425,10427,10429,10431,10433],{"class":10420,"line":1373},[1089,1570],[1087,10422,3061],{"class":1588},[1087,10424,1711],{"class":1305},[1087,10426,10078],{"class":1301},[1087,10428,1489],{"class":1305},[1087,10430,2623],{"class":1305},[1087,10432,9799],{"class":1110},[1087,10434,2669],{"class":1301},[1087,10436,10437],{"class":1089,"line":1384},[1087,10438,1370],{"emptyLinePlaceholder":21},[1087,10440,10441,10443,10445,10447,10449,10451,10453,10455,10457,10459,10461,10463,10465,10467,10469,10471,10473,10475,10477,10479],{"class":1089,"line":1400},[1087,10442,3061],{"class":1588},[1087,10444,1711],{"class":1305},[1087,10446,5876],{"class":1311},[1087,10448,1315],{"class":1305},[1087,10450,5881],{"class":1301},[1087,10452,1489],{"class":1305},[1087,10454,2623],{"class":1305},[1087,10456,2626],{"class":1291},[1087,10458,5890],{"class":1110},[1087,10460,1302],{"class":1301},[1087,10462,3677],{"class":1305},[1087,10464,5897],{"class":1097},[1087,10466,5384],{"class":1305},[1087,10468,5902],{"class":1301},[1087,10470,1809],{"class":1305},[1087,10472,5907],{"class":1301},[1087,10474,1809],{"class":1305},[1087,10476,2018],{"class":1301},[1087,10478,5393],{"class":1305},[1087,10480,1492],{"class":1301},[1087,10482,10483],{"class":1089,"line":1406},[1087,10484,1370],{"emptyLinePlaceholder":21},[1087,10486,10487,10489,10491,10493,10495,10497,10499],{"class":1089,"line":1411},[1087,10488,5924],{"class":1291},[1087,10490,1952],{"class":1301},[1087,10492,3533],{"class":1305},[1087,10494,5931],{"class":1301},[1087,10496,1809],{"class":1305},[1087,10498,5936],{"class":1301},[1087,10500,1306],{"class":1305},[1087,10502,10503,10505,10507,10509,10511,10513,10515,10517,10519,10521,10523,10525,10527,10529,10531,10533,10535,10537,10539],{"class":1089,"line":1434},[1087,10504,5943],{"class":1291},[1087,10506,2899],{"class":1110},[1087,10508,1302],{"class":1311},[1087,10510,1866],{"class":1305},[1087,10512,3555],{"class":1311},[1087,10514,1315],{"class":1305},[1087,10516,3561],{"class":3560},[1087,10518,1717],{"class":1305},[1087,10520,3566],{"class":1311},[1087,10522,1315],{"class":1305},[1087,10524,1392],{"class":1305},[1087,10526,3573],{"class":1097},[1087,10528,1330],{"class":1305},[1087,10530,1717],{"class":1305},[1087,10532,5972],{"class":1311},[1087,10534,1315],{"class":1305},[1087,10536,4169],{"class":1467},[1087,10538,1733],{"class":1305},[1087,10540,1492],{"class":1311},[1087,10542,10543],{"class":1089,"line":1439},[1087,10544,5400],{"class":1305},[1087,10546,10547],{"class":1089,"line":1449},[1087,10548,1370],{"emptyLinePlaceholder":21},[1087,10550,10551,10553,10555,10557,10559,10561,10563],{"class":1089,"line":1459},[1087,10552,3061],{"class":1588},[1087,10554,5135],{"class":1301},[1087,10556,1592],{"class":1305},[1087,10558,5140],{"class":1110},[1087,10560,1302],{"class":1301},[1087,10562,5145],{"class":1305},[1087,10564,1492],{"class":1301},[1087,10566,10567],{"class":1089,"line":1475},[1087,10568,1370],{"emptyLinePlaceholder":21},[1087,10570,10571,10573,10575,10577,10579,10581,10583],{"class":1089,"line":1481},[1087,10572,3061],{"class":1588},[1087,10574,6021],{"class":1301},[1087,10576,1592],{"class":1305},[1087,10578,1903],{"class":1305},[1087,10580,5794],{"class":1110},[1087,10582,1302],{"class":1301},[1087,10584,1306],{"class":1305},[1087,10586,10587,10589,10591,10593,10595,10597,10599,10601],{"class":1089,"line":1486},[1087,10588,1799],{"class":1311},[1087,10590,1315],{"class":1305},[1087,10592,6041],{"class":1301},[1087,10594,1809],{"class":1305},[1087,10596,3322],{"class":1301},[1087,10598,1809],{"class":1305},[1087,10600,2018],{"class":1301},[1087,10602,1333],{"class":1305},[1087,10604,10605,10607,10609,10611,10613,10615,10617,10619],{"class":1089,"line":2275},[1087,10606,1959],{"class":1311},[1087,10608,1315],{"class":1305},[1087,10610,6041],{"class":1301},[1087,10612,1809],{"class":1305},[1087,10614,3322],{"class":1301},[1087,10616,1809],{"class":1305},[1087,10618,1997],{"class":1301},[1087,10620,1333],{"class":1305},[1087,10622,10623,10625,10627,10629,10631,10633],{"class":1089,"line":2288},[1087,10624,6076],{"class":1311},[1087,10626,1315],{"class":1305},[1087,10628,1903],{"class":1305},[1087,10630,5764],{"class":1110},[1087,10632,1302],{"class":1301},[1087,10634,1306],{"class":1305},[1087,10636,10637,10639,10641,10643,10645,10647,10649,10651,10653,10655,10657,10659],{"class":1089,"line":2318},[1087,10638,6092],{"class":1311},[1087,10640,1315],{"class":1305},[1087,10642,3671],{"class":1305},[1087,10644,5897],{"class":1097},[1087,10646,5384],{"class":1305},[1087,10648,5931],{"class":1301},[1087,10650,1809],{"class":1305},[1087,10652,3322],{"class":1301},[1087,10654,1809],{"class":1305},[1087,10656,2018],{"class":1301},[1087,10658,5393],{"class":1305},[1087,10660,1333],{"class":1305},[1087,10662,10663,10665,10667],{"class":1089,"line":2324},[1087,10664,5282],{"class":1311},[1087,10666,1315],{"class":1305},[1087,10668,1381],{"class":1305},[1087,10670,10672,10674,10676,10678,10680,10682],{"class":10671,"line":2329},[1089,1570],[1087,10673,3650],{"class":1311},[1087,10675,1315],{"class":1305},[1087,10677,3268],{"class":1301},[1087,10679,1809],{"class":1305},[1087,10681,10170],{"class":1301},[1087,10683,10684],{"class":1471},"\u002F\u002F Pass the selected model\n",[1087,10686,10688],{"class":10687,"line":2361},[1089,1570],[1087,10689,1478],{"class":1305},[1087,10691,10693,10695,10697],{"class":10692,"line":2377},[1089,1570],[1087,10694,2414],{"class":1305},[1087,10696,1883],{"class":1301},[1087,10698,1333],{"class":1305},[1087,10700,10701,10703,10705,10707,10709],{"class":1089,"line":2395},[1087,10702,6128],{"class":1311},[1087,10704,1302],{"class":1305},[1087,10706,6133],{"class":1943},[1087,10708,1883],{"class":1305},[1087,10710,1381],{"class":1305},[1087,10712,10713,10715,10717,10719,10721,10723,10725,10727,10729,10731,10733],{"class":1089,"line":2411},[1087,10714,6149],{"class":1291},[1087,10716,1952],{"class":1311},[1087,10718,6133],{"class":1301},[1087,10720,1809],{"class":1305},[1087,10722,6158],{"class":1301},[1087,10724,3349],{"class":1305},[1087,10726,1392],{"class":1305},[1087,10728,4316],{"class":1097},[1087,10730,1330],{"class":1305},[1087,10732,3538],{"class":1311},[1087,10734,1306],{"class":1305},[1087,10736,10737,10739,10741,10743,10745,10747],{"class":1089,"line":2419},[1087,10738,6176],{"class":1110},[1087,10740,1302],{"class":1311},[1087,10742,1330],{"class":1305},[1087,10744,1788],{"class":1097},[1087,10746,1330],{"class":1305},[1087,10748,1492],{"class":1311},[1087,10750,10751],{"class":1089,"line":3414},[1087,10752,1478],{"class":1305},[1087,10754,10755],{"class":1089,"line":3427},[1087,10756,1403],{"class":1305},[1087,10758,10759,10761,10763,10765,10767],{"class":1089,"line":3432},[1087,10760,6202],{"class":1311},[1087,10762,1302],{"class":1305},[1087,10764,6207],{"class":1943},[1087,10766,1883],{"class":1305},[1087,10768,1381],{"class":1305},[1087,10770,10771,10773,10775,10777,10779],{"class":1089,"line":3438},[1087,10772,6217],{"class":1301},[1087,10774,1809],{"class":1305},[1087,10776,6222],{"class":1110},[1087,10778,1302],{"class":1311},[1087,10780,1306],{"class":1305},[1087,10782,10783,10785,10787,10789,10791,10793],{"class":1089,"line":3469},[1087,10784,6232],{"class":1311},[1087,10786,1315],{"class":1305},[1087,10788,1392],{"class":1305},[1087,10790,497],{"class":1097},[1087,10792,1330],{"class":1305},[1087,10794,1333],{"class":1305},[1087,10796,10797,10799,10801,10803,10805,10807],{"class":1089,"line":3513},[1087,10798,6248],{"class":1311},[1087,10800,1315],{"class":1305},[1087,10802,6253],{"class":1301},[1087,10804,1809],{"class":1305},[1087,10806,4468],{"class":1301},[1087,10808,1333],{"class":1305},[1087,10810,10811,10813,10815,10817,10819],{"class":1089,"line":3520},[1087,10812,6265],{"class":1311},[1087,10814,1315],{"class":1305},[1087,10816,1392],{"class":1305},[1087,10818,6207],{"class":1097},[1087,10820,1356],{"class":1305},[1087,10822,10823,10825],{"class":1089,"line":3525},[1087,10824,3376],{"class":1305},[1087,10826,1492],{"class":1311},[1087,10828,10829],{"class":1089,"line":3543},[1087,10830,3585],{"class":1305},[1087,10832,10833,10835],{"class":1089,"line":3582},[1087,10834,1489],{"class":1305},[1087,10836,1492],{"class":1301},[1087,10838,10839],{"class":1089,"line":3588},[1087,10840,1370],{"emptyLinePlaceholder":21},[1087,10842,10843,10845,10847,10849,10851,10853,10855,10857],{"class":1089,"line":3593},[1087,10844,6301],{"class":1588},[1087,10846,6304],{"class":1110},[1087,10848,1302],{"class":1305},[1087,10850,6309],{"class":1943},[1087,10852,1315],{"class":1305},[1087,10854,6314],{"class":1093},[1087,10856,1883],{"class":1305},[1087,10858,1381],{"class":1305},[1087,10860,10861,10863,10865,10867],{"class":1089,"line":3599},[1087,10862,6323],{"class":1301},[1087,10864,1809],{"class":1305},[1087,10866,6328],{"class":1110},[1087,10868,2669],{"class":1311},[1087,10870,10871,10873,10875,10877,10879,10881,10883,10885,10887],{"class":1089,"line":3619},[1087,10872,3528],{"class":1291},[1087,10874,1952],{"class":1311},[1087,10876,5194],{"class":1301},[1087,10878,1809],{"class":1305},[1087,10880,3322],{"class":1301},[1087,10882,1809],{"class":1305},[1087,10884,5203],{"class":1110},[1087,10886,5206],{"class":1311},[1087,10888,1306],{"class":1305},[1087,10890,10891,10893,10895,10897,10899,10901,10903,10905,10907,10909,10911,10913],{"class":1089,"line":3647},[1087,10892,6355],{"class":1301},[1087,10894,1809],{"class":1305},[1087,10896,6360],{"class":1110},[1087,10898,1302],{"class":1311},[1087,10900,1866],{"class":1305},[1087,10902,1720],{"class":1311},[1087,10904,1315],{"class":1305},[1087,10906,5338],{"class":1301},[1087,10908,1809],{"class":1305},[1087,10910,3322],{"class":1301},[1087,10912,1733],{"class":1305},[1087,10914,1492],{"class":1311},[1087,10916,10917,10919,10921,10923,10925],{"class":1089,"line":3663},[1087,10918,6383],{"class":1301},[1087,10920,1809],{"class":1305},[1087,10922,3322],{"class":1301},[1087,10924,2623],{"class":1305},[1087,10926,6392],{"class":1305},[1087,10928,10929],{"class":1089,"line":3682},[1087,10930,3585],{"class":1305},[1087,10932,10933],{"class":1089,"line":3710},[1087,10934,5400],{"class":1305},[1087,10936,10937],{"class":1089,"line":3717},[1087,10938,1370],{"emptyLinePlaceholder":21},[1087,10940,10941,10943,10945,10947,10949],{"class":1089,"line":3722},[1087,10942,6414],{"class":1110},[1087,10944,1302],{"class":1301},[1087,10946,1806],{"class":1305},[1087,10948,1826],{"class":1588},[1087,10950,1381],{"class":1305},[1087,10952,10953,10955,10957,10959,10961,10963,10965,10967,10969,10971,10973,10975,10977],{"class":1089,"line":3788},[1087,10954,3528],{"class":1291},[1087,10956,1952],{"class":1311},[1087,10958,5931],{"class":1301},[1087,10960,1809],{"class":1305},[1087,10962,3322],{"class":1301},[1087,10964,3843],{"class":1305},[1087,10966,1997],{"class":1301},[1087,10968,1809],{"class":1305},[1087,10970,3822],{"class":1301},[1087,10972,3349],{"class":1305},[1087,10974,3828],{"class":3560},[1087,10976,3538],{"class":1311},[1087,10978,1306],{"class":1305},[1087,10980,10981,10983,10985,10987],{"class":1089,"line":3793},[1087,10982,6355],{"class":1301},[1087,10984,1809],{"class":1305},[1087,10986,6459],{"class":1110},[1087,10988,2669],{"class":1311},[1087,10990,10991],{"class":1089,"line":3798},[1087,10992,3585],{"class":1305},[1087,10994,10995,10997],{"class":1089,"line":3804},[1087,10996,1489],{"class":1305},[1087,10998,1492],{"class":1301},[1087,11000,11001,11003,11005],{"class":1089,"line":3833},[1087,11002,1636],{"class":1305},[1087,11004,5112],{"class":1311},[1087,11006,1566],{"class":1305},[1087,11008,11009],{"class":1089,"line":3874},[1087,11010,1370],{"emptyLinePlaceholder":21},[1087,11012,11013,11015,11017],{"class":1089,"line":3903},[1087,11014,1560],{"class":1305},[1087,11016,1563],{"class":1311},[1087,11018,1566],{"class":1305},[1087,11020,11021,11023,11025,11027,11029,11031,11033,11035],{"class":1089,"line":3915},[1087,11022,1573],{"class":1305},[1087,11024,5427],{"class":1311},[1087,11026,5430],{"class":1588},[1087,11028,1592],{"class":1305},[1087,11030,1519],{"class":1305},[1087,11032,5437],{"class":1097},[1087,11034,1519],{"class":1305},[1087,11036,1566],{"class":1305},[1087,11038,11039,11041,11043,11045,11047],{"class":1089,"line":3931},[1087,11040,1582],{"class":1305},[1087,11042,1563],{"class":1311},[1087,11044,5450],{"class":1305},[1087,11046,8266],{"class":1588},[1087,11048,1566],{"class":1305},[1087,11050,11051,11053,11055],{"class":1089,"line":3945},[1087,11052,1606],{"class":1305},[1087,11054,8276],{"class":1311},[1087,11056,1612],{"class":1305},[1087,11058,11059,11061,11063],{"class":1089,"line":3952},[1087,11060,1617],{"class":1305},[1087,11062,1563],{"class":1311},[1087,11064,1566],{"class":1305},[1087,11066,11067,11069,11071,11073,11075],{"class":1089,"line":3957},[1087,11068,1582],{"class":1305},[1087,11070,1563],{"class":1311},[1087,11072,5450],{"class":1305},[1087,11074,5453],{"class":1588},[1087,11076,1566],{"class":1305},[1087,11078,11079,11081,11083,11085,11087,11089,11091,11093],{"class":1089,"line":3962},[1087,11080,1606],{"class":1305},[1087,11082,5462],{"class":1311},[1087,11084,5465],{"class":1588},[1087,11086,1592],{"class":1305},[1087,11088,1519],{"class":1305},[1087,11090,6536],{"class":1097},[1087,11092,1519],{"class":1305},[1087,11094,1566],{"class":1305},[1087,11096,11097,11099],{"class":1089,"line":3968},[1087,11098,5481],{"class":1305},[1087,11100,6547],{"class":1311},[1087,11102,11103,11105,11107,11109,11111],{"class":1089,"line":3985},[1087,11104,6552],{"class":1588},[1087,11106,1592],{"class":1305},[1087,11108,1519],{"class":1305},[1087,11110,6559],{"class":1097},[1087,11112,5538],{"class":1305},[1087,11114,11115,11117,11119,11121,11123],{"class":1089,"line":4007},[1087,11116,5544],{"class":1588},[1087,11118,1592],{"class":1305},[1087,11120,1519],{"class":1305},[1087,11122,6572],{"class":1097},[1087,11124,5538],{"class":1305},[1087,11126,11127],{"class":1089,"line":4025},[1087,11128,6579],{"class":1588},[1087,11130,11131,11133,11135,11137,11139],{"class":1089,"line":4033},[1087,11132,6584],{"class":1588},[1087,11134,1592],{"class":1305},[1087,11136,1519],{"class":1305},[1087,11138,6591],{"class":1097},[1087,11140,5538],{"class":1305},[1087,11142,11143],{"class":1089,"line":4050},[1087,11144,5604],{"class":1305},[1087,11146,11147,11149,11151,11153,11155,11157,11159,11161,11163,11165,11167],{"class":1089,"line":4071},[1087,11148,5610],{"class":1305},[1087,11150,1563],{"class":1311},[1087,11152,5450],{"class":1305},[1087,11154,371],{"class":1588},[1087,11156,1592],{"class":1305},[1087,11158,1519],{"class":1305},[1087,11160,1866],{"class":1305},[1087,11162,6616],{"class":1301},[1087,11164,1489],{"class":1305},[1087,11166,1519],{"class":1305},[1087,11168,1566],{"class":1305},[1087,11170,11171,11173,11175,11177,11179,11181,11183,11185,11187,11189,11191,11193,11195,11197,11199,11201,11203,11205,11207,11209,11211,11213,11215,11217,11219,11221,11223,11225,11227,11229,11231,11233],{"class":1089,"line":4081},[1087,11172,6627],{"class":1305},[1087,11174,1563],{"class":1311},[1087,11176,6632],{"class":1291},[1087,11178,1592],{"class":1305},[1087,11180,1519],{"class":1305},[1087,11182,6639],{"class":1301},[1087,11184,1717],{"class":1305},[1087,11186,6644],{"class":1301},[1087,11188,6647],{"class":1305},[1087,11190,2618],{"class":1301},[1087,11192,1809],{"class":1305},[1087,11194,2199],{"class":1301},[1087,11196,1519],{"class":1305},[1087,11198,6658],{"class":1305},[1087,11200,6661],{"class":1588},[1087,11202,1592],{"class":1305},[1087,11204,6666],{"class":1305},[1087,11206,4468],{"class":1301},[1087,11208,1809],{"class":1305},[1087,11210,2018],{"class":1301},[1087,11212,1489],{"class":1305},[1087,11214,6677],{"class":1097},[1087,11216,5384],{"class":1305},[1087,11218,6682],{"class":1301},[1087,11220,1809],{"class":1305},[1087,11222,6158],{"class":1301},[1087,11224,1489],{"class":1305},[1087,11226,6677],{"class":1097},[1087,11228,5384],{"class":1305},[1087,11230,6695],{"class":1301},[1087,11232,6698],{"class":1305},[1087,11234,1566],{"class":1305},[1087,11236,11237,11239],{"class":1089,"line":4091},[1087,11238,6705],{"class":1305},[1087,11240,6708],{"class":1311},[1087,11242,11243,11245,11247,11249,11251],{"class":1089,"line":4101},[1087,11244,6713],{"class":1588},[1087,11246,1592],{"class":1305},[1087,11248,1519],{"class":1305},[1087,11250,6720],{"class":1097},[1087,11252,5538],{"class":1305},[1087,11254,11255,11257,11259,11261,11263],{"class":1089,"line":4118},[1087,11256,6727],{"class":1588},[1087,11258,1592],{"class":1305},[1087,11260,1519],{"class":1305},[1087,11262,6734],{"class":1097},[1087,11264,5538],{"class":1305},[1087,11266,11267,11269,11271,11273,11275],{"class":1089,"line":4129},[1087,11268,6741],{"class":1588},[1087,11270,1592],{"class":1305},[1087,11272,1519],{"class":1305},[1087,11274,6748],{"class":1097},[1087,11276,5538],{"class":1305},[1087,11278,11279],{"class":1089,"line":4135},[1087,11280,6755],{"class":1305},[1087,11282,11283,11285],{"class":1089,"line":4141},[1087,11284,6760],{"class":1305},[1087,11286,6763],{"class":1311},[1087,11288,11289,11291,11293,11295,11297],{"class":1089,"line":4151},[1087,11290,6768],{"class":1588},[1087,11292,1592],{"class":1305},[1087,11294,1519],{"class":1305},[1087,11296,6734],{"class":1097},[1087,11298,5538],{"class":1305},[1087,11300,11301,11303,11305,11307,11309],{"class":1089,"line":4161},[1087,11302,6781],{"class":1588},[1087,11304,1592],{"class":1305},[1087,11306,1519],{"class":1305},[1087,11308,6788],{"class":1097},[1087,11310,5538],{"class":1305},[1087,11312,11313,11315,11317,11319,11321],{"class":1089,"line":4174},[1087,11314,6795],{"class":1588},[1087,11316,1592],{"class":1305},[1087,11318,1519],{"class":1305},[1087,11320,6802],{"class":1097},[1087,11322,5538],{"class":1305},[1087,11324,11325],{"class":1089,"line":4189},[1087,11326,6809],{"class":1305},[1087,11328,11329,11331,11333],{"class":1089,"line":4194},[1087,11330,6814],{"class":1305},[1087,11332,6817],{"class":1311},[1087,11334,1566],{"class":1305},[1087,11336,11337],{"class":1089,"line":4199},[1087,11338,1370],{"emptyLinePlaceholder":21},[1087,11340,11341,11343],{"class":1089,"line":4209},[1087,11342,6705],{"class":1305},[1087,11344,6763],{"class":1311},[1087,11346,11347,11349,11351,11353,11355],{"class":1089,"line":4225},[1087,11348,6834],{"class":1588},[1087,11350,1592],{"class":1305},[1087,11352,1519],{"class":1305},[1087,11354,6841],{"class":1097},[1087,11356,5538],{"class":1305},[1087,11358,11359,11361,11363,11365,11367],{"class":1089,"line":4240},[1087,11360,6848],{"class":1588},[1087,11362,1592],{"class":1305},[1087,11364,1519],{"class":1305},[1087,11366,6734],{"class":1097},[1087,11368,5538],{"class":1305},[1087,11370,11371,11373,11375,11377,11379],{"class":1089,"line":4246},[1087,11372,6861],{"class":1588},[1087,11374,1592],{"class":1305},[1087,11376,1519],{"class":1305},[1087,11378,6868],{"class":1097},[1087,11380,5538],{"class":1305},[1087,11382,11383,11385,11387,11389,11391],{"class":1089,"line":4252},[1087,11384,6875],{"class":1588},[1087,11386,1592],{"class":1305},[1087,11388,1519],{"class":1305},[1087,11390,6802],{"class":1097},[1087,11392,5538],{"class":1305},[1087,11394,11395],{"class":1089,"line":4260},[1087,11396,6888],{"class":1305},[1087,11398,11399,11401,11403],{"class":1089,"line":4265},[1087,11400,6893],{"class":1305},[1087,11402,1563],{"class":1311},[1087,11404,1566],{"class":1305},[1087,11406,11407,11409,11411],{"class":1089,"line":4271},[1087,11408,6902],{"class":1305},[1087,11410,1563],{"class":1311},[1087,11412,1566],{"class":1305},[1087,11414,11415,11417,11419],{"class":1089,"line":4291},[1087,11416,5507],{"class":1305},[1087,11418,5083],{"class":1311},[1087,11420,1566],{"class":1305},[1087,11422,11423],{"class":1089,"line":4306},[1087,11424,1370],{"emptyLinePlaceholder":21},[1087,11426,11427,11429],{"class":1089,"line":4323},[1087,11428,5481],{"class":1305},[1087,11430,5523],{"class":1311},[1087,11432,11434,11436,11438,11440,11442],{"class":11433,"line":4346},[1089,1570],[1087,11435,5529],{"class":1588},[1087,11437,1592],{"class":1305},[1087,11439,1519],{"class":1305},[1087,11441,5194],{"class":1097},[1087,11443,5538],{"class":1305},[1087,11445,11447,11449,11451,11453,11455],{"class":11446,"line":4357},[1089,1570],[1087,11448,6941],{"class":1588},[1087,11450,1592],{"class":1305},[1087,11452,1519],{"class":1305},[1087,11454,6948],{"class":1097},[1087,11456,5538],{"class":1305},[1087,11458,11460,11462,11464,11466,11468],{"class":11459,"line":4365},[1089,1570],[1087,11461,5559],{"class":1588},[1087,11463,1592],{"class":1305},[1087,11465,1519],{"class":1305},[1087,11467,5566],{"class":1097},[1087,11469,5538],{"class":1305},[1087,11471,11472,11474,11476,11478,11480],{"class":1089,"line":4371},[1087,11473,6584],{"class":1588},[1087,11475,1592],{"class":1305},[1087,11477,1519],{"class":1305},[1087,11479,6973],{"class":1097},[1087,11481,5538],{"class":1305},[1087,11483,11484,11486,11488,11490,11492],{"class":1089,"line":4376},[1087,11485,5589],{"class":1588},[1087,11487,1592],{"class":1305},[1087,11489,1519],{"class":1305},[1087,11491,6986],{"class":1097},[1087,11493,5538],{"class":1305},[1087,11495,11496],{"class":1089,"line":4399},[1087,11497,5604],{"class":1305},[1087,11499,11500,11502,11504,11506,11509],{"class":1089,"line":4405},[1087,11501,5610],{"class":1305},[1087,11503,1563],{"class":1311},[1087,11505,5450],{"class":1305},[1087,11507,11508],{"class":1588},"footer",[1087,11510,1566],{"class":1305},[1087,11512,11513,11515,11518,11521,11523,11525,11527,11529],{"class":1089,"line":4425},[1087,11514,6627],{"class":1305},[1087,11516,11517],{"class":1311},"ModelSelect",[1087,11519,11520],{"class":1588}," v-model",[1087,11522,1592],{"class":1305},[1087,11524,1519],{"class":1305},[1087,11526,4639],{"class":1097},[1087,11528,1519],{"class":1305},[1087,11530,1612],{"class":1305},[1087,11532,11533,11535,11537],{"class":1089,"line":4431},[1087,11534,6902],{"class":1305},[1087,11536,1563],{"class":1311},[1087,11538,1566],{"class":1305},[1087,11540,11541],{"class":1089,"line":4477},[1087,11542,1370],{"emptyLinePlaceholder":21},[1087,11544,11545,11547],{"class":1089,"line":4493},[1087,11546,5610],{"class":1305},[1087,11548,6999],{"class":1311},[1087,11550,11551,11553,11555,11557,11559],{"class":1089,"line":4526},[1087,11552,7004],{"class":1588},[1087,11554,1592],{"class":1305},[1087,11556,1519],{"class":1305},[1087,11558,6572],{"class":1097},[1087,11560,5538],{"class":1305},[1087,11562,11563,11565,11567,11569,11571],{"class":1089,"line":4540},[1087,11564,7017],{"class":1588},[1087,11566,1592],{"class":1305},[1087,11568,1519],{"class":1305},[1087,11570,5623],{"class":1097},[1087,11572,5538],{"class":1305},[1087,11574,11575,11577,11579,11581,11583],{"class":1089,"line":4548},[1087,11576,7030],{"class":1588},[1087,11578,1592],{"class":1305},[1087,11580,1519],{"class":1305},[1087,11582,7037],{"class":1097},[1087,11584,5538],{"class":1305},[1087,11586,11587,11589,11591,11593,11595],{"class":1089,"line":4553},[1087,11588,7044],{"class":1588},[1087,11590,1592],{"class":1305},[1087,11592,1519],{"class":1305},[1087,11594,7051],{"class":1097},[1087,11596,5538],{"class":1305},[1087,11598,11599],{"class":1089,"line":4560},[1087,11600,7058],{"class":1305},[1087,11602,11603,11605,11607],{"class":1089,"line":4565},[1087,11604,5507],{"class":1305},[1087,11606,5077],{"class":1311},[1087,11608,1566],{"class":1305},[1087,11610,11611,11613,11615],{"class":1089,"line":4583},[1087,11612,5641],{"class":1305},[1087,11614,5462],{"class":1311},[1087,11616,1566],{"class":1305},[1087,11618,11620,11622,11624],{"class":1089,"line":11619},112,[1087,11621,1617],{"class":1305},[1087,11623,1563],{"class":1311},[1087,11625,1566],{"class":1305},[1087,11627,11629,11631,11633],{"class":1089,"line":11628},113,[1087,11630,1627],{"class":1305},[1087,11632,5427],{"class":1311},[1087,11634,1566],{"class":1305},[1087,11636,11638,11640,11642],{"class":1089,"line":11637},114,[1087,11639,1636],{"class":1305},[1087,11641,1563],{"class":1311},[1087,11643,1566],{"class":1305},[980,11645,11647],{"id":11646},"going-further","Going further",[976,11649,11650],{},"You now have a working AI chatbot with database persistence! To take it further, consider adding:",[976,11652,11653],{},[994,11654,11655],{},"User Authentication",[976,11657,11658,11659,11664],{},"Add authentication with ",[1030,11660,11663],{"href":11661,"rel":11662},"https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",[1034],"nuxt-auth-utils"," to let users access their chat history across devices and keep conversations private.",[976,11666,11667],{},[994,11668,11669],{},"AI Tools",[976,11671,11672,11673,11678],{},"Extend your chatbot with ",[1030,11674,11677],{"href":11675,"rel":11676},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Ftools-and-tool-calling",[1034],"AI SDK tools"," that can fetch real-time data, generate charts, or interact with external APIs:",[1078,11680,11682],{"className":1282,"code":11681,"language":1284,"meta":1083,"style":1083},"import { tool } from 'ai'\nimport { z } from 'zod'\n\nconst weatherTool = tool({\n  description: 'Get the current weather for a location',\n  parameters: z.object({\n    location: z.string().describe('The city name')\n  }),\n  execute: async ({ location }) => {\n    \u002F\u002F Fetch weather data from an API\n    return { location, temperature: 22, condition: 'Sunny' }\n  }\n})\n",[1037,11683,11684,11703,11721,11725,11740,11756,11773,11804,11812,11832,11837,11872,11876],{"__ignoreMap":1083},[1087,11685,11686,11688,11690,11693,11695,11697,11699,11701],{"class":1089,"line":1090},[1087,11687,1708],{"class":1291},[1087,11689,1711],{"class":1305},[1087,11691,11692],{"class":1301}," tool",[1087,11694,1733],{"class":1305},[1087,11696,1736],{"class":1291},[1087,11698,1392],{"class":1305},[1087,11700,2534],{"class":1097},[1087,11702,1356],{"class":1305},[1087,11704,11705,11707,11709,11711,11713,11715,11717,11719],{"class":1089,"line":1107},[1087,11706,1708],{"class":1291},[1087,11708,1711],{"class":1305},[1087,11710,2569],{"class":1301},[1087,11712,1733],{"class":1305},[1087,11714,1736],{"class":1291},[1087,11716,1392],{"class":1305},[1087,11718,2578],{"class":1097},[1087,11720,1356],{"class":1305},[1087,11722,11723],{"class":1089,"line":1321},[1087,11724,1370],{"emptyLinePlaceholder":21},[1087,11726,11727,11729,11732,11734,11736,11738],{"class":1089,"line":1336},[1087,11728,3061],{"class":1588},[1087,11730,11731],{"class":1301}," weatherTool ",[1087,11733,1592],{"class":1305},[1087,11735,11692],{"class":1110},[1087,11737,1302],{"class":1301},[1087,11739,1306],{"class":1305},[1087,11741,11742,11745,11747,11749,11752,11754],{"class":1089,"line":1348},[1087,11743,11744],{"class":1311},"  description",[1087,11746,1315],{"class":1305},[1087,11748,1392],{"class":1305},[1087,11750,11751],{"class":1097},"Get the current weather for a location",[1087,11753,1330],{"class":1305},[1087,11755,1333],{"class":1305},[1087,11757,11758,11761,11763,11765,11767,11769,11771],{"class":1089,"line":1359},[1087,11759,11760],{"class":1311},"  parameters",[1087,11762,1315],{"class":1305},[1087,11764,2569],{"class":1301},[1087,11766,1809],{"class":1305},[1087,11768,2641],{"class":1110},[1087,11770,1302],{"class":1301},[1087,11772,1306],{"class":1305},[1087,11774,11775,11778,11780,11782,11784,11786,11788,11790,11793,11795,11797,11800,11802],{"class":1089,"line":1367},[1087,11776,11777],{"class":1311},"    location",[1087,11779,1315],{"class":1305},[1087,11781,2569],{"class":1301},[1087,11783,1809],{"class":1305},[1087,11785,3241],{"class":1110},[1087,11787,1806],{"class":1301},[1087,11789,1809],{"class":1305},[1087,11791,11792],{"class":1110},"describe",[1087,11794,1302],{"class":1301},[1087,11796,1330],{"class":1305},[1087,11798,11799],{"class":1097},"The city name",[1087,11801,1330],{"class":1305},[1087,11803,1492],{"class":1301},[1087,11805,11806,11808,11810],{"class":1089,"line":1373},[1087,11807,2414],{"class":1305},[1087,11809,1883],{"class":1301},[1087,11811,1333],{"class":1305},[1087,11813,11814,11817,11819,11821,11823,11826,11828,11830],{"class":1089,"line":1384},[1087,11815,11816],{"class":1110},"  execute",[1087,11818,1315],{"class":1305},[1087,11820,3993],{"class":1588},[1087,11822,1940],{"class":1305},[1087,11824,11825],{"class":1943}," location",[1087,11827,1947],{"class":1305},[1087,11829,1826],{"class":1588},[1087,11831,1381],{"class":1305},[1087,11833,11834],{"class":1089,"line":1400},[1087,11835,11836],{"class":1471},"    \u002F\u002F Fetch weather data from an API\n",[1087,11838,11839,11842,11844,11846,11848,11851,11853,11856,11858,11861,11863,11865,11868,11870],{"class":1089,"line":1406},[1087,11840,11841],{"class":1291},"    return",[1087,11843,1711],{"class":1305},[1087,11845,11825],{"class":1301},[1087,11847,1717],{"class":1305},[1087,11849,11850],{"class":1311}," temperature",[1087,11852,1315],{"class":1305},[1087,11854,11855],{"class":3560}," 22",[1087,11857,1717],{"class":1305},[1087,11859,11860],{"class":1311}," condition",[1087,11862,1315],{"class":1305},[1087,11864,1392],{"class":1305},[1087,11866,11867],{"class":1097},"Sunny",[1087,11869,1330],{"class":1305},[1087,11871,3163],{"class":1305},[1087,11873,11874],{"class":1089,"line":1411},[1087,11875,3585],{"class":1305},[1087,11877,11878,11880],{"class":1089,"line":1434},[1087,11879,1489],{"class":1305},[1087,11881,1492],{"class":1301},[980,11883,11885],{"id":11884},"deploying-to-vercel","Deploying to Vercel",[976,11887,11888],{},"Deploy your chatbot to Vercel with zero configuration:",[1078,11890,11892],{"className":1080,"code":11891,"language":1082,"meta":1083,"style":1083},"npx vercel deploy\n",[1037,11893,11894],{"__ignoreMap":1083},[1087,11895,11896,11898,11901],{"class":1089,"line":1090},[1087,11897,1094],{"class":1093},[1087,11899,11900],{"class":1097}," vercel",[1087,11902,11903],{"class":1097}," deploy\n",[976,11905,11906],{},"Then, in the Vercel dashboard:",[988,11908,11909,11915],{},[991,11910,11911,11912,11914],{},"Enable ",[994,11913,4595],{}," and add credits so requests can be processed.",[991,11916,11917,11918,11921],{},"Add a ",[994,11919,11920],{},"Turso"," database from the Vercel Marketplace and connect it to your project (it will provision the database and add the required environment variables automatically).",[11923,11924,11925],"blockquote",{},[976,11926,11927,11928,11933,11934,11936],{},"Note: On Vercel, you ",[994,11929,11930,11931],{},"don’t need to manually add ",[1037,11932,1659],{}," — Vercel handles the gateway configuration for deployments. Keep using ",[1037,11935,1646],{}," locally for development.",[1666,11938,11939],{"to":1066,"target":1035},[976,11940,11941,11942,1809],{},"Learn more about setting up AI Gateway in the ",[994,11943,11944],{},"Vercel AI Gateway documentation",[980,11946,11948],{"id":11947},"conclusion","Conclusion",[976,11950,11951],{},"You've built a complete AI chatbot with:",[988,11953,11954,11960,11966,11971,11976],{},[991,11955,11956,11959],{},[994,11957,11958],{},"A complete chat interface"," using Nuxt UI components",[991,11961,11962,11965],{},[994,11963,11964],{},"Real-time streaming responses"," with the AI SDK",[991,11967,11968,11970],{},[994,11969,1008],{}," with MDC for rich content display",[991,11972,11973,11975],{},[994,11974,1014],{}," via AI Gateway",[991,11977,11978,11981],{},[994,11979,11980],{},"Database persistence"," with SQLite (local) \u002F Turso (production) and Drizzle ORM",[976,11983,11984],{},"The combination of Nuxt's full-stack capabilities, Nuxt UI's purpose-built chat components, a local SQLite dev database with a production Turso database, and the AI SDK's streaming infrastructure makes building AI applications straightforward and enjoyable.",[976,11986,11987],{},[994,11988,11989],{},"Resources:",[988,11991,11992,11999,12006,12013,12019,12025],{},[991,11993,11994],{},[1030,11995,11998],{"href":11996,"rel":11997},"https:\u002F\u002Fui.nuxt.com\u002Fcomponents\u002Fchat",[1034],"Nuxt UI Chat Components",[991,12000,12001],{},[1030,12002,12005],{"href":12003,"rel":12004},"https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Ffeatures\u002Fdatabase",[1034],"NuxtHub Database",[991,12007,12008],{},[1030,12009,12012],{"href":12010,"rel":12011},"https:\u002F\u002Fai-sdk.dev",[1034],"AI SDK Documentation",[991,12014,12015],{},[1030,12016,12018],{"href":1066,"rel":12017},[1034],"AI Gateway Documentation",[991,12020,12021],{},[1030,12022,12024],{"href":1032,"rel":12023},[1034],"Nuxt AI Chat Template",[991,12026,12027],{},[1030,12028,12030],{"href":1043,"rel":12029},[1034],"Vue AI Chat Template",[976,12032,12033],{},"We're excited to see what you'll build!",[12035,12036,12037],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":1083,"searchDepth":1107,"depth":1107,"links":12039},[12040,12041,12042,12048,12053,12056,12057,12061,12062,12063,12068,12069,12070],{"id":982,"depth":1107,"text":983},{"id":1051,"depth":1107,"text":1052},{"id":1072,"depth":1107,"text":1073,"children":12043},[12044,12045,12046,12047],{"id":1117,"depth":1321,"text":1118},{"id":1268,"depth":1321,"text":1269},{"id":1537,"depth":1321,"text":1538},{"id":1677,"depth":1321,"text":1678},{"id":2457,"depth":1107,"text":2458,"children":12049},[12050,12051,12052],{"id":2469,"depth":1321,"text":2470},{"id":2852,"depth":1321,"text":2853},{"id":4686,"depth":1321,"text":4687},{"id":5068,"depth":1107,"text":5069,"children":12054},[12055],{"id":5087,"depth":1321,"text":5088},{"id":5704,"depth":1107,"text":5705},{"id":7272,"depth":1107,"text":7273,"children":12058},[12059,12060],{"id":7279,"depth":1321,"text":7280},{"id":7439,"depth":1321,"text":7440},{"id":7939,"depth":1107,"text":7940},{"id":8482,"depth":1107,"text":8483},{"id":9760,"depth":1107,"text":9761,"children":12064},[12065,12066,12067],{"id":9771,"depth":1321,"text":9772},{"id":10034,"depth":1321,"text":10035},{"id":10293,"depth":1321,"text":10294},{"id":11646,"depth":1107,"text":11647},{"id":11884,"depth":1107,"text":11885},{"id":11947,"depth":1107,"text":11948},"2025-12-16T10:00:00.000Z","Learn how to build a full-featured AI chatbot with streaming responses, multiple models support, and a beautiful UI using Nuxt, Nuxt UI, and Vercel AI SDK.","md","\u002Fassets\u002Fblog\u002Fbuilding-nuxt-ai-chatbot.png",{"category":12076},"Tutorial","\u002Fblog\u002Fhow-to-build-an-ai-chat",{"title":960,"description":12072},"blog\u002Fhow-to-build-an-ai-chat","ugglJqLsGgnnltNBbTrx1KjoUNVnc0W4pVd_V3GiLRg",1774822452141]