[{"data":1,"prerenderedAt":12121},["ShallowReactive",2],{"navigation":3,"blog":958,"blog-posts":970,"blog-hero-title":12094,"blog-hero-description":12113},[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,"body":16,"description":961,"extension":962,"hero":963,"meta":965,"navigation":36,"path":966,"seo":967,"stem":968,"__hash__":969},"blog\u002Fblog.yml","Blog","Tutorials, guides, and insights to help you build beautiful applications with Nuxt UI.","yml",{"title":964,"description":961},"Nuxt [UI]{.text-primary} Blog",{},"\u002Fblog",{"title":960,"description":961},"blog","ESl67YJxs4hhxlk_OHymZ1sSoeclVge2lYINtoN5zxg",[971],{"id":972,"title":973,"authors":974,"body":985,"date":12084,"description":12085,"extension":12086,"image":12087,"meta":12088,"navigation":36,"path":12090,"seo":12091,"stem":12092,"__hash__":12093},"posts\u002Fblog\u002Fhow-to-build-an-ai-chat.md","Build an AI Chatbot with Nuxt, Nuxt UI, and AI SDK",[975,980],{"name":976,"avatar":977,"to":979},"Hugo Richard",{"src":978},"https:\u002F\u002Fgithub.com\u002Fhugorcd.png","https:\u002F\u002Fx.com\u002Fhugorcd",{"name":981,"avatar":982,"to":984},"Benjamin Canac",{"src":983},"https:\u002F\u002Fgithub.com\u002Fbenjamincanac.png","https:\u002F\u002Fx.com\u002Fbenjamincanac",{"type":986,"value":987,"toc":12051},"minimark",[988,992,997,1000,1035,1062,1066,1069,1083,1087,1090,1127,1132,1135,1279,1283,1290,1506,1509,1548,1552,1559,1654,1661,1678,1688,1692,1706,2437,2440,2458,2468,2472,2480,2484,2495,2863,2867,2894,4601,4604,4609,4616,4621,4632,4637,4646,4664,4669,4684,4697,4701,4704,5079,5083,5098,5102,5110,5683,5690,5715,5719,5737,7112,7115,7120,7131,7169,7184,7189,7196,7210,7215,7255,7260,7265,7272,7283,7287,7290,7294,7297,7450,7454,7479,7950,7954,8493,8497,9762,9771,9775,9782,9786,9796,10045,10049,10057,10304,10308,10311,11657,11661,11664,11669,11678,11683,11692,11895,11899,11902,11917,11920,11935,11950,11958,11962,11965,11995,11998,12003,12044,12047],[989,990,991],"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.",[993,994,996],"h2",{"id":995},"what-were-building","What we're building",[989,998,999],{},"By the end of this tutorial, you'll have a fully functional AI chatbot with:",[1001,1002,1003,1011,1017,1023,1029],"ul",{},[1004,1005,1006,1010],"li",{},[1007,1008,1009],"strong",{},"Streaming responses"," that appear in real-time as the AI generates them",[1004,1012,1013,1016],{},[1007,1014,1015],{},"A beautiful chat interface"," built with Nuxt UI's purpose-built chat components",[1004,1018,1019,1022],{},[1007,1020,1021],{},"Markdown rendering"," for rich AI responses with code highlighting",[1004,1024,1025,1028],{},[1007,1026,1027],{},"Multi-model support"," allowing users to switch between OpenAI, Anthropic, and Google models",[1004,1030,1031,1034],{},[1007,1032,1033],{},"Server-side AI integration"," using Nitro API routes and the AI SDK",[1036,1037,1039],"callout",{"icon":1038},"i-simple-icons-github",[989,1040,1041,1042,1053,1054,1061],{},"Check out the ",[1043,1044,1049],"a",{"href":1045,"rel":1046,"target":1048},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat",[1047],"nofollow","_blank",[1050,1051,1052],"code",{},"Nuxt"," and ",[1043,1055,1058],{"href":1056,"rel":1057,"target":1048},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat-vue",[1047],[1050,1059,1060],{},"Vue"," AI Chat templates on GitHub for production-ready implementations with authentication, database persistence, and more.",[993,1063,1065],{"id":1064},"prerequisites","Prerequisites",[989,1067,1068],{},"Before we start, make sure you have:",[1001,1070,1071,1074],{},[1004,1072,1073],{},"Node.js 20+ installed",[1004,1075,1076,1077,1082],{},"A ",[1043,1078,1081],{"href":1079,"rel":1080},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fai-gateway",[1047],"Vercel AI Gateway"," API key (provides access to multiple AI providers through a single endpoint)",[993,1084,1086],{"id":1085},"project-setup","Project setup",[989,1088,1089],{},"Start by creating a new Nuxt project:",[1091,1092,1097],"pre",{"className":1093,"code":1094,"language":1095,"meta":1096,"style":1096},"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","",[1050,1098,1099,1118],{"__ignoreMap":1096},[1100,1101,1104,1108,1112,1115],"span",{"class":1102,"line":1103},"line",1,[1100,1105,1107],{"class":1106},"sBMFI","npx",[1100,1109,1111],{"class":1110},"sfazB"," nuxi@latest",[1100,1113,1114],{"class":1110}," init",[1100,1116,1117],{"class":1110}," nuxt-ai-chat\n",[1100,1119,1121,1125],{"class":1102,"line":1120},2,[1100,1122,1124],{"class":1123},"s2Zo4","cd",[1100,1126,1117],{"class":1110},[1128,1129,1131],"h3",{"id":1130},"installing-dependencies","Installing dependencies",[989,1133,1134],{},"Install Nuxt UI and the AI-specific dependencies:",[1136,1137,1139,1182,1214,1247],"code-group",{"sync":1138},"pm",[1091,1140,1143],{"className":1093,"code":1141,"filename":1142,"language":1095,"meta":1096,"style":1096},"pnpm add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","pnpm",[1050,1144,1145],{"__ignoreMap":1096},[1100,1146,1147,1149,1152,1155,1158,1161,1164,1167,1170,1173,1176,1179],{"class":1102,"line":1103},[1100,1148,1142],{"class":1106},[1100,1150,1151],{"class":1110}," add",[1100,1153,1154],{"class":1110}," @nuxt\u002Fui",[1100,1156,1157],{"class":1110}," tailwindcss",[1100,1159,1160],{"class":1110}," @nuxtjs\u002Fmdc",[1100,1162,1163],{"class":1110}," @nuxthub\u002Fcore",[1100,1165,1166],{"class":1110}," drizzle-orm",[1100,1168,1169],{"class":1110}," drizzle-kit",[1100,1171,1172],{"class":1110}," @libsql\u002Fclient",[1100,1174,1175],{"class":1110}," ai",[1100,1177,1178],{"class":1110}," @ai-sdk\u002Fvue",[1100,1180,1181],{"class":1110}," zod\n",[1091,1183,1186],{"className":1093,"code":1184,"filename":1185,"language":1095,"meta":1096,"style":1096},"yarn add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","yarn",[1050,1187,1188],{"__ignoreMap":1096},[1100,1189,1190,1192,1194,1196,1198,1200,1202,1204,1206,1208,1210,1212],{"class":1102,"line":1103},[1100,1191,1185],{"class":1106},[1100,1193,1151],{"class":1110},[1100,1195,1154],{"class":1110},[1100,1197,1157],{"class":1110},[1100,1199,1160],{"class":1110},[1100,1201,1163],{"class":1110},[1100,1203,1166],{"class":1110},[1100,1205,1169],{"class":1110},[1100,1207,1172],{"class":1110},[1100,1209,1175],{"class":1110},[1100,1211,1178],{"class":1110},[1100,1213,1181],{"class":1110},[1091,1215,1218],{"className":1093,"code":1216,"filename":1217,"language":1095,"meta":1096,"style":1096},"npm install @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","npm",[1050,1219,1220],{"__ignoreMap":1096},[1100,1221,1222,1224,1227,1229,1231,1233,1235,1237,1239,1241,1243,1245],{"class":1102,"line":1103},[1100,1223,1217],{"class":1106},[1100,1225,1226],{"class":1110}," install",[1100,1228,1154],{"class":1110},[1100,1230,1157],{"class":1110},[1100,1232,1160],{"class":1110},[1100,1234,1163],{"class":1110},[1100,1236,1166],{"class":1110},[1100,1238,1169],{"class":1110},[1100,1240,1172],{"class":1110},[1100,1242,1175],{"class":1110},[1100,1244,1178],{"class":1110},[1100,1246,1181],{"class":1110},[1091,1248,1251],{"className":1093,"code":1249,"filename":1250,"language":1095,"meta":1096,"style":1096},"bun add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","bun",[1050,1252,1253],{"__ignoreMap":1096},[1100,1254,1255,1257,1259,1261,1263,1265,1267,1269,1271,1273,1275,1277],{"class":1102,"line":1103},[1100,1256,1250],{"class":1106},[1100,1258,1151],{"class":1110},[1100,1260,1154],{"class":1110},[1100,1262,1157],{"class":1110},[1100,1264,1160],{"class":1110},[1100,1266,1163],{"class":1110},[1100,1268,1166],{"class":1110},[1100,1270,1169],{"class":1110},[1100,1272,1172],{"class":1110},[1100,1274,1175],{"class":1110},[1100,1276,1178],{"class":1110},[1100,1278,1181],{"class":1110},[1128,1280,1282],{"id":1281},"configuration","Configuration",[989,1284,1285,1286,1289],{},"Update your ",[1050,1287,1288],{},"nuxt.config.ts"," to register the modules:",[1291,1292,1293],"code-tree-intersection",{},[1091,1294,1298],{"className":1295,"code":1296,"filename":1288,"language":1297,"meta":1096,"style":1096},"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",[1050,1299,1300,1320,1332,1347,1359,1370,1378,1384,1395,1411,1417,1422,1445,1450,1460,1470,1486,1492,1497],{"__ignoreMap":1096},[1100,1301,1302,1306,1309,1312,1316],{"class":1102,"line":1103},[1100,1303,1305],{"class":1304},"s7zQu","export",[1100,1307,1308],{"class":1304}," default",[1100,1310,1311],{"class":1123}," defineNuxtConfig",[1100,1313,1315],{"class":1314},"sTEyZ","(",[1100,1317,1319],{"class":1318},"sMK4o","{\n",[1100,1321,1322,1326,1329],{"class":1102,"line":1120},[1100,1323,1325],{"class":1324},"swJcz","  modules",[1100,1327,1328],{"class":1318},":",[1100,1330,1331],{"class":1314}," [\n",[1100,1333,1335,1338,1341,1344],{"class":1102,"line":1334},3,[1100,1336,1337],{"class":1318},"    '",[1100,1339,1340],{"class":1110},"@nuxt\u002Fui",[1100,1342,1343],{"class":1318},"'",[1100,1345,1346],{"class":1318},",\n",[1100,1348,1350,1352,1355,1357],{"class":1102,"line":1349},4,[1100,1351,1337],{"class":1318},[1100,1353,1354],{"class":1110},"@nuxtjs\u002Fmdc",[1100,1356,1343],{"class":1318},[1100,1358,1346],{"class":1318},[1100,1360,1362,1364,1367],{"class":1102,"line":1361},5,[1100,1363,1337],{"class":1318},[1100,1365,1366],{"class":1110},"@nuxthub\u002Fcore",[1100,1368,1369],{"class":1318},"'\n",[1100,1371,1373,1376],{"class":1102,"line":1372},6,[1100,1374,1375],{"class":1314},"  ]",[1100,1377,1346],{"class":1318},[1100,1379,1381],{"class":1102,"line":1380},7,[1100,1382,1383],{"emptyLinePlaceholder":21},"\n",[1100,1385,1387,1390,1392],{"class":1102,"line":1386},8,[1100,1388,1389],{"class":1324},"  hub",[1100,1391,1328],{"class":1318},[1100,1393,1394],{"class":1318}," {\n",[1100,1396,1398,1401,1403,1406,1409],{"class":1102,"line":1397},9,[1100,1399,1400],{"class":1324},"    db",[1100,1402,1328],{"class":1318},[1100,1404,1405],{"class":1318}," '",[1100,1407,1408],{"class":1110},"sqlite",[1100,1410,1369],{"class":1318},[1100,1412,1414],{"class":1102,"line":1413},10,[1100,1415,1416],{"class":1318},"  },\n",[1100,1418,1420],{"class":1102,"line":1419},11,[1100,1421,1383],{"emptyLinePlaceholder":21},[1100,1423,1425,1428,1430,1433,1435,1438,1440,1443],{"class":1102,"line":1424},12,[1100,1426,1427],{"class":1324},"  css",[1100,1429,1328],{"class":1318},[1100,1431,1432],{"class":1314}," [",[1100,1434,1343],{"class":1318},[1100,1436,1437],{"class":1110},"~\u002Fassets\u002Fcss\u002Fmain.css",[1100,1439,1343],{"class":1318},[1100,1441,1442],{"class":1314},"]",[1100,1444,1346],{"class":1318},[1100,1446,1448],{"class":1102,"line":1447},13,[1100,1449,1383],{"emptyLinePlaceholder":21},[1100,1451,1453,1456,1458],{"class":1102,"line":1452},14,[1100,1454,1455],{"class":1324},"  mdc",[1100,1457,1328],{"class":1318},[1100,1459,1394],{"class":1318},[1100,1461,1463,1466,1468],{"class":1102,"line":1462},15,[1100,1464,1465],{"class":1324},"    headings",[1100,1467,1328],{"class":1318},[1100,1469,1394],{"class":1318},[1100,1471,1473,1476,1478,1482],{"class":1102,"line":1472},16,[1100,1474,1475],{"class":1324},"      anchorLinks",[1100,1477,1328],{"class":1318},[1100,1479,1481],{"class":1480},"sfNiH"," false",[1100,1483,1485],{"class":1484},"sHwdD"," \u002F\u002F Disable anchor links in AI responses\n",[1100,1487,1489],{"class":1102,"line":1488},17,[1100,1490,1491],{"class":1318},"    }\n",[1100,1493,1495],{"class":1102,"line":1494},18,[1100,1496,1416],{"class":1318},[1100,1498,1500,1503],{"class":1102,"line":1499},19,[1100,1501,1502],{"class":1318},"}",[1100,1504,1505],{"class":1314},")\n",[989,1507,1508],{},"Create the main CSS file to import Tailwind CSS and Nuxt UI:",[1291,1510,1511],{},[1091,1512,1517],{"className":1513,"code":1514,"filename":1515,"language":1516,"meta":1096,"style":1096},"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",[1050,1518,1519,1536],{"__ignoreMap":1096},[1100,1520,1521,1524,1527,1530,1533],{"class":1102,"line":1103},[1100,1522,1523],{"class":1304},"@import",[1100,1525,1526],{"class":1318}," \"",[1100,1528,1529],{"class":1110},"tailwindcss",[1100,1531,1532],{"class":1318},"\"",[1100,1534,1535],{"class":1318},";\n",[1100,1537,1538,1540,1542,1544,1546],{"class":1102,"line":1120},[1100,1539,1523],{"class":1304},[1100,1541,1526],{"class":1318},[1100,1543,1340],{"class":1110},[1100,1545,1532],{"class":1318},[1100,1547,1535],{"class":1318},[1128,1549,1551],{"id":1550},"setting-up-the-app","Setting up the app",[989,1553,1554,1555,1558],{},"Nuxt UI requires wrapping your app with ",[1050,1556,1557],{},"UApp"," for modals, toasts, and overlays to work properly:",[1291,1560,1561],{},[1091,1562,1567],{"className":1563,"code":1564,"filename":1565,"highlights":1566,"language":34,"meta":1096,"style":1096},"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",[1120,1372],[1050,1568,1569,1580,1591,1615,1626,1635,1645],{"__ignoreMap":1096},[1100,1570,1571,1574,1577],{"class":1102,"line":1103},[1100,1572,1573],{"class":1318},"\u003C",[1100,1575,1576],{"class":1324},"template",[1100,1578,1579],{"class":1318},">\n",[1100,1581,1584,1587,1589],{"class":1582,"line":1120},[1102,1583],"highlight",[1100,1585,1586],{"class":1318},"  \u003C",[1100,1588,1557],{"class":1324},[1100,1590,1579],{"class":1318},[1100,1592,1593,1596,1599,1603,1606,1608,1611,1613],{"class":1102,"line":1334},[1100,1594,1595],{"class":1318},"    \u003C",[1100,1597,1598],{"class":1324},"UDashboardGroup",[1100,1600,1602],{"class":1601},"spNyl"," unit",[1100,1604,1605],{"class":1318},"=",[1100,1607,1532],{"class":1318},[1100,1609,1610],{"class":1110},"rem",[1100,1612,1532],{"class":1318},[1100,1614,1579],{"class":1318},[1100,1616,1617,1620,1623],{"class":1102,"line":1349},[1100,1618,1619],{"class":1318},"      \u003C",[1100,1621,1622],{"class":1324},"NuxtPage",[1100,1624,1625],{"class":1318}," \u002F>\n",[1100,1627,1628,1631,1633],{"class":1102,"line":1361},[1100,1629,1630],{"class":1318},"    \u003C\u002F",[1100,1632,1598],{"class":1324},[1100,1634,1579],{"class":1318},[1100,1636,1638,1641,1643],{"class":1637,"line":1372},[1102,1583],[1100,1639,1640],{"class":1318},"  \u003C\u002F",[1100,1642,1557],{"class":1324},[1100,1644,1579],{"class":1318},[1100,1646,1647,1650,1652],{"class":1102,"line":1380},[1100,1648,1649],{"class":1318},"\u003C\u002F",[1100,1651,1576],{"class":1324},[1100,1653,1579],{"class":1318},[989,1655,1656,1657,1660],{},"Create a ",[1050,1658,1659],{},".env"," file with your AI Gateway API key:",[1291,1662,1663],{},[1091,1664,1666],{"className":1093,"code":1665,"filename":1659,"language":1095,"meta":1096,"style":1096},"AI_GATEWAY_API_KEY=your-api-key-here\n",[1050,1667,1668],{"__ignoreMap":1096},[1100,1669,1670,1673,1675],{"class":1102,"line":1103},[1100,1671,1672],{"class":1314},"AI_GATEWAY_API_KEY",[1100,1674,1605],{"class":1318},[1100,1676,1677],{"class":1110},"your-api-key-here\n",[1679,1680,1681],"note",{},[989,1682,1683,1684,1687],{},"With ",[1043,1685,1081],{"href":1079,"rel":1686},[1047],", 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.",[1128,1689,1691],{"id":1690},"setting-up-the-database","Setting up the database",[989,1693,1694,1699,1700,1705],{},[1043,1695,1698],{"href":1696,"rel":1697},"https:\u002F\u002Fhub.nuxt.com",[1047],"NuxtHub"," provides a zero-config database powered by ",[1043,1701,1704],{"href":1702,"rel":1703},"https:\u002F\u002Form.drizzle.team",[1047],"Drizzle ORM",". Here is the schema for the chat application:",[1291,1707,1708],{},[1709,1710,1711],"code-collapse",{},[1091,1712,1715],{"className":1295,"code":1713,"filename":1714,"language":1297,"meta":1096,"style":1096},"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",[1050,1716,1717,1757,1777,1781,1808,1853,1866,1923,1929,1933,1968,1980,1987,1991,2017,2062,2128,2197,2236,2286,2299,2329,2335,2340,2372,2388,2406,2422,2430],{"__ignoreMap":1096},[1100,1718,1719,1722,1725,1728,1731,1734,1736,1739,1741,1744,1747,1750,1752,1755],{"class":1102,"line":1103},[1100,1720,1721],{"class":1304},"import",[1100,1723,1724],{"class":1318}," {",[1100,1726,1727],{"class":1314}," sqliteTable",[1100,1729,1730],{"class":1318},",",[1100,1732,1733],{"class":1314}," text",[1100,1735,1730],{"class":1318},[1100,1737,1738],{"class":1314}," integer",[1100,1740,1730],{"class":1318},[1100,1742,1743],{"class":1314}," index",[1100,1745,1746],{"class":1318}," }",[1100,1748,1749],{"class":1304}," from",[1100,1751,1405],{"class":1318},[1100,1753,1754],{"class":1110},"drizzle-orm\u002Fsqlite-core",[1100,1756,1369],{"class":1318},[1100,1758,1759,1761,1763,1766,1768,1770,1772,1775],{"class":1102,"line":1120},[1100,1760,1721],{"class":1304},[1100,1762,1724],{"class":1318},[1100,1764,1765],{"class":1314}," relations",[1100,1767,1746],{"class":1318},[1100,1769,1749],{"class":1304},[1100,1771,1405],{"class":1318},[1100,1773,1774],{"class":1110},"drizzle-orm",[1100,1776,1369],{"class":1318},[1100,1778,1779],{"class":1102,"line":1334},[1100,1780,1383],{"emptyLinePlaceholder":21},[1100,1782,1783,1785,1788,1791,1793,1795,1797,1799,1802,1804,1806],{"class":1102,"line":1349},[1100,1784,1305],{"class":1304},[1100,1786,1787],{"class":1601}," const",[1100,1789,1790],{"class":1314}," chats ",[1100,1792,1605],{"class":1318},[1100,1794,1727],{"class":1123},[1100,1796,1315],{"class":1314},[1100,1798,1343],{"class":1318},[1100,1800,1801],{"class":1110},"chats",[1100,1803,1343],{"class":1318},[1100,1805,1730],{"class":1318},[1100,1807,1394],{"class":1318},[1100,1809,1810,1813,1815,1817,1820,1823,1826,1828,1830,1833,1835,1837,1840,1843,1845,1848,1851],{"class":1102,"line":1361},[1100,1811,1812],{"class":1324},"  id",[1100,1814,1328],{"class":1318},[1100,1816,1733],{"class":1123},[1100,1818,1819],{"class":1314},"()",[1100,1821,1822],{"class":1318},".",[1100,1824,1825],{"class":1123},"primaryKey",[1100,1827,1819],{"class":1314},[1100,1829,1822],{"class":1318},[1100,1831,1832],{"class":1123},"$defaultFn",[1100,1834,1315],{"class":1314},[1100,1836,1819],{"class":1318},[1100,1838,1839],{"class":1601}," =>",[1100,1841,1842],{"class":1314}," crypto",[1100,1844,1822],{"class":1318},[1100,1846,1847],{"class":1123},"randomUUID",[1100,1849,1850],{"class":1314},"())",[1100,1852,1346],{"class":1318},[1100,1854,1855,1858,1860,1862,1864],{"class":1102,"line":1372},[1100,1856,1857],{"class":1324},"  title",[1100,1859,1328],{"class":1318},[1100,1861,1733],{"class":1123},[1100,1863,1819],{"class":1314},[1100,1865,1346],{"class":1318},[1100,1867,1868,1871,1873,1875,1877,1880,1883,1885,1887,1890,1892,1894,1897,1899,1902,1904,1906,1908,1910,1912,1914,1917,1920],{"class":1102,"line":1380},[1100,1869,1870],{"class":1324},"  createdAt",[1100,1872,1328],{"class":1318},[1100,1874,1738],{"class":1123},[1100,1876,1315],{"class":1314},[1100,1878,1879],{"class":1318},"{",[1100,1881,1882],{"class":1324}," mode",[1100,1884,1328],{"class":1318},[1100,1886,1405],{"class":1318},[1100,1888,1889],{"class":1110},"timestamp",[1100,1891,1343],{"class":1318},[1100,1893,1746],{"class":1318},[1100,1895,1896],{"class":1314},")",[1100,1898,1822],{"class":1318},[1100,1900,1901],{"class":1123},"notNull",[1100,1903,1819],{"class":1314},[1100,1905,1822],{"class":1318},[1100,1907,1832],{"class":1123},[1100,1909,1315],{"class":1314},[1100,1911,1819],{"class":1318},[1100,1913,1839],{"class":1601},[1100,1915,1916],{"class":1318}," new",[1100,1918,1919],{"class":1123}," Date",[1100,1921,1922],{"class":1314},"())\n",[1100,1924,1925,1927],{"class":1102,"line":1386},[1100,1926,1502],{"class":1318},[1100,1928,1505],{"class":1314},[1100,1930,1931],{"class":1102,"line":1397},[1100,1932,1383],{"emptyLinePlaceholder":21},[1100,1934,1935,1937,1939,1942,1944,1946,1949,1951,1954,1958,1961,1963,1966],{"class":1102,"line":1413},[1100,1936,1305],{"class":1304},[1100,1938,1787],{"class":1601},[1100,1940,1941],{"class":1314}," chatsRelations ",[1100,1943,1605],{"class":1318},[1100,1945,1765],{"class":1123},[1100,1947,1948],{"class":1314},"(chats",[1100,1950,1730],{"class":1318},[1100,1952,1953],{"class":1318}," ({",[1100,1955,1957],{"class":1956},"sHdIc"," many",[1100,1959,1960],{"class":1318}," })",[1100,1962,1839],{"class":1601},[1100,1964,1965],{"class":1314}," (",[1100,1967,1319],{"class":1318},[1100,1969,1970,1973,1975,1977],{"class":1102,"line":1419},[1100,1971,1972],{"class":1324},"  messages",[1100,1974,1328],{"class":1318},[1100,1976,1957],{"class":1123},[1100,1978,1979],{"class":1314},"(messages)\n",[1100,1981,1982,1984],{"class":1102,"line":1424},[1100,1983,1502],{"class":1318},[1100,1985,1986],{"class":1314},"))\n",[1100,1988,1989],{"class":1102,"line":1447},[1100,1990,1383],{"emptyLinePlaceholder":21},[1100,1992,1993,1995,1997,2000,2002,2004,2006,2008,2011,2013,2015],{"class":1102,"line":1452},[1100,1994,1305],{"class":1304},[1100,1996,1787],{"class":1601},[1100,1998,1999],{"class":1314}," messages ",[1100,2001,1605],{"class":1318},[1100,2003,1727],{"class":1123},[1100,2005,1315],{"class":1314},[1100,2007,1343],{"class":1318},[1100,2009,2010],{"class":1110},"messages",[1100,2012,1343],{"class":1318},[1100,2014,1730],{"class":1318},[1100,2016,1394],{"class":1318},[1100,2018,2019,2021,2023,2025,2027,2029,2032,2034,2036,2038,2040,2042,2044,2046,2048,2050,2052,2054,2056,2058,2060],{"class":1102,"line":1462},[1100,2020,1812],{"class":1324},[1100,2022,1328],{"class":1318},[1100,2024,1733],{"class":1123},[1100,2026,1315],{"class":1314},[1100,2028,1343],{"class":1318},[1100,2030,2031],{"class":1110},"id",[1100,2033,1343],{"class":1318},[1100,2035,1896],{"class":1314},[1100,2037,1822],{"class":1318},[1100,2039,1825],{"class":1123},[1100,2041,1819],{"class":1314},[1100,2043,1822],{"class":1318},[1100,2045,1832],{"class":1123},[1100,2047,1315],{"class":1314},[1100,2049,1819],{"class":1318},[1100,2051,1839],{"class":1601},[1100,2053,1842],{"class":1314},[1100,2055,1822],{"class":1318},[1100,2057,1847],{"class":1123},[1100,2059,1850],{"class":1314},[1100,2061,1346],{"class":1318},[1100,2063,2064,2067,2069,2071,2073,2075,2078,2080,2082,2084,2086,2088,2090,2093,2095,2097,2099,2102,2104,2106,2108,2110,2113,2115,2117,2120,2122,2124,2126],{"class":1102,"line":1472},[1100,2065,2066],{"class":1324},"  chatId",[1100,2068,1328],{"class":1318},[1100,2070,1733],{"class":1123},[1100,2072,1315],{"class":1314},[1100,2074,1343],{"class":1318},[1100,2076,2077],{"class":1110},"chat_id",[1100,2079,1343],{"class":1318},[1100,2081,1896],{"class":1314},[1100,2083,1822],{"class":1318},[1100,2085,1901],{"class":1123},[1100,2087,1819],{"class":1314},[1100,2089,1822],{"class":1318},[1100,2091,2092],{"class":1123},"references",[1100,2094,1315],{"class":1314},[1100,2096,1819],{"class":1318},[1100,2098,1839],{"class":1601},[1100,2100,2101],{"class":1314}," chats",[1100,2103,1822],{"class":1318},[1100,2105,2031],{"class":1314},[1100,2107,1730],{"class":1318},[1100,2109,1724],{"class":1318},[1100,2111,2112],{"class":1324}," onDelete",[1100,2114,1328],{"class":1318},[1100,2116,1405],{"class":1318},[1100,2118,2119],{"class":1110},"cascade",[1100,2121,1343],{"class":1318},[1100,2123,1746],{"class":1318},[1100,2125,1896],{"class":1314},[1100,2127,1346],{"class":1318},[1100,2129,2130,2133,2135,2137,2139,2141,2144,2146,2148,2150,2153,2155,2157,2159,2162,2164,2166,2168,2171,2173,2175,2177,2180,2182,2185,2187,2189,2191,2193,2195],{"class":1102,"line":1488},[1100,2131,2132],{"class":1324},"  role",[1100,2134,1328],{"class":1318},[1100,2136,1733],{"class":1123},[1100,2138,1315],{"class":1314},[1100,2140,1343],{"class":1318},[1100,2142,2143],{"class":1110},"role",[1100,2145,1343],{"class":1318},[1100,2147,1730],{"class":1318},[1100,2149,1724],{"class":1318},[1100,2151,2152],{"class":1324}," enum",[1100,2154,1328],{"class":1318},[1100,2156,1432],{"class":1314},[1100,2158,1343],{"class":1318},[1100,2160,2161],{"class":1110},"user",[1100,2163,1343],{"class":1318},[1100,2165,1730],{"class":1318},[1100,2167,1405],{"class":1318},[1100,2169,2170],{"class":1110},"assistant",[1100,2172,1343],{"class":1318},[1100,2174,1730],{"class":1318},[1100,2176,1405],{"class":1318},[1100,2178,2179],{"class":1110},"system",[1100,2181,1343],{"class":1318},[1100,2183,2184],{"class":1314},"] ",[1100,2186,1502],{"class":1318},[1100,2188,1896],{"class":1314},[1100,2190,1822],{"class":1318},[1100,2192,1901],{"class":1123},[1100,2194,1819],{"class":1314},[1100,2196,1346],{"class":1318},[1100,2198,2199,2202,2204,2206,2208,2210,2213,2215,2217,2219,2221,2223,2225,2228,2230,2232,2234],{"class":1102,"line":1494},[1100,2200,2201],{"class":1324},"  parts",[1100,2203,1328],{"class":1318},[1100,2205,1733],{"class":1123},[1100,2207,1315],{"class":1314},[1100,2209,1343],{"class":1318},[1100,2211,2212],{"class":1110},"parts",[1100,2214,1343],{"class":1318},[1100,2216,1730],{"class":1318},[1100,2218,1724],{"class":1318},[1100,2220,1882],{"class":1324},[1100,2222,1328],{"class":1318},[1100,2224,1405],{"class":1318},[1100,2226,2227],{"class":1110},"json",[1100,2229,1343],{"class":1318},[1100,2231,1746],{"class":1318},[1100,2233,1896],{"class":1314},[1100,2235,1346],{"class":1318},[1100,2237,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260,2262,2264,2266,2268,2270,2272,2274,2276,2278,2280,2282,2284],{"class":1102,"line":1499},[1100,2239,1870],{"class":1324},[1100,2241,1328],{"class":1318},[1100,2243,1738],{"class":1123},[1100,2245,1315],{"class":1314},[1100,2247,1879],{"class":1318},[1100,2249,1882],{"class":1324},[1100,2251,1328],{"class":1318},[1100,2253,1405],{"class":1318},[1100,2255,1889],{"class":1110},[1100,2257,1343],{"class":1318},[1100,2259,1746],{"class":1318},[1100,2261,1896],{"class":1314},[1100,2263,1822],{"class":1318},[1100,2265,1901],{"class":1123},[1100,2267,1819],{"class":1314},[1100,2269,1822],{"class":1318},[1100,2271,1832],{"class":1123},[1100,2273,1315],{"class":1314},[1100,2275,1819],{"class":1318},[1100,2277,1839],{"class":1601},[1100,2279,1916],{"class":1318},[1100,2281,1919],{"class":1123},[1100,2283,1850],{"class":1314},[1100,2285,1346],{"class":1318},[1100,2287,2289,2292,2295,2297],{"class":1102,"line":2288},20,[1100,2290,2291],{"class":1318},"},",[1100,2293,2294],{"class":1956}," table",[1100,2296,1839],{"class":1601},[1100,2298,1331],{"class":1314},[1100,2300,2302,2305,2307,2309,2312,2314,2316,2318,2321,2324,2326],{"class":1102,"line":2301},21,[1100,2303,2304],{"class":1123},"  index",[1100,2306,1315],{"class":1314},[1100,2308,1343],{"class":1318},[1100,2310,2311],{"class":1110},"messages_chat_id_idx",[1100,2313,1343],{"class":1318},[1100,2315,1896],{"class":1314},[1100,2317,1822],{"class":1318},[1100,2319,2320],{"class":1123},"on",[1100,2322,2323],{"class":1314},"(table",[1100,2325,1822],{"class":1318},[1100,2327,2328],{"class":1314},"chatId)\n",[1100,2330,2332],{"class":1102,"line":2331},22,[1100,2333,2334],{"class":1314},"])\n",[1100,2336,2338],{"class":1102,"line":2337},23,[1100,2339,1383],{"emptyLinePlaceholder":21},[1100,2341,2343,2345,2347,2350,2352,2354,2357,2359,2361,2364,2366,2368,2370],{"class":1102,"line":2342},24,[1100,2344,1305],{"class":1304},[1100,2346,1787],{"class":1601},[1100,2348,2349],{"class":1314}," messagesRelations ",[1100,2351,1605],{"class":1318},[1100,2353,1765],{"class":1123},[1100,2355,2356],{"class":1314},"(messages",[1100,2358,1730],{"class":1318},[1100,2360,1953],{"class":1318},[1100,2362,2363],{"class":1956}," one",[1100,2365,1960],{"class":1318},[1100,2367,1839],{"class":1601},[1100,2369,1965],{"class":1314},[1100,2371,1319],{"class":1318},[1100,2373,2375,2378,2380,2382,2384,2386],{"class":1102,"line":2374},25,[1100,2376,2377],{"class":1324},"  chat",[1100,2379,1328],{"class":1318},[1100,2381,2363],{"class":1123},[1100,2383,1948],{"class":1314},[1100,2385,1730],{"class":1318},[1100,2387,1394],{"class":1318},[1100,2389,2391,2394,2396,2399,2401,2404],{"class":1102,"line":2390},26,[1100,2392,2393],{"class":1324},"    fields",[1100,2395,1328],{"class":1318},[1100,2397,2398],{"class":1314}," [messages",[1100,2400,1822],{"class":1318},[1100,2402,2403],{"class":1314},"chatId]",[1100,2405,1346],{"class":1318},[1100,2407,2409,2412,2414,2417,2419],{"class":1102,"line":2408},27,[1100,2410,2411],{"class":1324},"    references",[1100,2413,1328],{"class":1318},[1100,2415,2416],{"class":1314}," [chats",[1100,2418,1822],{"class":1318},[1100,2420,2421],{"class":1314},"id]\n",[1100,2423,2425,2428],{"class":1102,"line":2424},28,[1100,2426,2427],{"class":1318},"  }",[1100,2429,1505],{"class":1314},[1100,2431,2433,2435],{"class":1102,"line":2432},29,[1100,2434,1502],{"class":1318},[1100,2436,1986],{"class":1314},[989,2438,2439],{},"Generate the database migrations from your schema:",[1091,2441,2443],{"className":1093,"code":2442,"language":1095,"meta":1096,"style":1096},"npx nuxt db generate\n",[1050,2444,2445],{"__ignoreMap":1096},[1100,2446,2447,2449,2452,2455],{"class":1102,"line":1103},[1100,2448,1107],{"class":1106},[1100,2450,2451],{"class":1110}," nuxt",[1100,2453,2454],{"class":1110}," db",[1100,2456,2457],{"class":1110}," generate\n",[2459,2460,2461],"tip",{},[989,2462,2463,2464,2467],{},"Migrations are automatically applied when you start the development server with ",[1050,2465,2466],{},"npx nuxt dev",". NuxtHub uses SQLite locally, so no external database is required during development.",[993,2469,2471],{"id":2470},"building-the-backend","Building the backend",[989,2473,2474,2475,1822],{},"This section covers integrating AI on the server. The following API endpoints handle chat creation, AI streaming, and data persistence using ",[1043,2476,2479],{"href":2477,"rel":2478},"https:\u002F\u002Fnitro.build",[1047],"Nitro",[1128,2481,2483],{"id":2482},"creating-a-chat","Creating a chat",[989,2485,2486,2487,2494],{},"First, create the endpoint that initializes a new chat and saves the first message to the database. This uses the ",[1043,2488,2491],{"href":2489,"rel":2490},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fui-message",[1047],[1050,2492,2493],{},"UIMessage"," type from the AI SDK:",[1291,2496,2497],{},[1091,2498,2501],{"className":1295,"code":2499,"filename":2500,"language":1297,"meta":1096,"style":1096},"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",[1050,2502,2503,2527,2550,2574,2594,2598,2622,2659,2683,2696,2700,2705,2756,2760,2765,2794,2810,2825,2839,2845,2849,2857],{"__ignoreMap":1096},[1100,2504,2505,2507,2509,2512,2514,2517,2519,2521,2523,2525],{"class":1102,"line":1103},[1100,2506,1721],{"class":1304},[1100,2508,1724],{"class":1318},[1100,2510,2511],{"class":1314}," defineEventHandler",[1100,2513,1730],{"class":1318},[1100,2515,2516],{"class":1314}," readValidatedBody",[1100,2518,1746],{"class":1318},[1100,2520,1749],{"class":1304},[1100,2522,1405],{"class":1318},[1100,2524,1128],{"class":1110},[1100,2526,1369],{"class":1318},[1100,2528,2529,2531,2534,2536,2539,2541,2543,2545,2548],{"class":1102,"line":1120},[1100,2530,1721],{"class":1304},[1100,2532,2533],{"class":1304}," type",[1100,2535,1724],{"class":1318},[1100,2537,2538],{"class":1314}," UIMessage",[1100,2540,1746],{"class":1318},[1100,2542,1749],{"class":1304},[1100,2544,1405],{"class":1318},[1100,2546,2547],{"class":1110},"ai",[1100,2549,1369],{"class":1318},[1100,2551,2552,2554,2556,2558,2560,2563,2565,2567,2569,2572],{"class":1102,"line":1334},[1100,2553,1721],{"class":1304},[1100,2555,1724],{"class":1318},[1100,2557,2454],{"class":1314},[1100,2559,1730],{"class":1318},[1100,2561,2562],{"class":1314}," schema",[1100,2564,1746],{"class":1318},[1100,2566,1749],{"class":1304},[1100,2568,1405],{"class":1318},[1100,2570,2571],{"class":1110},"hub:db",[1100,2573,1369],{"class":1318},[1100,2575,2576,2578,2580,2583,2585,2587,2589,2592],{"class":1102,"line":1349},[1100,2577,1721],{"class":1304},[1100,2579,1724],{"class":1318},[1100,2581,2582],{"class":1314}," z",[1100,2584,1746],{"class":1318},[1100,2586,1749],{"class":1304},[1100,2588,1405],{"class":1318},[1100,2590,2591],{"class":1110},"zod",[1100,2593,1369],{"class":1318},[1100,2595,2596],{"class":1102,"line":1361},[1100,2597,1383],{"emptyLinePlaceholder":21},[1100,2599,2600,2602,2604,2606,2608,2611,2613,2616,2618,2620],{"class":1102,"line":1372},[1100,2601,1305],{"class":1304},[1100,2603,1308],{"class":1304},[1100,2605,2511],{"class":1123},[1100,2607,1315],{"class":1314},[1100,2609,2610],{"class":1601},"async",[1100,2612,1965],{"class":1318},[1100,2614,2615],{"class":1956},"event",[1100,2617,1896],{"class":1318},[1100,2619,1839],{"class":1601},[1100,2621,1394],{"class":1318},[1100,2623,2624,2627,2629,2632,2634,2637,2640,2642,2644,2646,2648,2650,2652,2655,2657],{"class":1102,"line":1380},[1100,2625,2626],{"class":1601},"  const",[1100,2628,1724],{"class":1318},[1100,2630,2631],{"class":1314}," message",[1100,2633,1746],{"class":1318},[1100,2635,2636],{"class":1318}," =",[1100,2638,2639],{"class":1304}," await",[1100,2641,2516],{"class":1123},[1100,2643,1315],{"class":1324},[1100,2645,2615],{"class":1314},[1100,2647,1730],{"class":1318},[1100,2649,2582],{"class":1314},[1100,2651,1822],{"class":1318},[1100,2653,2654],{"class":1123},"object",[1100,2656,1315],{"class":1324},[1100,2658,1319],{"class":1318},[1100,2660,2661,2664,2666,2668,2670,2673,2675,2677,2680],{"class":1102,"line":1386},[1100,2662,2663],{"class":1324},"    message",[1100,2665,1328],{"class":1318},[1100,2667,2582],{"class":1314},[1100,2669,1822],{"class":1318},[1100,2671,2672],{"class":1123},"custom",[1100,2674,1573],{"class":1318},[1100,2676,2493],{"class":1106},[1100,2678,2679],{"class":1318},">",[1100,2681,2682],{"class":1324},"()\n",[1100,2684,2685,2687,2689,2691,2694],{"class":1102,"line":1397},[1100,2686,2427],{"class":1318},[1100,2688,1896],{"class":1324},[1100,2690,1822],{"class":1318},[1100,2692,2693],{"class":1314},"parse",[1100,2695,1505],{"class":1324},[1100,2697,2698],{"class":1102,"line":1413},[1100,2699,1383],{"emptyLinePlaceholder":21},[1100,2701,2702],{"class":1102,"line":1419},[1100,2703,2704],{"class":1484},"  \u002F\u002F Create a new chat\n",[1100,2706,2707,2709,2711,2713,2715,2717,2719,2721,2723,2726,2728,2731,2733,2735,2737,2739,2742,2744,2747,2749,2751,2754],{"class":1102,"line":1424},[1100,2708,2626],{"class":1601},[1100,2710,1432],{"class":1318},[1100,2712,262],{"class":1314},[1100,2714,1442],{"class":1318},[1100,2716,2636],{"class":1318},[1100,2718,2639],{"class":1304},[1100,2720,2454],{"class":1314},[1100,2722,1822],{"class":1318},[1100,2724,2725],{"class":1123},"insert",[1100,2727,1315],{"class":1324},[1100,2729,2730],{"class":1314},"schema",[1100,2732,1822],{"class":1318},[1100,2734,1801],{"class":1314},[1100,2736,1896],{"class":1324},[1100,2738,1822],{"class":1318},[1100,2740,2741],{"class":1123},"values",[1100,2743,1315],{"class":1324},[1100,2745,2746],{"class":1318},"{}",[1100,2748,1896],{"class":1324},[1100,2750,1822],{"class":1318},[1100,2752,2753],{"class":1123},"returning",[1100,2755,2682],{"class":1324},[1100,2757,2758],{"class":1102,"line":1447},[1100,2759,1383],{"emptyLinePlaceholder":21},[1100,2761,2762],{"class":1102,"line":1452},[1100,2763,2764],{"class":1484},"  \u002F\u002F Save the first user message\n",[1100,2766,2767,2770,2772,2774,2776,2778,2780,2782,2784,2786,2788,2790,2792],{"class":1102,"line":1462},[1100,2768,2769],{"class":1304},"  await",[1100,2771,2454],{"class":1314},[1100,2773,1822],{"class":1318},[1100,2775,2725],{"class":1123},[1100,2777,1315],{"class":1324},[1100,2779,2730],{"class":1314},[1100,2781,1822],{"class":1318},[1100,2783,2010],{"class":1314},[1100,2785,1896],{"class":1324},[1100,2787,1822],{"class":1318},[1100,2789,2741],{"class":1123},[1100,2791,1315],{"class":1324},[1100,2793,1319],{"class":1318},[1100,2795,2796,2799,2801,2804,2806,2808],{"class":1102,"line":1472},[1100,2797,2798],{"class":1324},"    chatId",[1100,2800,1328],{"class":1318},[1100,2802,2803],{"class":1314}," chat",[1100,2805,1822],{"class":1318},[1100,2807,2031],{"class":1314},[1100,2809,1346],{"class":1318},[1100,2811,2812,2815,2817,2819,2821,2823],{"class":1102,"line":1488},[1100,2813,2814],{"class":1324},"    role",[1100,2816,1328],{"class":1318},[1100,2818,1405],{"class":1318},[1100,2820,2161],{"class":1110},[1100,2822,1343],{"class":1318},[1100,2824,1346],{"class":1318},[1100,2826,2827,2830,2832,2834,2836],{"class":1102,"line":1494},[1100,2828,2829],{"class":1324},"    parts",[1100,2831,1328],{"class":1318},[1100,2833,2631],{"class":1314},[1100,2835,1822],{"class":1318},[1100,2837,2838],{"class":1314},"parts\n",[1100,2840,2841,2843],{"class":1102,"line":1499},[1100,2842,2427],{"class":1318},[1100,2844,1505],{"class":1324},[1100,2846,2847],{"class":1102,"line":2288},[1100,2848,1383],{"emptyLinePlaceholder":21},[1100,2850,2851,2854],{"class":1102,"line":2301},[1100,2852,2853],{"class":1304},"  return",[1100,2855,2856],{"class":1314}," chat\n",[1100,2858,2859,2861],{"class":1102,"line":2331},[1100,2860,1502],{"class":1318},[1100,2862,1505],{"class":1314},[1128,2864,2866],{"id":2865},"streaming-ai-responses","Streaming AI responses",[989,2868,2869,2870,2877,2878,2885,2886,2893],{},"Next, create the endpoint that handles the AI conversation. This endpoint uses ",[1043,2871,2874],{"href":2872,"rel":2873},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fstream-text",[1047],[1050,2875,2876],{},"streamText",", ",[1043,2879,2882],{"href":2880,"rel":2881},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream",[1047],[1050,2883,2884],{},"createUIMessageStream",", and ",[1043,2887,2890],{"href":2888,"rel":2889},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response",[1047],[1050,2891,2892],{},"createUIMessageStreamResponse"," from the AI SDK:",[1291,2895,2896],{},[1709,2897,2898],{},[1091,2899,2902],{"className":1295,"code":2900,"filename":2901,"language":1297,"meta":1096,"style":1096},"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",[1050,2903,2904,2936,2955,2977,2995,3001,3008,3015,3022,3029,3034,3046,3066,3070,3082,3116,3146,3177,3182,3186,3208,3241,3257,3269,3273,3311,3371,3385,3394,3425,3438,3443,3449,3480,3524,3531,3536,3554,3593,3599,3604,3610,3630,3658,3674,3693,3721,3728,3733,3799,3804,3809,3815,3844,3885,3914,3926,3942,3956,3963,3968,3973,3979,3996,4018,4036,4044,4061,4082,4092,4102,4112,4129,4140,4146,4152,4162,4172,4185,4200,4205,4210,4220,4236,4251,4257,4263,4271,4276,4282,4302,4317,4334,4357,4368,4376,4382,4387,4410,4416,4436,4442,4488,4504,4537,4551,4559,4564,4571,4576,4594],{"__ignoreMap":1096},[1100,2905,2906,2908,2910,2913,2915,2917,2919,2922,2924,2926,2928,2930,2932,2934],{"class":1102,"line":1103},[1100,2907,1721],{"class":1304},[1100,2909,1724],{"class":1318},[1100,2911,2912],{"class":1314}," createError",[1100,2914,1730],{"class":1318},[1100,2916,2511],{"class":1314},[1100,2918,1730],{"class":1318},[1100,2920,2921],{"class":1314}," getValidatedRouterParams",[1100,2923,1730],{"class":1318},[1100,2925,2516],{"class":1314},[1100,2927,1746],{"class":1318},[1100,2929,1749],{"class":1304},[1100,2931,1405],{"class":1318},[1100,2933,1128],{"class":1110},[1100,2935,1369],{"class":1318},[1100,2937,2938,2940,2942,2945,2947,2949,2951,2953],{"class":1102,"line":1120},[1100,2939,1721],{"class":1304},[1100,2941,1724],{"class":1318},[1100,2943,2944],{"class":1314}," eq",[1100,2946,1746],{"class":1318},[1100,2948,1749],{"class":1304},[1100,2950,1405],{"class":1318},[1100,2952,1774],{"class":1110},[1100,2954,1369],{"class":1318},[1100,2956,2957,2959,2961,2963,2965,2967,2969,2971,2973,2975],{"class":1102,"line":1334},[1100,2958,1721],{"class":1304},[1100,2960,1724],{"class":1318},[1100,2962,2454],{"class":1314},[1100,2964,1730],{"class":1318},[1100,2966,2562],{"class":1314},[1100,2968,1746],{"class":1318},[1100,2970,1749],{"class":1304},[1100,2972,1405],{"class":1318},[1100,2974,2571],{"class":1110},[1100,2976,1369],{"class":1318},[1100,2978,2979,2981,2983,2985,2987,2989,2991,2993],{"class":1102,"line":1349},[1100,2980,1721],{"class":1304},[1100,2982,1724],{"class":1318},[1100,2984,2582],{"class":1314},[1100,2986,1746],{"class":1318},[1100,2988,1749],{"class":1304},[1100,2990,1405],{"class":1318},[1100,2992,2591],{"class":1110},[1100,2994,1369],{"class":1318},[1100,2996,2997,2999],{"class":1102,"line":1361},[1100,2998,1721],{"class":1304},[1100,3000,1394],{"class":1318},[1100,3002,3003,3006],{"class":1102,"line":1372},[1100,3004,3005],{"class":1314},"  convertToModelMessages",[1100,3007,1346],{"class":1318},[1100,3009,3010,3013],{"class":1102,"line":1380},[1100,3011,3012],{"class":1314},"  createUIMessageStream",[1100,3014,1346],{"class":1318},[1100,3016,3017,3020],{"class":1102,"line":1386},[1100,3018,3019],{"class":1314},"  createUIMessageStreamResponse",[1100,3021,1346],{"class":1318},[1100,3023,3024,3027],{"class":1102,"line":1397},[1100,3025,3026],{"class":1314},"  generateText",[1100,3028,1346],{"class":1318},[1100,3030,3031],{"class":1102,"line":1413},[1100,3032,3033],{"class":1314},"  streamText\n",[1100,3035,3036,3038,3040,3042,3044],{"class":1102,"line":1419},[1100,3037,1502],{"class":1318},[1100,3039,1749],{"class":1304},[1100,3041,1405],{"class":1318},[1100,3043,2547],{"class":1110},[1100,3045,1369],{"class":1318},[1100,3047,3048,3050,3052,3054,3056,3058,3060,3062,3064],{"class":1102,"line":1424},[1100,3049,1721],{"class":1304},[1100,3051,2533],{"class":1304},[1100,3053,1724],{"class":1318},[1100,3055,2538],{"class":1314},[1100,3057,1746],{"class":1318},[1100,3059,1749],{"class":1304},[1100,3061,1405],{"class":1318},[1100,3063,2547],{"class":1110},[1100,3065,1369],{"class":1318},[1100,3067,3068],{"class":1102,"line":1447},[1100,3069,1383],{"emptyLinePlaceholder":21},[1100,3071,3072,3075,3078,3080],{"class":1102,"line":1452},[1100,3073,3074],{"class":1601},"const",[1100,3076,3077],{"class":1314}," MODELS ",[1100,3079,1605],{"class":1318},[1100,3081,1331],{"class":1314},[1100,3083,3084,3087,3090,3092,3094,3097,3099,3101,3104,3106,3108,3111,3113],{"class":1102,"line":1462},[1100,3085,3086],{"class":1318},"  {",[1100,3088,3089],{"class":1324}," value",[1100,3091,1328],{"class":1318},[1100,3093,1405],{"class":1318},[1100,3095,3096],{"class":1110},"openai\u002Fgpt-5-nano",[1100,3098,1343],{"class":1318},[1100,3100,1730],{"class":1318},[1100,3102,3103],{"class":1324}," label",[1100,3105,1328],{"class":1318},[1100,3107,1405],{"class":1318},[1100,3109,3110],{"class":1110},"GPT-5 Nano",[1100,3112,1343],{"class":1318},[1100,3114,3115],{"class":1318}," },\n",[1100,3117,3118,3120,3122,3124,3126,3129,3131,3133,3135,3137,3139,3142,3144],{"class":1102,"line":1472},[1100,3119,3086],{"class":1318},[1100,3121,3089],{"class":1324},[1100,3123,1328],{"class":1318},[1100,3125,1405],{"class":1318},[1100,3127,3128],{"class":1110},"anthropic\u002Fclaude-haiku-4.5",[1100,3130,1343],{"class":1318},[1100,3132,1730],{"class":1318},[1100,3134,3103],{"class":1324},[1100,3136,1328],{"class":1318},[1100,3138,1405],{"class":1318},[1100,3140,3141],{"class":1110},"Claude Haiku 4.5",[1100,3143,1343],{"class":1318},[1100,3145,3115],{"class":1318},[1100,3147,3148,3150,3152,3154,3156,3159,3161,3163,3165,3167,3169,3172,3174],{"class":1102,"line":1488},[1100,3149,3086],{"class":1318},[1100,3151,3089],{"class":1324},[1100,3153,1328],{"class":1318},[1100,3155,1405],{"class":1318},[1100,3157,3158],{"class":1110},"google\u002Fgemini-3-flash",[1100,3160,1343],{"class":1318},[1100,3162,1730],{"class":1318},[1100,3164,3103],{"class":1324},[1100,3166,1328],{"class":1318},[1100,3168,1405],{"class":1318},[1100,3170,3171],{"class":1110},"Gemini 3 Flash",[1100,3173,1343],{"class":1318},[1100,3175,3176],{"class":1318}," }\n",[1100,3178,3179],{"class":1102,"line":1494},[1100,3180,3181],{"class":1314},"]\n",[1100,3183,3184],{"class":1102,"line":1499},[1100,3185,1383],{"emptyLinePlaceholder":21},[1100,3187,3188,3190,3192,3194,3196,3198,3200,3202,3204,3206],{"class":1102,"line":2288},[1100,3189,1305],{"class":1304},[1100,3191,1308],{"class":1304},[1100,3193,2511],{"class":1123},[1100,3195,1315],{"class":1314},[1100,3197,2610],{"class":1601},[1100,3199,1965],{"class":1318},[1100,3201,2615],{"class":1956},[1100,3203,1896],{"class":1318},[1100,3205,1839],{"class":1601},[1100,3207,1394],{"class":1318},[1100,3209,3210,3212,3214,3217,3219,3221,3223,3225,3227,3229,3231,3233,3235,3237,3239],{"class":1102,"line":2301},[1100,3211,2626],{"class":1601},[1100,3213,1724],{"class":1318},[1100,3215,3216],{"class":1314}," id",[1100,3218,1746],{"class":1318},[1100,3220,2636],{"class":1318},[1100,3222,2639],{"class":1304},[1100,3224,2921],{"class":1123},[1100,3226,1315],{"class":1324},[1100,3228,2615],{"class":1314},[1100,3230,1730],{"class":1318},[1100,3232,2582],{"class":1314},[1100,3234,1822],{"class":1318},[1100,3236,2654],{"class":1123},[1100,3238,1315],{"class":1324},[1100,3240,1319],{"class":1318},[1100,3242,3243,3246,3248,3250,3252,3255],{"class":1102,"line":2331},[1100,3244,3245],{"class":1324},"    id",[1100,3247,1328],{"class":1318},[1100,3249,2582],{"class":1314},[1100,3251,1822],{"class":1318},[1100,3253,3254],{"class":1123},"string",[1100,3256,2682],{"class":1324},[1100,3258,3259,3261,3263,3265,3267],{"class":1102,"line":2337},[1100,3260,2427],{"class":1318},[1100,3262,1896],{"class":1324},[1100,3264,1822],{"class":1318},[1100,3266,2693],{"class":1314},[1100,3268,1505],{"class":1324},[1100,3270,3271],{"class":1102,"line":2342},[1100,3272,1383],{"emptyLinePlaceholder":21},[1100,3274,3275,3277,3279,3282,3284,3287,3289,3291,3293,3295,3297,3299,3301,3303,3305,3307,3309],{"class":1102,"line":2374},[1100,3276,2626],{"class":1601},[1100,3278,1724],{"class":1318},[1100,3280,3281],{"class":1314}," model",[1100,3283,1730],{"class":1318},[1100,3285,3286],{"class":1314}," messages",[1100,3288,1746],{"class":1318},[1100,3290,2636],{"class":1318},[1100,3292,2639],{"class":1304},[1100,3294,2516],{"class":1123},[1100,3296,1315],{"class":1324},[1100,3298,2615],{"class":1314},[1100,3300,1730],{"class":1318},[1100,3302,2582],{"class":1314},[1100,3304,1822],{"class":1318},[1100,3306,2654],{"class":1123},[1100,3308,1315],{"class":1324},[1100,3310,1319],{"class":1318},[1100,3312,3313,3316,3318,3320,3322,3324,3326,3328,3331,3333,3336,3338,3341,3343,3346,3348,3351,3353,3356,3358,3360,3363,3365,3367,3369],{"class":1102,"line":2390},[1100,3314,3315],{"class":1324},"    model",[1100,3317,1328],{"class":1318},[1100,3319,2582],{"class":1314},[1100,3321,1822],{"class":1318},[1100,3323,3254],{"class":1123},[1100,3325,1819],{"class":1324},[1100,3327,1822],{"class":1318},[1100,3329,3330],{"class":1123},"refine",[1100,3332,1315],{"class":1324},[1100,3334,3335],{"class":1956},"value",[1100,3337,1839],{"class":1601},[1100,3339,3340],{"class":1314}," MODELS",[1100,3342,1822],{"class":1318},[1100,3344,3345],{"class":1123},"some",[1100,3347,1315],{"class":1324},[1100,3349,3350],{"class":1956},"m",[1100,3352,1839],{"class":1601},[1100,3354,3355],{"class":1314}," m",[1100,3357,1822],{"class":1318},[1100,3359,3335],{"class":1314},[1100,3361,3362],{"class":1318}," ===",[1100,3364,3089],{"class":1314},[1100,3366,1896],{"class":1324},[1100,3368,1730],{"class":1318},[1100,3370,1394],{"class":1318},[1100,3372,3373,3376,3378,3380,3383],{"class":1102,"line":2408},[1100,3374,3375],{"class":1324},"      message",[1100,3377,1328],{"class":1318},[1100,3379,1405],{"class":1318},[1100,3381,3382],{"class":1110},"Invalid model",[1100,3384,1369],{"class":1318},[1100,3386,3387,3390,3392],{"class":1102,"line":2424},[1100,3388,3389],{"class":1318},"    }",[1100,3391,1896],{"class":1324},[1100,3393,1346],{"class":1318},[1100,3395,3396,3399,3401,3403,3405,3408,3410,3413,3415,3417,3419,3421,3423],{"class":1102,"line":2432},[1100,3397,3398],{"class":1324},"    messages",[1100,3400,1328],{"class":1318},[1100,3402,2582],{"class":1314},[1100,3404,1822],{"class":1318},[1100,3406,3407],{"class":1123},"array",[1100,3409,1315],{"class":1324},[1100,3411,3412],{"class":1314},"z",[1100,3414,1822],{"class":1318},[1100,3416,2672],{"class":1123},[1100,3418,1573],{"class":1318},[1100,3420,2493],{"class":1106},[1100,3422,2679],{"class":1318},[1100,3424,1922],{"class":1324},[1100,3426,3428,3430,3432,3434,3436],{"class":1102,"line":3427},30,[1100,3429,2427],{"class":1318},[1100,3431,1896],{"class":1324},[1100,3433,1822],{"class":1318},[1100,3435,2693],{"class":1314},[1100,3437,1505],{"class":1324},[1100,3439,3441],{"class":1102,"line":3440},31,[1100,3442,1383],{"emptyLinePlaceholder":21},[1100,3444,3446],{"class":1102,"line":3445},32,[1100,3447,3448],{"class":1484},"  \u002F\u002F Fetch the chat from the database\n",[1100,3450,3452,3454,3456,3458,3460,3462,3464,3467,3469,3471,3473,3476,3478],{"class":1102,"line":3451},33,[1100,3453,2626],{"class":1601},[1100,3455,2803],{"class":1314},[1100,3457,2636],{"class":1318},[1100,3459,2639],{"class":1304},[1100,3461,2454],{"class":1314},[1100,3463,1822],{"class":1318},[1100,3465,3466],{"class":1314},"query",[1100,3468,1822],{"class":1318},[1100,3470,1801],{"class":1314},[1100,3472,1822],{"class":1318},[1100,3474,3475],{"class":1123},"findFirst",[1100,3477,1315],{"class":1324},[1100,3479,1319],{"class":1318},[1100,3481,3483,3486,3488,3490,3492,3494,3496,3498,3500,3502,3504,3506,3508,3510,3512,3514,3516,3519,3522],{"class":1102,"line":3482},34,[1100,3484,3485],{"class":1123},"    where",[1100,3487,1328],{"class":1318},[1100,3489,1965],{"class":1318},[1100,3491,262],{"class":1956},[1100,3493,1730],{"class":1318},[1100,3495,1724],{"class":1318},[1100,3497,2944],{"class":1956},[1100,3499,1960],{"class":1318},[1100,3501,1839],{"class":1601},[1100,3503,2944],{"class":1123},[1100,3505,1315],{"class":1324},[1100,3507,262],{"class":1314},[1100,3509,1822],{"class":1318},[1100,3511,2031],{"class":1314},[1100,3513,1730],{"class":1318},[1100,3515,3216],{"class":1314},[1100,3517,3518],{"class":1304}," as",[1100,3520,3521],{"class":1106}," string",[1100,3523,1505],{"class":1324},[1100,3525,3527,3529],{"class":1102,"line":3526},35,[1100,3528,2427],{"class":1318},[1100,3530,1505],{"class":1324},[1100,3532,3534],{"class":1102,"line":3533},36,[1100,3535,1383],{"emptyLinePlaceholder":21},[1100,3537,3539,3542,3544,3547,3549,3552],{"class":1102,"line":3538},37,[1100,3540,3541],{"class":1304},"  if",[1100,3543,1965],{"class":1324},[1100,3545,3546],{"class":1318},"!",[1100,3548,262],{"class":1314},[1100,3550,3551],{"class":1324},") ",[1100,3553,1319],{"class":1318},[1100,3555,3557,3560,3562,3564,3566,3569,3571,3575,3577,3580,3582,3584,3587,3589,3591],{"class":1102,"line":3556},38,[1100,3558,3559],{"class":1304},"    throw",[1100,3561,2912],{"class":1123},[1100,3563,1315],{"class":1324},[1100,3565,1879],{"class":1318},[1100,3567,3568],{"class":1324}," statusCode",[1100,3570,1328],{"class":1318},[1100,3572,3574],{"class":3573},"sbssI"," 404",[1100,3576,1730],{"class":1318},[1100,3578,3579],{"class":1324}," statusMessage",[1100,3581,1328],{"class":1318},[1100,3583,1405],{"class":1318},[1100,3585,3586],{"class":1110},"Chat not found",[1100,3588,1343],{"class":1318},[1100,3590,1746],{"class":1318},[1100,3592,1505],{"class":1324},[1100,3594,3596],{"class":1102,"line":3595},39,[1100,3597,3598],{"class":1318},"  }\n",[1100,3600,3602],{"class":1102,"line":3601},40,[1100,3603,1383],{"emptyLinePlaceholder":21},[1100,3605,3607],{"class":1102,"line":3606},41,[1100,3608,3609],{"class":1484},"  \u002F\u002F Generate a title for the chat if it doesn't have one\n",[1100,3611,3613,3615,3617,3619,3621,3623,3626,3628],{"class":1102,"line":3612},42,[1100,3614,3541],{"class":1304},[1100,3616,1965],{"class":1324},[1100,3618,3546],{"class":1318},[1100,3620,262],{"class":1314},[1100,3622,1822],{"class":1318},[1100,3624,3625],{"class":1314},"title",[1100,3627,3551],{"class":1324},[1100,3629,1319],{"class":1318},[1100,3631,3633,3636,3638,3640,3642,3645,3647,3649,3651,3654,3656],{"class":1102,"line":3632},43,[1100,3634,3635],{"class":1601},"    const",[1100,3637,1724],{"class":1318},[1100,3639,1733],{"class":1324},[1100,3641,1328],{"class":1318},[1100,3643,3644],{"class":1314}," title",[1100,3646,1746],{"class":1318},[1100,3648,2636],{"class":1318},[1100,3650,2639],{"class":1304},[1100,3652,3653],{"class":1123}," generateText",[1100,3655,1315],{"class":1324},[1100,3657,1319],{"class":1318},[1100,3659,3661,3664,3666,3668,3670,3672],{"class":1102,"line":3660},44,[1100,3662,3663],{"class":1324},"      model",[1100,3665,1328],{"class":1318},[1100,3667,1405],{"class":1318},[1100,3669,3128],{"class":1110},[1100,3671,1343],{"class":1318},[1100,3673,1346],{"class":1318},[1100,3675,3677,3680,3682,3685,3688,3691],{"class":1102,"line":3676},45,[1100,3678,3679],{"class":1324},"      system",[1100,3681,1328],{"class":1318},[1100,3683,3684],{"class":1318}," `",[1100,3686,3687],{"class":1110},"Generate a short title (max 30 characters) based on the user's message. No quotes or punctuation.",[1100,3689,3690],{"class":1318},"`",[1100,3692,1346],{"class":1318},[1100,3694,3696,3699,3701,3704,3706,3709,3711,3713,3716,3719],{"class":1102,"line":3695},46,[1100,3697,3698],{"class":1324},"      prompt",[1100,3700,1328],{"class":1318},[1100,3702,3703],{"class":1314}," JSON",[1100,3705,1822],{"class":1318},[1100,3707,3708],{"class":1123},"stringify",[1100,3710,1315],{"class":1324},[1100,3712,2010],{"class":1314},[1100,3714,3715],{"class":1324},"[",[1100,3717,3718],{"class":3573},"0",[1100,3720,2334],{"class":1324},[1100,3722,3724,3726],{"class":1102,"line":3723},47,[1100,3725,3389],{"class":1318},[1100,3727,1505],{"class":1324},[1100,3729,3731],{"class":1102,"line":3730},48,[1100,3732,1383],{"emptyLinePlaceholder":21},[1100,3734,3736,3739,3741,3743,3746,3748,3750,3752,3754,3756,3758,3761,3763,3765,3767,3769,3771,3773,3776,3778,3781,3783,3785,3787,3789,3791,3793,3795,3797],{"class":1102,"line":3735},49,[1100,3737,3738],{"class":1304},"    await",[1100,3740,2454],{"class":1314},[1100,3742,1822],{"class":1318},[1100,3744,3745],{"class":1123},"update",[1100,3747,1315],{"class":1324},[1100,3749,2730],{"class":1314},[1100,3751,1822],{"class":1318},[1100,3753,1801],{"class":1314},[1100,3755,1896],{"class":1324},[1100,3757,1822],{"class":1318},[1100,3759,3760],{"class":1123},"set",[1100,3762,1315],{"class":1324},[1100,3764,1879],{"class":1318},[1100,3766,3644],{"class":1314},[1100,3768,1746],{"class":1318},[1100,3770,1896],{"class":1324},[1100,3772,1822],{"class":1318},[1100,3774,3775],{"class":1123},"where",[1100,3777,1315],{"class":1324},[1100,3779,3780],{"class":1123},"eq",[1100,3782,1315],{"class":1324},[1100,3784,2730],{"class":1314},[1100,3786,1822],{"class":1318},[1100,3788,1801],{"class":1314},[1100,3790,1822],{"class":1318},[1100,3792,2031],{"class":1314},[1100,3794,1730],{"class":1318},[1100,3796,3216],{"class":1314},[1100,3798,1986],{"class":1324},[1100,3800,3802],{"class":1102,"line":3801},50,[1100,3803,3598],{"class":1318},[1100,3805,3807],{"class":1102,"line":3806},51,[1100,3808,1383],{"emptyLinePlaceholder":21},[1100,3810,3812],{"class":1102,"line":3811},52,[1100,3813,3814],{"class":1484},"  \u002F\u002F Save the user message if it's a follow-up\n",[1100,3816,3818,3820,3823,3825,3827,3829,3831,3833,3836,3839,3842],{"class":1102,"line":3817},53,[1100,3819,2626],{"class":1601},[1100,3821,3822],{"class":1314}," lastMessage",[1100,3824,2636],{"class":1318},[1100,3826,3286],{"class":1314},[1100,3828,3715],{"class":1324},[1100,3830,2010],{"class":1314},[1100,3832,1822],{"class":1318},[1100,3834,3835],{"class":1314},"length",[1100,3837,3838],{"class":1318}," -",[1100,3840,3841],{"class":3573}," 1",[1100,3843,3181],{"class":1324},[1100,3845,3847,3849,3851,3854,3857,3859,3861,3863,3865,3867,3870,3872,3874,3876,3879,3881,3883],{"class":1102,"line":3846},54,[1100,3848,3541],{"class":1304},[1100,3850,1965],{"class":1324},[1100,3852,3853],{"class":1314},"lastMessage",[1100,3855,3856],{"class":1318},"?.",[1100,3858,2143],{"class":1314},[1100,3860,3362],{"class":1318},[1100,3862,1405],{"class":1318},[1100,3864,2161],{"class":1110},[1100,3866,1343],{"class":1318},[1100,3868,3869],{"class":1318}," &&",[1100,3871,3286],{"class":1314},[1100,3873,1822],{"class":1318},[1100,3875,3835],{"class":1314},[1100,3877,3878],{"class":1318}," >",[1100,3880,3841],{"class":3573},[1100,3882,3551],{"class":1324},[1100,3884,1319],{"class":1318},[1100,3886,3888,3890,3892,3894,3896,3898,3900,3902,3904,3906,3908,3910,3912],{"class":1102,"line":3887},55,[1100,3889,3738],{"class":1304},[1100,3891,2454],{"class":1314},[1100,3893,1822],{"class":1318},[1100,3895,2725],{"class":1123},[1100,3897,1315],{"class":1324},[1100,3899,2730],{"class":1314},[1100,3901,1822],{"class":1318},[1100,3903,2010],{"class":1314},[1100,3905,1896],{"class":1324},[1100,3907,1822],{"class":1318},[1100,3909,2741],{"class":1123},[1100,3911,1315],{"class":1324},[1100,3913,1319],{"class":1318},[1100,3915,3917,3920,3922,3924],{"class":1102,"line":3916},56,[1100,3918,3919],{"class":1324},"      chatId",[1100,3921,1328],{"class":1318},[1100,3923,3216],{"class":1314},[1100,3925,1346],{"class":1318},[1100,3927,3929,3932,3934,3936,3938,3940],{"class":1102,"line":3928},57,[1100,3930,3931],{"class":1324},"      role",[1100,3933,1328],{"class":1318},[1100,3935,1405],{"class":1318},[1100,3937,2161],{"class":1110},[1100,3939,1343],{"class":1318},[1100,3941,1346],{"class":1318},[1100,3943,3945,3948,3950,3952,3954],{"class":1102,"line":3944},58,[1100,3946,3947],{"class":1324},"      parts",[1100,3949,1328],{"class":1318},[1100,3951,3822],{"class":1314},[1100,3953,1822],{"class":1318},[1100,3955,2838],{"class":1314},[1100,3957,3959,3961],{"class":1102,"line":3958},59,[1100,3960,3389],{"class":1318},[1100,3962,1505],{"class":1324},[1100,3964,3966],{"class":1102,"line":3965},60,[1100,3967,3598],{"class":1318},[1100,3969,3971],{"class":1102,"line":3970},61,[1100,3972,1383],{"emptyLinePlaceholder":21},[1100,3974,3976],{"class":1102,"line":3975},62,[1100,3977,3978],{"class":1484},"  \u002F\u002F Create the streaming response\n",[1100,3980,3982,3984,3987,3989,3992,3994],{"class":1102,"line":3981},63,[1100,3983,2626],{"class":1601},[1100,3985,3986],{"class":1314}," stream",[1100,3988,2636],{"class":1318},[1100,3990,3991],{"class":1123}," createUIMessageStream",[1100,3993,1315],{"class":1324},[1100,3995,1319],{"class":1318},[1100,3997,3999,4002,4004,4007,4009,4012,4014,4016],{"class":1102,"line":3998},64,[1100,4000,4001],{"class":1123},"    execute",[1100,4003,1328],{"class":1318},[1100,4005,4006],{"class":1601}," async",[1100,4008,1953],{"class":1318},[1100,4010,4011],{"class":1956}," writer",[1100,4013,1960],{"class":1318},[1100,4015,1839],{"class":1601},[1100,4017,1394],{"class":1318},[1100,4019,4021,4024,4027,4029,4032,4034],{"class":1102,"line":4020},65,[1100,4022,4023],{"class":1601},"      const",[1100,4025,4026],{"class":1314}," result",[1100,4028,2636],{"class":1318},[1100,4030,4031],{"class":1123}," streamText",[1100,4033,1315],{"class":1324},[1100,4035,1319],{"class":1318},[1100,4037,4039,4042],{"class":1102,"line":4038},66,[1100,4040,4041],{"class":1314},"        model",[1100,4043,1346],{"class":1318},[1100,4045,4047,4050,4052,4054,4057,4059],{"class":1102,"line":4046},67,[1100,4048,4049],{"class":1324},"        system",[1100,4051,1328],{"class":1318},[1100,4053,3684],{"class":1318},[1100,4055,4056],{"class":1110},"You are a helpful AI assistant. Be concise and friendly.",[1100,4058,3690],{"class":1318},[1100,4060,1346],{"class":1318},[1100,4062,4064,4067,4069,4071,4074,4076,4078,4080],{"class":1102,"line":4063},68,[1100,4065,4066],{"class":1324},"        messages",[1100,4068,1328],{"class":1318},[1100,4070,2639],{"class":1304},[1100,4072,4073],{"class":1123}," convertToModelMessages",[1100,4075,1315],{"class":1324},[1100,4077,2010],{"class":1314},[1100,4079,1896],{"class":1324},[1100,4081,1346],{"class":1318},[1100,4083,4085,4088,4090],{"class":1102,"line":4084},69,[1100,4086,4087],{"class":1324},"        providerOptions",[1100,4089,1328],{"class":1318},[1100,4091,1394],{"class":1318},[1100,4093,4095,4098,4100],{"class":1102,"line":4094},70,[1100,4096,4097],{"class":1324},"          anthropic",[1100,4099,1328],{"class":1318},[1100,4101,1394],{"class":1318},[1100,4103,4105,4108,4110],{"class":1102,"line":4104},71,[1100,4106,4107],{"class":1324},"            thinking",[1100,4109,1328],{"class":1318},[1100,4111,1394],{"class":1318},[1100,4113,4115,4118,4120,4122,4125,4127],{"class":1102,"line":4114},72,[1100,4116,4117],{"class":1324},"              type",[1100,4119,1328],{"class":1318},[1100,4121,1405],{"class":1318},[1100,4123,4124],{"class":1110},"enabled",[1100,4126,1343],{"class":1318},[1100,4128,1346],{"class":1318},[1100,4130,4132,4135,4137],{"class":1102,"line":4131},73,[1100,4133,4134],{"class":1324},"              budgetTokens",[1100,4136,1328],{"class":1318},[1100,4138,4139],{"class":3573}," 2048\n",[1100,4141,4143],{"class":1102,"line":4142},74,[1100,4144,4145],{"class":1318},"            }\n",[1100,4147,4149],{"class":1102,"line":4148},75,[1100,4150,4151],{"class":1318},"          },\n",[1100,4153,4155,4158,4160],{"class":1102,"line":4154},76,[1100,4156,4157],{"class":1324},"          google",[1100,4159,1328],{"class":1318},[1100,4161,1394],{"class":1318},[1100,4163,4165,4168,4170],{"class":1102,"line":4164},77,[1100,4166,4167],{"class":1324},"            thinkingConfig",[1100,4169,1328],{"class":1318},[1100,4171,1394],{"class":1318},[1100,4173,4175,4178,4180,4183],{"class":1102,"line":4174},78,[1100,4176,4177],{"class":1324},"              includeThoughts",[1100,4179,1328],{"class":1318},[1100,4181,4182],{"class":1480}," true",[1100,4184,1346],{"class":1318},[1100,4186,4188,4191,4193,4195,4198],{"class":1102,"line":4187},79,[1100,4189,4190],{"class":1324},"              thinkingLevel",[1100,4192,1328],{"class":1318},[1100,4194,1405],{"class":1318},[1100,4196,4197],{"class":1110},"low",[1100,4199,1369],{"class":1318},[1100,4201,4203],{"class":1102,"line":4202},80,[1100,4204,4145],{"class":1318},[1100,4206,4208],{"class":1102,"line":4207},81,[1100,4209,4151],{"class":1318},[1100,4211,4213,4216,4218],{"class":1102,"line":4212},82,[1100,4214,4215],{"class":1324},"          openai",[1100,4217,1328],{"class":1318},[1100,4219,1394],{"class":1318},[1100,4221,4223,4226,4228,4230,4232,4234],{"class":1102,"line":4222},83,[1100,4224,4225],{"class":1324},"            reasoningEffort",[1100,4227,1328],{"class":1318},[1100,4229,1405],{"class":1318},[1100,4231,4197],{"class":1110},[1100,4233,1343],{"class":1318},[1100,4235,1346],{"class":1318},[1100,4237,4239,4242,4244,4246,4249],{"class":1102,"line":4238},84,[1100,4240,4241],{"class":1324},"            reasoningSummary",[1100,4243,1328],{"class":1318},[1100,4245,1405],{"class":1318},[1100,4247,4248],{"class":1110},"detailed",[1100,4250,1369],{"class":1318},[1100,4252,4254],{"class":1102,"line":4253},85,[1100,4255,4256],{"class":1318},"          }\n",[1100,4258,4260],{"class":1102,"line":4259},86,[1100,4261,4262],{"class":1318},"        }\n",[1100,4264,4266,4269],{"class":1102,"line":4265},87,[1100,4267,4268],{"class":1318},"      }",[1100,4270,1505],{"class":1324},[1100,4272,4274],{"class":1102,"line":4273},88,[1100,4275,1383],{"emptyLinePlaceholder":21},[1100,4277,4279],{"class":1102,"line":4278},89,[1100,4280,4281],{"class":1484},"      \u002F\u002F Notify the client that a title was generated\n",[1100,4283,4285,4288,4290,4292,4294,4296,4298,4300],{"class":1102,"line":4284},90,[1100,4286,4287],{"class":1304},"      if",[1100,4289,1965],{"class":1324},[1100,4291,3546],{"class":1318},[1100,4293,262],{"class":1314},[1100,4295,1822],{"class":1318},[1100,4297,3625],{"class":1314},[1100,4299,3551],{"class":1324},[1100,4301,1319],{"class":1318},[1100,4303,4305,4308,4310,4313,4315],{"class":1102,"line":4304},91,[1100,4306,4307],{"class":1314},"        writer",[1100,4309,1822],{"class":1318},[1100,4311,4312],{"class":1123},"write",[1100,4314,1315],{"class":1324},[1100,4316,1319],{"class":1318},[1100,4318,4320,4323,4325,4327,4330,4332],{"class":1102,"line":4319},92,[1100,4321,4322],{"class":1324},"          type",[1100,4324,1328],{"class":1318},[1100,4326,1405],{"class":1318},[1100,4328,4329],{"class":1110},"data-chat-title",[1100,4331,1343],{"class":1318},[1100,4333,1346],{"class":1318},[1100,4335,4337,4340,4342,4344,4346,4348,4350,4353,4355],{"class":1102,"line":4336},93,[1100,4338,4339],{"class":1324},"          data",[1100,4341,1328],{"class":1318},[1100,4343,1724],{"class":1318},[1100,4345,2631],{"class":1324},[1100,4347,1328],{"class":1318},[1100,4349,1405],{"class":1318},[1100,4351,4352],{"class":1110},"Title generated",[1100,4354,1343],{"class":1318},[1100,4356,3115],{"class":1318},[1100,4358,4360,4363,4365],{"class":1102,"line":4359},94,[1100,4361,4362],{"class":1324},"          transient",[1100,4364,1328],{"class":1318},[1100,4366,4367],{"class":1480}," true\n",[1100,4369,4371,4374],{"class":1102,"line":4370},95,[1100,4372,4373],{"class":1318},"        }",[1100,4375,1505],{"class":1324},[1100,4377,4379],{"class":1102,"line":4378},96,[1100,4380,4381],{"class":1318},"      }\n",[1100,4383,4385],{"class":1102,"line":4384},97,[1100,4386,1383],{"emptyLinePlaceholder":21},[1100,4388,4390,4393,4395,4398,4400,4403,4405,4408],{"class":1102,"line":4389},98,[1100,4391,4392],{"class":1314},"      writer",[1100,4394,1822],{"class":1318},[1100,4396,4397],{"class":1123},"merge",[1100,4399,1315],{"class":1324},[1100,4401,4402],{"class":1314},"result",[1100,4404,1822],{"class":1318},[1100,4406,4407],{"class":1123},"toUIMessageStream",[1100,4409,1922],{"class":1324},[1100,4411,4413],{"class":1102,"line":4412},99,[1100,4414,4415],{"class":1318},"    },\n",[1100,4417,4419,4422,4424,4426,4428,4430,4432,4434],{"class":1102,"line":4418},100,[1100,4420,4421],{"class":1123},"    onFinish",[1100,4423,1328],{"class":1318},[1100,4425,4006],{"class":1601},[1100,4427,1953],{"class":1318},[1100,4429,3286],{"class":1956},[1100,4431,1960],{"class":1318},[1100,4433,1839],{"class":1601},[1100,4435,1394],{"class":1318},[1100,4437,4439],{"class":1102,"line":4438},101,[1100,4440,4441],{"class":1484},"      \u002F\u002F Save the assistant's response to the database\n",[1100,4443,4445,4448,4450,4452,4454,4456,4458,4460,4462,4464,4466,4468,4470,4472,4474,4477,4479,4482,4484,4486],{"class":1102,"line":4444},102,[1100,4446,4447],{"class":1304},"      await",[1100,4449,2454],{"class":1314},[1100,4451,1822],{"class":1318},[1100,4453,2725],{"class":1123},[1100,4455,1315],{"class":1324},[1100,4457,2730],{"class":1314},[1100,4459,1822],{"class":1318},[1100,4461,2010],{"class":1314},[1100,4463,1896],{"class":1324},[1100,4465,1822],{"class":1318},[1100,4467,2741],{"class":1123},[1100,4469,1315],{"class":1324},[1100,4471,2010],{"class":1314},[1100,4473,1822],{"class":1318},[1100,4475,4476],{"class":1123},"map",[1100,4478,1315],{"class":1324},[1100,4480,4481],{"class":1956},"message",[1100,4483,1839],{"class":1601},[1100,4485,1965],{"class":1324},[1100,4487,1319],{"class":1318},[1100,4489,4491,4494,4496,4498,4500,4502],{"class":1102,"line":4490},103,[1100,4492,4493],{"class":1324},"        chatId",[1100,4495,1328],{"class":1318},[1100,4497,2803],{"class":1314},[1100,4499,1822],{"class":1318},[1100,4501,2031],{"class":1314},[1100,4503,1346],{"class":1318},[1100,4505,4507,4510,4512,4514,4516,4518,4520,4522,4524,4526,4529,4531,4533,4535],{"class":1102,"line":4506},104,[1100,4508,4509],{"class":1324},"        role",[1100,4511,1328],{"class":1318},[1100,4513,2631],{"class":1314},[1100,4515,1822],{"class":1318},[1100,4517,2143],{"class":1314},[1100,4519,3518],{"class":1304},[1100,4521,1405],{"class":1318},[1100,4523,2161],{"class":1110},[1100,4525,1343],{"class":1318},[1100,4527,4528],{"class":1318}," |",[1100,4530,1405],{"class":1318},[1100,4532,2170],{"class":1110},[1100,4534,1343],{"class":1318},[1100,4536,1346],{"class":1318},[1100,4538,4540,4543,4545,4547,4549],{"class":1102,"line":4539},105,[1100,4541,4542],{"class":1324},"        parts",[1100,4544,1328],{"class":1318},[1100,4546,2631],{"class":1314},[1100,4548,1822],{"class":1318},[1100,4550,2838],{"class":1314},[1100,4552,4554,4556],{"class":1102,"line":4553},106,[1100,4555,4268],{"class":1318},[1100,4557,4558],{"class":1324},")))\n",[1100,4560,4562],{"class":1102,"line":4561},107,[1100,4563,1491],{"class":1318},[1100,4565,4567,4569],{"class":1102,"line":4566},108,[1100,4568,2427],{"class":1318},[1100,4570,1505],{"class":1324},[1100,4572,4574],{"class":1102,"line":4573},109,[1100,4575,1383],{"emptyLinePlaceholder":21},[1100,4577,4579,4581,4584,4586,4588,4590,4592],{"class":1102,"line":4578},110,[1100,4580,2853],{"class":1304},[1100,4582,4583],{"class":1123}," createUIMessageStreamResponse",[1100,4585,1315],{"class":1324},[1100,4587,1879],{"class":1318},[1100,4589,3986],{"class":1314},[1100,4591,1746],{"class":1318},[1100,4593,1505],{"class":1324},[1100,4595,4597,4599],{"class":1102,"line":4596},111,[1100,4598,1502],{"class":1318},[1100,4600,1505],{"class":1314},[989,4602,4603],{},"Here's what each part does:",[989,4605,4606],{},[1007,4607,4608],{},"AI Gateway",[989,4610,4611,4612,4615],{},"Thanks to ",[1043,4613,1081],{"href":1079,"rel":4614},[1047],", we can use any AI model supported by the gateway just by specifying the model name.",[989,4617,4618],{},[1007,4619,4620],{},"Automatic Title Generation",[989,4622,4623,4624,4631],{},"When a chat doesn't have a title yet, we use ",[1043,4625,4628],{"href":4626,"rel":4627},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fgenerate-text#generatetext",[1047],[1050,4629,4630],{},"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\".",[989,4633,4634],{},[1007,4635,4636],{},"Streaming with streamText",[989,4638,4639,4640,4645],{},"The ",[1043,4641,4643],{"href":2872,"rel":4642},[1047],[1050,4644,2876],{}," function generates a streaming response from the AI model. Key options include:",[1001,4647,4648,4654,4659],{},[1004,4649,4650,4653],{},[1050,4651,4652],{},"model",": The AI model to use",[1004,4655,4656,4658],{},[1050,4657,2179],{},": Instructions that guide the AI's behavior",[1004,4660,4661,4663],{},[1050,4662,2010],{},": The conversation history",[989,4665,4666],{},[1007,4667,4668],{},"UIMessageStream",[989,4670,4639,4671,1053,4677,4683],{},[1043,4672,4675],{"href":4673,"rel":4674},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream#createuimessagestream",[1047],[1050,4676,2884],{},[1043,4678,4681],{"href":4679,"rel":4680},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response#createuimessagestreamresponse",[1047],[1050,4682,2892],{}," 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.",[989,4685,4639,4686,4689,4690,4692,4693,4696],{},[1050,4687,4688],{},"writer.write()"," method allows sending custom data events to the client (like ",[1050,4691,4329],{},"), while ",[1050,4694,4695],{},"onFinish"," is called when streaming completes, perfect for persisting the assistant's response.",[1128,4698,4700],{"id":4699},"fetching-a-chat","Fetching a chat",[989,4702,4703],{},"Add an endpoint to fetch existing chat data from your database:",[1291,4705,4706],{},[1091,4707,4710],{"className":1295,"code":4708,"filename":4709,"language":1297,"meta":1096,"style":1096},"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",[1050,4711,4712,4738,4761,4783,4801,4805,4827,4859,4873,4885,4889,4917,4948,4957,4966,4995,4999,5003,5009,5013,5027,5059,5063,5067,5073],{"__ignoreMap":1096},[1100,4713,4714,4716,4718,4720,4722,4724,4726,4728,4730,4732,4734,4736],{"class":1102,"line":1103},[1100,4715,1721],{"class":1304},[1100,4717,1724],{"class":1318},[1100,4719,2912],{"class":1314},[1100,4721,1730],{"class":1318},[1100,4723,2511],{"class":1314},[1100,4725,1730],{"class":1318},[1100,4727,2921],{"class":1314},[1100,4729,1746],{"class":1318},[1100,4731,1749],{"class":1304},[1100,4733,1405],{"class":1318},[1100,4735,1128],{"class":1110},[1100,4737,1369],{"class":1318},[1100,4739,4740,4742,4744,4747,4749,4751,4753,4755,4757,4759],{"class":1102,"line":1120},[1100,4741,1721],{"class":1304},[1100,4743,1724],{"class":1318},[1100,4745,4746],{"class":1314}," asc",[1100,4748,1730],{"class":1318},[1100,4750,2944],{"class":1314},[1100,4752,1746],{"class":1318},[1100,4754,1749],{"class":1304},[1100,4756,1405],{"class":1318},[1100,4758,1774],{"class":1110},[1100,4760,1369],{"class":1318},[1100,4762,4763,4765,4767,4769,4771,4773,4775,4777,4779,4781],{"class":1102,"line":1334},[1100,4764,1721],{"class":1304},[1100,4766,1724],{"class":1318},[1100,4768,2454],{"class":1314},[1100,4770,1730],{"class":1318},[1100,4772,2562],{"class":1314},[1100,4774,1746],{"class":1318},[1100,4776,1749],{"class":1304},[1100,4778,1405],{"class":1318},[1100,4780,2571],{"class":1110},[1100,4782,1369],{"class":1318},[1100,4784,4785,4787,4789,4791,4793,4795,4797,4799],{"class":1102,"line":1349},[1100,4786,1721],{"class":1304},[1100,4788,1724],{"class":1318},[1100,4790,2582],{"class":1314},[1100,4792,1746],{"class":1318},[1100,4794,1749],{"class":1304},[1100,4796,1405],{"class":1318},[1100,4798,2591],{"class":1110},[1100,4800,1369],{"class":1318},[1100,4802,4803],{"class":1102,"line":1361},[1100,4804,1383],{"emptyLinePlaceholder":21},[1100,4806,4807,4809,4811,4813,4815,4817,4819,4821,4823,4825],{"class":1102,"line":1372},[1100,4808,1305],{"class":1304},[1100,4810,1308],{"class":1304},[1100,4812,2511],{"class":1123},[1100,4814,1315],{"class":1314},[1100,4816,2610],{"class":1601},[1100,4818,1965],{"class":1318},[1100,4820,2615],{"class":1956},[1100,4822,1896],{"class":1318},[1100,4824,1839],{"class":1601},[1100,4826,1394],{"class":1318},[1100,4828,4829,4831,4833,4835,4837,4839,4841,4843,4845,4847,4849,4851,4853,4855,4857],{"class":1102,"line":1380},[1100,4830,2626],{"class":1601},[1100,4832,1724],{"class":1318},[1100,4834,3216],{"class":1314},[1100,4836,1746],{"class":1318},[1100,4838,2636],{"class":1318},[1100,4840,2639],{"class":1304},[1100,4842,2921],{"class":1123},[1100,4844,1315],{"class":1324},[1100,4846,2615],{"class":1314},[1100,4848,1730],{"class":1318},[1100,4850,2582],{"class":1314},[1100,4852,1822],{"class":1318},[1100,4854,2654],{"class":1123},[1100,4856,1315],{"class":1324},[1100,4858,1319],{"class":1318},[1100,4860,4861,4863,4865,4867,4869,4871],{"class":1102,"line":1386},[1100,4862,3245],{"class":1324},[1100,4864,1328],{"class":1318},[1100,4866,2582],{"class":1314},[1100,4868,1822],{"class":1318},[1100,4870,3254],{"class":1123},[1100,4872,2682],{"class":1324},[1100,4874,4875,4877,4879,4881,4883],{"class":1102,"line":1397},[1100,4876,2427],{"class":1318},[1100,4878,1896],{"class":1324},[1100,4880,1822],{"class":1318},[1100,4882,2693],{"class":1314},[1100,4884,1505],{"class":1324},[1100,4886,4887],{"class":1102,"line":1413},[1100,4888,1383],{"emptyLinePlaceholder":21},[1100,4890,4891,4893,4895,4897,4899,4901,4903,4905,4907,4909,4911,4913,4915],{"class":1102,"line":1419},[1100,4892,2626],{"class":1601},[1100,4894,2803],{"class":1314},[1100,4896,2636],{"class":1318},[1100,4898,2639],{"class":1304},[1100,4900,2454],{"class":1314},[1100,4902,1822],{"class":1318},[1100,4904,3466],{"class":1314},[1100,4906,1822],{"class":1318},[1100,4908,1801],{"class":1314},[1100,4910,1822],{"class":1318},[1100,4912,3475],{"class":1123},[1100,4914,1315],{"class":1324},[1100,4916,1319],{"class":1318},[1100,4918,4919,4921,4923,4925,4927,4929,4931,4933,4935,4937,4939,4941,4943,4946],{"class":1102,"line":1424},[1100,4920,3485],{"class":1324},[1100,4922,1328],{"class":1318},[1100,4924,1965],{"class":1324},[1100,4926,3780],{"class":1123},[1100,4928,1315],{"class":1324},[1100,4930,2730],{"class":1314},[1100,4932,1822],{"class":1318},[1100,4934,1801],{"class":1314},[1100,4936,1822],{"class":1318},[1100,4938,2031],{"class":1314},[1100,4940,1730],{"class":1318},[1100,4942,3216],{"class":1314},[1100,4944,4945],{"class":1324},"))",[1100,4947,1346],{"class":1318},[1100,4949,4950,4953,4955],{"class":1102,"line":1447},[1100,4951,4952],{"class":1324},"    with",[1100,4954,1328],{"class":1318},[1100,4956,1394],{"class":1318},[1100,4958,4959,4962,4964],{"class":1102,"line":1452},[1100,4960,4961],{"class":1324},"      messages",[1100,4963,1328],{"class":1318},[1100,4965,1394],{"class":1318},[1100,4967,4968,4971,4973,4976,4978,4980,4982,4984,4986,4988,4990,4993],{"class":1102,"line":1462},[1100,4969,4970],{"class":1123},"        orderBy",[1100,4972,1328],{"class":1318},[1100,4974,4975],{"class":1318}," ()",[1100,4977,1839],{"class":1601},[1100,4979,4746],{"class":1123},[1100,4981,1315],{"class":1324},[1100,4983,2730],{"class":1314},[1100,4985,1822],{"class":1318},[1100,4987,2010],{"class":1314},[1100,4989,1822],{"class":1318},[1100,4991,4992],{"class":1314},"createdAt",[1100,4994,1505],{"class":1324},[1100,4996,4997],{"class":1102,"line":1472},[1100,4998,4381],{"class":1318},[1100,5000,5001],{"class":1102,"line":1488},[1100,5002,1491],{"class":1318},[1100,5004,5005,5007],{"class":1102,"line":1494},[1100,5006,2427],{"class":1318},[1100,5008,1505],{"class":1324},[1100,5010,5011],{"class":1102,"line":1499},[1100,5012,1383],{"emptyLinePlaceholder":21},[1100,5014,5015,5017,5019,5021,5023,5025],{"class":1102,"line":2288},[1100,5016,3541],{"class":1304},[1100,5018,1965],{"class":1324},[1100,5020,3546],{"class":1318},[1100,5022,262],{"class":1314},[1100,5024,3551],{"class":1324},[1100,5026,1319],{"class":1318},[1100,5028,5029,5031,5033,5035,5037,5039,5041,5043,5045,5047,5049,5051,5053,5055,5057],{"class":1102,"line":2301},[1100,5030,3559],{"class":1304},[1100,5032,2912],{"class":1123},[1100,5034,1315],{"class":1324},[1100,5036,1879],{"class":1318},[1100,5038,3568],{"class":1324},[1100,5040,1328],{"class":1318},[1100,5042,3574],{"class":3573},[1100,5044,1730],{"class":1318},[1100,5046,3579],{"class":1324},[1100,5048,1328],{"class":1318},[1100,5050,1405],{"class":1318},[1100,5052,3586],{"class":1110},[1100,5054,1343],{"class":1318},[1100,5056,1746],{"class":1318},[1100,5058,1505],{"class":1324},[1100,5060,5061],{"class":1102,"line":2331},[1100,5062,3598],{"class":1318},[1100,5064,5065],{"class":1102,"line":2337},[1100,5066,1383],{"emptyLinePlaceholder":21},[1100,5068,5069,5071],{"class":1102,"line":2342},[1100,5070,2853],{"class":1304},[1100,5072,2856],{"class":1314},[1100,5074,5075,5077],{"class":1102,"line":2374},[1100,5076,1502],{"class":1318},[1100,5078,1505],{"class":1314},[993,5080,5082],{"id":5081},"wire-up-the-ui","Wire up the UI",[989,5084,5085,5086,5091,5092,5097],{},"Nuxt UI provides purpose-built components for AI chat interfaces: ",[1043,5087,5088],{"href":281},[1050,5089,5090],{},"UChatPrompt"," for the input area and ",[1043,5093,5094],{"href":271},[1050,5095,5096],{},"UChatMessages"," for displaying the conversation.",[1128,5099,5101],{"id":5100},"creating-the-home-page","Creating the home page",[989,5103,5104,5105,5109],{},"The home page is where users start a new conversation. The ",[1043,5106,5107],{"href":281},[1050,5108,5090],{}," component provides a textarea with auto-resize, keyboard shortcuts, and a submit button:",[1291,5111,5112],{},[1091,5113,5117],{"className":1563,"code":5114,"filename":5115,"highlights":5116,"language":34,"meta":1096,"style":1096},"\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",[3482,3526,3533,3538,3556,3595,3601,3606,3612],[1050,5118,5119,5142,5161,5179,5183,5197,5223,5227,5240,5244,5249,5275,5291,5300,5308,5322,5360,5364,5368,5374,5378,5383,5409,5414,5422,5426,5434,5455,5469,5490,5511,5516,5525,5529,5537,5552,5567,5582,5597,5612,5618,5641,5650,5659,5667,5675],{"__ignoreMap":1096},[1100,5120,5121,5123,5126,5129,5132,5134,5136,5138,5140],{"class":1102,"line":1103},[1100,5122,1573],{"class":1318},[1100,5124,5125],{"class":1324},"script",[1100,5127,5128],{"class":1601}," setup",[1100,5130,5131],{"class":1601}," lang",[1100,5133,1605],{"class":1318},[1100,5135,1532],{"class":1318},[1100,5137,1297],{"class":1110},[1100,5139,1532],{"class":1318},[1100,5141,1579],{"class":1318},[1100,5143,5144,5146,5149,5151,5154,5156,5159],{"class":1102,"line":1120},[1100,5145,3074],{"class":1601},[1100,5147,5148],{"class":1314}," input ",[1100,5150,1605],{"class":1318},[1100,5152,5153],{"class":1123}," ref",[1100,5155,1315],{"class":1314},[1100,5157,5158],{"class":1318},"''",[1100,5160,1505],{"class":1314},[1100,5162,5163,5165,5168,5170,5172,5174,5177],{"class":1102,"line":1334},[1100,5164,3074],{"class":1601},[1100,5166,5167],{"class":1314}," loading ",[1100,5169,1605],{"class":1318},[1100,5171,5153],{"class":1123},[1100,5173,1315],{"class":1314},[1100,5175,5176],{"class":1480},"false",[1100,5178,1505],{"class":1314},[1100,5180,5181],{"class":1102,"line":1349},[1100,5182,1383],{"emptyLinePlaceholder":21},[1100,5184,5185,5187,5190,5193,5195],{"class":1102,"line":1361},[1100,5186,2610],{"class":1601},[1100,5188,5189],{"class":1601}," function",[1100,5191,5192],{"class":1123}," createChat",[1100,5194,1819],{"class":1318},[1100,5196,1394],{"class":1318},[1100,5198,5199,5201,5203,5205,5208,5210,5212,5214,5217,5220],{"class":1102,"line":1372},[1100,5200,3541],{"class":1304},[1100,5202,1965],{"class":1324},[1100,5204,3546],{"class":1318},[1100,5206,5207],{"class":1314},"input",[1100,5209,1822],{"class":1318},[1100,5211,3335],{"class":1314},[1100,5213,1822],{"class":1318},[1100,5215,5216],{"class":1123},"trim",[1100,5218,5219],{"class":1324},"()) ",[1100,5221,5222],{"class":1304},"return\n",[1100,5224,5225],{"class":1102,"line":1380},[1100,5226,1383],{"emptyLinePlaceholder":21},[1100,5228,5229,5232,5234,5236,5238],{"class":1102,"line":1386},[1100,5230,5231],{"class":1314},"  loading",[1100,5233,1822],{"class":1318},[1100,5235,3335],{"class":1314},[1100,5237,2636],{"class":1318},[1100,5239,4367],{"class":1480},[1100,5241,5242],{"class":1102,"line":1397},[1100,5243,1383],{"emptyLinePlaceholder":21},[1100,5245,5246],{"class":1102,"line":1413},[1100,5247,5248],{"class":1484},"  \u002F\u002F Create a new chat on the server\n",[1100,5250,5251,5253,5255,5257,5259,5262,5264,5266,5269,5271,5273],{"class":1102,"line":1419},[1100,5252,2626],{"class":1601},[1100,5254,2803],{"class":1314},[1100,5256,2636],{"class":1318},[1100,5258,2639],{"class":1304},[1100,5260,5261],{"class":1123}," $fetch",[1100,5263,1315],{"class":1324},[1100,5265,1343],{"class":1318},[1100,5267,5268],{"class":1110},"\u002Fapi\u002Fchats",[1100,5270,1343],{"class":1318},[1100,5272,1730],{"class":1318},[1100,5274,1394],{"class":1318},[1100,5276,5277,5280,5282,5284,5287,5289],{"class":1102,"line":1424},[1100,5278,5279],{"class":1324},"    method",[1100,5281,1328],{"class":1318},[1100,5283,1405],{"class":1318},[1100,5285,5286],{"class":1110},"POST",[1100,5288,1343],{"class":1318},[1100,5290,1346],{"class":1318},[1100,5292,5293,5296,5298],{"class":1102,"line":1447},[1100,5294,5295],{"class":1324},"    body",[1100,5297,1328],{"class":1318},[1100,5299,1394],{"class":1318},[1100,5301,5302,5304,5306],{"class":1102,"line":1452},[1100,5303,3375],{"class":1324},[1100,5305,1328],{"class":1318},[1100,5307,1394],{"class":1318},[1100,5309,5310,5312,5314,5316,5318,5320],{"class":1102,"line":1462},[1100,5311,4509],{"class":1324},[1100,5313,1328],{"class":1318},[1100,5315,1405],{"class":1318},[1100,5317,2161],{"class":1110},[1100,5319,1343],{"class":1318},[1100,5321,1346],{"class":1318},[1100,5323,5324,5326,5328,5330,5332,5334,5336,5338,5341,5343,5345,5347,5349,5352,5354,5356,5358],{"class":1102,"line":1472},[1100,5325,4542],{"class":1324},[1100,5327,1328],{"class":1318},[1100,5329,1432],{"class":1324},[1100,5331,1879],{"class":1318},[1100,5333,2533],{"class":1324},[1100,5335,1328],{"class":1318},[1100,5337,1405],{"class":1318},[1100,5339,5340],{"class":1110},"text",[1100,5342,1343],{"class":1318},[1100,5344,1730],{"class":1318},[1100,5346,1733],{"class":1324},[1100,5348,1328],{"class":1318},[1100,5350,5351],{"class":1314}," input",[1100,5353,1822],{"class":1318},[1100,5355,3335],{"class":1314},[1100,5357,1746],{"class":1318},[1100,5359,3181],{"class":1324},[1100,5361,5362],{"class":1102,"line":1488},[1100,5363,4381],{"class":1318},[1100,5365,5366],{"class":1102,"line":1494},[1100,5367,1491],{"class":1318},[1100,5369,5370,5372],{"class":1102,"line":1499},[1100,5371,2427],{"class":1318},[1100,5373,1505],{"class":1324},[1100,5375,5376],{"class":1102,"line":2288},[1100,5377,1383],{"emptyLinePlaceholder":21},[1100,5379,5380],{"class":1102,"line":2301},[1100,5381,5382],{"class":1484},"  \u002F\u002F Navigate to the chat page\n",[1100,5384,5385,5388,5390,5392,5395,5398,5400,5402,5404,5407],{"class":1102,"line":2331},[1100,5386,5387],{"class":1123},"  navigateTo",[1100,5389,1315],{"class":1324},[1100,5391,3690],{"class":1318},[1100,5393,5394],{"class":1110},"\u002Fchat\u002F",[1100,5396,5397],{"class":1318},"${",[1100,5399,262],{"class":1314},[1100,5401,1822],{"class":1318},[1100,5403,2031],{"class":1314},[1100,5405,5406],{"class":1318},"}`",[1100,5408,1505],{"class":1324},[1100,5410,5411],{"class":1102,"line":2337},[1100,5412,5413],{"class":1318},"}\n",[1100,5415,5416,5418,5420],{"class":1102,"line":2342},[1100,5417,1649],{"class":1318},[1100,5419,5125],{"class":1324},[1100,5421,1579],{"class":1318},[1100,5423,5424],{"class":1102,"line":2374},[1100,5425,1383],{"emptyLinePlaceholder":21},[1100,5427,5428,5430,5432],{"class":1102,"line":2390},[1100,5429,1573],{"class":1318},[1100,5431,1576],{"class":1324},[1100,5433,1579],{"class":1318},[1100,5435,5436,5438,5441,5444,5446,5448,5451,5453],{"class":1102,"line":2408},[1100,5437,1586],{"class":1318},[1100,5439,5440],{"class":1324},"UDashboardPanel",[1100,5442,5443],{"class":1601}," :ui",[1100,5445,1605],{"class":1318},[1100,5447,1532],{"class":1318},[1100,5449,5450],{"class":1110},"{ body: 'p-0 sm:p-0' }",[1100,5452,1532],{"class":1318},[1100,5454,1579],{"class":1318},[1100,5456,5457,5459,5461,5464,5467],{"class":1102,"line":2424},[1100,5458,1595],{"class":1318},[1100,5460,1576],{"class":1324},[1100,5462,5463],{"class":1318}," #",[1100,5465,5466],{"class":1601},"body",[1100,5468,1579],{"class":1318},[1100,5470,5471,5473,5476,5479,5481,5483,5486,5488],{"class":1102,"line":2432},[1100,5472,1619],{"class":1318},[1100,5474,5475],{"class":1324},"UContainer",[1100,5477,5478],{"class":1601}," class",[1100,5480,1605],{"class":1318},[1100,5482,1532],{"class":1318},[1100,5484,5485],{"class":1110},"min-h-dvh flex flex-col justify-center gap-6 py-8",[1100,5487,1532],{"class":1318},[1100,5489,1579],{"class":1318},[1100,5491,5492,5495,5498,5500,5502,5504,5507,5509],{"class":1102,"line":3427},[1100,5493,5494],{"class":1318},"        \u003C",[1100,5496,5497],{"class":1324},"h1",[1100,5499,5478],{"class":1601},[1100,5501,1605],{"class":1318},[1100,5503,1532],{"class":1318},[1100,5505,5506],{"class":1110},"text-3xl sm:text-4xl text-highlighted font-bold",[1100,5508,1532],{"class":1318},[1100,5510,1579],{"class":1318},[1100,5512,5513],{"class":1102,"line":3440},[1100,5514,5515],{"class":1314},"          How can I help you today?\n",[1100,5517,5518,5521,5523],{"class":1102,"line":3445},[1100,5519,5520],{"class":1318},"        \u003C\u002F",[1100,5522,5497],{"class":1324},[1100,5524,1579],{"class":1318},[1100,5526,5527],{"class":1102,"line":3451},[1100,5528,1383],{"emptyLinePlaceholder":21},[1100,5530,5532,5534],{"class":5531,"line":3482},[1102,1583],[1100,5533,5494],{"class":1318},[1100,5535,5536],{"class":1324},"UChatPrompt\n",[1100,5538,5540,5543,5545,5547,5549],{"class":5539,"line":3526},[1102,1583],[1100,5541,5542],{"class":1601},"          v-model",[1100,5544,1605],{"class":1318},[1100,5546,1532],{"class":1318},[1100,5548,5207],{"class":1110},[1100,5550,5551],{"class":1318},"\"\n",[1100,5553,5555,5558,5560,5562,5565],{"class":5554,"line":3533},[1102,1583],[1100,5556,5557],{"class":1601},"          :status",[1100,5559,1605],{"class":1318},[1100,5561,1532],{"class":1318},[1100,5563,5564],{"class":1110},"loading ? 'streaming' : 'ready'",[1100,5566,5551],{"class":1318},[1100,5568,5570,5573,5575,5577,5580],{"class":5569,"line":3538},[1102,1583],[1100,5571,5572],{"class":1601},"          variant",[1100,5574,1605],{"class":1318},[1100,5576,1532],{"class":1318},[1100,5578,5579],{"class":1110},"subtle",[1100,5581,5551],{"class":1318},[1100,5583,5585,5588,5590,5592,5595],{"class":5584,"line":3556},[1102,1583],[1100,5586,5587],{"class":1601},"          placeholder",[1100,5589,1605],{"class":1318},[1100,5591,1532],{"class":1318},[1100,5593,5594],{"class":1110},"Ask me anything...",[1100,5596,5551],{"class":1318},[1100,5598,5600,5603,5605,5607,5610],{"class":5599,"line":3595},[1102,1583],[1100,5601,5602],{"class":1601},"          @submit",[1100,5604,1605],{"class":1318},[1100,5606,1532],{"class":1318},[1100,5608,5609],{"class":1110},"createChat",[1100,5611,5551],{"class":1318},[1100,5613,5615],{"class":5614,"line":3601},[1102,1583],[1100,5616,5617],{"class":1318},"        >\n",[1100,5619,5621,5624,5627,5630,5632,5634,5637,5639],{"class":5620,"line":3606},[1102,1583],[1100,5622,5623],{"class":1318},"          \u003C",[1100,5625,5626],{"class":1324},"UChatPromptSubmit",[1100,5628,5629],{"class":1601}," color",[1100,5631,1605],{"class":1318},[1100,5633,1532],{"class":1318},[1100,5635,5636],{"class":1110},"neutral",[1100,5638,1532],{"class":1318},[1100,5640,1625],{"class":1318},[1100,5642,5644,5646,5648],{"class":5643,"line":3612},[1102,1583],[1100,5645,5520],{"class":1318},[1100,5647,5090],{"class":1324},[1100,5649,1579],{"class":1318},[1100,5651,5652,5655,5657],{"class":1102,"line":3632},[1100,5653,5654],{"class":1318},"      \u003C\u002F",[1100,5656,5475],{"class":1324},[1100,5658,1579],{"class":1318},[1100,5660,5661,5663,5665],{"class":1102,"line":3660},[1100,5662,1630],{"class":1318},[1100,5664,1576],{"class":1324},[1100,5666,1579],{"class":1318},[1100,5668,5669,5671,5673],{"class":1102,"line":3676},[1100,5670,1640],{"class":1318},[1100,5672,5440],{"class":1324},[1100,5674,1579],{"class":1318},[1100,5676,5677,5679,5681],{"class":1102,"line":3695},[1100,5678,1649],{"class":1318},[1100,5680,1576],{"class":1324},[1100,5682,1579],{"class":1318},[989,5684,4639,5685,5689],{},[1043,5686,5687],{"href":281},[1050,5688,5090],{}," component automatically handles:",[1001,5691,5692,5699,5702,5712],{},[1004,5693,5694,5695],{},"Form submission when pressing ",[5696,5697],"kbd",{"value":5698},"enter",[1004,5700,5701],{},"Auto-resizing as you type",[1004,5703,5704,5705,5708,5709],{},"A loading state when ",[1050,5706,5707],{},"status"," is set to ",[1050,5710,5711],{},"streaming",[1004,5713,5714],{},"Focus management and keyboard shortcuts",[993,5716,5718],{"id":5717},"creating-the-chat-page","Creating the chat page",[989,5720,5721,5722,5728,5729,5736],{},"The chat page is where the actual conversation happens. It integrates the AI SDK's ",[1043,5723,5726],{"href":5724,"rel":5725},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fchat",[1047],[1050,5727,259],{}," class and ",[1043,5730,5733],{"href":5731,"rel":5732},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fdefault-chat-transport",[1047],[1050,5734,5735],{},"DefaultChatTransport"," for real-time streaming.",[1291,5738,5739],{},[1709,5740,5741],{},[1091,5742,5746],{"className":1563,"code":5743,"filename":5744,"highlights":5745,"language":34,"meta":1096,"style":1096},"\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",[1120,1334,1349,1499,2288,2301,2331,2337,2342,2374,2390,2408,2424,2432,3427,3440,3445,3451,3482,3526,3533,3538,3556],[1050,5747,5748,5768,5798,5819,5840,5844,5858,5872,5876,5881,5929,5933,5952,5994,5998,6002,6018,6022,6027,6045,6065,6084,6100,6127,6136,6151,6157,6184,6200,6205,6210,6225,6240,6256,6273,6287,6294,6299,6306,6310,6332,6344,6364,6392,6406,6410,6414,6418,6423,6436,6464,6475,6479,6485,6493,6497,6505,6523,6535,6554,6561,6575,6588,6593,6607,6611,6636,6714,6722,6736,6750,6764,6769,6777,6790,6804,6818,6823,6833,6837,6843,6857,6870,6884,6897,6902,6911,6920,6928,6932,6938,6950,6964,6976,6989,7002,7006,7013,7026,7039,7053,7067,7072,7080,7088,7096,7104],{"__ignoreMap":1096},[1100,5749,5750,5752,5754,5756,5758,5760,5762,5764,5766],{"class":1102,"line":1103},[1100,5751,1573],{"class":1318},[1100,5753,5125],{"class":1324},[1100,5755,5128],{"class":1601},[1100,5757,5131],{"class":1601},[1100,5759,1605],{"class":1318},[1100,5761,1532],{"class":1318},[1100,5763,1297],{"class":1110},[1100,5765,1532],{"class":1318},[1100,5767,1579],{"class":1318},[1100,5769,5771,5773,5775,5778,5780,5783,5785,5788,5790,5792,5794,5796],{"class":5770,"line":1120},[1102,1583],[1100,5772,1721],{"class":1304},[1100,5774,1724],{"class":1318},[1100,5776,5777],{"class":1314}," DefaultChatTransport",[1100,5779,1730],{"class":1318},[1100,5781,5782],{"class":1314}," isReasoningUIPart",[1100,5784,1730],{"class":1318},[1100,5786,5787],{"class":1314}," isTextUIPart",[1100,5789,1746],{"class":1318},[1100,5791,1749],{"class":1304},[1100,5793,1405],{"class":1318},[1100,5795,2547],{"class":1110},[1100,5797,1369],{"class":1318},[1100,5799,5801,5803,5805,5808,5810,5812,5814,5817],{"class":5800,"line":1334},[1102,1583],[1100,5802,1721],{"class":1304},[1100,5804,1724],{"class":1318},[1100,5806,5807],{"class":1314}," Chat",[1100,5809,1746],{"class":1318},[1100,5811,1749],{"class":1304},[1100,5813,1405],{"class":1318},[1100,5815,5816],{"class":1110},"@ai-sdk\u002Fvue",[1100,5818,1369],{"class":1318},[1100,5820,5822,5824,5826,5829,5831,5833,5835,5838],{"class":5821,"line":1349},[1102,1583],[1100,5823,1721],{"class":1304},[1100,5825,1724],{"class":1318},[1100,5827,5828],{"class":1314}," isReasoningStreaming",[1100,5830,1746],{"class":1318},[1100,5832,1749],{"class":1304},[1100,5834,1405],{"class":1318},[1100,5836,5837],{"class":1110},"@nuxt\u002Fui\u002Futils\u002Fai",[1100,5839,1369],{"class":1318},[1100,5841,5842],{"class":1102,"line":1361},[1100,5843,1383],{"emptyLinePlaceholder":21},[1100,5845,5846,5848,5851,5853,5856],{"class":1102,"line":1372},[1100,5847,3074],{"class":1601},[1100,5849,5850],{"class":1314}," route ",[1100,5852,1605],{"class":1318},[1100,5854,5855],{"class":1123}," useRoute",[1100,5857,2682],{"class":1314},[1100,5859,5860,5862,5865,5867,5870],{"class":1102,"line":1380},[1100,5861,3074],{"class":1601},[1100,5863,5864],{"class":1314}," toast ",[1100,5866,1605],{"class":1318},[1100,5868,5869],{"class":1123}," useToast",[1100,5871,2682],{"class":1314},[1100,5873,5874],{"class":1102,"line":1386},[1100,5875,1383],{"emptyLinePlaceholder":21},[1100,5877,5878],{"class":1102,"line":1397},[1100,5879,5880],{"class":1484},"\u002F\u002F Fetch existing chat data\n",[1100,5882,5883,5885,5887,5890,5892,5895,5897,5899,5901,5904,5906,5908,5911,5913,5916,5918,5921,5923,5925,5927],{"class":1102,"line":1413},[1100,5884,3074],{"class":1601},[1100,5886,1724],{"class":1318},[1100,5888,5889],{"class":1324}," data",[1100,5891,1328],{"class":1318},[1100,5893,5894],{"class":1314}," chatData ",[1100,5896,1502],{"class":1318},[1100,5898,2636],{"class":1318},[1100,5900,2639],{"class":1304},[1100,5902,5903],{"class":1123}," useFetch",[1100,5905,1315],{"class":1314},[1100,5907,3690],{"class":1318},[1100,5909,5910],{"class":1110},"\u002Fapi\u002Fchats\u002F",[1100,5912,5397],{"class":1318},[1100,5914,5915],{"class":1314},"route",[1100,5917,1822],{"class":1318},[1100,5919,5920],{"class":1314},"params",[1100,5922,1822],{"class":1318},[1100,5924,2031],{"class":1314},[1100,5926,5406],{"class":1318},[1100,5928,1505],{"class":1314},[1100,5930,5931],{"class":1102,"line":1419},[1100,5932,1383],{"emptyLinePlaceholder":21},[1100,5934,5935,5938,5940,5942,5945,5947,5950],{"class":1102,"line":1424},[1100,5936,5937],{"class":1304},"if",[1100,5939,1965],{"class":1314},[1100,5941,3546],{"class":1318},[1100,5943,5944],{"class":1314},"chatData",[1100,5946,1822],{"class":1318},[1100,5948,5949],{"class":1314},"value) ",[1100,5951,1319],{"class":1318},[1100,5953,5954,5957,5959,5961,5963,5965,5967,5969,5971,5973,5975,5977,5979,5981,5983,5986,5988,5990,5992],{"class":1102,"line":1447},[1100,5955,5956],{"class":1304},"  throw",[1100,5958,2912],{"class":1123},[1100,5960,1315],{"class":1324},[1100,5962,1879],{"class":1318},[1100,5964,3568],{"class":1324},[1100,5966,1328],{"class":1318},[1100,5968,3574],{"class":3573},[1100,5970,1730],{"class":1318},[1100,5972,3579],{"class":1324},[1100,5974,1328],{"class":1318},[1100,5976,1405],{"class":1318},[1100,5978,3586],{"class":1110},[1100,5980,1343],{"class":1318},[1100,5982,1730],{"class":1318},[1100,5984,5985],{"class":1324}," fatal",[1100,5987,1328],{"class":1318},[1100,5989,4182],{"class":1480},[1100,5991,1746],{"class":1318},[1100,5993,1505],{"class":1324},[1100,5995,5996],{"class":1102,"line":1452},[1100,5997,5413],{"class":1318},[1100,5999,6000],{"class":1102,"line":1462},[1100,6001,1383],{"emptyLinePlaceholder":21},[1100,6003,6004,6006,6008,6010,6012,6014,6016],{"class":1102,"line":1472},[1100,6005,3074],{"class":1601},[1100,6007,5148],{"class":1314},[1100,6009,1605],{"class":1318},[1100,6011,5153],{"class":1123},[1100,6013,1315],{"class":1314},[1100,6015,5158],{"class":1318},[1100,6017,1505],{"class":1314},[1100,6019,6020],{"class":1102,"line":1488},[1100,6021,1383],{"emptyLinePlaceholder":21},[1100,6023,6024],{"class":1102,"line":1494},[1100,6025,6026],{"class":1484},"\u002F\u002F Initialize the Chat class from AI SDK\n",[1100,6028,6030,6032,6035,6037,6039,6041,6043],{"class":6029,"line":1499},[1102,1583],[1100,6031,3074],{"class":1601},[1100,6033,6034],{"class":1314}," chat ",[1100,6036,1605],{"class":1318},[1100,6038,1916],{"class":1318},[1100,6040,5807],{"class":1123},[1100,6042,1315],{"class":1314},[1100,6044,1319],{"class":1318},[1100,6046,6048,6050,6052,6055,6057,6059,6061,6063],{"class":6047,"line":2288},[1102,1583],[1100,6049,1812],{"class":1324},[1100,6051,1328],{"class":1318},[1100,6053,6054],{"class":1314}," chatData",[1100,6056,1822],{"class":1318},[1100,6058,3335],{"class":1314},[1100,6060,1822],{"class":1318},[1100,6062,2031],{"class":1314},[1100,6064,1346],{"class":1318},[1100,6066,6068,6070,6072,6074,6076,6078,6080,6082],{"class":6067,"line":2301},[1102,1583],[1100,6069,1972],{"class":1324},[1100,6071,1328],{"class":1318},[1100,6073,6054],{"class":1314},[1100,6075,1822],{"class":1318},[1100,6077,3335],{"class":1314},[1100,6079,1822],{"class":1318},[1100,6081,2010],{"class":1314},[1100,6083,1346],{"class":1318},[1100,6085,6087,6090,6092,6094,6096,6098],{"class":6086,"line":2331},[1102,1583],[1100,6088,6089],{"class":1324},"  transport",[1100,6091,1328],{"class":1318},[1100,6093,1916],{"class":1318},[1100,6095,5777],{"class":1123},[1100,6097,1315],{"class":1314},[1100,6099,1319],{"class":1318},[1100,6101,6103,6106,6108,6110,6112,6114,6116,6118,6120,6122,6124],{"class":6102,"line":2337},[1102,1583],[1100,6104,6105],{"class":1324},"    api",[1100,6107,1328],{"class":1318},[1100,6109,3684],{"class":1318},[1100,6111,5910],{"class":1110},[1100,6113,5397],{"class":1318},[1100,6115,5944],{"class":1314},[1100,6117,1822],{"class":1318},[1100,6119,3335],{"class":1314},[1100,6121,1822],{"class":1318},[1100,6123,2031],{"class":1314},[1100,6125,6126],{"class":1318},"}`\n",[1100,6128,6130,6132,6134],{"class":6129,"line":2342},[1102,1583],[1100,6131,2427],{"class":1318},[1100,6133,1896],{"class":1314},[1100,6135,1346],{"class":1318},[1100,6137,6139,6142,6144,6147,6149],{"class":6138,"line":2374},[1102,1583],[1100,6140,6141],{"class":1324},"  onData",[1100,6143,1315],{"class":1318},[1100,6145,6146],{"class":1956},"dataPart",[1100,6148,1896],{"class":1318},[1100,6150,1394],{"class":1318},[1100,6152,6154],{"class":6153,"line":2390},[1102,1583],[1100,6155,6156],{"class":1484},"    \u002F\u002F Refresh the chat list when a title is generated\n",[1100,6158,6160,6163,6165,6167,6169,6172,6174,6176,6178,6180,6182],{"class":6159,"line":2408},[1102,1583],[1100,6161,6162],{"class":1304},"    if",[1100,6164,1965],{"class":1324},[1100,6166,6146],{"class":1314},[1100,6168,1822],{"class":1318},[1100,6170,6171],{"class":1314},"type",[1100,6173,3362],{"class":1318},[1100,6175,1405],{"class":1318},[1100,6177,4329],{"class":1110},[1100,6179,1343],{"class":1318},[1100,6181,3551],{"class":1324},[1100,6183,1319],{"class":1318},[1100,6185,6187,6190,6192,6194,6196,6198],{"class":6186,"line":2424},[1102,1583],[1100,6188,6189],{"class":1123},"      refreshNuxtData",[1100,6191,1315],{"class":1324},[1100,6193,1343],{"class":1318},[1100,6195,1801],{"class":1110},[1100,6197,1343],{"class":1318},[1100,6199,1505],{"class":1324},[1100,6201,6203],{"class":6202,"line":2432},[1102,1583],[1100,6204,1491],{"class":1318},[1100,6206,6208],{"class":6207,"line":3427},[1102,1583],[1100,6209,1416],{"class":1318},[1100,6211,6213,6216,6218,6221,6223],{"class":6212,"line":3440},[1102,1583],[1100,6214,6215],{"class":1324},"  onError",[1100,6217,1315],{"class":1318},[1100,6219,6220],{"class":1956},"error",[1100,6222,1896],{"class":1318},[1100,6224,1394],{"class":1318},[1100,6226,6228,6231,6233,6236,6238],{"class":6227,"line":3445},[1102,1583],[1100,6229,6230],{"class":1314},"    toast",[1100,6232,1822],{"class":1318},[1100,6234,6235],{"class":1123},"add",[1100,6237,1315],{"class":1324},[1100,6239,1319],{"class":1318},[1100,6241,6243,6246,6248,6250,6252,6254],{"class":6242,"line":3451},[1102,1583],[1100,6244,6245],{"class":1324},"      title",[1100,6247,1328],{"class":1318},[1100,6249,1405],{"class":1318},[1100,6251,497],{"class":1110},[1100,6253,1343],{"class":1318},[1100,6255,1346],{"class":1318},[1100,6257,6259,6262,6264,6267,6269,6271],{"class":6258,"line":3482},[1102,1583],[1100,6260,6261],{"class":1324},"      description",[1100,6263,1328],{"class":1318},[1100,6265,6266],{"class":1314}," error",[1100,6268,1822],{"class":1318},[1100,6270,4481],{"class":1314},[1100,6272,1346],{"class":1318},[1100,6274,6276,6279,6281,6283,6285],{"class":6275,"line":3526},[1102,1583],[1100,6277,6278],{"class":1324},"      color",[1100,6280,1328],{"class":1318},[1100,6282,1405],{"class":1318},[1100,6284,6220],{"class":1110},[1100,6286,1369],{"class":1318},[1100,6288,6290,6292],{"class":6289,"line":3533},[1102,1583],[1100,6291,3389],{"class":1318},[1100,6293,1505],{"class":1324},[1100,6295,6297],{"class":6296,"line":3538},[1102,1583],[1100,6298,3598],{"class":1318},[1100,6300,6302,6304],{"class":6301,"line":3556},[1102,1583],[1100,6303,1502],{"class":1318},[1100,6305,1505],{"class":1314},[1100,6307,6308],{"class":1102,"line":3595},[1100,6309,1383],{"emptyLinePlaceholder":21},[1100,6311,6312,6315,6318,6320,6323,6325,6328,6330],{"class":1102,"line":3601},[1100,6313,6314],{"class":1601},"function",[1100,6316,6317],{"class":1123}," handleSubmit",[1100,6319,1315],{"class":1318},[1100,6321,6322],{"class":1956},"e",[1100,6324,1328],{"class":1318},[1100,6326,6327],{"class":1106}," Event",[1100,6329,1896],{"class":1318},[1100,6331,1394],{"class":1318},[1100,6333,6334,6337,6339,6342],{"class":1102,"line":3606},[1100,6335,6336],{"class":1314},"  e",[1100,6338,1822],{"class":1318},[1100,6340,6341],{"class":1123},"preventDefault",[1100,6343,2682],{"class":1324},[1100,6345,6346,6348,6350,6352,6354,6356,6358,6360,6362],{"class":1102,"line":3612},[1100,6347,3541],{"class":1304},[1100,6349,1965],{"class":1324},[1100,6351,5207],{"class":1314},[1100,6353,1822],{"class":1318},[1100,6355,3335],{"class":1314},[1100,6357,1822],{"class":1318},[1100,6359,5216],{"class":1123},[1100,6361,5219],{"class":1324},[1100,6363,1319],{"class":1318},[1100,6365,6366,6369,6371,6374,6376,6378,6380,6382,6384,6386,6388,6390],{"class":1102,"line":3632},[1100,6367,6368],{"class":1314},"    chat",[1100,6370,1822],{"class":1318},[1100,6372,6373],{"class":1123},"sendMessage",[1100,6375,1315],{"class":1324},[1100,6377,1879],{"class":1318},[1100,6379,1733],{"class":1324},[1100,6381,1328],{"class":1318},[1100,6383,5351],{"class":1314},[1100,6385,1822],{"class":1318},[1100,6387,3335],{"class":1314},[1100,6389,1746],{"class":1318},[1100,6391,1505],{"class":1324},[1100,6393,6394,6397,6399,6401,6403],{"class":1102,"line":3660},[1100,6395,6396],{"class":1314},"    input",[1100,6398,1822],{"class":1318},[1100,6400,3335],{"class":1314},[1100,6402,2636],{"class":1318},[1100,6404,6405],{"class":1318}," ''\n",[1100,6407,6408],{"class":1102,"line":3676},[1100,6409,3598],{"class":1318},[1100,6411,6412],{"class":1102,"line":3695},[1100,6413,5413],{"class":1318},[1100,6415,6416],{"class":1102,"line":3723},[1100,6417,1383],{"emptyLinePlaceholder":21},[1100,6419,6420],{"class":1102,"line":3730},[1100,6421,6422],{"class":1484},"\u002F\u002F Auto-generate response for first message\n",[1100,6424,6425,6428,6430,6432,6434],{"class":1102,"line":3735},[1100,6426,6427],{"class":1123},"onMounted",[1100,6429,1315],{"class":1314},[1100,6431,1819],{"class":1318},[1100,6433,1839],{"class":1601},[1100,6435,1394],{"class":1318},[1100,6437,6438,6440,6442,6444,6446,6448,6450,6452,6454,6456,6458,6460,6462],{"class":1102,"line":3801},[1100,6439,3541],{"class":1304},[1100,6441,1965],{"class":1324},[1100,6443,5944],{"class":1314},[1100,6445,1822],{"class":1318},[1100,6447,3335],{"class":1314},[1100,6449,3856],{"class":1318},[1100,6451,2010],{"class":1314},[1100,6453,1822],{"class":1318},[1100,6455,3835],{"class":1314},[1100,6457,3362],{"class":1318},[1100,6459,3841],{"class":3573},[1100,6461,3551],{"class":1324},[1100,6463,1319],{"class":1318},[1100,6465,6466,6468,6470,6473],{"class":1102,"line":3806},[1100,6467,6368],{"class":1314},[1100,6469,1822],{"class":1318},[1100,6471,6472],{"class":1123},"regenerate",[1100,6474,2682],{"class":1324},[1100,6476,6477],{"class":1102,"line":3811},[1100,6478,3598],{"class":1318},[1100,6480,6481,6483],{"class":1102,"line":3817},[1100,6482,1502],{"class":1318},[1100,6484,1505],{"class":1314},[1100,6486,6487,6489,6491],{"class":1102,"line":3846},[1100,6488,1649],{"class":1318},[1100,6490,5125],{"class":1324},[1100,6492,1579],{"class":1318},[1100,6494,6495],{"class":1102,"line":3887},[1100,6496,1383],{"emptyLinePlaceholder":21},[1100,6498,6499,6501,6503],{"class":1102,"line":3916},[1100,6500,1573],{"class":1318},[1100,6502,1576],{"class":1324},[1100,6504,1579],{"class":1318},[1100,6506,6507,6509,6511,6513,6515,6517,6519,6521],{"class":1102,"line":3928},[1100,6508,1586],{"class":1318},[1100,6510,5440],{"class":1324},[1100,6512,5443],{"class":1601},[1100,6514,1605],{"class":1318},[1100,6516,1532],{"class":1318},[1100,6518,5450],{"class":1110},[1100,6520,1532],{"class":1318},[1100,6522,1579],{"class":1318},[1100,6524,6525,6527,6529,6531,6533],{"class":1102,"line":3944},[1100,6526,1595],{"class":1318},[1100,6528,1576],{"class":1324},[1100,6530,5463],{"class":1318},[1100,6532,5466],{"class":1601},[1100,6534,1579],{"class":1318},[1100,6536,6537,6539,6541,6543,6545,6547,6550,6552],{"class":1102,"line":3958},[1100,6538,1619],{"class":1318},[1100,6540,5475],{"class":1324},[1100,6542,5478],{"class":1601},[1100,6544,1605],{"class":1318},[1100,6546,1532],{"class":1318},[1100,6548,6549],{"class":1110},"min-h-dvh flex flex-col py-4 sm:py-6",[1100,6551,1532],{"class":1318},[1100,6553,1579],{"class":1318},[1100,6555,6556,6558],{"class":1102,"line":3965},[1100,6557,5494],{"class":1318},[1100,6559,6560],{"class":1324},"UChatMessages\n",[1100,6562,6563,6566,6568,6570,6573],{"class":1102,"line":3970},[1100,6564,6565],{"class":1601},"          :messages",[1100,6567,1605],{"class":1318},[1100,6569,1532],{"class":1318},[1100,6571,6572],{"class":1110},"chat.messages",[1100,6574,5551],{"class":1318},[1100,6576,6577,6579,6581,6583,6586],{"class":1102,"line":3975},[1100,6578,5557],{"class":1601},[1100,6580,1605],{"class":1318},[1100,6582,1532],{"class":1318},[1100,6584,6585],{"class":1110},"chat.status",[1100,6587,5551],{"class":1318},[1100,6589,6590],{"class":1102,"line":3981},[1100,6591,6592],{"class":1601},"          should-auto-scroll\n",[1100,6594,6595,6598,6600,6602,6605],{"class":1102,"line":3998},[1100,6596,6597],{"class":1601},"          class",[1100,6599,1605],{"class":1318},[1100,6601,1532],{"class":1318},[1100,6603,6604],{"class":1110},"flex-1",[1100,6606,5551],{"class":1318},[1100,6608,6609],{"class":1102,"line":4020},[1100,6610,5617],{"class":1318},[1100,6612,6613,6615,6617,6619,6621,6623,6625,6627,6630,6632,6634],{"class":1102,"line":4038},[1100,6614,5623],{"class":1318},[1100,6616,1576],{"class":1324},[1100,6618,5463],{"class":1318},[1100,6620,371],{"class":1601},[1100,6622,1605],{"class":1318},[1100,6624,1532],{"class":1318},[1100,6626,1879],{"class":1318},[1100,6628,6629],{"class":1314}," message ",[1100,6631,1502],{"class":1318},[1100,6633,1532],{"class":1318},[1100,6635,1579],{"class":1318},[1100,6637,6638,6641,6643,6646,6648,6650,6653,6655,6658,6661,6663,6665,6667,6669,6672,6675,6677,6680,6682,6684,6686,6688,6691,6693,6696,6698,6700,6702,6704,6706,6709,6712],{"class":1102,"line":4046},[1100,6639,6640],{"class":1318},"            \u003C",[1100,6642,1576],{"class":1324},[1100,6644,6645],{"class":1304}," v-for",[1100,6647,1605],{"class":1318},[1100,6649,1532],{"class":1318},[1100,6651,6652],{"class":1314},"(part",[1100,6654,1730],{"class":1318},[1100,6656,6657],{"class":1314}," index) ",[1100,6659,6660],{"class":1318},"in",[1100,6662,2631],{"class":1314},[1100,6664,1822],{"class":1318},[1100,6666,2212],{"class":1314},[1100,6668,1532],{"class":1318},[1100,6670,6671],{"class":1318}," :",[1100,6673,6674],{"class":1601},"key",[1100,6676,1605],{"class":1318},[1100,6678,6679],{"class":1318},"\"`${",[1100,6681,4481],{"class":1314},[1100,6683,1822],{"class":1318},[1100,6685,2031],{"class":1314},[1100,6687,1502],{"class":1318},[1100,6689,6690],{"class":1110},"-",[1100,6692,5397],{"class":1318},[1100,6694,6695],{"class":1314},"part",[1100,6697,1822],{"class":1318},[1100,6699,6171],{"class":1314},[1100,6701,1502],{"class":1318},[1100,6703,6690],{"class":1110},[1100,6705,5397],{"class":1318},[1100,6707,6708],{"class":1314},"index",[1100,6710,6711],{"class":1318},"}`\"",[1100,6713,1579],{"class":1318},[1100,6715,6716,6719],{"class":1102,"line":4063},[1100,6717,6718],{"class":1318},"              \u003C",[1100,6720,6721],{"class":1324},"UChatReasoning\n",[1100,6723,6724,6727,6729,6731,6734],{"class":1102,"line":4084},[1100,6725,6726],{"class":1601},"                v-if",[1100,6728,1605],{"class":1318},[1100,6730,1532],{"class":1318},[1100,6732,6733],{"class":1110},"isReasoningUIPart(part)",[1100,6735,5551],{"class":1318},[1100,6737,6738,6741,6743,6745,6748],{"class":1102,"line":4094},[1100,6739,6740],{"class":1601},"                :text",[1100,6742,1605],{"class":1318},[1100,6744,1532],{"class":1318},[1100,6746,6747],{"class":1110},"part.text",[1100,6749,5551],{"class":1318},[1100,6751,6752,6755,6757,6759,6762],{"class":1102,"line":4104},[1100,6753,6754],{"class":1601},"                :streaming",[1100,6756,1605],{"class":1318},[1100,6758,1532],{"class":1318},[1100,6760,6761],{"class":1110},"isReasoningStreaming(message, index, chat)",[1100,6763,5551],{"class":1318},[1100,6765,6766],{"class":1102,"line":4114},[1100,6767,6768],{"class":1318},"              >\n",[1100,6770,6771,6774],{"class":1102,"line":4131},[1100,6772,6773],{"class":1318},"                \u003C",[1100,6775,6776],{"class":1324},"MDC\n",[1100,6778,6779,6782,6784,6786,6788],{"class":1102,"line":4142},[1100,6780,6781],{"class":1601},"                  :value",[1100,6783,1605],{"class":1318},[1100,6785,1532],{"class":1318},[1100,6787,6747],{"class":1110},[1100,6789,5551],{"class":1318},[1100,6791,6792,6795,6797,6799,6802],{"class":1102,"line":4148},[1100,6793,6794],{"class":1601},"                  :cache-key",[1100,6796,1605],{"class":1318},[1100,6798,1532],{"class":1318},[1100,6800,6801],{"class":1110},"`reasoning-${message.id}-${index}`",[1100,6803,5551],{"class":1318},[1100,6805,6806,6809,6811,6813,6816],{"class":1102,"line":4154},[1100,6807,6808],{"class":1601},"                  class",[1100,6810,1605],{"class":1318},[1100,6812,1532],{"class":1318},[1100,6814,6815],{"class":1110},"*:first:mt-0 *:last:mb-0",[1100,6817,5551],{"class":1318},[1100,6819,6820],{"class":1102,"line":4164},[1100,6821,6822],{"class":1318},"                \u002F>\n",[1100,6824,6825,6828,6831],{"class":1102,"line":4174},[1100,6826,6827],{"class":1318},"              \u003C\u002F",[1100,6829,6830],{"class":1324},"UChatReasoning",[1100,6832,1579],{"class":1318},[1100,6834,6835],{"class":1102,"line":4187},[1100,6836,1383],{"emptyLinePlaceholder":21},[1100,6838,6839,6841],{"class":1102,"line":4202},[1100,6840,6718],{"class":1318},[1100,6842,6776],{"class":1324},[1100,6844,6845,6848,6850,6852,6855],{"class":1102,"line":4207},[1100,6846,6847],{"class":1601},"                v-else-if",[1100,6849,1605],{"class":1318},[1100,6851,1532],{"class":1318},[1100,6853,6854],{"class":1110},"isTextUIPart(part)",[1100,6856,5551],{"class":1318},[1100,6858,6859,6862,6864,6866,6868],{"class":1102,"line":4212},[1100,6860,6861],{"class":1601},"                :value",[1100,6863,1605],{"class":1318},[1100,6865,1532],{"class":1318},[1100,6867,6747],{"class":1110},[1100,6869,5551],{"class":1318},[1100,6871,6872,6875,6877,6879,6882],{"class":1102,"line":4222},[1100,6873,6874],{"class":1601},"                :cache-key",[1100,6876,1605],{"class":1318},[1100,6878,1532],{"class":1318},[1100,6880,6881],{"class":1110},"`${message.id}-${index}`",[1100,6883,5551],{"class":1318},[1100,6885,6886,6889,6891,6893,6895],{"class":1102,"line":4238},[1100,6887,6888],{"class":1601},"                class",[1100,6890,1605],{"class":1318},[1100,6892,1532],{"class":1318},[1100,6894,6815],{"class":1110},[1100,6896,5551],{"class":1318},[1100,6898,6899],{"class":1102,"line":4253},[1100,6900,6901],{"class":1318},"              \u002F>\n",[1100,6903,6904,6907,6909],{"class":1102,"line":4259},[1100,6905,6906],{"class":1318},"            \u003C\u002F",[1100,6908,1576],{"class":1324},[1100,6910,1579],{"class":1318},[1100,6912,6913,6916,6918],{"class":1102,"line":4265},[1100,6914,6915],{"class":1318},"          \u003C\u002F",[1100,6917,1576],{"class":1324},[1100,6919,1579],{"class":1318},[1100,6921,6922,6924,6926],{"class":1102,"line":4273},[1100,6923,5520],{"class":1318},[1100,6925,5096],{"class":1324},[1100,6927,1579],{"class":1318},[1100,6929,6930],{"class":1102,"line":4278},[1100,6931,1383],{"emptyLinePlaceholder":21},[1100,6933,6934,6936],{"class":1102,"line":4284},[1100,6935,5494],{"class":1318},[1100,6937,5536],{"class":1324},[1100,6939,6940,6942,6944,6946,6948],{"class":1102,"line":4304},[1100,6941,5542],{"class":1601},[1100,6943,1605],{"class":1318},[1100,6945,1532],{"class":1318},[1100,6947,5207],{"class":1110},[1100,6949,5551],{"class":1318},[1100,6951,6952,6955,6957,6959,6962],{"class":1102,"line":4319},[1100,6953,6954],{"class":1601},"          :error",[1100,6956,1605],{"class":1318},[1100,6958,1532],{"class":1318},[1100,6960,6961],{"class":1110},"chat.error",[1100,6963,5551],{"class":1318},[1100,6965,6966,6968,6970,6972,6974],{"class":1102,"line":4336},[1100,6967,5572],{"class":1601},[1100,6969,1605],{"class":1318},[1100,6971,1532],{"class":1318},[1100,6973,5579],{"class":1110},[1100,6975,5551],{"class":1318},[1100,6977,6978,6980,6982,6984,6987],{"class":1102,"line":4359},[1100,6979,6597],{"class":1601},[1100,6981,1605],{"class":1318},[1100,6983,1532],{"class":1318},[1100,6985,6986],{"class":1110},"sticky bottom-0",[1100,6988,5551],{"class":1318},[1100,6990,6991,6993,6995,6997,7000],{"class":1102,"line":4370},[1100,6992,5602],{"class":1601},[1100,6994,1605],{"class":1318},[1100,6996,1532],{"class":1318},[1100,6998,6999],{"class":1110},"handleSubmit",[1100,7001,5551],{"class":1318},[1100,7003,7004],{"class":1102,"line":4378},[1100,7005,5617],{"class":1318},[1100,7007,7008,7010],{"class":1102,"line":4384},[1100,7009,5623],{"class":1318},[1100,7011,7012],{"class":1324},"UChatPromptSubmit\n",[1100,7014,7015,7018,7020,7022,7024],{"class":1102,"line":4389},[1100,7016,7017],{"class":1601},"            :status",[1100,7019,1605],{"class":1318},[1100,7021,1532],{"class":1318},[1100,7023,6585],{"class":1110},[1100,7025,5551],{"class":1318},[1100,7027,7028,7031,7033,7035,7037],{"class":1102,"line":4412},[1100,7029,7030],{"class":1601},"            color",[1100,7032,1605],{"class":1318},[1100,7034,1532],{"class":1318},[1100,7036,5636],{"class":1110},[1100,7038,5551],{"class":1318},[1100,7040,7041,7044,7046,7048,7051],{"class":1102,"line":4418},[1100,7042,7043],{"class":1601},"            @stop",[1100,7045,1605],{"class":1318},[1100,7047,1532],{"class":1318},[1100,7049,7050],{"class":1110},"chat.stop()",[1100,7052,5551],{"class":1318},[1100,7054,7055,7058,7060,7062,7065],{"class":1102,"line":4438},[1100,7056,7057],{"class":1601},"            @reload",[1100,7059,1605],{"class":1318},[1100,7061,1532],{"class":1318},[1100,7063,7064],{"class":1110},"chat.regenerate()",[1100,7066,5551],{"class":1318},[1100,7068,7069],{"class":1102,"line":4444},[1100,7070,7071],{"class":1318},"          \u002F>\n",[1100,7073,7074,7076,7078],{"class":1102,"line":4490},[1100,7075,5520],{"class":1318},[1100,7077,5090],{"class":1324},[1100,7079,1579],{"class":1318},[1100,7081,7082,7084,7086],{"class":1102,"line":4506},[1100,7083,5654],{"class":1318},[1100,7085,5475],{"class":1324},[1100,7087,1579],{"class":1318},[1100,7089,7090,7092,7094],{"class":1102,"line":4539},[1100,7091,1630],{"class":1318},[1100,7093,1576],{"class":1324},[1100,7095,1579],{"class":1318},[1100,7097,7098,7100,7102],{"class":1102,"line":4553},[1100,7099,1640],{"class":1318},[1100,7101,5440],{"class":1324},[1100,7103,1579],{"class":1318},[1100,7105,7106,7108,7110],{"class":1102,"line":4561},[1100,7107,1649],{"class":1318},[1100,7109,1576],{"class":1324},[1100,7111,1579],{"class":1318},[989,7113,7114],{},"Here's a breakdown of the key parts:",[989,7116,7117],{},[1007,7118,7119],{},"The Chat Class",[989,7121,4639,7122,7127,7128,7130],{},[1043,7123,7125],{"href":5724,"rel":7124},[1047],[1050,7126,259],{}," class from ",[1050,7129,5816],{}," manages the entire conversation state. It handles:",[1001,7132,7133,7138,7153,7159,7164],{},[1004,7134,7135,7136],{},"Message history with ",[1050,7137,6572],{},[1004,7139,7140,7141,1965,7143,2877,7146,2877,7149,2877,7151,1896],{},"Connection status with ",[1050,7142,6585],{},[1050,7144,7145],{},"ready",[1050,7147,7148],{},"submitted",[1050,7150,5711],{},[1050,7152,6220],{},[1004,7154,7155,7156],{},"Sending messages with ",[1050,7157,7158],{},"chat.sendMessage()",[1004,7160,7161,7162],{},"Stopping generation with ",[1050,7163,7050],{},[1004,7165,7166,7167],{},"Regenerating responses with ",[1050,7168,7064],{},[989,7170,4639,7171,7174,7175,7180,7181,7183],{},[1050,7172,7173],{},"onData"," callback receives ",[1043,7176,7179],{"href":7177,"rel":7178},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fstreaming-data",[1047],"custom data events"," from the server (like ",[1050,7182,4329],{},"), allowing you to react to server-side events during streaming.",[989,7185,7186],{},[1007,7187,7188],{},"UChatMessages Component",[989,7190,4639,7191,7195],{},[1043,7192,7193],{"href":271},[1050,7194,5096],{}," component is purpose-built for AI chatbots with:",[1001,7197,7198,7201,7204,7207],{},[1004,7199,7200],{},"Auto-scroll to bottom on load",[1004,7202,7203],{},"Continuous scrolling as messages stream in",[1004,7205,7206],{},"A loading indicator while the assistant processes",[1004,7208,7209],{},"An \"Auto scroll\" button when scrolled up",[989,7211,7212],{},[1007,7213,7214],{},"Rendering Markdown with MDC",[989,7216,7217,7218,7220,7221,1053,7224,7227,7228,7235,7236,7242,7243,7247,7248,7251,7252,7254],{},"AI models often respond with Markdown formatting (code blocks, lists, bold text, etc.). We iterate over message ",[1050,7219,2212],{}," using AI SDK helpers like ",[1050,7222,7223],{},"isTextUIPart",[1050,7225,7226],{},"isReasoningUIPart",", rendering text with the ",[1043,7229,7232],{"href":7230,"rel":7231},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc#mdc",[1047],[1050,7233,7234],{},"MDC"," component from ",[1043,7237,7240],{"href":7238,"rel":7239},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc",[1047],[1050,7241,1354],{}," and reasoning with ",[1043,7244,7245],{"href":291},[1050,7246,6830],{},". The ",[1050,7249,7250],{},"isReasoningStreaming"," utility from ",[1050,7253,5837],{}," detects if a reasoning part is currently being streamed.",[1679,7256,7257],{"to":859},[989,7258,7259],{},"Nuxt UI provides pre-styled prose components, so your markdown content will be automatically styled to match your theme.",[989,7261,7262],{},[1007,7263,7264],{},"UChatPromptSubmit Component",[989,7266,4639,7267,7271],{},[1043,7268,7269],{"href":286},[1050,7270,5626],{}," component adapts based on the chat status:",[1001,7273,7274,7277,7280],{},[1004,7275,7276],{},"Shows a send button when ready",[1004,7278,7279],{},"Shows a stop button while streaming",[1004,7281,7282],{},"Shows a reload button after an error",[993,7284,7286],{"id":7285},"adding-chat-history","Adding chat history",[989,7288,7289],{},"This section adds a dropdown menu to list previous chats and navigate between them.",[1128,7291,7293],{"id":7292},"listing-chats-api","Listing chats API",[989,7295,7296],{},"First, create an endpoint to fetch all chats:",[1291,7298,7299],{},[1091,7300,7303],{"className":1295,"code":7301,"filename":7302,"language":1297,"meta":1096,"style":1096},"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",[1050,7304,7305,7323,7345,7364,7368,7386,7411,7438,7444],{"__ignoreMap":1096},[1100,7306,7307,7309,7311,7313,7315,7317,7319,7321],{"class":1102,"line":1103},[1100,7308,1721],{"class":1304},[1100,7310,1724],{"class":1318},[1100,7312,2511],{"class":1314},[1100,7314,1746],{"class":1318},[1100,7316,1749],{"class":1304},[1100,7318,1405],{"class":1318},[1100,7320,1128],{"class":1110},[1100,7322,1369],{"class":1318},[1100,7324,7325,7327,7329,7331,7333,7335,7337,7339,7341,7343],{"class":1102,"line":1120},[1100,7326,1721],{"class":1304},[1100,7328,1724],{"class":1318},[1100,7330,2454],{"class":1314},[1100,7332,1730],{"class":1318},[1100,7334,2562],{"class":1314},[1100,7336,1746],{"class":1318},[1100,7338,1749],{"class":1304},[1100,7340,1405],{"class":1318},[1100,7342,2571],{"class":1110},[1100,7344,1369],{"class":1318},[1100,7346,7347,7349,7351,7354,7356,7358,7360,7362],{"class":1102,"line":1334},[1100,7348,1721],{"class":1304},[1100,7350,1724],{"class":1318},[1100,7352,7353],{"class":1314}," desc",[1100,7355,1746],{"class":1318},[1100,7357,1749],{"class":1304},[1100,7359,1405],{"class":1318},[1100,7361,1774],{"class":1110},[1100,7363,1369],{"class":1318},[1100,7365,7366],{"class":1102,"line":1349},[1100,7367,1383],{"emptyLinePlaceholder":21},[1100,7369,7370,7372,7374,7376,7378,7380,7382,7384],{"class":1102,"line":1361},[1100,7371,1305],{"class":1304},[1100,7373,1308],{"class":1304},[1100,7375,2511],{"class":1123},[1100,7377,1315],{"class":1314},[1100,7379,2610],{"class":1601},[1100,7381,4975],{"class":1318},[1100,7383,1839],{"class":1601},[1100,7385,1394],{"class":1318},[1100,7387,7388,7390,7392,7394,7396,7398,7400,7402,7404,7407,7409],{"class":1102,"line":1372},[1100,7389,2853],{"class":1304},[1100,7391,2639],{"class":1304},[1100,7393,2454],{"class":1314},[1100,7395,1822],{"class":1318},[1100,7397,3466],{"class":1314},[1100,7399,1822],{"class":1318},[1100,7401,1801],{"class":1314},[1100,7403,1822],{"class":1318},[1100,7405,7406],{"class":1123},"findMany",[1100,7408,1315],{"class":1324},[1100,7410,1319],{"class":1318},[1100,7412,7413,7416,7418,7420,7422,7424,7426,7428,7430,7432,7434,7436],{"class":1102,"line":1380},[1100,7414,7415],{"class":1123},"    orderBy",[1100,7417,1328],{"class":1318},[1100,7419,4975],{"class":1318},[1100,7421,1839],{"class":1601},[1100,7423,7353],{"class":1123},[1100,7425,1315],{"class":1324},[1100,7427,2730],{"class":1314},[1100,7429,1822],{"class":1318},[1100,7431,1801],{"class":1314},[1100,7433,1822],{"class":1318},[1100,7435,4992],{"class":1314},[1100,7437,1505],{"class":1324},[1100,7439,7440,7442],{"class":1102,"line":1386},[1100,7441,2427],{"class":1318},[1100,7443,1505],{"class":1324},[1100,7445,7446,7448],{"class":1102,"line":1397},[1100,7447,1502],{"class":1318},[1100,7449,1505],{"class":1314},[1128,7451,7453],{"id":7452},"building-the-chats-history-dropdown","Building the chats history dropdown",[989,7455,7456,7457,7462,7463,7468,7469,7462,7476,7478],{},"The component uses ",[1043,7458,7459],{"href":457},[1050,7460,7461],{},"UDropdownMenu"," with a ",[1043,7464,7465],{"href":230},[1050,7466,7467],{},"UButton"," as trigger. Use ",[1043,7470,7473],{"href":7471,"rel":7472},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-fetch",[1047],[1050,7474,7475],{},"useFetch",[1050,7477,6674],{}," to fetch and cache the chat list:",[1291,7480,7481],{},[1091,7482,7485],{"className":1563,"code":7483,"filename":7484,"language":34,"meta":1096,"style":1096},"\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",[1050,7486,7487,7507,7519,7523,7555,7570,7584,7590,7594,7614,7619,7635,7651,7667,7691,7695,7720,7745,7767,7793,7799,7803,7811,7815,7823,7854,7861,7875,7889,7903,7915,7929,7934,7942],{"__ignoreMap":1096},[1100,7488,7489,7491,7493,7495,7497,7499,7501,7503,7505],{"class":1102,"line":1103},[1100,7490,1573],{"class":1318},[1100,7492,5125],{"class":1324},[1100,7494,5128],{"class":1601},[1100,7496,5131],{"class":1601},[1100,7498,1605],{"class":1318},[1100,7500,1532],{"class":1318},[1100,7502,1297],{"class":1110},[1100,7504,1532],{"class":1318},[1100,7506,1579],{"class":1318},[1100,7508,7509,7511,7513,7515,7517],{"class":1102,"line":1120},[1100,7510,3074],{"class":1601},[1100,7512,5850],{"class":1314},[1100,7514,1605],{"class":1318},[1100,7516,5855],{"class":1123},[1100,7518,2682],{"class":1314},[1100,7520,7521],{"class":1102,"line":1334},[1100,7522,1383],{"emptyLinePlaceholder":21},[1100,7524,7525,7527,7529,7531,7533,7535,7537,7539,7541,7543,7545,7547,7549,7551,7553],{"class":1102,"line":1349},[1100,7526,3074],{"class":1601},[1100,7528,1724],{"class":1318},[1100,7530,5889],{"class":1324},[1100,7532,1328],{"class":1318},[1100,7534,1790],{"class":1314},[1100,7536,1502],{"class":1318},[1100,7538,2636],{"class":1318},[1100,7540,2639],{"class":1304},[1100,7542,5903],{"class":1123},[1100,7544,1315],{"class":1314},[1100,7546,1343],{"class":1318},[1100,7548,5268],{"class":1110},[1100,7550,1343],{"class":1318},[1100,7552,1730],{"class":1318},[1100,7554,1394],{"class":1318},[1100,7556,7557,7560,7562,7564,7566,7568],{"class":1102,"line":1361},[1100,7558,7559],{"class":1324},"  key",[1100,7561,1328],{"class":1318},[1100,7563,1405],{"class":1318},[1100,7565,1801],{"class":1110},[1100,7567,1343],{"class":1318},[1100,7569,1346],{"class":1318},[1100,7571,7572,7575,7577,7579,7581],{"class":1102,"line":1372},[1100,7573,7574],{"class":1123},"  default",[1100,7576,1328],{"class":1318},[1100,7578,4975],{"class":1318},[1100,7580,1839],{"class":1601},[1100,7582,7583],{"class":1314}," []\n",[1100,7585,7586,7588],{"class":1102,"line":1380},[1100,7587,1502],{"class":1318},[1100,7589,1505],{"class":1314},[1100,7591,7592],{"class":1102,"line":1386},[1100,7593,1383],{"emptyLinePlaceholder":21},[1100,7595,7596,7598,7601,7603,7606,7608,7610,7612],{"class":1102,"line":1397},[1100,7597,3074],{"class":1601},[1100,7599,7600],{"class":1314}," items ",[1100,7602,1605],{"class":1318},[1100,7604,7605],{"class":1123}," computed",[1100,7607,1315],{"class":1314},[1100,7609,1819],{"class":1318},[1100,7611,1839],{"class":1601},[1100,7613,1331],{"class":1314},[1100,7615,7616],{"class":1102,"line":1413},[1100,7617,7618],{"class":1318},"  {\n",[1100,7620,7621,7624,7626,7628,7631,7633],{"class":1102,"line":1419},[1100,7622,7623],{"class":1324},"    label",[1100,7625,1328],{"class":1318},[1100,7627,1405],{"class":1318},[1100,7629,7630],{"class":1110},"New chat",[1100,7632,1343],{"class":1318},[1100,7634,1346],{"class":1318},[1100,7636,7637,7640,7642,7644,7647,7649],{"class":1102,"line":1424},[1100,7638,7639],{"class":1324},"    to",[1100,7641,1328],{"class":1318},[1100,7643,1405],{"class":1318},[1100,7645,7646],{"class":1110},"\u002F",[1100,7648,1343],{"class":1318},[1100,7650,1346],{"class":1318},[1100,7652,7653,7656,7658,7660,7663,7665],{"class":1102,"line":1447},[1100,7654,7655],{"class":1324},"    icon",[1100,7657,1328],{"class":1318},[1100,7659,1405],{"class":1318},[1100,7661,7662],{"class":1110},"i-lucide-plus-square",[1100,7664,1343],{"class":1318},[1100,7666,1346],{"class":1318},[1100,7668,7669,7672,7674,7677,7679,7682,7685,7687,7689],{"class":1102,"line":1452},[1100,7670,7671],{"class":1324},"    active",[1100,7673,1328],{"class":1318},[1100,7675,7676],{"class":1314}," route",[1100,7678,1822],{"class":1318},[1100,7680,7681],{"class":1314},"name ",[1100,7683,7684],{"class":1318},"===",[1100,7686,1405],{"class":1318},[1100,7688,6708],{"class":1110},[1100,7690,1369],{"class":1318},[1100,7692,7693],{"class":1102,"line":1462},[1100,7694,1416],{"class":1318},[1100,7696,7697,7700,7702,7704,7706,7708,7710,7712,7714,7716,7718],{"class":1102,"line":1472},[1100,7698,7699],{"class":1318},"  ...",[1100,7701,1801],{"class":1314},[1100,7703,1822],{"class":1318},[1100,7705,3335],{"class":1314},[1100,7707,1822],{"class":1318},[1100,7709,4476],{"class":1123},[1100,7711,1315],{"class":1314},[1100,7713,262],{"class":1956},[1100,7715,1839],{"class":1601},[1100,7717,1965],{"class":1314},[1100,7719,1319],{"class":1318},[1100,7721,7722,7724,7726,7728,7730,7733,7736,7738,7741,7743],{"class":1102,"line":1488},[1100,7723,7623],{"class":1324},[1100,7725,1328],{"class":1318},[1100,7727,2803],{"class":1314},[1100,7729,1822],{"class":1318},[1100,7731,7732],{"class":1314},"title ",[1100,7734,7735],{"class":1318},"||",[1100,7737,1405],{"class":1318},[1100,7739,7740],{"class":1110},"Untitled",[1100,7742,1343],{"class":1318},[1100,7744,1346],{"class":1318},[1100,7746,7747,7749,7751,7753,7755,7757,7759,7761,7763,7765],{"class":1102,"line":1494},[1100,7748,7639],{"class":1324},[1100,7750,1328],{"class":1318},[1100,7752,3684],{"class":1318},[1100,7754,5394],{"class":1110},[1100,7756,5397],{"class":1318},[1100,7758,262],{"class":1314},[1100,7760,1822],{"class":1318},[1100,7762,2031],{"class":1314},[1100,7764,5406],{"class":1318},[1100,7766,1346],{"class":1318},[1100,7768,7769,7771,7773,7775,7777,7779,7781,7784,7786,7788,7790],{"class":1102,"line":1499},[1100,7770,7671],{"class":1324},[1100,7772,1328],{"class":1318},[1100,7774,7676],{"class":1314},[1100,7776,1822],{"class":1318},[1100,7778,5920],{"class":1314},[1100,7780,1822],{"class":1318},[1100,7782,7783],{"class":1314},"id ",[1100,7785,7684],{"class":1318},[1100,7787,2803],{"class":1314},[1100,7789,1822],{"class":1318},[1100,7791,7792],{"class":1314},"id\n",[1100,7794,7795,7797],{"class":1102,"line":2288},[1100,7796,2427],{"class":1318},[1100,7798,1986],{"class":1314},[1100,7800,7801],{"class":1102,"line":2301},[1100,7802,2334],{"class":1314},[1100,7804,7805,7807,7809],{"class":1102,"line":2331},[1100,7806,1649],{"class":1318},[1100,7808,5125],{"class":1324},[1100,7810,1579],{"class":1318},[1100,7812,7813],{"class":1102,"line":2337},[1100,7814,1383],{"emptyLinePlaceholder":21},[1100,7816,7817,7819,7821],{"class":1102,"line":2342},[1100,7818,1573],{"class":1318},[1100,7820,1576],{"class":1324},[1100,7822,1579],{"class":1318},[1100,7824,7825,7827,7829,7832,7834,7836,7839,7841,7843,7845,7847,7850,7852],{"class":1102,"line":2374},[1100,7826,1586],{"class":1318},[1100,7828,7461],{"class":1324},[1100,7830,7831],{"class":1601}," :items",[1100,7833,1605],{"class":1318},[1100,7835,1532],{"class":1318},[1100,7837,7838],{"class":1110},"items",[1100,7840,1532],{"class":1318},[1100,7842,5478],{"class":1601},[1100,7844,1605],{"class":1318},[1100,7846,1532],{"class":1318},[1100,7848,7849],{"class":1110},"m-2",[1100,7851,1532],{"class":1318},[1100,7853,1579],{"class":1318},[1100,7855,7856,7858],{"class":1102,"line":2390},[1100,7857,1595],{"class":1318},[1100,7859,7860],{"class":1324},"UButton\n",[1100,7862,7863,7866,7868,7870,7873],{"class":1102,"line":2408},[1100,7864,7865],{"class":1601},"      icon",[1100,7867,1605],{"class":1318},[1100,7869,1532],{"class":1318},[1100,7871,7872],{"class":1110},"i-lucide-messages-square",[1100,7874,5551],{"class":1318},[1100,7876,7877,7880,7882,7884,7887],{"class":1102,"line":2424},[1100,7878,7879],{"class":1601},"      variant",[1100,7881,1605],{"class":1318},[1100,7883,1532],{"class":1318},[1100,7885,7886],{"class":1110},"ghost",[1100,7888,5551],{"class":1318},[1100,7890,7891,7894,7896,7898,7901],{"class":1102,"line":2432},[1100,7892,7893],{"class":1601},"      label",[1100,7895,1605],{"class":1318},[1100,7897,1532],{"class":1318},[1100,7899,7900],{"class":1110},"Chats History",[1100,7902,5551],{"class":1318},[1100,7904,7905,7907,7909,7911,7913],{"class":1102,"line":3427},[1100,7906,6278],{"class":1601},[1100,7908,1605],{"class":1318},[1100,7910,1532],{"class":1318},[1100,7912,5636],{"class":1110},[1100,7914,5551],{"class":1318},[1100,7916,7917,7920,7922,7924,7927],{"class":1102,"line":3440},[1100,7918,7919],{"class":1601},"      class",[1100,7921,1605],{"class":1318},[1100,7923,1532],{"class":1318},[1100,7925,7926],{"class":1110},"w-fit",[1100,7928,5551],{"class":1318},[1100,7930,7931],{"class":1102,"line":3445},[1100,7932,7933],{"class":1318},"    \u002F>\n",[1100,7935,7936,7938,7940],{"class":1102,"line":3451},[1100,7937,1640],{"class":1318},[1100,7939,7461],{"class":1324},[1100,7941,1579],{"class":1318},[1100,7943,7944,7946,7948],{"class":1102,"line":3482},[1100,7945,1649],{"class":1318},[1100,7947,1576],{"class":1324},[1100,7949,1579],{"class":1318},[993,7951,7953],{"id":7952},"integrating-history-in-the-home-page","Integrating history in the home page",[1291,7955,7956],{},[1709,7957,7958],{},[1091,7959,7962],{"className":1563,"code":7960,"filename":5115,"highlights":7961,"language":34,"meta":1096,"style":1096},"\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",[2424,2432,3427],[1050,7963,7964,7984,8000,8016,8020,8032,8054,8058,8070,8074,8078,8102,8116,8124,8132,8146,8182,8186,8190,8196,8200,8204,8226,8230,8238,8242,8250,8268,8282,8292,8301,8313,8331,8349,8353,8361,8365,8371,8383,8395,8407,8419,8431,8435,8453,8461,8469,8477,8485],{"__ignoreMap":1096},[1100,7965,7966,7968,7970,7972,7974,7976,7978,7980,7982],{"class":1102,"line":1103},[1100,7967,1573],{"class":1318},[1100,7969,5125],{"class":1324},[1100,7971,5128],{"class":1601},[1100,7973,5131],{"class":1601},[1100,7975,1605],{"class":1318},[1100,7977,1532],{"class":1318},[1100,7979,1297],{"class":1110},[1100,7981,1532],{"class":1318},[1100,7983,1579],{"class":1318},[1100,7985,7986,7988,7990,7992,7994,7996,7998],{"class":1102,"line":1120},[1100,7987,3074],{"class":1601},[1100,7989,5148],{"class":1314},[1100,7991,1605],{"class":1318},[1100,7993,5153],{"class":1123},[1100,7995,1315],{"class":1314},[1100,7997,5158],{"class":1318},[1100,7999,1505],{"class":1314},[1100,8001,8002,8004,8006,8008,8010,8012,8014],{"class":1102,"line":1334},[1100,8003,3074],{"class":1601},[1100,8005,5167],{"class":1314},[1100,8007,1605],{"class":1318},[1100,8009,5153],{"class":1123},[1100,8011,1315],{"class":1314},[1100,8013,5176],{"class":1480},[1100,8015,1505],{"class":1314},[1100,8017,8018],{"class":1102,"line":1349},[1100,8019,1383],{"emptyLinePlaceholder":21},[1100,8021,8022,8024,8026,8028,8030],{"class":1102,"line":1361},[1100,8023,2610],{"class":1601},[1100,8025,5189],{"class":1601},[1100,8027,5192],{"class":1123},[1100,8029,1819],{"class":1318},[1100,8031,1394],{"class":1318},[1100,8033,8034,8036,8038,8040,8042,8044,8046,8048,8050,8052],{"class":1102,"line":1372},[1100,8035,3541],{"class":1304},[1100,8037,1965],{"class":1324},[1100,8039,3546],{"class":1318},[1100,8041,5207],{"class":1314},[1100,8043,1822],{"class":1318},[1100,8045,3335],{"class":1314},[1100,8047,1822],{"class":1318},[1100,8049,5216],{"class":1123},[1100,8051,5219],{"class":1324},[1100,8053,5222],{"class":1304},[1100,8055,8056],{"class":1102,"line":1380},[1100,8057,1383],{"emptyLinePlaceholder":21},[1100,8059,8060,8062,8064,8066,8068],{"class":1102,"line":1386},[1100,8061,5231],{"class":1314},[1100,8063,1822],{"class":1318},[1100,8065,3335],{"class":1314},[1100,8067,2636],{"class":1318},[1100,8069,4367],{"class":1480},[1100,8071,8072],{"class":1102,"line":1397},[1100,8073,1383],{"emptyLinePlaceholder":21},[1100,8075,8076],{"class":1102,"line":1413},[1100,8077,5248],{"class":1484},[1100,8079,8080,8082,8084,8086,8088,8090,8092,8094,8096,8098,8100],{"class":1102,"line":1419},[1100,8081,2626],{"class":1601},[1100,8083,2803],{"class":1314},[1100,8085,2636],{"class":1318},[1100,8087,2639],{"class":1304},[1100,8089,5261],{"class":1123},[1100,8091,1315],{"class":1324},[1100,8093,1343],{"class":1318},[1100,8095,5268],{"class":1110},[1100,8097,1343],{"class":1318},[1100,8099,1730],{"class":1318},[1100,8101,1394],{"class":1318},[1100,8103,8104,8106,8108,8110,8112,8114],{"class":1102,"line":1424},[1100,8105,5279],{"class":1324},[1100,8107,1328],{"class":1318},[1100,8109,1405],{"class":1318},[1100,8111,5286],{"class":1110},[1100,8113,1343],{"class":1318},[1100,8115,1346],{"class":1318},[1100,8117,8118,8120,8122],{"class":1102,"line":1447},[1100,8119,5295],{"class":1324},[1100,8121,1328],{"class":1318},[1100,8123,1394],{"class":1318},[1100,8125,8126,8128,8130],{"class":1102,"line":1452},[1100,8127,3375],{"class":1324},[1100,8129,1328],{"class":1318},[1100,8131,1394],{"class":1318},[1100,8133,8134,8136,8138,8140,8142,8144],{"class":1102,"line":1462},[1100,8135,4509],{"class":1324},[1100,8137,1328],{"class":1318},[1100,8139,1405],{"class":1318},[1100,8141,2161],{"class":1110},[1100,8143,1343],{"class":1318},[1100,8145,1346],{"class":1318},[1100,8147,8148,8150,8152,8154,8156,8158,8160,8162,8164,8166,8168,8170,8172,8174,8176,8178,8180],{"class":1102,"line":1472},[1100,8149,4542],{"class":1324},[1100,8151,1328],{"class":1318},[1100,8153,1432],{"class":1324},[1100,8155,1879],{"class":1318},[1100,8157,2533],{"class":1324},[1100,8159,1328],{"class":1318},[1100,8161,1405],{"class":1318},[1100,8163,5340],{"class":1110},[1100,8165,1343],{"class":1318},[1100,8167,1730],{"class":1318},[1100,8169,1733],{"class":1324},[1100,8171,1328],{"class":1318},[1100,8173,5351],{"class":1314},[1100,8175,1822],{"class":1318},[1100,8177,3335],{"class":1314},[1100,8179,1746],{"class":1318},[1100,8181,3181],{"class":1324},[1100,8183,8184],{"class":1102,"line":1488},[1100,8185,4381],{"class":1318},[1100,8187,8188],{"class":1102,"line":1494},[1100,8189,1491],{"class":1318},[1100,8191,8192,8194],{"class":1102,"line":1499},[1100,8193,2427],{"class":1318},[1100,8195,1505],{"class":1324},[1100,8197,8198],{"class":1102,"line":2288},[1100,8199,1383],{"emptyLinePlaceholder":21},[1100,8201,8202],{"class":1102,"line":2301},[1100,8203,5382],{"class":1484},[1100,8205,8206,8208,8210,8212,8214,8216,8218,8220,8222,8224],{"class":1102,"line":2331},[1100,8207,5387],{"class":1123},[1100,8209,1315],{"class":1324},[1100,8211,3690],{"class":1318},[1100,8213,5394],{"class":1110},[1100,8215,5397],{"class":1318},[1100,8217,262],{"class":1314},[1100,8219,1822],{"class":1318},[1100,8221,2031],{"class":1314},[1100,8223,5406],{"class":1318},[1100,8225,1505],{"class":1324},[1100,8227,8228],{"class":1102,"line":2337},[1100,8229,5413],{"class":1318},[1100,8231,8232,8234,8236],{"class":1102,"line":2342},[1100,8233,1649],{"class":1318},[1100,8235,5125],{"class":1324},[1100,8237,1579],{"class":1318},[1100,8239,8240],{"class":1102,"line":2374},[1100,8241,1383],{"emptyLinePlaceholder":21},[1100,8243,8244,8246,8248],{"class":1102,"line":2390},[1100,8245,1573],{"class":1318},[1100,8247,1576],{"class":1324},[1100,8249,1579],{"class":1318},[1100,8251,8252,8254,8256,8258,8260,8262,8264,8266],{"class":1102,"line":2408},[1100,8253,1586],{"class":1318},[1100,8255,5440],{"class":1324},[1100,8257,5443],{"class":1601},[1100,8259,1605],{"class":1318},[1100,8261,1532],{"class":1318},[1100,8263,5450],{"class":1110},[1100,8265,1532],{"class":1318},[1100,8267,1579],{"class":1318},[1100,8269,8271,8273,8275,8277,8280],{"class":8270,"line":2424},[1102,1583],[1100,8272,1595],{"class":1318},[1100,8274,1576],{"class":1324},[1100,8276,5463],{"class":1318},[1100,8278,8279],{"class":1601},"header",[1100,8281,1579],{"class":1318},[1100,8283,8285,8287,8290],{"class":8284,"line":2432},[1102,1583],[1100,8286,1619],{"class":1318},[1100,8288,8289],{"class":1324},"ChatsHistory",[1100,8291,1625],{"class":1318},[1100,8293,8295,8297,8299],{"class":8294,"line":3427},[1102,1583],[1100,8296,1630],{"class":1318},[1100,8298,1576],{"class":1324},[1100,8300,1579],{"class":1318},[1100,8302,8303,8305,8307,8309,8311],{"class":1102,"line":3440},[1100,8304,1595],{"class":1318},[1100,8306,1576],{"class":1324},[1100,8308,5463],{"class":1318},[1100,8310,5466],{"class":1601},[1100,8312,1579],{"class":1318},[1100,8314,8315,8317,8319,8321,8323,8325,8327,8329],{"class":1102,"line":3445},[1100,8316,1619],{"class":1318},[1100,8318,5475],{"class":1324},[1100,8320,5478],{"class":1601},[1100,8322,1605],{"class":1318},[1100,8324,1532],{"class":1318},[1100,8326,5485],{"class":1110},[1100,8328,1532],{"class":1318},[1100,8330,1579],{"class":1318},[1100,8332,8333,8335,8337,8339,8341,8343,8345,8347],{"class":1102,"line":3451},[1100,8334,5494],{"class":1318},[1100,8336,5497],{"class":1324},[1100,8338,5478],{"class":1601},[1100,8340,1605],{"class":1318},[1100,8342,1532],{"class":1318},[1100,8344,5506],{"class":1110},[1100,8346,1532],{"class":1318},[1100,8348,1579],{"class":1318},[1100,8350,8351],{"class":1102,"line":3482},[1100,8352,5515],{"class":1314},[1100,8354,8355,8357,8359],{"class":1102,"line":3526},[1100,8356,5520],{"class":1318},[1100,8358,5497],{"class":1324},[1100,8360,1579],{"class":1318},[1100,8362,8363],{"class":1102,"line":3533},[1100,8364,1383],{"emptyLinePlaceholder":21},[1100,8366,8367,8369],{"class":1102,"line":3538},[1100,8368,5494],{"class":1318},[1100,8370,5536],{"class":1324},[1100,8372,8373,8375,8377,8379,8381],{"class":1102,"line":3556},[1100,8374,5542],{"class":1601},[1100,8376,1605],{"class":1318},[1100,8378,1532],{"class":1318},[1100,8380,5207],{"class":1110},[1100,8382,5551],{"class":1318},[1100,8384,8385,8387,8389,8391,8393],{"class":1102,"line":3595},[1100,8386,5557],{"class":1601},[1100,8388,1605],{"class":1318},[1100,8390,1532],{"class":1318},[1100,8392,5564],{"class":1110},[1100,8394,5551],{"class":1318},[1100,8396,8397,8399,8401,8403,8405],{"class":1102,"line":3601},[1100,8398,5572],{"class":1601},[1100,8400,1605],{"class":1318},[1100,8402,1532],{"class":1318},[1100,8404,5579],{"class":1110},[1100,8406,5551],{"class":1318},[1100,8408,8409,8411,8413,8415,8417],{"class":1102,"line":3606},[1100,8410,5587],{"class":1601},[1100,8412,1605],{"class":1318},[1100,8414,1532],{"class":1318},[1100,8416,5594],{"class":1110},[1100,8418,5551],{"class":1318},[1100,8420,8421,8423,8425,8427,8429],{"class":1102,"line":3612},[1100,8422,5602],{"class":1601},[1100,8424,1605],{"class":1318},[1100,8426,1532],{"class":1318},[1100,8428,5609],{"class":1110},[1100,8430,5551],{"class":1318},[1100,8432,8433],{"class":1102,"line":3632},[1100,8434,5617],{"class":1318},[1100,8436,8437,8439,8441,8443,8445,8447,8449,8451],{"class":1102,"line":3660},[1100,8438,5623],{"class":1318},[1100,8440,5626],{"class":1324},[1100,8442,5629],{"class":1601},[1100,8444,1605],{"class":1318},[1100,8446,1532],{"class":1318},[1100,8448,5636],{"class":1110},[1100,8450,1532],{"class":1318},[1100,8452,1625],{"class":1318},[1100,8454,8455,8457,8459],{"class":1102,"line":3676},[1100,8456,5520],{"class":1318},[1100,8458,5090],{"class":1324},[1100,8460,1579],{"class":1318},[1100,8462,8463,8465,8467],{"class":1102,"line":3695},[1100,8464,5654],{"class":1318},[1100,8466,5475],{"class":1324},[1100,8468,1579],{"class":1318},[1100,8470,8471,8473,8475],{"class":1102,"line":3723},[1100,8472,1630],{"class":1318},[1100,8474,1576],{"class":1324},[1100,8476,1579],{"class":1318},[1100,8478,8479,8481,8483],{"class":1102,"line":3730},[1100,8480,1640],{"class":1318},[1100,8482,5440],{"class":1324},[1100,8484,1579],{"class":1318},[1100,8486,8487,8489,8491],{"class":1102,"line":3735},[1100,8488,1649],{"class":1318},[1100,8490,1576],{"class":1324},[1100,8492,1579],{"class":1318},[993,8494,8496],{"id":8495},"integrating-history-in-the-chat-page","Integrating history in the chat page",[1291,8498,8499],{},[1709,8500,8501],{},[1091,8502,8505],{"className":1563,"code":8503,"filename":5744,"highlights":8504,"language":34,"meta":1096,"style":1096},"\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",[3975,3981,3998],[1050,8506,8507,8527,8553,8571,8589,8593,8605,8617,8621,8625,8667,8671,8687,8727,8731,8735,8751,8755,8759,8775,8793,8811,8825,8849,8857,8869,8873,8897,8911,8915,8919,8931,8943,8957,8971,8983,8989,8993,8999,9003,9021,9031,9051,9077,9089,9093,9097,9101,9105,9117,9145,9155,9159,9165,9173,9177,9185,9203,9215,9223,9231,9243,9262,9269,9282,9294,9298,9310,9314,9338,9404,9410,9422,9434,9446,9450,9456,9468,9480,9492,9496,9504,9508,9514,9526,9538,9550,9562,9566,9574,9582,9590,9594,9600,9612,9624,9636,9648,9660,9664,9670,9682,9694,9706,9718,9722,9730,9738,9746,9754],{"__ignoreMap":1096},[1100,8508,8509,8511,8513,8515,8517,8519,8521,8523,8525],{"class":1102,"line":1103},[1100,8510,1573],{"class":1318},[1100,8512,5125],{"class":1324},[1100,8514,5128],{"class":1601},[1100,8516,5131],{"class":1601},[1100,8518,1605],{"class":1318},[1100,8520,1532],{"class":1318},[1100,8522,1297],{"class":1110},[1100,8524,1532],{"class":1318},[1100,8526,1579],{"class":1318},[1100,8528,8529,8531,8533,8535,8537,8539,8541,8543,8545,8547,8549,8551],{"class":1102,"line":1120},[1100,8530,1721],{"class":1304},[1100,8532,1724],{"class":1318},[1100,8534,5777],{"class":1314},[1100,8536,1730],{"class":1318},[1100,8538,5782],{"class":1314},[1100,8540,1730],{"class":1318},[1100,8542,5787],{"class":1314},[1100,8544,1746],{"class":1318},[1100,8546,1749],{"class":1304},[1100,8548,1405],{"class":1318},[1100,8550,2547],{"class":1110},[1100,8552,1369],{"class":1318},[1100,8554,8555,8557,8559,8561,8563,8565,8567,8569],{"class":1102,"line":1334},[1100,8556,1721],{"class":1304},[1100,8558,1724],{"class":1318},[1100,8560,5807],{"class":1314},[1100,8562,1746],{"class":1318},[1100,8564,1749],{"class":1304},[1100,8566,1405],{"class":1318},[1100,8568,5816],{"class":1110},[1100,8570,1369],{"class":1318},[1100,8572,8573,8575,8577,8579,8581,8583,8585,8587],{"class":1102,"line":1349},[1100,8574,1721],{"class":1304},[1100,8576,1724],{"class":1318},[1100,8578,5828],{"class":1314},[1100,8580,1746],{"class":1318},[1100,8582,1749],{"class":1304},[1100,8584,1405],{"class":1318},[1100,8586,5837],{"class":1110},[1100,8588,1369],{"class":1318},[1100,8590,8591],{"class":1102,"line":1361},[1100,8592,1383],{"emptyLinePlaceholder":21},[1100,8594,8595,8597,8599,8601,8603],{"class":1102,"line":1372},[1100,8596,3074],{"class":1601},[1100,8598,5850],{"class":1314},[1100,8600,1605],{"class":1318},[1100,8602,5855],{"class":1123},[1100,8604,2682],{"class":1314},[1100,8606,8607,8609,8611,8613,8615],{"class":1102,"line":1380},[1100,8608,3074],{"class":1601},[1100,8610,5864],{"class":1314},[1100,8612,1605],{"class":1318},[1100,8614,5869],{"class":1123},[1100,8616,2682],{"class":1314},[1100,8618,8619],{"class":1102,"line":1386},[1100,8620,1383],{"emptyLinePlaceholder":21},[1100,8622,8623],{"class":1102,"line":1397},[1100,8624,5880],{"class":1484},[1100,8626,8627,8629,8631,8633,8635,8637,8639,8641,8643,8645,8647,8649,8651,8653,8655,8657,8659,8661,8663,8665],{"class":1102,"line":1413},[1100,8628,3074],{"class":1601},[1100,8630,1724],{"class":1318},[1100,8632,5889],{"class":1324},[1100,8634,1328],{"class":1318},[1100,8636,5894],{"class":1314},[1100,8638,1502],{"class":1318},[1100,8640,2636],{"class":1318},[1100,8642,2639],{"class":1304},[1100,8644,5903],{"class":1123},[1100,8646,1315],{"class":1314},[1100,8648,3690],{"class":1318},[1100,8650,5910],{"class":1110},[1100,8652,5397],{"class":1318},[1100,8654,5915],{"class":1314},[1100,8656,1822],{"class":1318},[1100,8658,5920],{"class":1314},[1100,8660,1822],{"class":1318},[1100,8662,2031],{"class":1314},[1100,8664,5406],{"class":1318},[1100,8666,1505],{"class":1314},[1100,8668,8669],{"class":1102,"line":1419},[1100,8670,1383],{"emptyLinePlaceholder":21},[1100,8672,8673,8675,8677,8679,8681,8683,8685],{"class":1102,"line":1424},[1100,8674,5937],{"class":1304},[1100,8676,1965],{"class":1314},[1100,8678,3546],{"class":1318},[1100,8680,5944],{"class":1314},[1100,8682,1822],{"class":1318},[1100,8684,5949],{"class":1314},[1100,8686,1319],{"class":1318},[1100,8688,8689,8691,8693,8695,8697,8699,8701,8703,8705,8707,8709,8711,8713,8715,8717,8719,8721,8723,8725],{"class":1102,"line":1447},[1100,8690,5956],{"class":1304},[1100,8692,2912],{"class":1123},[1100,8694,1315],{"class":1324},[1100,8696,1879],{"class":1318},[1100,8698,3568],{"class":1324},[1100,8700,1328],{"class":1318},[1100,8702,3574],{"class":3573},[1100,8704,1730],{"class":1318},[1100,8706,3579],{"class":1324},[1100,8708,1328],{"class":1318},[1100,8710,1405],{"class":1318},[1100,8712,3586],{"class":1110},[1100,8714,1343],{"class":1318},[1100,8716,1730],{"class":1318},[1100,8718,5985],{"class":1324},[1100,8720,1328],{"class":1318},[1100,8722,4182],{"class":1480},[1100,8724,1746],{"class":1318},[1100,8726,1505],{"class":1324},[1100,8728,8729],{"class":1102,"line":1452},[1100,8730,5413],{"class":1318},[1100,8732,8733],{"class":1102,"line":1462},[1100,8734,1383],{"emptyLinePlaceholder":21},[1100,8736,8737,8739,8741,8743,8745,8747,8749],{"class":1102,"line":1472},[1100,8738,3074],{"class":1601},[1100,8740,5148],{"class":1314},[1100,8742,1605],{"class":1318},[1100,8744,5153],{"class":1123},[1100,8746,1315],{"class":1314},[1100,8748,5158],{"class":1318},[1100,8750,1505],{"class":1314},[1100,8752,8753],{"class":1102,"line":1488},[1100,8754,1383],{"emptyLinePlaceholder":21},[1100,8756,8757],{"class":1102,"line":1494},[1100,8758,6026],{"class":1484},[1100,8760,8761,8763,8765,8767,8769,8771,8773],{"class":1102,"line":1499},[1100,8762,3074],{"class":1601},[1100,8764,6034],{"class":1314},[1100,8766,1605],{"class":1318},[1100,8768,1916],{"class":1318},[1100,8770,5807],{"class":1123},[1100,8772,1315],{"class":1314},[1100,8774,1319],{"class":1318},[1100,8776,8777,8779,8781,8783,8785,8787,8789,8791],{"class":1102,"line":2288},[1100,8778,1812],{"class":1324},[1100,8780,1328],{"class":1318},[1100,8782,6054],{"class":1314},[1100,8784,1822],{"class":1318},[1100,8786,3335],{"class":1314},[1100,8788,1822],{"class":1318},[1100,8790,2031],{"class":1314},[1100,8792,1346],{"class":1318},[1100,8794,8795,8797,8799,8801,8803,8805,8807,8809],{"class":1102,"line":2301},[1100,8796,1972],{"class":1324},[1100,8798,1328],{"class":1318},[1100,8800,6054],{"class":1314},[1100,8802,1822],{"class":1318},[1100,8804,3335],{"class":1314},[1100,8806,1822],{"class":1318},[1100,8808,2010],{"class":1314},[1100,8810,1346],{"class":1318},[1100,8812,8813,8815,8817,8819,8821,8823],{"class":1102,"line":2331},[1100,8814,6089],{"class":1324},[1100,8816,1328],{"class":1318},[1100,8818,1916],{"class":1318},[1100,8820,5777],{"class":1123},[1100,8822,1315],{"class":1314},[1100,8824,1319],{"class":1318},[1100,8826,8827,8829,8831,8833,8835,8837,8839,8841,8843,8845,8847],{"class":1102,"line":2337},[1100,8828,6105],{"class":1324},[1100,8830,1328],{"class":1318},[1100,8832,3684],{"class":1318},[1100,8834,5910],{"class":1110},[1100,8836,5397],{"class":1318},[1100,8838,5944],{"class":1314},[1100,8840,1822],{"class":1318},[1100,8842,3335],{"class":1314},[1100,8844,1822],{"class":1318},[1100,8846,2031],{"class":1314},[1100,8848,6126],{"class":1318},[1100,8850,8851,8853,8855],{"class":1102,"line":2342},[1100,8852,2427],{"class":1318},[1100,8854,1896],{"class":1314},[1100,8856,1346],{"class":1318},[1100,8858,8859,8861,8863,8865,8867],{"class":1102,"line":2374},[1100,8860,6141],{"class":1324},[1100,8862,1315],{"class":1318},[1100,8864,6146],{"class":1956},[1100,8866,1896],{"class":1318},[1100,8868,1394],{"class":1318},[1100,8870,8871],{"class":1102,"line":2390},[1100,8872,6156],{"class":1484},[1100,8874,8875,8877,8879,8881,8883,8885,8887,8889,8891,8893,8895],{"class":1102,"line":2408},[1100,8876,6162],{"class":1304},[1100,8878,1965],{"class":1324},[1100,8880,6146],{"class":1314},[1100,8882,1822],{"class":1318},[1100,8884,6171],{"class":1314},[1100,8886,3362],{"class":1318},[1100,8888,1405],{"class":1318},[1100,8890,4329],{"class":1110},[1100,8892,1343],{"class":1318},[1100,8894,3551],{"class":1324},[1100,8896,1319],{"class":1318},[1100,8898,8899,8901,8903,8905,8907,8909],{"class":1102,"line":2424},[1100,8900,6189],{"class":1123},[1100,8902,1315],{"class":1324},[1100,8904,1343],{"class":1318},[1100,8906,1801],{"class":1110},[1100,8908,1343],{"class":1318},[1100,8910,1505],{"class":1324},[1100,8912,8913],{"class":1102,"line":2432},[1100,8914,1491],{"class":1318},[1100,8916,8917],{"class":1102,"line":3427},[1100,8918,1416],{"class":1318},[1100,8920,8921,8923,8925,8927,8929],{"class":1102,"line":3440},[1100,8922,6215],{"class":1324},[1100,8924,1315],{"class":1318},[1100,8926,6220],{"class":1956},[1100,8928,1896],{"class":1318},[1100,8930,1394],{"class":1318},[1100,8932,8933,8935,8937,8939,8941],{"class":1102,"line":3445},[1100,8934,6230],{"class":1314},[1100,8936,1822],{"class":1318},[1100,8938,6235],{"class":1123},[1100,8940,1315],{"class":1324},[1100,8942,1319],{"class":1318},[1100,8944,8945,8947,8949,8951,8953,8955],{"class":1102,"line":3451},[1100,8946,6245],{"class":1324},[1100,8948,1328],{"class":1318},[1100,8950,1405],{"class":1318},[1100,8952,497],{"class":1110},[1100,8954,1343],{"class":1318},[1100,8956,1346],{"class":1318},[1100,8958,8959,8961,8963,8965,8967,8969],{"class":1102,"line":3482},[1100,8960,6261],{"class":1324},[1100,8962,1328],{"class":1318},[1100,8964,6266],{"class":1314},[1100,8966,1822],{"class":1318},[1100,8968,4481],{"class":1314},[1100,8970,1346],{"class":1318},[1100,8972,8973,8975,8977,8979,8981],{"class":1102,"line":3526},[1100,8974,6278],{"class":1324},[1100,8976,1328],{"class":1318},[1100,8978,1405],{"class":1318},[1100,8980,6220],{"class":1110},[1100,8982,1369],{"class":1318},[1100,8984,8985,8987],{"class":1102,"line":3533},[1100,8986,3389],{"class":1318},[1100,8988,1505],{"class":1324},[1100,8990,8991],{"class":1102,"line":3538},[1100,8992,3598],{"class":1318},[1100,8994,8995,8997],{"class":1102,"line":3556},[1100,8996,1502],{"class":1318},[1100,8998,1505],{"class":1314},[1100,9000,9001],{"class":1102,"line":3595},[1100,9002,1383],{"emptyLinePlaceholder":21},[1100,9004,9005,9007,9009,9011,9013,9015,9017,9019],{"class":1102,"line":3601},[1100,9006,6314],{"class":1601},[1100,9008,6317],{"class":1123},[1100,9010,1315],{"class":1318},[1100,9012,6322],{"class":1956},[1100,9014,1328],{"class":1318},[1100,9016,6327],{"class":1106},[1100,9018,1896],{"class":1318},[1100,9020,1394],{"class":1318},[1100,9022,9023,9025,9027,9029],{"class":1102,"line":3606},[1100,9024,6336],{"class":1314},[1100,9026,1822],{"class":1318},[1100,9028,6341],{"class":1123},[1100,9030,2682],{"class":1324},[1100,9032,9033,9035,9037,9039,9041,9043,9045,9047,9049],{"class":1102,"line":3612},[1100,9034,3541],{"class":1304},[1100,9036,1965],{"class":1324},[1100,9038,5207],{"class":1314},[1100,9040,1822],{"class":1318},[1100,9042,3335],{"class":1314},[1100,9044,1822],{"class":1318},[1100,9046,5216],{"class":1123},[1100,9048,5219],{"class":1324},[1100,9050,1319],{"class":1318},[1100,9052,9053,9055,9057,9059,9061,9063,9065,9067,9069,9071,9073,9075],{"class":1102,"line":3632},[1100,9054,6368],{"class":1314},[1100,9056,1822],{"class":1318},[1100,9058,6373],{"class":1123},[1100,9060,1315],{"class":1324},[1100,9062,1879],{"class":1318},[1100,9064,1733],{"class":1324},[1100,9066,1328],{"class":1318},[1100,9068,5351],{"class":1314},[1100,9070,1822],{"class":1318},[1100,9072,3335],{"class":1314},[1100,9074,1746],{"class":1318},[1100,9076,1505],{"class":1324},[1100,9078,9079,9081,9083,9085,9087],{"class":1102,"line":3660},[1100,9080,6396],{"class":1314},[1100,9082,1822],{"class":1318},[1100,9084,3335],{"class":1314},[1100,9086,2636],{"class":1318},[1100,9088,6405],{"class":1318},[1100,9090,9091],{"class":1102,"line":3676},[1100,9092,3598],{"class":1318},[1100,9094,9095],{"class":1102,"line":3695},[1100,9096,5413],{"class":1318},[1100,9098,9099],{"class":1102,"line":3723},[1100,9100,1383],{"emptyLinePlaceholder":21},[1100,9102,9103],{"class":1102,"line":3730},[1100,9104,6422],{"class":1484},[1100,9106,9107,9109,9111,9113,9115],{"class":1102,"line":3735},[1100,9108,6427],{"class":1123},[1100,9110,1315],{"class":1314},[1100,9112,1819],{"class":1318},[1100,9114,1839],{"class":1601},[1100,9116,1394],{"class":1318},[1100,9118,9119,9121,9123,9125,9127,9129,9131,9133,9135,9137,9139,9141,9143],{"class":1102,"line":3801},[1100,9120,3541],{"class":1304},[1100,9122,1965],{"class":1324},[1100,9124,5944],{"class":1314},[1100,9126,1822],{"class":1318},[1100,9128,3335],{"class":1314},[1100,9130,3856],{"class":1318},[1100,9132,2010],{"class":1314},[1100,9134,1822],{"class":1318},[1100,9136,3835],{"class":1314},[1100,9138,3362],{"class":1318},[1100,9140,3841],{"class":3573},[1100,9142,3551],{"class":1324},[1100,9144,1319],{"class":1318},[1100,9146,9147,9149,9151,9153],{"class":1102,"line":3806},[1100,9148,6368],{"class":1314},[1100,9150,1822],{"class":1318},[1100,9152,6472],{"class":1123},[1100,9154,2682],{"class":1324},[1100,9156,9157],{"class":1102,"line":3811},[1100,9158,3598],{"class":1318},[1100,9160,9161,9163],{"class":1102,"line":3817},[1100,9162,1502],{"class":1318},[1100,9164,1505],{"class":1314},[1100,9166,9167,9169,9171],{"class":1102,"line":3846},[1100,9168,1649],{"class":1318},[1100,9170,5125],{"class":1324},[1100,9172,1579],{"class":1318},[1100,9174,9175],{"class":1102,"line":3887},[1100,9176,1383],{"emptyLinePlaceholder":21},[1100,9178,9179,9181,9183],{"class":1102,"line":3916},[1100,9180,1573],{"class":1318},[1100,9182,1576],{"class":1324},[1100,9184,1579],{"class":1318},[1100,9186,9187,9189,9191,9193,9195,9197,9199,9201],{"class":1102,"line":3928},[1100,9188,1586],{"class":1318},[1100,9190,5440],{"class":1324},[1100,9192,5443],{"class":1601},[1100,9194,1605],{"class":1318},[1100,9196,1532],{"class":1318},[1100,9198,5450],{"class":1110},[1100,9200,1532],{"class":1318},[1100,9202,1579],{"class":1318},[1100,9204,9205,9207,9209,9211,9213],{"class":1102,"line":3944},[1100,9206,1595],{"class":1318},[1100,9208,1576],{"class":1324},[1100,9210,5463],{"class":1318},[1100,9212,8279],{"class":1601},[1100,9214,1579],{"class":1318},[1100,9216,9217,9219,9221],{"class":1102,"line":3958},[1100,9218,1619],{"class":1318},[1100,9220,8289],{"class":1324},[1100,9222,1625],{"class":1318},[1100,9224,9225,9227,9229],{"class":1102,"line":3965},[1100,9226,1630],{"class":1318},[1100,9228,1576],{"class":1324},[1100,9230,1579],{"class":1318},[1100,9232,9233,9235,9237,9239,9241],{"class":1102,"line":3970},[1100,9234,1595],{"class":1318},[1100,9236,1576],{"class":1324},[1100,9238,5463],{"class":1318},[1100,9240,5466],{"class":1601},[1100,9242,1579],{"class":1318},[1100,9244,9246,9248,9250,9252,9254,9256,9258,9260],{"class":9245,"line":3975},[1102,1583],[1100,9247,1619],{"class":1318},[1100,9249,5475],{"class":1324},[1100,9251,5478],{"class":1601},[1100,9253,1605],{"class":1318},[1100,9255,1532],{"class":1318},[1100,9257,6549],{"class":1110},[1100,9259,1532],{"class":1318},[1100,9261,1579],{"class":1318},[1100,9263,9265,9267],{"class":9264,"line":3981},[1102,1583],[1100,9266,5494],{"class":1318},[1100,9268,6560],{"class":1324},[1100,9270,9272,9274,9276,9278,9280],{"class":9271,"line":3998},[1102,1583],[1100,9273,6565],{"class":1601},[1100,9275,1605],{"class":1318},[1100,9277,1532],{"class":1318},[1100,9279,6572],{"class":1110},[1100,9281,5551],{"class":1318},[1100,9283,9284,9286,9288,9290,9292],{"class":1102,"line":4020},[1100,9285,5557],{"class":1601},[1100,9287,1605],{"class":1318},[1100,9289,1532],{"class":1318},[1100,9291,6585],{"class":1110},[1100,9293,5551],{"class":1318},[1100,9295,9296],{"class":1102,"line":4038},[1100,9297,6592],{"class":1601},[1100,9299,9300,9302,9304,9306,9308],{"class":1102,"line":4046},[1100,9301,6597],{"class":1601},[1100,9303,1605],{"class":1318},[1100,9305,1532],{"class":1318},[1100,9307,6604],{"class":1110},[1100,9309,5551],{"class":1318},[1100,9311,9312],{"class":1102,"line":4063},[1100,9313,5617],{"class":1318},[1100,9315,9316,9318,9320,9322,9324,9326,9328,9330,9332,9334,9336],{"class":1102,"line":4084},[1100,9317,5623],{"class":1318},[1100,9319,1576],{"class":1324},[1100,9321,5463],{"class":1318},[1100,9323,371],{"class":1601},[1100,9325,1605],{"class":1318},[1100,9327,1532],{"class":1318},[1100,9329,1879],{"class":1318},[1100,9331,6629],{"class":1314},[1100,9333,1502],{"class":1318},[1100,9335,1532],{"class":1318},[1100,9337,1579],{"class":1318},[1100,9339,9340,9342,9344,9346,9348,9350,9352,9354,9356,9358,9360,9362,9364,9366,9368,9370,9372,9374,9376,9378,9380,9382,9384,9386,9388,9390,9392,9394,9396,9398,9400,9402],{"class":1102,"line":4094},[1100,9341,6640],{"class":1318},[1100,9343,1576],{"class":1324},[1100,9345,6645],{"class":1304},[1100,9347,1605],{"class":1318},[1100,9349,1532],{"class":1318},[1100,9351,6652],{"class":1314},[1100,9353,1730],{"class":1318},[1100,9355,6657],{"class":1314},[1100,9357,6660],{"class":1318},[1100,9359,2631],{"class":1314},[1100,9361,1822],{"class":1318},[1100,9363,2212],{"class":1314},[1100,9365,1532],{"class":1318},[1100,9367,6671],{"class":1318},[1100,9369,6674],{"class":1601},[1100,9371,1605],{"class":1318},[1100,9373,6679],{"class":1318},[1100,9375,4481],{"class":1314},[1100,9377,1822],{"class":1318},[1100,9379,2031],{"class":1314},[1100,9381,1502],{"class":1318},[1100,9383,6690],{"class":1110},[1100,9385,5397],{"class":1318},[1100,9387,6695],{"class":1314},[1100,9389,1822],{"class":1318},[1100,9391,6171],{"class":1314},[1100,9393,1502],{"class":1318},[1100,9395,6690],{"class":1110},[1100,9397,5397],{"class":1318},[1100,9399,6708],{"class":1314},[1100,9401,6711],{"class":1318},[1100,9403,1579],{"class":1318},[1100,9405,9406,9408],{"class":1102,"line":4104},[1100,9407,6718],{"class":1318},[1100,9409,6721],{"class":1324},[1100,9411,9412,9414,9416,9418,9420],{"class":1102,"line":4114},[1100,9413,6726],{"class":1601},[1100,9415,1605],{"class":1318},[1100,9417,1532],{"class":1318},[1100,9419,6733],{"class":1110},[1100,9421,5551],{"class":1318},[1100,9423,9424,9426,9428,9430,9432],{"class":1102,"line":4131},[1100,9425,6740],{"class":1601},[1100,9427,1605],{"class":1318},[1100,9429,1532],{"class":1318},[1100,9431,6747],{"class":1110},[1100,9433,5551],{"class":1318},[1100,9435,9436,9438,9440,9442,9444],{"class":1102,"line":4142},[1100,9437,6754],{"class":1601},[1100,9439,1605],{"class":1318},[1100,9441,1532],{"class":1318},[1100,9443,6761],{"class":1110},[1100,9445,5551],{"class":1318},[1100,9447,9448],{"class":1102,"line":4148},[1100,9449,6768],{"class":1318},[1100,9451,9452,9454],{"class":1102,"line":4154},[1100,9453,6773],{"class":1318},[1100,9455,6776],{"class":1324},[1100,9457,9458,9460,9462,9464,9466],{"class":1102,"line":4164},[1100,9459,6781],{"class":1601},[1100,9461,1605],{"class":1318},[1100,9463,1532],{"class":1318},[1100,9465,6747],{"class":1110},[1100,9467,5551],{"class":1318},[1100,9469,9470,9472,9474,9476,9478],{"class":1102,"line":4174},[1100,9471,6794],{"class":1601},[1100,9473,1605],{"class":1318},[1100,9475,1532],{"class":1318},[1100,9477,6801],{"class":1110},[1100,9479,5551],{"class":1318},[1100,9481,9482,9484,9486,9488,9490],{"class":1102,"line":4187},[1100,9483,6808],{"class":1601},[1100,9485,1605],{"class":1318},[1100,9487,1532],{"class":1318},[1100,9489,6815],{"class":1110},[1100,9491,5551],{"class":1318},[1100,9493,9494],{"class":1102,"line":4202},[1100,9495,6822],{"class":1318},[1100,9497,9498,9500,9502],{"class":1102,"line":4207},[1100,9499,6827],{"class":1318},[1100,9501,6830],{"class":1324},[1100,9503,1579],{"class":1318},[1100,9505,9506],{"class":1102,"line":4212},[1100,9507,1383],{"emptyLinePlaceholder":21},[1100,9509,9510,9512],{"class":1102,"line":4222},[1100,9511,6718],{"class":1318},[1100,9513,6776],{"class":1324},[1100,9515,9516,9518,9520,9522,9524],{"class":1102,"line":4238},[1100,9517,6847],{"class":1601},[1100,9519,1605],{"class":1318},[1100,9521,1532],{"class":1318},[1100,9523,6854],{"class":1110},[1100,9525,5551],{"class":1318},[1100,9527,9528,9530,9532,9534,9536],{"class":1102,"line":4253},[1100,9529,6861],{"class":1601},[1100,9531,1605],{"class":1318},[1100,9533,1532],{"class":1318},[1100,9535,6747],{"class":1110},[1100,9537,5551],{"class":1318},[1100,9539,9540,9542,9544,9546,9548],{"class":1102,"line":4259},[1100,9541,6874],{"class":1601},[1100,9543,1605],{"class":1318},[1100,9545,1532],{"class":1318},[1100,9547,6881],{"class":1110},[1100,9549,5551],{"class":1318},[1100,9551,9552,9554,9556,9558,9560],{"class":1102,"line":4265},[1100,9553,6888],{"class":1601},[1100,9555,1605],{"class":1318},[1100,9557,1532],{"class":1318},[1100,9559,6815],{"class":1110},[1100,9561,5551],{"class":1318},[1100,9563,9564],{"class":1102,"line":4273},[1100,9565,6901],{"class":1318},[1100,9567,9568,9570,9572],{"class":1102,"line":4278},[1100,9569,6906],{"class":1318},[1100,9571,1576],{"class":1324},[1100,9573,1579],{"class":1318},[1100,9575,9576,9578,9580],{"class":1102,"line":4284},[1100,9577,6915],{"class":1318},[1100,9579,1576],{"class":1324},[1100,9581,1579],{"class":1318},[1100,9583,9584,9586,9588],{"class":1102,"line":4304},[1100,9585,5520],{"class":1318},[1100,9587,5096],{"class":1324},[1100,9589,1579],{"class":1318},[1100,9591,9592],{"class":1102,"line":4319},[1100,9593,1383],{"emptyLinePlaceholder":21},[1100,9595,9596,9598],{"class":1102,"line":4336},[1100,9597,5494],{"class":1318},[1100,9599,5536],{"class":1324},[1100,9601,9602,9604,9606,9608,9610],{"class":1102,"line":4359},[1100,9603,5542],{"class":1601},[1100,9605,1605],{"class":1318},[1100,9607,1532],{"class":1318},[1100,9609,5207],{"class":1110},[1100,9611,5551],{"class":1318},[1100,9613,9614,9616,9618,9620,9622],{"class":1102,"line":4370},[1100,9615,6954],{"class":1601},[1100,9617,1605],{"class":1318},[1100,9619,1532],{"class":1318},[1100,9621,6961],{"class":1110},[1100,9623,5551],{"class":1318},[1100,9625,9626,9628,9630,9632,9634],{"class":1102,"line":4378},[1100,9627,5572],{"class":1601},[1100,9629,1605],{"class":1318},[1100,9631,1532],{"class":1318},[1100,9633,5579],{"class":1110},[1100,9635,5551],{"class":1318},[1100,9637,9638,9640,9642,9644,9646],{"class":1102,"line":4384},[1100,9639,6597],{"class":1601},[1100,9641,1605],{"class":1318},[1100,9643,1532],{"class":1318},[1100,9645,6986],{"class":1110},[1100,9647,5551],{"class":1318},[1100,9649,9650,9652,9654,9656,9658],{"class":1102,"line":4389},[1100,9651,5602],{"class":1601},[1100,9653,1605],{"class":1318},[1100,9655,1532],{"class":1318},[1100,9657,6999],{"class":1110},[1100,9659,5551],{"class":1318},[1100,9661,9662],{"class":1102,"line":4412},[1100,9663,5617],{"class":1318},[1100,9665,9666,9668],{"class":1102,"line":4418},[1100,9667,5623],{"class":1318},[1100,9669,7012],{"class":1324},[1100,9671,9672,9674,9676,9678,9680],{"class":1102,"line":4438},[1100,9673,7017],{"class":1601},[1100,9675,1605],{"class":1318},[1100,9677,1532],{"class":1318},[1100,9679,6585],{"class":1110},[1100,9681,5551],{"class":1318},[1100,9683,9684,9686,9688,9690,9692],{"class":1102,"line":4444},[1100,9685,7030],{"class":1601},[1100,9687,1605],{"class":1318},[1100,9689,1532],{"class":1318},[1100,9691,5636],{"class":1110},[1100,9693,5551],{"class":1318},[1100,9695,9696,9698,9700,9702,9704],{"class":1102,"line":4490},[1100,9697,7043],{"class":1601},[1100,9699,1605],{"class":1318},[1100,9701,1532],{"class":1318},[1100,9703,7050],{"class":1110},[1100,9705,5551],{"class":1318},[1100,9707,9708,9710,9712,9714,9716],{"class":1102,"line":4506},[1100,9709,7057],{"class":1601},[1100,9711,1605],{"class":1318},[1100,9713,1532],{"class":1318},[1100,9715,7064],{"class":1110},[1100,9717,5551],{"class":1318},[1100,9719,9720],{"class":1102,"line":4539},[1100,9721,7071],{"class":1318},[1100,9723,9724,9726,9728],{"class":1102,"line":4553},[1100,9725,5520],{"class":1318},[1100,9727,5090],{"class":1324},[1100,9729,1579],{"class":1318},[1100,9731,9732,9734,9736],{"class":1102,"line":4561},[1100,9733,5654],{"class":1318},[1100,9735,5475],{"class":1324},[1100,9737,1579],{"class":1318},[1100,9739,9740,9742,9744],{"class":1102,"line":4566},[1100,9741,1630],{"class":1318},[1100,9743,1576],{"class":1324},[1100,9745,1579],{"class":1318},[1100,9747,9748,9750,9752],{"class":1102,"line":4573},[1100,9749,1640],{"class":1318},[1100,9751,5440],{"class":1324},[1100,9753,1579],{"class":1318},[1100,9755,9756,9758,9760],{"class":1102,"line":4578},[1100,9757,1649],{"class":1318},[1100,9759,1576],{"class":1324},[1100,9761,1579],{"class":1318},[989,9763,4639,9764,9767,9768,9770],{},[1050,9765,9766],{},"refreshNuxtData('chats')"," call in the chat page's ",[1050,9769,7173],{}," callback (as shown earlier) ensures the chat list updates automatically when a new title is generated.",[993,9772,9774],{"id":9773},"adding-multi-model-support","Adding multi-model support",[989,9776,9777,9778,9781],{},"One of the benefits of using ",[1043,9779,4608],{"href":1079,"rel":9780},[1047]," is the ability to switch between models seamlessly. This section adds a model selector to the chat.",[1128,9783,9785],{"id":9784},"creating-a-models-composable","Creating a models composable",[989,9787,9788,9789,1328],{},"Define the available models and persist the user's selection using ",[1043,9790,9793],{"href":9791,"rel":9792},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-cookie",[1047],[1050,9794,9795],{},"useCookie",[1291,9797,9798],{},[1091,9799,9802],{"className":1295,"code":9800,"filename":9801,"language":1297,"meta":1096,"style":1096},"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",[1050,9803,9804,9817,9828,9871,9912,9953,9958,9962,9992,10009,10015,10019,10025,10032,10037,10041],{"__ignoreMap":1096},[1100,9805,9806,9808,9810,9813,9815],{"class":1102,"line":1103},[1100,9807,1305],{"class":1304},[1100,9809,5189],{"class":1601},[1100,9811,9812],{"class":1123}," useModels",[1100,9814,1819],{"class":1318},[1100,9816,1394],{"class":1318},[1100,9818,9819,9821,9824,9826],{"class":1102,"line":1120},[1100,9820,2626],{"class":1601},[1100,9822,9823],{"class":1314}," models",[1100,9825,2636],{"class":1318},[1100,9827,1331],{"class":1324},[1100,9829,9830,9833,9835,9837,9839,9841,9843,9845,9847,9849,9851,9853,9855,9857,9860,9862,9864,9867,9869],{"class":1102,"line":1334},[1100,9831,9832],{"class":1318},"    {",[1100,9834,3103],{"class":1324},[1100,9836,1328],{"class":1318},[1100,9838,1405],{"class":1318},[1100,9840,3110],{"class":1110},[1100,9842,1343],{"class":1318},[1100,9844,1730],{"class":1318},[1100,9846,3089],{"class":1324},[1100,9848,1328],{"class":1318},[1100,9850,1405],{"class":1318},[1100,9852,3096],{"class":1110},[1100,9854,1343],{"class":1318},[1100,9856,1730],{"class":1318},[1100,9858,9859],{"class":1324}," icon",[1100,9861,1328],{"class":1318},[1100,9863,1405],{"class":1318},[1100,9865,9866],{"class":1110},"i-simple-icons-openai",[1100,9868,1343],{"class":1318},[1100,9870,3115],{"class":1318},[1100,9872,9873,9875,9877,9879,9881,9883,9885,9887,9889,9891,9893,9895,9897,9899,9901,9903,9905,9908,9910],{"class":1102,"line":1349},[1100,9874,9832],{"class":1318},[1100,9876,3103],{"class":1324},[1100,9878,1328],{"class":1318},[1100,9880,1405],{"class":1318},[1100,9882,3141],{"class":1110},[1100,9884,1343],{"class":1318},[1100,9886,1730],{"class":1318},[1100,9888,3089],{"class":1324},[1100,9890,1328],{"class":1318},[1100,9892,1405],{"class":1318},[1100,9894,3128],{"class":1110},[1100,9896,1343],{"class":1318},[1100,9898,1730],{"class":1318},[1100,9900,9859],{"class":1324},[1100,9902,1328],{"class":1318},[1100,9904,1405],{"class":1318},[1100,9906,9907],{"class":1110},"i-simple-icons-anthropic",[1100,9909,1343],{"class":1318},[1100,9911,3115],{"class":1318},[1100,9913,9914,9916,9918,9920,9922,9924,9926,9928,9930,9932,9934,9936,9938,9940,9942,9944,9946,9949,9951],{"class":1102,"line":1361},[1100,9915,9832],{"class":1318},[1100,9917,3103],{"class":1324},[1100,9919,1328],{"class":1318},[1100,9921,1405],{"class":1318},[1100,9923,3171],{"class":1110},[1100,9925,1343],{"class":1318},[1100,9927,1730],{"class":1318},[1100,9929,3089],{"class":1324},[1100,9931,1328],{"class":1318},[1100,9933,1405],{"class":1318},[1100,9935,3158],{"class":1110},[1100,9937,1343],{"class":1318},[1100,9939,1730],{"class":1318},[1100,9941,9859],{"class":1324},[1100,9943,1328],{"class":1318},[1100,9945,1405],{"class":1318},[1100,9947,9948],{"class":1110},"i-simple-icons-google",[1100,9950,1343],{"class":1318},[1100,9952,3176],{"class":1318},[1100,9954,9955],{"class":1102,"line":1372},[1100,9956,9957],{"class":1324},"  ]\n",[1100,9959,9960],{"class":1102,"line":1380},[1100,9961,1383],{"emptyLinePlaceholder":21},[1100,9963,9964,9966,9968,9970,9973,9975,9977,9979,9981,9983,9986,9988,9990],{"class":1102,"line":1386},[1100,9965,2626],{"class":1601},[1100,9967,3281],{"class":1314},[1100,9969,2636],{"class":1318},[1100,9971,9972],{"class":1123}," useCookie",[1100,9974,1573],{"class":1318},[1100,9976,3254],{"class":1106},[1100,9978,2679],{"class":1318},[1100,9980,1315],{"class":1324},[1100,9982,1343],{"class":1318},[1100,9984,9985],{"class":1110},"ai-model",[1100,9987,1343],{"class":1318},[1100,9989,1730],{"class":1318},[1100,9991,1394],{"class":1318},[1100,9993,9994,9997,9999,10001,10003,10005,10007],{"class":1102,"line":1397},[1100,9995,9996],{"class":1123},"    default",[1100,9998,1328],{"class":1318},[1100,10000,4975],{"class":1318},[1100,10002,1839],{"class":1601},[1100,10004,1405],{"class":1318},[1100,10006,3128],{"class":1110},[1100,10008,1369],{"class":1318},[1100,10010,10011,10013],{"class":1102,"line":1413},[1100,10012,2427],{"class":1318},[1100,10014,1505],{"class":1324},[1100,10016,10017],{"class":1102,"line":1419},[1100,10018,1383],{"emptyLinePlaceholder":21},[1100,10020,10021,10023],{"class":1102,"line":1424},[1100,10022,2853],{"class":1304},[1100,10024,1394],{"class":1318},[1100,10026,10027,10030],{"class":1102,"line":1447},[1100,10028,10029],{"class":1314},"    models",[1100,10031,1346],{"class":1318},[1100,10033,10034],{"class":1102,"line":1452},[1100,10035,10036],{"class":1314},"    model\n",[1100,10038,10039],{"class":1102,"line":1462},[1100,10040,3598],{"class":1318},[1100,10042,10043],{"class":1102,"line":1472},[1100,10044,5413],{"class":1318},[1128,10046,10048],{"id":10047},"building-the-model-selector","Building the model selector",[989,10050,1656,10051,10056],{},[1043,10052,10053],{"href":734},[1050,10054,10055],{},"USelectMenu"," component that displays the available models:",[1291,10058,10059],{},[1091,10060,10063],{"className":1563,"code":10061,"filename":10062,"language":34,"meta":1096,"style":1096},"\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",[1050,10064,10065,10085,10118,10122,10139,10143,10161,10193,10197,10205,10209,10217,10224,10237,10251,10265,10278,10291,10296],{"__ignoreMap":1096},[1100,10066,10067,10069,10071,10073,10075,10077,10079,10081,10083],{"class":1102,"line":1103},[1100,10068,1573],{"class":1318},[1100,10070,5125],{"class":1324},[1100,10072,5128],{"class":1601},[1100,10074,5131],{"class":1601},[1100,10076,1605],{"class":1318},[1100,10078,1532],{"class":1318},[1100,10080,1297],{"class":1110},[1100,10082,1532],{"class":1318},[1100,10084,1579],{"class":1318},[1100,10086,10087,10089,10092,10094,10097,10099,10101,10103,10105,10107,10110,10112,10114,10116],{"class":1102,"line":1120},[1100,10088,3074],{"class":1601},[1100,10090,10091],{"class":1314}," model ",[1100,10093,1605],{"class":1318},[1100,10095,10096],{"class":1123}," defineModel",[1100,10098,1573],{"class":1318},[1100,10100,3254],{"class":1106},[1100,10102,2679],{"class":1318},[1100,10104,1315],{"class":1314},[1100,10106,1879],{"class":1318},[1100,10108,10109],{"class":1324}," required",[1100,10111,1328],{"class":1318},[1100,10113,4182],{"class":1480},[1100,10115,1746],{"class":1318},[1100,10117,1505],{"class":1314},[1100,10119,10120],{"class":1102,"line":1334},[1100,10121,1383],{"emptyLinePlaceholder":21},[1100,10123,10124,10126,10128,10131,10133,10135,10137],{"class":1102,"line":1349},[1100,10125,3074],{"class":1601},[1100,10127,1724],{"class":1318},[1100,10129,10130],{"class":1314}," models ",[1100,10132,1502],{"class":1318},[1100,10134,2636],{"class":1318},[1100,10136,9812],{"class":1123},[1100,10138,2682],{"class":1314},[1100,10140,10141],{"class":1102,"line":1361},[1100,10142,1383],{"emptyLinePlaceholder":21},[1100,10144,10145,10147,10150,10152,10154,10156,10158],{"class":1102,"line":1372},[1100,10146,3074],{"class":1601},[1100,10148,10149],{"class":1314}," selectedModel ",[1100,10151,1605],{"class":1318},[1100,10153,7605],{"class":1123},[1100,10155,1315],{"class":1314},[1100,10157,1819],{"class":1318},[1100,10159,10160],{"class":1601}," =>\n",[1100,10162,10163,10166,10168,10171,10173,10175,10177,10179,10181,10184,10186,10188,10190],{"class":1102,"line":1380},[1100,10164,10165],{"class":1314},"  models",[1100,10167,1822],{"class":1318},[1100,10169,10170],{"class":1123},"find",[1100,10172,1315],{"class":1314},[1100,10174,3350],{"class":1956},[1100,10176,1839],{"class":1601},[1100,10178,3355],{"class":1314},[1100,10180,1822],{"class":1318},[1100,10182,10183],{"class":1314},"value ",[1100,10185,7684],{"class":1318},[1100,10187,3281],{"class":1314},[1100,10189,1822],{"class":1318},[1100,10191,10192],{"class":1314},"value)\n",[1100,10194,10195],{"class":1102,"line":1386},[1100,10196,1505],{"class":1314},[1100,10198,10199,10201,10203],{"class":1102,"line":1397},[1100,10200,1649],{"class":1318},[1100,10202,5125],{"class":1324},[1100,10204,1579],{"class":1318},[1100,10206,10207],{"class":1102,"line":1413},[1100,10208,1383],{"emptyLinePlaceholder":21},[1100,10210,10211,10213,10215],{"class":1102,"line":1419},[1100,10212,1573],{"class":1318},[1100,10214,1576],{"class":1324},[1100,10216,1579],{"class":1318},[1100,10218,10219,10221],{"class":1102,"line":1424},[1100,10220,1586],{"class":1318},[1100,10222,10223],{"class":1324},"USelectMenu\n",[1100,10225,10226,10229,10231,10233,10235],{"class":1102,"line":1447},[1100,10227,10228],{"class":1601},"    v-model",[1100,10230,1605],{"class":1318},[1100,10232,1532],{"class":1318},[1100,10234,4652],{"class":1110},[1100,10236,5551],{"class":1318},[1100,10238,10239,10242,10244,10246,10249],{"class":1102,"line":1452},[1100,10240,10241],{"class":1601},"    :items",[1100,10243,1605],{"class":1318},[1100,10245,1532],{"class":1318},[1100,10247,10248],{"class":1110},"models",[1100,10250,5551],{"class":1318},[1100,10252,10253,10256,10258,10260,10263],{"class":1102,"line":1462},[1100,10254,10255],{"class":1601},"    :icon",[1100,10257,1605],{"class":1318},[1100,10259,1532],{"class":1318},[1100,10261,10262],{"class":1110},"selectedModel?.icon",[1100,10264,5551],{"class":1318},[1100,10266,10267,10270,10272,10274,10276],{"class":1102,"line":1472},[1100,10268,10269],{"class":1601},"    variant",[1100,10271,1605],{"class":1318},[1100,10273,1532],{"class":1318},[1100,10275,7886],{"class":1110},[1100,10277,5551],{"class":1318},[1100,10279,10280,10283,10285,10287,10289],{"class":1102,"line":1488},[1100,10281,10282],{"class":1601},"    value-key",[1100,10284,1605],{"class":1318},[1100,10286,1532],{"class":1318},[1100,10288,3335],{"class":1110},[1100,10290,5551],{"class":1318},[1100,10292,10293],{"class":1102,"line":1494},[1100,10294,10295],{"class":1318},"  \u002F>\n",[1100,10297,10298,10300,10302],{"class":1102,"line":1499},[1100,10299,1649],{"class":1318},[1100,10301,1576],{"class":1324},[1100,10303,1579],{"class":1318},[1128,10305,10307],{"id":10306},"integrating-with-the-chat","Integrating with the chat",[989,10309,10310],{},"Update the chat page to include the model selector and pass the selected model to the server:",[1291,10312,10313],{},[1709,10314,10315],{},[1091,10316,10319],{"className":1563,"code":10317,"filename":5744,"highlights":10318,"language":34,"meta":1096,"style":1096},"\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",[1386,2342,2374,2390,4359,4370,4378],[1050,10320,10321,10341,10367,10385,10403,10407,10419,10431,10448,10452,10494,10498,10514,10554,10558,10562,10578,10582,10598,10616,10634,10648,10674,10682,10698,10703,10712,10724,10748,10762,10766,10770,10782,10794,10808,10822,10834,10840,10844,10850,10854,10872,10882,10902,10928,10940,10944,10948,10952,10964,10992,11002,11006,11012,11020,11024,11032,11050,11062,11070,11078,11090,11108,11114,11126,11138,11142,11154,11158,11182,11248,11254,11266,11278,11290,11294,11300,11312,11324,11336,11340,11348,11352,11358,11370,11382,11394,11406,11410,11418,11426,11434,11438,11444,11457,11470,11483,11495,11507,11511,11524,11544,11552,11556,11562,11574,11586,11598,11610,11614,11622,11630,11639,11648],{"__ignoreMap":1096},[1100,10322,10323,10325,10327,10329,10331,10333,10335,10337,10339],{"class":1102,"line":1103},[1100,10324,1573],{"class":1318},[1100,10326,5125],{"class":1324},[1100,10328,5128],{"class":1601},[1100,10330,5131],{"class":1601},[1100,10332,1605],{"class":1318},[1100,10334,1532],{"class":1318},[1100,10336,1297],{"class":1110},[1100,10338,1532],{"class":1318},[1100,10340,1579],{"class":1318},[1100,10342,10343,10345,10347,10349,10351,10353,10355,10357,10359,10361,10363,10365],{"class":1102,"line":1120},[1100,10344,1721],{"class":1304},[1100,10346,1724],{"class":1318},[1100,10348,5777],{"class":1314},[1100,10350,1730],{"class":1318},[1100,10352,5782],{"class":1314},[1100,10354,1730],{"class":1318},[1100,10356,5787],{"class":1314},[1100,10358,1746],{"class":1318},[1100,10360,1749],{"class":1304},[1100,10362,1405],{"class":1318},[1100,10364,2547],{"class":1110},[1100,10366,1369],{"class":1318},[1100,10368,10369,10371,10373,10375,10377,10379,10381,10383],{"class":1102,"line":1334},[1100,10370,1721],{"class":1304},[1100,10372,1724],{"class":1318},[1100,10374,5807],{"class":1314},[1100,10376,1746],{"class":1318},[1100,10378,1749],{"class":1304},[1100,10380,1405],{"class":1318},[1100,10382,5816],{"class":1110},[1100,10384,1369],{"class":1318},[1100,10386,10387,10389,10391,10393,10395,10397,10399,10401],{"class":1102,"line":1349},[1100,10388,1721],{"class":1304},[1100,10390,1724],{"class":1318},[1100,10392,5828],{"class":1314},[1100,10394,1746],{"class":1318},[1100,10396,1749],{"class":1304},[1100,10398,1405],{"class":1318},[1100,10400,5837],{"class":1110},[1100,10402,1369],{"class":1318},[1100,10404,10405],{"class":1102,"line":1361},[1100,10406,1383],{"emptyLinePlaceholder":21},[1100,10408,10409,10411,10413,10415,10417],{"class":1102,"line":1372},[1100,10410,3074],{"class":1601},[1100,10412,5850],{"class":1314},[1100,10414,1605],{"class":1318},[1100,10416,5855],{"class":1123},[1100,10418,2682],{"class":1314},[1100,10420,10421,10423,10425,10427,10429],{"class":1102,"line":1380},[1100,10422,3074],{"class":1601},[1100,10424,5864],{"class":1314},[1100,10426,1605],{"class":1318},[1100,10428,5869],{"class":1123},[1100,10430,2682],{"class":1314},[1100,10432,10434,10436,10438,10440,10442,10444,10446],{"class":10433,"line":1386},[1102,1583],[1100,10435,3074],{"class":1601},[1100,10437,1724],{"class":1318},[1100,10439,10091],{"class":1314},[1100,10441,1502],{"class":1318},[1100,10443,2636],{"class":1318},[1100,10445,9812],{"class":1123},[1100,10447,2682],{"class":1314},[1100,10449,10450],{"class":1102,"line":1397},[1100,10451,1383],{"emptyLinePlaceholder":21},[1100,10453,10454,10456,10458,10460,10462,10464,10466,10468,10470,10472,10474,10476,10478,10480,10482,10484,10486,10488,10490,10492],{"class":1102,"line":1413},[1100,10455,3074],{"class":1601},[1100,10457,1724],{"class":1318},[1100,10459,5889],{"class":1324},[1100,10461,1328],{"class":1318},[1100,10463,5894],{"class":1314},[1100,10465,1502],{"class":1318},[1100,10467,2636],{"class":1318},[1100,10469,2639],{"class":1304},[1100,10471,5903],{"class":1123},[1100,10473,1315],{"class":1314},[1100,10475,3690],{"class":1318},[1100,10477,5910],{"class":1110},[1100,10479,5397],{"class":1318},[1100,10481,5915],{"class":1314},[1100,10483,1822],{"class":1318},[1100,10485,5920],{"class":1314},[1100,10487,1822],{"class":1318},[1100,10489,2031],{"class":1314},[1100,10491,5406],{"class":1318},[1100,10493,1505],{"class":1314},[1100,10495,10496],{"class":1102,"line":1419},[1100,10497,1383],{"emptyLinePlaceholder":21},[1100,10499,10500,10502,10504,10506,10508,10510,10512],{"class":1102,"line":1424},[1100,10501,5937],{"class":1304},[1100,10503,1965],{"class":1314},[1100,10505,3546],{"class":1318},[1100,10507,5944],{"class":1314},[1100,10509,1822],{"class":1318},[1100,10511,5949],{"class":1314},[1100,10513,1319],{"class":1318},[1100,10515,10516,10518,10520,10522,10524,10526,10528,10530,10532,10534,10536,10538,10540,10542,10544,10546,10548,10550,10552],{"class":1102,"line":1447},[1100,10517,5956],{"class":1304},[1100,10519,2912],{"class":1123},[1100,10521,1315],{"class":1324},[1100,10523,1879],{"class":1318},[1100,10525,3568],{"class":1324},[1100,10527,1328],{"class":1318},[1100,10529,3574],{"class":3573},[1100,10531,1730],{"class":1318},[1100,10533,3579],{"class":1324},[1100,10535,1328],{"class":1318},[1100,10537,1405],{"class":1318},[1100,10539,3586],{"class":1110},[1100,10541,1343],{"class":1318},[1100,10543,1730],{"class":1318},[1100,10545,5985],{"class":1324},[1100,10547,1328],{"class":1318},[1100,10549,4182],{"class":1480},[1100,10551,1746],{"class":1318},[1100,10553,1505],{"class":1324},[1100,10555,10556],{"class":1102,"line":1452},[1100,10557,5413],{"class":1318},[1100,10559,10560],{"class":1102,"line":1462},[1100,10561,1383],{"emptyLinePlaceholder":21},[1100,10563,10564,10566,10568,10570,10572,10574,10576],{"class":1102,"line":1472},[1100,10565,3074],{"class":1601},[1100,10567,5148],{"class":1314},[1100,10569,1605],{"class":1318},[1100,10571,5153],{"class":1123},[1100,10573,1315],{"class":1314},[1100,10575,5158],{"class":1318},[1100,10577,1505],{"class":1314},[1100,10579,10580],{"class":1102,"line":1488},[1100,10581,1383],{"emptyLinePlaceholder":21},[1100,10583,10584,10586,10588,10590,10592,10594,10596],{"class":1102,"line":1494},[1100,10585,3074],{"class":1601},[1100,10587,6034],{"class":1314},[1100,10589,1605],{"class":1318},[1100,10591,1916],{"class":1318},[1100,10593,5807],{"class":1123},[1100,10595,1315],{"class":1314},[1100,10597,1319],{"class":1318},[1100,10599,10600,10602,10604,10606,10608,10610,10612,10614],{"class":1102,"line":1499},[1100,10601,1812],{"class":1324},[1100,10603,1328],{"class":1318},[1100,10605,6054],{"class":1314},[1100,10607,1822],{"class":1318},[1100,10609,3335],{"class":1314},[1100,10611,1822],{"class":1318},[1100,10613,2031],{"class":1314},[1100,10615,1346],{"class":1318},[1100,10617,10618,10620,10622,10624,10626,10628,10630,10632],{"class":1102,"line":2288},[1100,10619,1972],{"class":1324},[1100,10621,1328],{"class":1318},[1100,10623,6054],{"class":1314},[1100,10625,1822],{"class":1318},[1100,10627,3335],{"class":1314},[1100,10629,1822],{"class":1318},[1100,10631,2010],{"class":1314},[1100,10633,1346],{"class":1318},[1100,10635,10636,10638,10640,10642,10644,10646],{"class":1102,"line":2301},[1100,10637,6089],{"class":1324},[1100,10639,1328],{"class":1318},[1100,10641,1916],{"class":1318},[1100,10643,5777],{"class":1123},[1100,10645,1315],{"class":1314},[1100,10647,1319],{"class":1318},[1100,10649,10650,10652,10654,10656,10658,10660,10662,10664,10666,10668,10670,10672],{"class":1102,"line":2331},[1100,10651,6105],{"class":1324},[1100,10653,1328],{"class":1318},[1100,10655,3684],{"class":1318},[1100,10657,5910],{"class":1110},[1100,10659,5397],{"class":1318},[1100,10661,5944],{"class":1314},[1100,10663,1822],{"class":1318},[1100,10665,3335],{"class":1314},[1100,10667,1822],{"class":1318},[1100,10669,2031],{"class":1314},[1100,10671,5406],{"class":1318},[1100,10673,1346],{"class":1318},[1100,10675,10676,10678,10680],{"class":1102,"line":2337},[1100,10677,5295],{"class":1324},[1100,10679,1328],{"class":1318},[1100,10681,1394],{"class":1318},[1100,10683,10685,10687,10689,10691,10693,10695],{"class":10684,"line":2342},[1102,1583],[1100,10686,3663],{"class":1324},[1100,10688,1328],{"class":1318},[1100,10690,3281],{"class":1314},[1100,10692,1822],{"class":1318},[1100,10694,10183],{"class":1314},[1100,10696,10697],{"class":1484},"\u002F\u002F Pass the selected model\n",[1100,10699,10701],{"class":10700,"line":2374},[1102,1583],[1100,10702,1491],{"class":1318},[1100,10704,10706,10708,10710],{"class":10705,"line":2390},[1102,1583],[1100,10707,2427],{"class":1318},[1100,10709,1896],{"class":1314},[1100,10711,1346],{"class":1318},[1100,10713,10714,10716,10718,10720,10722],{"class":1102,"line":2408},[1100,10715,6141],{"class":1324},[1100,10717,1315],{"class":1318},[1100,10719,6146],{"class":1956},[1100,10721,1896],{"class":1318},[1100,10723,1394],{"class":1318},[1100,10725,10726,10728,10730,10732,10734,10736,10738,10740,10742,10744,10746],{"class":1102,"line":2424},[1100,10727,6162],{"class":1304},[1100,10729,1965],{"class":1324},[1100,10731,6146],{"class":1314},[1100,10733,1822],{"class":1318},[1100,10735,6171],{"class":1314},[1100,10737,3362],{"class":1318},[1100,10739,1405],{"class":1318},[1100,10741,4329],{"class":1110},[1100,10743,1343],{"class":1318},[1100,10745,3551],{"class":1324},[1100,10747,1319],{"class":1318},[1100,10749,10750,10752,10754,10756,10758,10760],{"class":1102,"line":2432},[1100,10751,6189],{"class":1123},[1100,10753,1315],{"class":1324},[1100,10755,1343],{"class":1318},[1100,10757,1801],{"class":1110},[1100,10759,1343],{"class":1318},[1100,10761,1505],{"class":1324},[1100,10763,10764],{"class":1102,"line":3427},[1100,10765,1491],{"class":1318},[1100,10767,10768],{"class":1102,"line":3440},[1100,10769,1416],{"class":1318},[1100,10771,10772,10774,10776,10778,10780],{"class":1102,"line":3445},[1100,10773,6215],{"class":1324},[1100,10775,1315],{"class":1318},[1100,10777,6220],{"class":1956},[1100,10779,1896],{"class":1318},[1100,10781,1394],{"class":1318},[1100,10783,10784,10786,10788,10790,10792],{"class":1102,"line":3451},[1100,10785,6230],{"class":1314},[1100,10787,1822],{"class":1318},[1100,10789,6235],{"class":1123},[1100,10791,1315],{"class":1324},[1100,10793,1319],{"class":1318},[1100,10795,10796,10798,10800,10802,10804,10806],{"class":1102,"line":3482},[1100,10797,6245],{"class":1324},[1100,10799,1328],{"class":1318},[1100,10801,1405],{"class":1318},[1100,10803,497],{"class":1110},[1100,10805,1343],{"class":1318},[1100,10807,1346],{"class":1318},[1100,10809,10810,10812,10814,10816,10818,10820],{"class":1102,"line":3526},[1100,10811,6261],{"class":1324},[1100,10813,1328],{"class":1318},[1100,10815,6266],{"class":1314},[1100,10817,1822],{"class":1318},[1100,10819,4481],{"class":1314},[1100,10821,1346],{"class":1318},[1100,10823,10824,10826,10828,10830,10832],{"class":1102,"line":3533},[1100,10825,6278],{"class":1324},[1100,10827,1328],{"class":1318},[1100,10829,1405],{"class":1318},[1100,10831,6220],{"class":1110},[1100,10833,1369],{"class":1318},[1100,10835,10836,10838],{"class":1102,"line":3538},[1100,10837,3389],{"class":1318},[1100,10839,1505],{"class":1324},[1100,10841,10842],{"class":1102,"line":3556},[1100,10843,3598],{"class":1318},[1100,10845,10846,10848],{"class":1102,"line":3595},[1100,10847,1502],{"class":1318},[1100,10849,1505],{"class":1314},[1100,10851,10852],{"class":1102,"line":3601},[1100,10853,1383],{"emptyLinePlaceholder":21},[1100,10855,10856,10858,10860,10862,10864,10866,10868,10870],{"class":1102,"line":3606},[1100,10857,6314],{"class":1601},[1100,10859,6317],{"class":1123},[1100,10861,1315],{"class":1318},[1100,10863,6322],{"class":1956},[1100,10865,1328],{"class":1318},[1100,10867,6327],{"class":1106},[1100,10869,1896],{"class":1318},[1100,10871,1394],{"class":1318},[1100,10873,10874,10876,10878,10880],{"class":1102,"line":3612},[1100,10875,6336],{"class":1314},[1100,10877,1822],{"class":1318},[1100,10879,6341],{"class":1123},[1100,10881,2682],{"class":1324},[1100,10883,10884,10886,10888,10890,10892,10894,10896,10898,10900],{"class":1102,"line":3632},[1100,10885,3541],{"class":1304},[1100,10887,1965],{"class":1324},[1100,10889,5207],{"class":1314},[1100,10891,1822],{"class":1318},[1100,10893,3335],{"class":1314},[1100,10895,1822],{"class":1318},[1100,10897,5216],{"class":1123},[1100,10899,5219],{"class":1324},[1100,10901,1319],{"class":1318},[1100,10903,10904,10906,10908,10910,10912,10914,10916,10918,10920,10922,10924,10926],{"class":1102,"line":3660},[1100,10905,6368],{"class":1314},[1100,10907,1822],{"class":1318},[1100,10909,6373],{"class":1123},[1100,10911,1315],{"class":1324},[1100,10913,1879],{"class":1318},[1100,10915,1733],{"class":1324},[1100,10917,1328],{"class":1318},[1100,10919,5351],{"class":1314},[1100,10921,1822],{"class":1318},[1100,10923,3335],{"class":1314},[1100,10925,1746],{"class":1318},[1100,10927,1505],{"class":1324},[1100,10929,10930,10932,10934,10936,10938],{"class":1102,"line":3676},[1100,10931,6396],{"class":1314},[1100,10933,1822],{"class":1318},[1100,10935,3335],{"class":1314},[1100,10937,2636],{"class":1318},[1100,10939,6405],{"class":1318},[1100,10941,10942],{"class":1102,"line":3695},[1100,10943,3598],{"class":1318},[1100,10945,10946],{"class":1102,"line":3723},[1100,10947,5413],{"class":1318},[1100,10949,10950],{"class":1102,"line":3730},[1100,10951,1383],{"emptyLinePlaceholder":21},[1100,10953,10954,10956,10958,10960,10962],{"class":1102,"line":3735},[1100,10955,6427],{"class":1123},[1100,10957,1315],{"class":1314},[1100,10959,1819],{"class":1318},[1100,10961,1839],{"class":1601},[1100,10963,1394],{"class":1318},[1100,10965,10966,10968,10970,10972,10974,10976,10978,10980,10982,10984,10986,10988,10990],{"class":1102,"line":3801},[1100,10967,3541],{"class":1304},[1100,10969,1965],{"class":1324},[1100,10971,5944],{"class":1314},[1100,10973,1822],{"class":1318},[1100,10975,3335],{"class":1314},[1100,10977,3856],{"class":1318},[1100,10979,2010],{"class":1314},[1100,10981,1822],{"class":1318},[1100,10983,3835],{"class":1314},[1100,10985,3362],{"class":1318},[1100,10987,3841],{"class":3573},[1100,10989,3551],{"class":1324},[1100,10991,1319],{"class":1318},[1100,10993,10994,10996,10998,11000],{"class":1102,"line":3806},[1100,10995,6368],{"class":1314},[1100,10997,1822],{"class":1318},[1100,10999,6472],{"class":1123},[1100,11001,2682],{"class":1324},[1100,11003,11004],{"class":1102,"line":3811},[1100,11005,3598],{"class":1318},[1100,11007,11008,11010],{"class":1102,"line":3817},[1100,11009,1502],{"class":1318},[1100,11011,1505],{"class":1314},[1100,11013,11014,11016,11018],{"class":1102,"line":3846},[1100,11015,1649],{"class":1318},[1100,11017,5125],{"class":1324},[1100,11019,1579],{"class":1318},[1100,11021,11022],{"class":1102,"line":3887},[1100,11023,1383],{"emptyLinePlaceholder":21},[1100,11025,11026,11028,11030],{"class":1102,"line":3916},[1100,11027,1573],{"class":1318},[1100,11029,1576],{"class":1324},[1100,11031,1579],{"class":1318},[1100,11033,11034,11036,11038,11040,11042,11044,11046,11048],{"class":1102,"line":3928},[1100,11035,1586],{"class":1318},[1100,11037,5440],{"class":1324},[1100,11039,5443],{"class":1601},[1100,11041,1605],{"class":1318},[1100,11043,1532],{"class":1318},[1100,11045,5450],{"class":1110},[1100,11047,1532],{"class":1318},[1100,11049,1579],{"class":1318},[1100,11051,11052,11054,11056,11058,11060],{"class":1102,"line":3944},[1100,11053,1595],{"class":1318},[1100,11055,1576],{"class":1324},[1100,11057,5463],{"class":1318},[1100,11059,8279],{"class":1601},[1100,11061,1579],{"class":1318},[1100,11063,11064,11066,11068],{"class":1102,"line":3958},[1100,11065,1619],{"class":1318},[1100,11067,8289],{"class":1324},[1100,11069,1625],{"class":1318},[1100,11071,11072,11074,11076],{"class":1102,"line":3965},[1100,11073,1630],{"class":1318},[1100,11075,1576],{"class":1324},[1100,11077,1579],{"class":1318},[1100,11079,11080,11082,11084,11086,11088],{"class":1102,"line":3970},[1100,11081,1595],{"class":1318},[1100,11083,1576],{"class":1324},[1100,11085,5463],{"class":1318},[1100,11087,5466],{"class":1601},[1100,11089,1579],{"class":1318},[1100,11091,11092,11094,11096,11098,11100,11102,11104,11106],{"class":1102,"line":3975},[1100,11093,1619],{"class":1318},[1100,11095,5475],{"class":1324},[1100,11097,5478],{"class":1601},[1100,11099,1605],{"class":1318},[1100,11101,1532],{"class":1318},[1100,11103,6549],{"class":1110},[1100,11105,1532],{"class":1318},[1100,11107,1579],{"class":1318},[1100,11109,11110,11112],{"class":1102,"line":3981},[1100,11111,5494],{"class":1318},[1100,11113,6560],{"class":1324},[1100,11115,11116,11118,11120,11122,11124],{"class":1102,"line":3998},[1100,11117,6565],{"class":1601},[1100,11119,1605],{"class":1318},[1100,11121,1532],{"class":1318},[1100,11123,6572],{"class":1110},[1100,11125,5551],{"class":1318},[1100,11127,11128,11130,11132,11134,11136],{"class":1102,"line":4020},[1100,11129,5557],{"class":1601},[1100,11131,1605],{"class":1318},[1100,11133,1532],{"class":1318},[1100,11135,6585],{"class":1110},[1100,11137,5551],{"class":1318},[1100,11139,11140],{"class":1102,"line":4038},[1100,11141,6592],{"class":1601},[1100,11143,11144,11146,11148,11150,11152],{"class":1102,"line":4046},[1100,11145,6597],{"class":1601},[1100,11147,1605],{"class":1318},[1100,11149,1532],{"class":1318},[1100,11151,6604],{"class":1110},[1100,11153,5551],{"class":1318},[1100,11155,11156],{"class":1102,"line":4063},[1100,11157,5617],{"class":1318},[1100,11159,11160,11162,11164,11166,11168,11170,11172,11174,11176,11178,11180],{"class":1102,"line":4084},[1100,11161,5623],{"class":1318},[1100,11163,1576],{"class":1324},[1100,11165,5463],{"class":1318},[1100,11167,371],{"class":1601},[1100,11169,1605],{"class":1318},[1100,11171,1532],{"class":1318},[1100,11173,1879],{"class":1318},[1100,11175,6629],{"class":1314},[1100,11177,1502],{"class":1318},[1100,11179,1532],{"class":1318},[1100,11181,1579],{"class":1318},[1100,11183,11184,11186,11188,11190,11192,11194,11196,11198,11200,11202,11204,11206,11208,11210,11212,11214,11216,11218,11220,11222,11224,11226,11228,11230,11232,11234,11236,11238,11240,11242,11244,11246],{"class":1102,"line":4094},[1100,11185,6640],{"class":1318},[1100,11187,1576],{"class":1324},[1100,11189,6645],{"class":1304},[1100,11191,1605],{"class":1318},[1100,11193,1532],{"class":1318},[1100,11195,6652],{"class":1314},[1100,11197,1730],{"class":1318},[1100,11199,6657],{"class":1314},[1100,11201,6660],{"class":1318},[1100,11203,2631],{"class":1314},[1100,11205,1822],{"class":1318},[1100,11207,2212],{"class":1314},[1100,11209,1532],{"class":1318},[1100,11211,6671],{"class":1318},[1100,11213,6674],{"class":1601},[1100,11215,1605],{"class":1318},[1100,11217,6679],{"class":1318},[1100,11219,4481],{"class":1314},[1100,11221,1822],{"class":1318},[1100,11223,2031],{"class":1314},[1100,11225,1502],{"class":1318},[1100,11227,6690],{"class":1110},[1100,11229,5397],{"class":1318},[1100,11231,6695],{"class":1314},[1100,11233,1822],{"class":1318},[1100,11235,6171],{"class":1314},[1100,11237,1502],{"class":1318},[1100,11239,6690],{"class":1110},[1100,11241,5397],{"class":1318},[1100,11243,6708],{"class":1314},[1100,11245,6711],{"class":1318},[1100,11247,1579],{"class":1318},[1100,11249,11250,11252],{"class":1102,"line":4104},[1100,11251,6718],{"class":1318},[1100,11253,6721],{"class":1324},[1100,11255,11256,11258,11260,11262,11264],{"class":1102,"line":4114},[1100,11257,6726],{"class":1601},[1100,11259,1605],{"class":1318},[1100,11261,1532],{"class":1318},[1100,11263,6733],{"class":1110},[1100,11265,5551],{"class":1318},[1100,11267,11268,11270,11272,11274,11276],{"class":1102,"line":4131},[1100,11269,6740],{"class":1601},[1100,11271,1605],{"class":1318},[1100,11273,1532],{"class":1318},[1100,11275,6747],{"class":1110},[1100,11277,5551],{"class":1318},[1100,11279,11280,11282,11284,11286,11288],{"class":1102,"line":4142},[1100,11281,6754],{"class":1601},[1100,11283,1605],{"class":1318},[1100,11285,1532],{"class":1318},[1100,11287,6761],{"class":1110},[1100,11289,5551],{"class":1318},[1100,11291,11292],{"class":1102,"line":4148},[1100,11293,6768],{"class":1318},[1100,11295,11296,11298],{"class":1102,"line":4154},[1100,11297,6773],{"class":1318},[1100,11299,6776],{"class":1324},[1100,11301,11302,11304,11306,11308,11310],{"class":1102,"line":4164},[1100,11303,6781],{"class":1601},[1100,11305,1605],{"class":1318},[1100,11307,1532],{"class":1318},[1100,11309,6747],{"class":1110},[1100,11311,5551],{"class":1318},[1100,11313,11314,11316,11318,11320,11322],{"class":1102,"line":4174},[1100,11315,6794],{"class":1601},[1100,11317,1605],{"class":1318},[1100,11319,1532],{"class":1318},[1100,11321,6801],{"class":1110},[1100,11323,5551],{"class":1318},[1100,11325,11326,11328,11330,11332,11334],{"class":1102,"line":4187},[1100,11327,6808],{"class":1601},[1100,11329,1605],{"class":1318},[1100,11331,1532],{"class":1318},[1100,11333,6815],{"class":1110},[1100,11335,5551],{"class":1318},[1100,11337,11338],{"class":1102,"line":4202},[1100,11339,6822],{"class":1318},[1100,11341,11342,11344,11346],{"class":1102,"line":4207},[1100,11343,6827],{"class":1318},[1100,11345,6830],{"class":1324},[1100,11347,1579],{"class":1318},[1100,11349,11350],{"class":1102,"line":4212},[1100,11351,1383],{"emptyLinePlaceholder":21},[1100,11353,11354,11356],{"class":1102,"line":4222},[1100,11355,6718],{"class":1318},[1100,11357,6776],{"class":1324},[1100,11359,11360,11362,11364,11366,11368],{"class":1102,"line":4238},[1100,11361,6847],{"class":1601},[1100,11363,1605],{"class":1318},[1100,11365,1532],{"class":1318},[1100,11367,6854],{"class":1110},[1100,11369,5551],{"class":1318},[1100,11371,11372,11374,11376,11378,11380],{"class":1102,"line":4253},[1100,11373,6861],{"class":1601},[1100,11375,1605],{"class":1318},[1100,11377,1532],{"class":1318},[1100,11379,6747],{"class":1110},[1100,11381,5551],{"class":1318},[1100,11383,11384,11386,11388,11390,11392],{"class":1102,"line":4259},[1100,11385,6874],{"class":1601},[1100,11387,1605],{"class":1318},[1100,11389,1532],{"class":1318},[1100,11391,6881],{"class":1110},[1100,11393,5551],{"class":1318},[1100,11395,11396,11398,11400,11402,11404],{"class":1102,"line":4265},[1100,11397,6888],{"class":1601},[1100,11399,1605],{"class":1318},[1100,11401,1532],{"class":1318},[1100,11403,6815],{"class":1110},[1100,11405,5551],{"class":1318},[1100,11407,11408],{"class":1102,"line":4273},[1100,11409,6901],{"class":1318},[1100,11411,11412,11414,11416],{"class":1102,"line":4278},[1100,11413,6906],{"class":1318},[1100,11415,1576],{"class":1324},[1100,11417,1579],{"class":1318},[1100,11419,11420,11422,11424],{"class":1102,"line":4284},[1100,11421,6915],{"class":1318},[1100,11423,1576],{"class":1324},[1100,11425,1579],{"class":1318},[1100,11427,11428,11430,11432],{"class":1102,"line":4304},[1100,11429,5520],{"class":1318},[1100,11431,5096],{"class":1324},[1100,11433,1579],{"class":1318},[1100,11435,11436],{"class":1102,"line":4319},[1100,11437,1383],{"emptyLinePlaceholder":21},[1100,11439,11440,11442],{"class":1102,"line":4336},[1100,11441,5494],{"class":1318},[1100,11443,5536],{"class":1324},[1100,11445,11447,11449,11451,11453,11455],{"class":11446,"line":4359},[1102,1583],[1100,11448,5542],{"class":1601},[1100,11450,1605],{"class":1318},[1100,11452,1532],{"class":1318},[1100,11454,5207],{"class":1110},[1100,11456,5551],{"class":1318},[1100,11458,11460,11462,11464,11466,11468],{"class":11459,"line":4370},[1102,1583],[1100,11461,6954],{"class":1601},[1100,11463,1605],{"class":1318},[1100,11465,1532],{"class":1318},[1100,11467,6961],{"class":1110},[1100,11469,5551],{"class":1318},[1100,11471,11473,11475,11477,11479,11481],{"class":11472,"line":4378},[1102,1583],[1100,11474,5572],{"class":1601},[1100,11476,1605],{"class":1318},[1100,11478,1532],{"class":1318},[1100,11480,5579],{"class":1110},[1100,11482,5551],{"class":1318},[1100,11484,11485,11487,11489,11491,11493],{"class":1102,"line":4384},[1100,11486,6597],{"class":1601},[1100,11488,1605],{"class":1318},[1100,11490,1532],{"class":1318},[1100,11492,6986],{"class":1110},[1100,11494,5551],{"class":1318},[1100,11496,11497,11499,11501,11503,11505],{"class":1102,"line":4389},[1100,11498,5602],{"class":1601},[1100,11500,1605],{"class":1318},[1100,11502,1532],{"class":1318},[1100,11504,6999],{"class":1110},[1100,11506,5551],{"class":1318},[1100,11508,11509],{"class":1102,"line":4412},[1100,11510,5617],{"class":1318},[1100,11512,11513,11515,11517,11519,11522],{"class":1102,"line":4418},[1100,11514,5623],{"class":1318},[1100,11516,1576],{"class":1324},[1100,11518,5463],{"class":1318},[1100,11520,11521],{"class":1601},"footer",[1100,11523,1579],{"class":1318},[1100,11525,11526,11528,11531,11534,11536,11538,11540,11542],{"class":1102,"line":4438},[1100,11527,6640],{"class":1318},[1100,11529,11530],{"class":1324},"ModelSelect",[1100,11532,11533],{"class":1601}," v-model",[1100,11535,1605],{"class":1318},[1100,11537,1532],{"class":1318},[1100,11539,4652],{"class":1110},[1100,11541,1532],{"class":1318},[1100,11543,1625],{"class":1318},[1100,11545,11546,11548,11550],{"class":1102,"line":4444},[1100,11547,6915],{"class":1318},[1100,11549,1576],{"class":1324},[1100,11551,1579],{"class":1318},[1100,11553,11554],{"class":1102,"line":4490},[1100,11555,1383],{"emptyLinePlaceholder":21},[1100,11557,11558,11560],{"class":1102,"line":4506},[1100,11559,5623],{"class":1318},[1100,11561,7012],{"class":1324},[1100,11563,11564,11566,11568,11570,11572],{"class":1102,"line":4539},[1100,11565,7017],{"class":1601},[1100,11567,1605],{"class":1318},[1100,11569,1532],{"class":1318},[1100,11571,6585],{"class":1110},[1100,11573,5551],{"class":1318},[1100,11575,11576,11578,11580,11582,11584],{"class":1102,"line":4553},[1100,11577,7030],{"class":1601},[1100,11579,1605],{"class":1318},[1100,11581,1532],{"class":1318},[1100,11583,5636],{"class":1110},[1100,11585,5551],{"class":1318},[1100,11587,11588,11590,11592,11594,11596],{"class":1102,"line":4561},[1100,11589,7043],{"class":1601},[1100,11591,1605],{"class":1318},[1100,11593,1532],{"class":1318},[1100,11595,7050],{"class":1110},[1100,11597,5551],{"class":1318},[1100,11599,11600,11602,11604,11606,11608],{"class":1102,"line":4566},[1100,11601,7057],{"class":1601},[1100,11603,1605],{"class":1318},[1100,11605,1532],{"class":1318},[1100,11607,7064],{"class":1110},[1100,11609,5551],{"class":1318},[1100,11611,11612],{"class":1102,"line":4573},[1100,11613,7071],{"class":1318},[1100,11615,11616,11618,11620],{"class":1102,"line":4578},[1100,11617,5520],{"class":1318},[1100,11619,5090],{"class":1324},[1100,11621,1579],{"class":1318},[1100,11623,11624,11626,11628],{"class":1102,"line":4596},[1100,11625,5654],{"class":1318},[1100,11627,5475],{"class":1324},[1100,11629,1579],{"class":1318},[1100,11631,11633,11635,11637],{"class":1102,"line":11632},112,[1100,11634,1630],{"class":1318},[1100,11636,1576],{"class":1324},[1100,11638,1579],{"class":1318},[1100,11640,11642,11644,11646],{"class":1102,"line":11641},113,[1100,11643,1640],{"class":1318},[1100,11645,5440],{"class":1324},[1100,11647,1579],{"class":1318},[1100,11649,11651,11653,11655],{"class":1102,"line":11650},114,[1100,11652,1649],{"class":1318},[1100,11654,1576],{"class":1324},[1100,11656,1579],{"class":1318},[993,11658,11660],{"id":11659},"going-further","Going further",[989,11662,11663],{},"You now have a working AI chatbot with database persistence! To take it further, consider adding:",[989,11665,11666],{},[1007,11667,11668],{},"User Authentication",[989,11670,11671,11672,11677],{},"Add authentication with ",[1043,11673,11676],{"href":11674,"rel":11675},"https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",[1047],"nuxt-auth-utils"," to let users access their chat history across devices and keep conversations private.",[989,11679,11680],{},[1007,11681,11682],{},"AI Tools",[989,11684,11685,11686,11691],{},"Extend your chatbot with ",[1043,11687,11690],{"href":11688,"rel":11689},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Ftools-and-tool-calling",[1047],"AI SDK tools"," that can fetch real-time data, generate charts, or interact with external APIs:",[1091,11693,11695],{"className":1295,"code":11694,"language":1297,"meta":1096,"style":1096},"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",[1050,11696,11697,11716,11734,11738,11753,11769,11786,11817,11825,11845,11850,11885,11889],{"__ignoreMap":1096},[1100,11698,11699,11701,11703,11706,11708,11710,11712,11714],{"class":1102,"line":1103},[1100,11700,1721],{"class":1304},[1100,11702,1724],{"class":1318},[1100,11704,11705],{"class":1314}," tool",[1100,11707,1746],{"class":1318},[1100,11709,1749],{"class":1304},[1100,11711,1405],{"class":1318},[1100,11713,2547],{"class":1110},[1100,11715,1369],{"class":1318},[1100,11717,11718,11720,11722,11724,11726,11728,11730,11732],{"class":1102,"line":1120},[1100,11719,1721],{"class":1304},[1100,11721,1724],{"class":1318},[1100,11723,2582],{"class":1314},[1100,11725,1746],{"class":1318},[1100,11727,1749],{"class":1304},[1100,11729,1405],{"class":1318},[1100,11731,2591],{"class":1110},[1100,11733,1369],{"class":1318},[1100,11735,11736],{"class":1102,"line":1334},[1100,11737,1383],{"emptyLinePlaceholder":21},[1100,11739,11740,11742,11745,11747,11749,11751],{"class":1102,"line":1349},[1100,11741,3074],{"class":1601},[1100,11743,11744],{"class":1314}," weatherTool ",[1100,11746,1605],{"class":1318},[1100,11748,11705],{"class":1123},[1100,11750,1315],{"class":1314},[1100,11752,1319],{"class":1318},[1100,11754,11755,11758,11760,11762,11765,11767],{"class":1102,"line":1361},[1100,11756,11757],{"class":1324},"  description",[1100,11759,1328],{"class":1318},[1100,11761,1405],{"class":1318},[1100,11763,11764],{"class":1110},"Get the current weather for a location",[1100,11766,1343],{"class":1318},[1100,11768,1346],{"class":1318},[1100,11770,11771,11774,11776,11778,11780,11782,11784],{"class":1102,"line":1372},[1100,11772,11773],{"class":1324},"  parameters",[1100,11775,1328],{"class":1318},[1100,11777,2582],{"class":1314},[1100,11779,1822],{"class":1318},[1100,11781,2654],{"class":1123},[1100,11783,1315],{"class":1314},[1100,11785,1319],{"class":1318},[1100,11787,11788,11791,11793,11795,11797,11799,11801,11803,11806,11808,11810,11813,11815],{"class":1102,"line":1380},[1100,11789,11790],{"class":1324},"    location",[1100,11792,1328],{"class":1318},[1100,11794,2582],{"class":1314},[1100,11796,1822],{"class":1318},[1100,11798,3254],{"class":1123},[1100,11800,1819],{"class":1314},[1100,11802,1822],{"class":1318},[1100,11804,11805],{"class":1123},"describe",[1100,11807,1315],{"class":1314},[1100,11809,1343],{"class":1318},[1100,11811,11812],{"class":1110},"The city name",[1100,11814,1343],{"class":1318},[1100,11816,1505],{"class":1314},[1100,11818,11819,11821,11823],{"class":1102,"line":1386},[1100,11820,2427],{"class":1318},[1100,11822,1896],{"class":1314},[1100,11824,1346],{"class":1318},[1100,11826,11827,11830,11832,11834,11836,11839,11841,11843],{"class":1102,"line":1397},[1100,11828,11829],{"class":1123},"  execute",[1100,11831,1328],{"class":1318},[1100,11833,4006],{"class":1601},[1100,11835,1953],{"class":1318},[1100,11837,11838],{"class":1956}," location",[1100,11840,1960],{"class":1318},[1100,11842,1839],{"class":1601},[1100,11844,1394],{"class":1318},[1100,11846,11847],{"class":1102,"line":1413},[1100,11848,11849],{"class":1484},"    \u002F\u002F Fetch weather data from an API\n",[1100,11851,11852,11855,11857,11859,11861,11864,11866,11869,11871,11874,11876,11878,11881,11883],{"class":1102,"line":1419},[1100,11853,11854],{"class":1304},"    return",[1100,11856,1724],{"class":1318},[1100,11858,11838],{"class":1314},[1100,11860,1730],{"class":1318},[1100,11862,11863],{"class":1324}," temperature",[1100,11865,1328],{"class":1318},[1100,11867,11868],{"class":3573}," 22",[1100,11870,1730],{"class":1318},[1100,11872,11873],{"class":1324}," condition",[1100,11875,1328],{"class":1318},[1100,11877,1405],{"class":1318},[1100,11879,11880],{"class":1110},"Sunny",[1100,11882,1343],{"class":1318},[1100,11884,3176],{"class":1318},[1100,11886,11887],{"class":1102,"line":1424},[1100,11888,3598],{"class":1318},[1100,11890,11891,11893],{"class":1102,"line":1447},[1100,11892,1502],{"class":1318},[1100,11894,1505],{"class":1314},[993,11896,11898],{"id":11897},"deploying-to-vercel","Deploying to Vercel",[989,11900,11901],{},"Deploy your chatbot to Vercel with zero configuration:",[1091,11903,11905],{"className":1093,"code":11904,"language":1095,"meta":1096,"style":1096},"npx vercel deploy\n",[1050,11906,11907],{"__ignoreMap":1096},[1100,11908,11909,11911,11914],{"class":1102,"line":1103},[1100,11910,1107],{"class":1106},[1100,11912,11913],{"class":1110}," vercel",[1100,11915,11916],{"class":1110}," deploy\n",[989,11918,11919],{},"Then, in the Vercel dashboard:",[1001,11921,11922,11928],{},[1004,11923,11924,11925,11927],{},"Enable ",[1007,11926,4608],{}," and add credits so requests can be processed.",[1004,11929,11930,11931,11934],{},"Add a ",[1007,11932,11933],{},"Turso"," database from the Vercel Marketplace and connect it to your project (it will provision the database and add the required environment variables automatically).",[11936,11937,11938],"blockquote",{},[989,11939,11940,11941,11946,11947,11949],{},"Note: On Vercel, you ",[1007,11942,11943,11944],{},"don’t need to manually add ",[1050,11945,1672],{}," — Vercel handles the gateway configuration for deployments. Keep using ",[1050,11948,1659],{}," locally for development.",[1679,11951,11952],{"to":1079,"target":1048},[989,11953,11954,11955,1822],{},"Learn more about setting up AI Gateway in the ",[1007,11956,11957],{},"Vercel AI Gateway documentation",[993,11959,11961],{"id":11960},"conclusion","Conclusion",[989,11963,11964],{},"You've built a complete AI chatbot with:",[1001,11966,11967,11973,11979,11984,11989],{},[1004,11968,11969,11972],{},[1007,11970,11971],{},"A complete chat interface"," using Nuxt UI components",[1004,11974,11975,11978],{},[1007,11976,11977],{},"Real-time streaming responses"," with the AI SDK",[1004,11980,11981,11983],{},[1007,11982,1021],{}," with MDC for rich content display",[1004,11985,11986,11988],{},[1007,11987,1027],{}," via AI Gateway",[1004,11990,11991,11994],{},[1007,11992,11993],{},"Database persistence"," with SQLite (local) \u002F Turso (production) and Drizzle ORM",[989,11996,11997],{},"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.",[989,11999,12000],{},[1007,12001,12002],{},"Resources:",[1001,12004,12005,12012,12019,12026,12032,12038],{},[1004,12006,12007],{},[1043,12008,12011],{"href":12009,"rel":12010},"https:\u002F\u002Fui.nuxt.com\u002Fcomponents\u002Fchat",[1047],"Nuxt UI Chat Components",[1004,12013,12014],{},[1043,12015,12018],{"href":12016,"rel":12017},"https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Ffeatures\u002Fdatabase",[1047],"NuxtHub Database",[1004,12020,12021],{},[1043,12022,12025],{"href":12023,"rel":12024},"https:\u002F\u002Fai-sdk.dev",[1047],"AI SDK Documentation",[1004,12027,12028],{},[1043,12029,12031],{"href":1079,"rel":12030},[1047],"AI Gateway Documentation",[1004,12033,12034],{},[1043,12035,12037],{"href":1045,"rel":12036},[1047],"Nuxt AI Chat Template",[1004,12039,12040],{},[1043,12041,12043],{"href":1056,"rel":12042},[1047],"Vue AI Chat Template",[989,12045,12046],{},"We're excited to see what you'll build!",[12048,12049,12050],"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":1096,"searchDepth":1120,"depth":1120,"links":12052},[12053,12054,12055,12061,12066,12069,12070,12074,12075,12076,12081,12082,12083],{"id":995,"depth":1120,"text":996},{"id":1064,"depth":1120,"text":1065},{"id":1085,"depth":1120,"text":1086,"children":12056},[12057,12058,12059,12060],{"id":1130,"depth":1334,"text":1131},{"id":1281,"depth":1334,"text":1282},{"id":1550,"depth":1334,"text":1551},{"id":1690,"depth":1334,"text":1691},{"id":2470,"depth":1120,"text":2471,"children":12062},[12063,12064,12065],{"id":2482,"depth":1334,"text":2483},{"id":2865,"depth":1334,"text":2866},{"id":4699,"depth":1334,"text":4700},{"id":5081,"depth":1120,"text":5082,"children":12067},[12068],{"id":5100,"depth":1334,"text":5101},{"id":5717,"depth":1120,"text":5718},{"id":7285,"depth":1120,"text":7286,"children":12071},[12072,12073],{"id":7292,"depth":1334,"text":7293},{"id":7452,"depth":1334,"text":7453},{"id":7952,"depth":1120,"text":7953},{"id":8495,"depth":1120,"text":8496},{"id":9773,"depth":1120,"text":9774,"children":12077},[12078,12079,12080],{"id":9784,"depth":1334,"text":9785},{"id":10047,"depth":1334,"text":10048},{"id":10306,"depth":1334,"text":10307},{"id":11659,"depth":1120,"text":11660},{"id":11897,"depth":1120,"text":11898},{"id":11960,"depth":1120,"text":11961},"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":12089},"Tutorial","\u002Fblog\u002Fhow-to-build-an-ai-chat",{"title":973,"description":12085},"blog\u002Fhow-to-build-an-ai-chat","ugglJqLsGgnnltNBbTrx1KjoUNVnc0W4pVd_V3GiLRg",{"data":12095,"body":12096},{},{"type":12097,"children":12098},"root",[12099],{"type":178,"tag":989,"props":12100,"children":12101},{},[12102,12104,12111],{"type":5340,"value":12103},"Nuxt ",{"type":178,"tag":1100,"props":12105,"children":12108},{"className":12106},[12107],"text-primary",[12109],{"type":5340,"value":12110},"UI",{"type":5340,"value":12112}," Blog",{"data":12114,"body":12115},{},{"type":12097,"children":12116},[12117],{"type":178,"tag":989,"props":12118,"children":12119},{},[12120],{"type":5340,"value":961},1774822298959]