[{"data":1,"prerenderedAt":12122},["ShallowReactive",2],{"navigation":3,"blog":959,"blog-posts":971,"blog-hero-title":12095,"blog-hero-description":12114},[4],{"title":5,"path":6,"stem":7,"children":8,"page":36},"Docs","\u002Fdocs","docs",[9,163,817,858],{"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,792,797,802,807,812],{"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.","Soon",{"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,"badge":791},"\u002Fdocs\u002Fcomponents\u002Ftheme","docs\u002F2.components\u002Ftheme","A headless component to theme child components.","New",{"title":793,"path":794,"stem":795,"framework":16,"category":172,"description":796},"Timeline","\u002Fdocs\u002Fcomponents\u002Ftimeline","docs\u002F2.components\u002Ftimeline","A component that displays a sequence of events with dates, titles, icons or avatars.",{"title":798,"path":799,"stem":800,"framework":16,"category":397,"description":801},"Toast","\u002Fdocs\u002Fcomponents\u002Ftoast","docs\u002F2.components\u002Ftoast","A succinct message to provide information or feedback to the user.",{"title":803,"path":804,"stem":805,"framework":16,"category":397,"description":806},"Tooltip","\u002Fdocs\u002Fcomponents\u002Ftooltip","docs\u002F2.components\u002Ftooltip","A popup that reveals information when hovering over an element.",{"title":808,"path":809,"stem":810,"framework":16,"category":172,"description":811},"Tree","\u002Fdocs\u002Fcomponents\u002Ftree","docs\u002F2.components\u002Ftree","A tree view component to display and interact with hierarchical data structures.",{"title":813,"path":814,"stem":815,"framework":16,"category":172,"description":816},"User","\u002Fdocs\u002Fcomponents\u002Fuser","docs\u002F2.components\u002Fuser","Display user information with name, description and avatar.",{"title":818,"framework":16,"category":16,"description":16,"icon":819,"path":820,"stem":821,"children":822,"page":36},"Composables","i-lucide-square-function","\u002Fdocs\u002Fcomposables","docs\u002F3.composables",[823,828,833,838,843,848,853],{"title":824,"path":825,"stem":826,"framework":16,"category":16,"description":827},"defineLocale","\u002Fdocs\u002Fcomposables\u002Fdefine-locale","docs\u002F3.composables\u002Fdefine-locale","A utility to create a custom locale for your app.",{"title":829,"path":830,"stem":831,"framework":16,"category":16,"description":832},"defineShortcuts","\u002Fdocs\u002Fcomposables\u002Fdefine-shortcuts","docs\u002F3.composables\u002Fdefine-shortcuts","A composable to define keyboard shortcuts in your app.",{"title":834,"path":835,"stem":836,"framework":16,"category":16,"description":837},"extendLocale","\u002Fdocs\u002Fcomposables\u002Fextend-locale","docs\u002F3.composables\u002Fextend-locale","A utility to extend an existing locale with custom translations.",{"title":839,"path":840,"stem":841,"framework":16,"category":16,"description":842},"extractShortcuts","\u002Fdocs\u002Fcomposables\u002Fextract-shortcuts","docs\u002F3.composables\u002Fextract-shortcuts","A utility to extract keyboard shortcuts from menu items.",{"title":844,"path":845,"stem":846,"framework":16,"category":16,"description":847},"useOverlay","\u002Fdocs\u002Fcomposables\u002Fuse-overlay","docs\u002F3.composables\u002Fuse-overlay","A composable to programmatically control overlays.",{"title":849,"path":850,"stem":851,"framework":16,"category":16,"description":852,"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":854,"path":855,"stem":856,"framework":16,"category":16,"description":857},"useToast","\u002Fdocs\u002Fcomposables\u002Fuse-toast","docs\u002F3.composables\u002Fuse-toast","A composable to display toast notifications in your app.",{"title":859,"path":860,"stem":861,"children":862,"framework":28,"category":16,"description":16,"icon":958},"Typography","\u002Fdocs\u002Ftypography","docs\u002F4.typography\u002F1.index",[863,865,870,875,880,885,890,894,899,903,908,913,918,923,928,932,937,941,945,949,954],{"title":15,"path":860,"stem":861,"framework":28,"category":16,"description":864},"Beautiful typography components and utilities to style your content with Nuxt UI.",{"title":866,"path":867,"stem":868,"framework":28,"category":16,"description":869},"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":871,"path":872,"stem":873,"framework":28,"category":16,"description":874},"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":876,"path":877,"stem":878,"framework":28,"category":16,"description":879},"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":881,"path":882,"stem":883,"framework":28,"category":16,"description":884},"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":886,"stem":887,"framework":28,"category":888,"description":889},"\u002Fdocs\u002Ftypography\u002Faccordion","docs\u002F4.typography\u002Faccordion","components","Create expandable content sections for better information organization.",{"title":203,"path":891,"stem":892,"framework":28,"category":888,"description":893},"\u002Fdocs\u002Ftypography\u002Fbadge","docs\u002F4.typography\u002Fbadge","Display version numbers, status labels, and tags within your content.",{"title":895,"path":896,"stem":897,"framework":28,"category":888,"description":898},"Callout","\u002Fdocs\u002Ftypography\u002Fcallout","docs\u002F4.typography\u002Fcallout","Highlight important information with eye-catching colored boxes and icons.",{"title":239,"path":900,"stem":901,"framework":28,"category":888,"description":902},"\u002Fdocs\u002Ftypography\u002Fcard","docs\u002F4.typography\u002Fcard","Create highlighted content blocks with optional links and navigation.",{"title":904,"path":905,"stem":906,"framework":28,"category":888,"description":907},"CardGroup","\u002Fdocs\u002Ftypography\u002Fcard-group","docs\u002F4.typography\u002Fcard-group","Organize multiple cards in responsive grid layouts for better content presentation.",{"title":909,"path":910,"stem":911,"framework":28,"category":888,"description":912},"CodeCollapse","\u002Fdocs\u002Ftypography\u002Fcode-collapse","docs\u002F4.typography\u002Fcode-collapse","Make long code blocks collapsible to save space and improve readability.",{"title":914,"path":915,"stem":916,"framework":28,"category":888,"description":917},"CodeGroup","\u002Fdocs\u002Ftypography\u002Fcode-group","docs\u002F4.typography\u002Fcode-group","Group multiple code examples in tabbed interfaces for easy comparison.",{"title":919,"path":920,"stem":921,"framework":28,"category":888,"description":922},"CodePreview","\u002Fdocs\u002Ftypography\u002Fcode-preview","docs\u002F4.typography\u002Fcode-preview","Display code examples with a preview and their source for clearer documentation.",{"title":924,"path":925,"stem":926,"framework":28,"category":888,"description":927},"CodeTree","\u002Fdocs\u002Ftypography\u002Fcode-tree","docs\u002F4.typography\u002Fcode-tree","Visualize file and folder structures with syntax-highlighted code.",{"title":322,"path":929,"stem":930,"framework":28,"category":888,"description":931},"\u002Fdocs\u002Ftypography\u002Fcollapsible","docs\u002F4.typography\u002Fcollapsible","Toggle content visibility with smooth expand and collapse animations.",{"title":933,"path":934,"stem":935,"framework":28,"category":888,"description":936},"Field","\u002Fdocs\u002Ftypography\u002Ffield","docs\u002F4.typography\u002Ffield","Document API parameters, props, and configuration options clearly.",{"title":502,"path":938,"stem":939,"framework":28,"category":888,"description":940},"\u002Fdocs\u002Ftypography\u002Ffield-group","docs\u002F4.typography\u002Ffield-group","Group related fields together for comprehensive API documentation.",{"title":537,"path":942,"stem":943,"framework":28,"category":888,"description":944},"\u002Fdocs\u002Ftypography\u002Ficon","docs\u002F4.typography\u002Ficon","Display icons from popular icon libraries to enhance your content.",{"title":572,"path":946,"stem":947,"framework":28,"category":888,"description":948},"\u002Fdocs\u002Ftypography\u002Fkbd","docs\u002F4.typography\u002Fkbd","Display keyboard shortcuts and key combinations with proper styling.",{"title":950,"path":951,"stem":952,"framework":28,"category":888,"description":953},"Steps","\u002Fdocs\u002Ftypography\u002Fsteps","docs\u002F4.typography\u002Fsteps","Transform headings into numbered step-by-step guides and tutorials.",{"title":778,"path":955,"stem":956,"framework":28,"category":888,"description":957},"\u002Fdocs\u002Ftypography\u002Ftabs","docs\u002F4.typography\u002Ftabs","Organize related content in interactive tabbed interfaces.","i-lucide-square-pilcrow",{"id":960,"title":961,"body":16,"description":962,"extension":963,"hero":964,"meta":966,"navigation":36,"path":967,"seo":968,"stem":969,"__hash__":970},"blog\u002Fblog.yml","Blog","Tutorials, guides, and insights to help you build beautiful applications with Nuxt UI.","yml",{"title":965,"description":962},"Nuxt [UI]{.text-primary} Blog",{},"\u002Fblog",{"title":961,"description":962},"blog","ESl67YJxs4hhxlk_OHymZ1sSoeclVge2lYINtoN5zxg",[972],{"id":973,"title":974,"authors":975,"body":986,"date":12085,"description":12086,"extension":12087,"image":12088,"meta":12089,"navigation":36,"path":12091,"seo":12092,"stem":12093,"__hash__":12094},"posts\u002Fblog\u002Fhow-to-build-an-ai-chat.md","Build an AI Chatbot with Nuxt, Nuxt UI, and AI SDK",[976,981],{"name":977,"avatar":978,"to":980},"Hugo Richard",{"src":979},"https:\u002F\u002Fgithub.com\u002Fhugorcd.png","https:\u002F\u002Fx.com\u002Fhugorcd",{"name":982,"avatar":983,"to":985},"Benjamin Canac",{"src":984},"https:\u002F\u002Fgithub.com\u002Fbenjamincanac.png","https:\u002F\u002Fx.com\u002Fbenjamincanac",{"type":987,"value":988,"toc":12052},"minimark",[989,993,998,1001,1036,1063,1067,1070,1084,1088,1091,1128,1133,1136,1280,1284,1291,1507,1510,1549,1553,1560,1655,1662,1679,1689,1693,1707,2438,2441,2459,2469,2473,2481,2485,2496,2864,2868,2895,4602,4605,4610,4617,4622,4633,4638,4647,4665,4670,4685,4698,4702,4705,5080,5084,5099,5103,5111,5684,5691,5716,5720,5738,7113,7116,7121,7132,7170,7185,7190,7197,7211,7216,7256,7261,7266,7273,7284,7288,7291,7295,7298,7451,7455,7480,7951,7955,8494,8498,9763,9772,9776,9783,9787,9797,10046,10050,10058,10305,10309,10312,11658,11662,11665,11670,11679,11684,11693,11896,11900,11903,11918,11921,11936,11951,11959,11963,11966,11996,11999,12004,12045,12048],[990,991,992],"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.",[994,995,997],"h2",{"id":996},"what-were-building","What we're building",[990,999,1000],{},"By the end of this tutorial, you'll have a fully functional AI chatbot with:",[1002,1003,1004,1012,1018,1024,1030],"ul",{},[1005,1006,1007,1011],"li",{},[1008,1009,1010],"strong",{},"Streaming responses"," that appear in real-time as the AI generates them",[1005,1013,1014,1017],{},[1008,1015,1016],{},"A beautiful chat interface"," built with Nuxt UI's purpose-built chat components",[1005,1019,1020,1023],{},[1008,1021,1022],{},"Markdown rendering"," for rich AI responses with code highlighting",[1005,1025,1026,1029],{},[1008,1027,1028],{},"Multi-model support"," allowing users to switch between OpenAI, Anthropic, and Google models",[1005,1031,1032,1035],{},[1008,1033,1034],{},"Server-side AI integration"," using Nitro API routes and the AI SDK",[1037,1038,1040],"callout",{"icon":1039},"i-simple-icons-github",[990,1041,1042,1043,1054,1055,1062],{},"Check out the ",[1044,1045,1050],"a",{"href":1046,"rel":1047,"target":1049},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat",[1048],"nofollow","_blank",[1051,1052,1053],"code",{},"Nuxt"," and ",[1044,1056,1059],{"href":1057,"rel":1058,"target":1049},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat-vue",[1048],[1051,1060,1061],{},"Vue"," AI Chat templates on GitHub for production-ready implementations with authentication, database persistence, and more.",[994,1064,1066],{"id":1065},"prerequisites","Prerequisites",[990,1068,1069],{},"Before we start, make sure you have:",[1002,1071,1072,1075],{},[1005,1073,1074],{},"Node.js 20+ installed",[1005,1076,1077,1078,1083],{},"A ",[1044,1079,1082],{"href":1080,"rel":1081},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fai-gateway",[1048],"Vercel AI Gateway"," API key (provides access to multiple AI providers through a single endpoint)",[994,1085,1087],{"id":1086},"project-setup","Project setup",[990,1089,1090],{},"Start by creating a new Nuxt project:",[1092,1093,1098],"pre",{"className":1094,"code":1095,"language":1096,"meta":1097,"style":1097},"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","",[1051,1099,1100,1119],{"__ignoreMap":1097},[1101,1102,1105,1109,1113,1116],"span",{"class":1103,"line":1104},"line",1,[1101,1106,1108],{"class":1107},"sBMFI","npx",[1101,1110,1112],{"class":1111},"sfazB"," nuxi@latest",[1101,1114,1115],{"class":1111}," init",[1101,1117,1118],{"class":1111}," nuxt-ai-chat\n",[1101,1120,1122,1126],{"class":1103,"line":1121},2,[1101,1123,1125],{"class":1124},"s2Zo4","cd",[1101,1127,1118],{"class":1111},[1129,1130,1132],"h3",{"id":1131},"installing-dependencies","Installing dependencies",[990,1134,1135],{},"Install Nuxt UI and the AI-specific dependencies:",[1137,1138,1140,1183,1215,1248],"code-group",{"sync":1139},"pm",[1092,1141,1144],{"className":1094,"code":1142,"filename":1143,"language":1096,"meta":1097,"style":1097},"pnpm add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","pnpm",[1051,1145,1146],{"__ignoreMap":1097},[1101,1147,1148,1150,1153,1156,1159,1162,1165,1168,1171,1174,1177,1180],{"class":1103,"line":1104},[1101,1149,1143],{"class":1107},[1101,1151,1152],{"class":1111}," add",[1101,1154,1155],{"class":1111}," @nuxt\u002Fui",[1101,1157,1158],{"class":1111}," tailwindcss",[1101,1160,1161],{"class":1111}," @nuxtjs\u002Fmdc",[1101,1163,1164],{"class":1111}," @nuxthub\u002Fcore",[1101,1166,1167],{"class":1111}," drizzle-orm",[1101,1169,1170],{"class":1111}," drizzle-kit",[1101,1172,1173],{"class":1111}," @libsql\u002Fclient",[1101,1175,1176],{"class":1111}," ai",[1101,1178,1179],{"class":1111}," @ai-sdk\u002Fvue",[1101,1181,1182],{"class":1111}," zod\n",[1092,1184,1187],{"className":1094,"code":1185,"filename":1186,"language":1096,"meta":1097,"style":1097},"yarn add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","yarn",[1051,1188,1189],{"__ignoreMap":1097},[1101,1190,1191,1193,1195,1197,1199,1201,1203,1205,1207,1209,1211,1213],{"class":1103,"line":1104},[1101,1192,1186],{"class":1107},[1101,1194,1152],{"class":1111},[1101,1196,1155],{"class":1111},[1101,1198,1158],{"class":1111},[1101,1200,1161],{"class":1111},[1101,1202,1164],{"class":1111},[1101,1204,1167],{"class":1111},[1101,1206,1170],{"class":1111},[1101,1208,1173],{"class":1111},[1101,1210,1176],{"class":1111},[1101,1212,1179],{"class":1111},[1101,1214,1182],{"class":1111},[1092,1216,1219],{"className":1094,"code":1217,"filename":1218,"language":1096,"meta":1097,"style":1097},"npm install @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","npm",[1051,1220,1221],{"__ignoreMap":1097},[1101,1222,1223,1225,1228,1230,1232,1234,1236,1238,1240,1242,1244,1246],{"class":1103,"line":1104},[1101,1224,1218],{"class":1107},[1101,1226,1227],{"class":1111}," install",[1101,1229,1155],{"class":1111},[1101,1231,1158],{"class":1111},[1101,1233,1161],{"class":1111},[1101,1235,1164],{"class":1111},[1101,1237,1167],{"class":1111},[1101,1239,1170],{"class":1111},[1101,1241,1173],{"class":1111},[1101,1243,1176],{"class":1111},[1101,1245,1179],{"class":1111},[1101,1247,1182],{"class":1111},[1092,1249,1252],{"className":1094,"code":1250,"filename":1251,"language":1096,"meta":1097,"style":1097},"bun add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","bun",[1051,1253,1254],{"__ignoreMap":1097},[1101,1255,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1278],{"class":1103,"line":1104},[1101,1257,1251],{"class":1107},[1101,1259,1152],{"class":1111},[1101,1261,1155],{"class":1111},[1101,1263,1158],{"class":1111},[1101,1265,1161],{"class":1111},[1101,1267,1164],{"class":1111},[1101,1269,1167],{"class":1111},[1101,1271,1170],{"class":1111},[1101,1273,1173],{"class":1111},[1101,1275,1176],{"class":1111},[1101,1277,1179],{"class":1111},[1101,1279,1182],{"class":1111},[1129,1281,1283],{"id":1282},"configuration","Configuration",[990,1285,1286,1287,1290],{},"Update your ",[1051,1288,1289],{},"nuxt.config.ts"," to register the modules:",[1292,1293,1294],"code-tree-intersection",{},[1092,1295,1299],{"className":1296,"code":1297,"filename":1289,"language":1298,"meta":1097,"style":1097},"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",[1051,1300,1301,1321,1333,1348,1360,1371,1379,1385,1396,1412,1418,1423,1446,1451,1461,1471,1487,1493,1498],{"__ignoreMap":1097},[1101,1302,1303,1307,1310,1313,1317],{"class":1103,"line":1104},[1101,1304,1306],{"class":1305},"s7zQu","export",[1101,1308,1309],{"class":1305}," default",[1101,1311,1312],{"class":1124}," defineNuxtConfig",[1101,1314,1316],{"class":1315},"sTEyZ","(",[1101,1318,1320],{"class":1319},"sMK4o","{\n",[1101,1322,1323,1327,1330],{"class":1103,"line":1121},[1101,1324,1326],{"class":1325},"swJcz","  modules",[1101,1328,1329],{"class":1319},":",[1101,1331,1332],{"class":1315}," [\n",[1101,1334,1336,1339,1342,1345],{"class":1103,"line":1335},3,[1101,1337,1338],{"class":1319},"    '",[1101,1340,1341],{"class":1111},"@nuxt\u002Fui",[1101,1343,1344],{"class":1319},"'",[1101,1346,1347],{"class":1319},",\n",[1101,1349,1351,1353,1356,1358],{"class":1103,"line":1350},4,[1101,1352,1338],{"class":1319},[1101,1354,1355],{"class":1111},"@nuxtjs\u002Fmdc",[1101,1357,1344],{"class":1319},[1101,1359,1347],{"class":1319},[1101,1361,1363,1365,1368],{"class":1103,"line":1362},5,[1101,1364,1338],{"class":1319},[1101,1366,1367],{"class":1111},"@nuxthub\u002Fcore",[1101,1369,1370],{"class":1319},"'\n",[1101,1372,1374,1377],{"class":1103,"line":1373},6,[1101,1375,1376],{"class":1315},"  ]",[1101,1378,1347],{"class":1319},[1101,1380,1382],{"class":1103,"line":1381},7,[1101,1383,1384],{"emptyLinePlaceholder":21},"\n",[1101,1386,1388,1391,1393],{"class":1103,"line":1387},8,[1101,1389,1390],{"class":1325},"  hub",[1101,1392,1329],{"class":1319},[1101,1394,1395],{"class":1319}," {\n",[1101,1397,1399,1402,1404,1407,1410],{"class":1103,"line":1398},9,[1101,1400,1401],{"class":1325},"    db",[1101,1403,1329],{"class":1319},[1101,1405,1406],{"class":1319}," '",[1101,1408,1409],{"class":1111},"sqlite",[1101,1411,1370],{"class":1319},[1101,1413,1415],{"class":1103,"line":1414},10,[1101,1416,1417],{"class":1319},"  },\n",[1101,1419,1421],{"class":1103,"line":1420},11,[1101,1422,1384],{"emptyLinePlaceholder":21},[1101,1424,1426,1429,1431,1434,1436,1439,1441,1444],{"class":1103,"line":1425},12,[1101,1427,1428],{"class":1325},"  css",[1101,1430,1329],{"class":1319},[1101,1432,1433],{"class":1315}," [",[1101,1435,1344],{"class":1319},[1101,1437,1438],{"class":1111},"~\u002Fassets\u002Fcss\u002Fmain.css",[1101,1440,1344],{"class":1319},[1101,1442,1443],{"class":1315},"]",[1101,1445,1347],{"class":1319},[1101,1447,1449],{"class":1103,"line":1448},13,[1101,1450,1384],{"emptyLinePlaceholder":21},[1101,1452,1454,1457,1459],{"class":1103,"line":1453},14,[1101,1455,1456],{"class":1325},"  mdc",[1101,1458,1329],{"class":1319},[1101,1460,1395],{"class":1319},[1101,1462,1464,1467,1469],{"class":1103,"line":1463},15,[1101,1465,1466],{"class":1325},"    headings",[1101,1468,1329],{"class":1319},[1101,1470,1395],{"class":1319},[1101,1472,1474,1477,1479,1483],{"class":1103,"line":1473},16,[1101,1475,1476],{"class":1325},"      anchorLinks",[1101,1478,1329],{"class":1319},[1101,1480,1482],{"class":1481},"sfNiH"," false",[1101,1484,1486],{"class":1485},"sHwdD"," \u002F\u002F Disable anchor links in AI responses\n",[1101,1488,1490],{"class":1103,"line":1489},17,[1101,1491,1492],{"class":1319},"    }\n",[1101,1494,1496],{"class":1103,"line":1495},18,[1101,1497,1417],{"class":1319},[1101,1499,1501,1504],{"class":1103,"line":1500},19,[1101,1502,1503],{"class":1319},"}",[1101,1505,1506],{"class":1315},")\n",[990,1508,1509],{},"Create the main CSS file to import Tailwind CSS and Nuxt UI:",[1292,1511,1512],{},[1092,1513,1518],{"className":1514,"code":1515,"filename":1516,"language":1517,"meta":1097,"style":1097},"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",[1051,1519,1520,1537],{"__ignoreMap":1097},[1101,1521,1522,1525,1528,1531,1534],{"class":1103,"line":1104},[1101,1523,1524],{"class":1305},"@import",[1101,1526,1527],{"class":1319}," \"",[1101,1529,1530],{"class":1111},"tailwindcss",[1101,1532,1533],{"class":1319},"\"",[1101,1535,1536],{"class":1319},";\n",[1101,1538,1539,1541,1543,1545,1547],{"class":1103,"line":1121},[1101,1540,1524],{"class":1305},[1101,1542,1527],{"class":1319},[1101,1544,1341],{"class":1111},[1101,1546,1533],{"class":1319},[1101,1548,1536],{"class":1319},[1129,1550,1552],{"id":1551},"setting-up-the-app","Setting up the app",[990,1554,1555,1556,1559],{},"Nuxt UI requires wrapping your app with ",[1051,1557,1558],{},"UApp"," for modals, toasts, and overlays to work properly:",[1292,1561,1562],{},[1092,1563,1568],{"className":1564,"code":1565,"filename":1566,"highlights":1567,"language":34,"meta":1097,"style":1097},"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",[1121,1373],[1051,1569,1570,1581,1592,1616,1627,1636,1646],{"__ignoreMap":1097},[1101,1571,1572,1575,1578],{"class":1103,"line":1104},[1101,1573,1574],{"class":1319},"\u003C",[1101,1576,1577],{"class":1325},"template",[1101,1579,1580],{"class":1319},">\n",[1101,1582,1585,1588,1590],{"class":1583,"line":1121},[1103,1584],"highlight",[1101,1586,1587],{"class":1319},"  \u003C",[1101,1589,1558],{"class":1325},[1101,1591,1580],{"class":1319},[1101,1593,1594,1597,1600,1604,1607,1609,1612,1614],{"class":1103,"line":1335},[1101,1595,1596],{"class":1319},"    \u003C",[1101,1598,1599],{"class":1325},"UDashboardGroup",[1101,1601,1603],{"class":1602},"spNyl"," unit",[1101,1605,1606],{"class":1319},"=",[1101,1608,1533],{"class":1319},[1101,1610,1611],{"class":1111},"rem",[1101,1613,1533],{"class":1319},[1101,1615,1580],{"class":1319},[1101,1617,1618,1621,1624],{"class":1103,"line":1350},[1101,1619,1620],{"class":1319},"      \u003C",[1101,1622,1623],{"class":1325},"NuxtPage",[1101,1625,1626],{"class":1319}," \u002F>\n",[1101,1628,1629,1632,1634],{"class":1103,"line":1362},[1101,1630,1631],{"class":1319},"    \u003C\u002F",[1101,1633,1599],{"class":1325},[1101,1635,1580],{"class":1319},[1101,1637,1639,1642,1644],{"class":1638,"line":1373},[1103,1584],[1101,1640,1641],{"class":1319},"  \u003C\u002F",[1101,1643,1558],{"class":1325},[1101,1645,1580],{"class":1319},[1101,1647,1648,1651,1653],{"class":1103,"line":1381},[1101,1649,1650],{"class":1319},"\u003C\u002F",[1101,1652,1577],{"class":1325},[1101,1654,1580],{"class":1319},[990,1656,1657,1658,1661],{},"Create a ",[1051,1659,1660],{},".env"," file with your AI Gateway API key:",[1292,1663,1664],{},[1092,1665,1667],{"className":1094,"code":1666,"filename":1660,"language":1096,"meta":1097,"style":1097},"AI_GATEWAY_API_KEY=your-api-key-here\n",[1051,1668,1669],{"__ignoreMap":1097},[1101,1670,1671,1674,1676],{"class":1103,"line":1104},[1101,1672,1673],{"class":1315},"AI_GATEWAY_API_KEY",[1101,1675,1606],{"class":1319},[1101,1677,1678],{"class":1111},"your-api-key-here\n",[1680,1681,1682],"note",{},[990,1683,1684,1685,1688],{},"With ",[1044,1686,1082],{"href":1080,"rel":1687},[1048],", 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.",[1129,1690,1692],{"id":1691},"setting-up-the-database","Setting up the database",[990,1694,1695,1700,1701,1706],{},[1044,1696,1699],{"href":1697,"rel":1698},"https:\u002F\u002Fhub.nuxt.com",[1048],"NuxtHub"," provides a zero-config database powered by ",[1044,1702,1705],{"href":1703,"rel":1704},"https:\u002F\u002Form.drizzle.team",[1048],"Drizzle ORM",". Here is the schema for the chat application:",[1292,1708,1709],{},[1710,1711,1712],"code-collapse",{},[1092,1713,1716],{"className":1296,"code":1714,"filename":1715,"language":1298,"meta":1097,"style":1097},"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",[1051,1717,1718,1758,1778,1782,1809,1854,1867,1924,1930,1934,1969,1981,1988,1992,2018,2063,2129,2198,2237,2287,2300,2330,2336,2341,2373,2389,2407,2423,2431],{"__ignoreMap":1097},[1101,1719,1720,1723,1726,1729,1732,1735,1737,1740,1742,1745,1748,1751,1753,1756],{"class":1103,"line":1104},[1101,1721,1722],{"class":1305},"import",[1101,1724,1725],{"class":1319}," {",[1101,1727,1728],{"class":1315}," sqliteTable",[1101,1730,1731],{"class":1319},",",[1101,1733,1734],{"class":1315}," text",[1101,1736,1731],{"class":1319},[1101,1738,1739],{"class":1315}," integer",[1101,1741,1731],{"class":1319},[1101,1743,1744],{"class":1315}," index",[1101,1746,1747],{"class":1319}," }",[1101,1749,1750],{"class":1305}," from",[1101,1752,1406],{"class":1319},[1101,1754,1755],{"class":1111},"drizzle-orm\u002Fsqlite-core",[1101,1757,1370],{"class":1319},[1101,1759,1760,1762,1764,1767,1769,1771,1773,1776],{"class":1103,"line":1121},[1101,1761,1722],{"class":1305},[1101,1763,1725],{"class":1319},[1101,1765,1766],{"class":1315}," relations",[1101,1768,1747],{"class":1319},[1101,1770,1750],{"class":1305},[1101,1772,1406],{"class":1319},[1101,1774,1775],{"class":1111},"drizzle-orm",[1101,1777,1370],{"class":1319},[1101,1779,1780],{"class":1103,"line":1335},[1101,1781,1384],{"emptyLinePlaceholder":21},[1101,1783,1784,1786,1789,1792,1794,1796,1798,1800,1803,1805,1807],{"class":1103,"line":1350},[1101,1785,1306],{"class":1305},[1101,1787,1788],{"class":1602}," const",[1101,1790,1791],{"class":1315}," chats ",[1101,1793,1606],{"class":1319},[1101,1795,1728],{"class":1124},[1101,1797,1316],{"class":1315},[1101,1799,1344],{"class":1319},[1101,1801,1802],{"class":1111},"chats",[1101,1804,1344],{"class":1319},[1101,1806,1731],{"class":1319},[1101,1808,1395],{"class":1319},[1101,1810,1811,1814,1816,1818,1821,1824,1827,1829,1831,1834,1836,1838,1841,1844,1846,1849,1852],{"class":1103,"line":1362},[1101,1812,1813],{"class":1325},"  id",[1101,1815,1329],{"class":1319},[1101,1817,1734],{"class":1124},[1101,1819,1820],{"class":1315},"()",[1101,1822,1823],{"class":1319},".",[1101,1825,1826],{"class":1124},"primaryKey",[1101,1828,1820],{"class":1315},[1101,1830,1823],{"class":1319},[1101,1832,1833],{"class":1124},"$defaultFn",[1101,1835,1316],{"class":1315},[1101,1837,1820],{"class":1319},[1101,1839,1840],{"class":1602}," =>",[1101,1842,1843],{"class":1315}," crypto",[1101,1845,1823],{"class":1319},[1101,1847,1848],{"class":1124},"randomUUID",[1101,1850,1851],{"class":1315},"())",[1101,1853,1347],{"class":1319},[1101,1855,1856,1859,1861,1863,1865],{"class":1103,"line":1373},[1101,1857,1858],{"class":1325},"  title",[1101,1860,1329],{"class":1319},[1101,1862,1734],{"class":1124},[1101,1864,1820],{"class":1315},[1101,1866,1347],{"class":1319},[1101,1868,1869,1872,1874,1876,1878,1881,1884,1886,1888,1891,1893,1895,1898,1900,1903,1905,1907,1909,1911,1913,1915,1918,1921],{"class":1103,"line":1381},[1101,1870,1871],{"class":1325},"  createdAt",[1101,1873,1329],{"class":1319},[1101,1875,1739],{"class":1124},[1101,1877,1316],{"class":1315},[1101,1879,1880],{"class":1319},"{",[1101,1882,1883],{"class":1325}," mode",[1101,1885,1329],{"class":1319},[1101,1887,1406],{"class":1319},[1101,1889,1890],{"class":1111},"timestamp",[1101,1892,1344],{"class":1319},[1101,1894,1747],{"class":1319},[1101,1896,1897],{"class":1315},")",[1101,1899,1823],{"class":1319},[1101,1901,1902],{"class":1124},"notNull",[1101,1904,1820],{"class":1315},[1101,1906,1823],{"class":1319},[1101,1908,1833],{"class":1124},[1101,1910,1316],{"class":1315},[1101,1912,1820],{"class":1319},[1101,1914,1840],{"class":1602},[1101,1916,1917],{"class":1319}," new",[1101,1919,1920],{"class":1124}," Date",[1101,1922,1923],{"class":1315},"())\n",[1101,1925,1926,1928],{"class":1103,"line":1387},[1101,1927,1503],{"class":1319},[1101,1929,1506],{"class":1315},[1101,1931,1932],{"class":1103,"line":1398},[1101,1933,1384],{"emptyLinePlaceholder":21},[1101,1935,1936,1938,1940,1943,1945,1947,1950,1952,1955,1959,1962,1964,1967],{"class":1103,"line":1414},[1101,1937,1306],{"class":1305},[1101,1939,1788],{"class":1602},[1101,1941,1942],{"class":1315}," chatsRelations ",[1101,1944,1606],{"class":1319},[1101,1946,1766],{"class":1124},[1101,1948,1949],{"class":1315},"(chats",[1101,1951,1731],{"class":1319},[1101,1953,1954],{"class":1319}," ({",[1101,1956,1958],{"class":1957},"sHdIc"," many",[1101,1960,1961],{"class":1319}," })",[1101,1963,1840],{"class":1602},[1101,1965,1966],{"class":1315}," (",[1101,1968,1320],{"class":1319},[1101,1970,1971,1974,1976,1978],{"class":1103,"line":1420},[1101,1972,1973],{"class":1325},"  messages",[1101,1975,1329],{"class":1319},[1101,1977,1958],{"class":1124},[1101,1979,1980],{"class":1315},"(messages)\n",[1101,1982,1983,1985],{"class":1103,"line":1425},[1101,1984,1503],{"class":1319},[1101,1986,1987],{"class":1315},"))\n",[1101,1989,1990],{"class":1103,"line":1448},[1101,1991,1384],{"emptyLinePlaceholder":21},[1101,1993,1994,1996,1998,2001,2003,2005,2007,2009,2012,2014,2016],{"class":1103,"line":1453},[1101,1995,1306],{"class":1305},[1101,1997,1788],{"class":1602},[1101,1999,2000],{"class":1315}," messages ",[1101,2002,1606],{"class":1319},[1101,2004,1728],{"class":1124},[1101,2006,1316],{"class":1315},[1101,2008,1344],{"class":1319},[1101,2010,2011],{"class":1111},"messages",[1101,2013,1344],{"class":1319},[1101,2015,1731],{"class":1319},[1101,2017,1395],{"class":1319},[1101,2019,2020,2022,2024,2026,2028,2030,2033,2035,2037,2039,2041,2043,2045,2047,2049,2051,2053,2055,2057,2059,2061],{"class":1103,"line":1463},[1101,2021,1813],{"class":1325},[1101,2023,1329],{"class":1319},[1101,2025,1734],{"class":1124},[1101,2027,1316],{"class":1315},[1101,2029,1344],{"class":1319},[1101,2031,2032],{"class":1111},"id",[1101,2034,1344],{"class":1319},[1101,2036,1897],{"class":1315},[1101,2038,1823],{"class":1319},[1101,2040,1826],{"class":1124},[1101,2042,1820],{"class":1315},[1101,2044,1823],{"class":1319},[1101,2046,1833],{"class":1124},[1101,2048,1316],{"class":1315},[1101,2050,1820],{"class":1319},[1101,2052,1840],{"class":1602},[1101,2054,1843],{"class":1315},[1101,2056,1823],{"class":1319},[1101,2058,1848],{"class":1124},[1101,2060,1851],{"class":1315},[1101,2062,1347],{"class":1319},[1101,2064,2065,2068,2070,2072,2074,2076,2079,2081,2083,2085,2087,2089,2091,2094,2096,2098,2100,2103,2105,2107,2109,2111,2114,2116,2118,2121,2123,2125,2127],{"class":1103,"line":1473},[1101,2066,2067],{"class":1325},"  chatId",[1101,2069,1329],{"class":1319},[1101,2071,1734],{"class":1124},[1101,2073,1316],{"class":1315},[1101,2075,1344],{"class":1319},[1101,2077,2078],{"class":1111},"chat_id",[1101,2080,1344],{"class":1319},[1101,2082,1897],{"class":1315},[1101,2084,1823],{"class":1319},[1101,2086,1902],{"class":1124},[1101,2088,1820],{"class":1315},[1101,2090,1823],{"class":1319},[1101,2092,2093],{"class":1124},"references",[1101,2095,1316],{"class":1315},[1101,2097,1820],{"class":1319},[1101,2099,1840],{"class":1602},[1101,2101,2102],{"class":1315}," chats",[1101,2104,1823],{"class":1319},[1101,2106,2032],{"class":1315},[1101,2108,1731],{"class":1319},[1101,2110,1725],{"class":1319},[1101,2112,2113],{"class":1325}," onDelete",[1101,2115,1329],{"class":1319},[1101,2117,1406],{"class":1319},[1101,2119,2120],{"class":1111},"cascade",[1101,2122,1344],{"class":1319},[1101,2124,1747],{"class":1319},[1101,2126,1897],{"class":1315},[1101,2128,1347],{"class":1319},[1101,2130,2131,2134,2136,2138,2140,2142,2145,2147,2149,2151,2154,2156,2158,2160,2163,2165,2167,2169,2172,2174,2176,2178,2181,2183,2186,2188,2190,2192,2194,2196],{"class":1103,"line":1489},[1101,2132,2133],{"class":1325},"  role",[1101,2135,1329],{"class":1319},[1101,2137,1734],{"class":1124},[1101,2139,1316],{"class":1315},[1101,2141,1344],{"class":1319},[1101,2143,2144],{"class":1111},"role",[1101,2146,1344],{"class":1319},[1101,2148,1731],{"class":1319},[1101,2150,1725],{"class":1319},[1101,2152,2153],{"class":1325}," enum",[1101,2155,1329],{"class":1319},[1101,2157,1433],{"class":1315},[1101,2159,1344],{"class":1319},[1101,2161,2162],{"class":1111},"user",[1101,2164,1344],{"class":1319},[1101,2166,1731],{"class":1319},[1101,2168,1406],{"class":1319},[1101,2170,2171],{"class":1111},"assistant",[1101,2173,1344],{"class":1319},[1101,2175,1731],{"class":1319},[1101,2177,1406],{"class":1319},[1101,2179,2180],{"class":1111},"system",[1101,2182,1344],{"class":1319},[1101,2184,2185],{"class":1315},"] ",[1101,2187,1503],{"class":1319},[1101,2189,1897],{"class":1315},[1101,2191,1823],{"class":1319},[1101,2193,1902],{"class":1124},[1101,2195,1820],{"class":1315},[1101,2197,1347],{"class":1319},[1101,2199,2200,2203,2205,2207,2209,2211,2214,2216,2218,2220,2222,2224,2226,2229,2231,2233,2235],{"class":1103,"line":1495},[1101,2201,2202],{"class":1325},"  parts",[1101,2204,1329],{"class":1319},[1101,2206,1734],{"class":1124},[1101,2208,1316],{"class":1315},[1101,2210,1344],{"class":1319},[1101,2212,2213],{"class":1111},"parts",[1101,2215,1344],{"class":1319},[1101,2217,1731],{"class":1319},[1101,2219,1725],{"class":1319},[1101,2221,1883],{"class":1325},[1101,2223,1329],{"class":1319},[1101,2225,1406],{"class":1319},[1101,2227,2228],{"class":1111},"json",[1101,2230,1344],{"class":1319},[1101,2232,1747],{"class":1319},[1101,2234,1897],{"class":1315},[1101,2236,1347],{"class":1319},[1101,2238,2239,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285],{"class":1103,"line":1500},[1101,2240,1871],{"class":1325},[1101,2242,1329],{"class":1319},[1101,2244,1739],{"class":1124},[1101,2246,1316],{"class":1315},[1101,2248,1880],{"class":1319},[1101,2250,1883],{"class":1325},[1101,2252,1329],{"class":1319},[1101,2254,1406],{"class":1319},[1101,2256,1890],{"class":1111},[1101,2258,1344],{"class":1319},[1101,2260,1747],{"class":1319},[1101,2262,1897],{"class":1315},[1101,2264,1823],{"class":1319},[1101,2266,1902],{"class":1124},[1101,2268,1820],{"class":1315},[1101,2270,1823],{"class":1319},[1101,2272,1833],{"class":1124},[1101,2274,1316],{"class":1315},[1101,2276,1820],{"class":1319},[1101,2278,1840],{"class":1602},[1101,2280,1917],{"class":1319},[1101,2282,1920],{"class":1124},[1101,2284,1851],{"class":1315},[1101,2286,1347],{"class":1319},[1101,2288,2290,2293,2296,2298],{"class":1103,"line":2289},20,[1101,2291,2292],{"class":1319},"},",[1101,2294,2295],{"class":1957}," table",[1101,2297,1840],{"class":1602},[1101,2299,1332],{"class":1315},[1101,2301,2303,2306,2308,2310,2313,2315,2317,2319,2322,2325,2327],{"class":1103,"line":2302},21,[1101,2304,2305],{"class":1124},"  index",[1101,2307,1316],{"class":1315},[1101,2309,1344],{"class":1319},[1101,2311,2312],{"class":1111},"messages_chat_id_idx",[1101,2314,1344],{"class":1319},[1101,2316,1897],{"class":1315},[1101,2318,1823],{"class":1319},[1101,2320,2321],{"class":1124},"on",[1101,2323,2324],{"class":1315},"(table",[1101,2326,1823],{"class":1319},[1101,2328,2329],{"class":1315},"chatId)\n",[1101,2331,2333],{"class":1103,"line":2332},22,[1101,2334,2335],{"class":1315},"])\n",[1101,2337,2339],{"class":1103,"line":2338},23,[1101,2340,1384],{"emptyLinePlaceholder":21},[1101,2342,2344,2346,2348,2351,2353,2355,2358,2360,2362,2365,2367,2369,2371],{"class":1103,"line":2343},24,[1101,2345,1306],{"class":1305},[1101,2347,1788],{"class":1602},[1101,2349,2350],{"class":1315}," messagesRelations ",[1101,2352,1606],{"class":1319},[1101,2354,1766],{"class":1124},[1101,2356,2357],{"class":1315},"(messages",[1101,2359,1731],{"class":1319},[1101,2361,1954],{"class":1319},[1101,2363,2364],{"class":1957}," one",[1101,2366,1961],{"class":1319},[1101,2368,1840],{"class":1602},[1101,2370,1966],{"class":1315},[1101,2372,1320],{"class":1319},[1101,2374,2376,2379,2381,2383,2385,2387],{"class":1103,"line":2375},25,[1101,2377,2378],{"class":1325},"  chat",[1101,2380,1329],{"class":1319},[1101,2382,2364],{"class":1124},[1101,2384,1949],{"class":1315},[1101,2386,1731],{"class":1319},[1101,2388,1395],{"class":1319},[1101,2390,2392,2395,2397,2400,2402,2405],{"class":1103,"line":2391},26,[1101,2393,2394],{"class":1325},"    fields",[1101,2396,1329],{"class":1319},[1101,2398,2399],{"class":1315}," [messages",[1101,2401,1823],{"class":1319},[1101,2403,2404],{"class":1315},"chatId]",[1101,2406,1347],{"class":1319},[1101,2408,2410,2413,2415,2418,2420],{"class":1103,"line":2409},27,[1101,2411,2412],{"class":1325},"    references",[1101,2414,1329],{"class":1319},[1101,2416,2417],{"class":1315}," [chats",[1101,2419,1823],{"class":1319},[1101,2421,2422],{"class":1315},"id]\n",[1101,2424,2426,2429],{"class":1103,"line":2425},28,[1101,2427,2428],{"class":1319},"  }",[1101,2430,1506],{"class":1315},[1101,2432,2434,2436],{"class":1103,"line":2433},29,[1101,2435,1503],{"class":1319},[1101,2437,1987],{"class":1315},[990,2439,2440],{},"Generate the database migrations from your schema:",[1092,2442,2444],{"className":1094,"code":2443,"language":1096,"meta":1097,"style":1097},"npx nuxt db generate\n",[1051,2445,2446],{"__ignoreMap":1097},[1101,2447,2448,2450,2453,2456],{"class":1103,"line":1104},[1101,2449,1108],{"class":1107},[1101,2451,2452],{"class":1111}," nuxt",[1101,2454,2455],{"class":1111}," db",[1101,2457,2458],{"class":1111}," generate\n",[2460,2461,2462],"tip",{},[990,2463,2464,2465,2468],{},"Migrations are automatically applied when you start the development server with ",[1051,2466,2467],{},"npx nuxt dev",". NuxtHub uses SQLite locally, so no external database is required during development.",[994,2470,2472],{"id":2471},"building-the-backend","Building the backend",[990,2474,2475,2476,1823],{},"This section covers integrating AI on the server. The following API endpoints handle chat creation, AI streaming, and data persistence using ",[1044,2477,2480],{"href":2478,"rel":2479},"https:\u002F\u002Fnitro.build",[1048],"Nitro",[1129,2482,2484],{"id":2483},"creating-a-chat","Creating a chat",[990,2486,2487,2488,2495],{},"First, create the endpoint that initializes a new chat and saves the first message to the database. This uses the ",[1044,2489,2492],{"href":2490,"rel":2491},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fui-message",[1048],[1051,2493,2494],{},"UIMessage"," type from the AI SDK:",[1292,2497,2498],{},[1092,2499,2502],{"className":1296,"code":2500,"filename":2501,"language":1298,"meta":1097,"style":1097},"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",[1051,2503,2504,2528,2551,2575,2595,2599,2623,2660,2684,2697,2701,2706,2757,2761,2766,2795,2811,2826,2840,2846,2850,2858],{"__ignoreMap":1097},[1101,2505,2506,2508,2510,2513,2515,2518,2520,2522,2524,2526],{"class":1103,"line":1104},[1101,2507,1722],{"class":1305},[1101,2509,1725],{"class":1319},[1101,2511,2512],{"class":1315}," defineEventHandler",[1101,2514,1731],{"class":1319},[1101,2516,2517],{"class":1315}," readValidatedBody",[1101,2519,1747],{"class":1319},[1101,2521,1750],{"class":1305},[1101,2523,1406],{"class":1319},[1101,2525,1129],{"class":1111},[1101,2527,1370],{"class":1319},[1101,2529,2530,2532,2535,2537,2540,2542,2544,2546,2549],{"class":1103,"line":1121},[1101,2531,1722],{"class":1305},[1101,2533,2534],{"class":1305}," type",[1101,2536,1725],{"class":1319},[1101,2538,2539],{"class":1315}," UIMessage",[1101,2541,1747],{"class":1319},[1101,2543,1750],{"class":1305},[1101,2545,1406],{"class":1319},[1101,2547,2548],{"class":1111},"ai",[1101,2550,1370],{"class":1319},[1101,2552,2553,2555,2557,2559,2561,2564,2566,2568,2570,2573],{"class":1103,"line":1335},[1101,2554,1722],{"class":1305},[1101,2556,1725],{"class":1319},[1101,2558,2455],{"class":1315},[1101,2560,1731],{"class":1319},[1101,2562,2563],{"class":1315}," schema",[1101,2565,1747],{"class":1319},[1101,2567,1750],{"class":1305},[1101,2569,1406],{"class":1319},[1101,2571,2572],{"class":1111},"hub:db",[1101,2574,1370],{"class":1319},[1101,2576,2577,2579,2581,2584,2586,2588,2590,2593],{"class":1103,"line":1350},[1101,2578,1722],{"class":1305},[1101,2580,1725],{"class":1319},[1101,2582,2583],{"class":1315}," z",[1101,2585,1747],{"class":1319},[1101,2587,1750],{"class":1305},[1101,2589,1406],{"class":1319},[1101,2591,2592],{"class":1111},"zod",[1101,2594,1370],{"class":1319},[1101,2596,2597],{"class":1103,"line":1362},[1101,2598,1384],{"emptyLinePlaceholder":21},[1101,2600,2601,2603,2605,2607,2609,2612,2614,2617,2619,2621],{"class":1103,"line":1373},[1101,2602,1306],{"class":1305},[1101,2604,1309],{"class":1305},[1101,2606,2512],{"class":1124},[1101,2608,1316],{"class":1315},[1101,2610,2611],{"class":1602},"async",[1101,2613,1966],{"class":1319},[1101,2615,2616],{"class":1957},"event",[1101,2618,1897],{"class":1319},[1101,2620,1840],{"class":1602},[1101,2622,1395],{"class":1319},[1101,2624,2625,2628,2630,2633,2635,2638,2641,2643,2645,2647,2649,2651,2653,2656,2658],{"class":1103,"line":1381},[1101,2626,2627],{"class":1602},"  const",[1101,2629,1725],{"class":1319},[1101,2631,2632],{"class":1315}," message",[1101,2634,1747],{"class":1319},[1101,2636,2637],{"class":1319}," =",[1101,2639,2640],{"class":1305}," await",[1101,2642,2517],{"class":1124},[1101,2644,1316],{"class":1325},[1101,2646,2616],{"class":1315},[1101,2648,1731],{"class":1319},[1101,2650,2583],{"class":1315},[1101,2652,1823],{"class":1319},[1101,2654,2655],{"class":1124},"object",[1101,2657,1316],{"class":1325},[1101,2659,1320],{"class":1319},[1101,2661,2662,2665,2667,2669,2671,2674,2676,2678,2681],{"class":1103,"line":1387},[1101,2663,2664],{"class":1325},"    message",[1101,2666,1329],{"class":1319},[1101,2668,2583],{"class":1315},[1101,2670,1823],{"class":1319},[1101,2672,2673],{"class":1124},"custom",[1101,2675,1574],{"class":1319},[1101,2677,2494],{"class":1107},[1101,2679,2680],{"class":1319},">",[1101,2682,2683],{"class":1325},"()\n",[1101,2685,2686,2688,2690,2692,2695],{"class":1103,"line":1398},[1101,2687,2428],{"class":1319},[1101,2689,1897],{"class":1325},[1101,2691,1823],{"class":1319},[1101,2693,2694],{"class":1315},"parse",[1101,2696,1506],{"class":1325},[1101,2698,2699],{"class":1103,"line":1414},[1101,2700,1384],{"emptyLinePlaceholder":21},[1101,2702,2703],{"class":1103,"line":1420},[1101,2704,2705],{"class":1485},"  \u002F\u002F Create a new chat\n",[1101,2707,2708,2710,2712,2714,2716,2718,2720,2722,2724,2727,2729,2732,2734,2736,2738,2740,2743,2745,2748,2750,2752,2755],{"class":1103,"line":1425},[1101,2709,2627],{"class":1602},[1101,2711,1433],{"class":1319},[1101,2713,262],{"class":1315},[1101,2715,1443],{"class":1319},[1101,2717,2637],{"class":1319},[1101,2719,2640],{"class":1305},[1101,2721,2455],{"class":1315},[1101,2723,1823],{"class":1319},[1101,2725,2726],{"class":1124},"insert",[1101,2728,1316],{"class":1325},[1101,2730,2731],{"class":1315},"schema",[1101,2733,1823],{"class":1319},[1101,2735,1802],{"class":1315},[1101,2737,1897],{"class":1325},[1101,2739,1823],{"class":1319},[1101,2741,2742],{"class":1124},"values",[1101,2744,1316],{"class":1325},[1101,2746,2747],{"class":1319},"{}",[1101,2749,1897],{"class":1325},[1101,2751,1823],{"class":1319},[1101,2753,2754],{"class":1124},"returning",[1101,2756,2683],{"class":1325},[1101,2758,2759],{"class":1103,"line":1448},[1101,2760,1384],{"emptyLinePlaceholder":21},[1101,2762,2763],{"class":1103,"line":1453},[1101,2764,2765],{"class":1485},"  \u002F\u002F Save the first user message\n",[1101,2767,2768,2771,2773,2775,2777,2779,2781,2783,2785,2787,2789,2791,2793],{"class":1103,"line":1463},[1101,2769,2770],{"class":1305},"  await",[1101,2772,2455],{"class":1315},[1101,2774,1823],{"class":1319},[1101,2776,2726],{"class":1124},[1101,2778,1316],{"class":1325},[1101,2780,2731],{"class":1315},[1101,2782,1823],{"class":1319},[1101,2784,2011],{"class":1315},[1101,2786,1897],{"class":1325},[1101,2788,1823],{"class":1319},[1101,2790,2742],{"class":1124},[1101,2792,1316],{"class":1325},[1101,2794,1320],{"class":1319},[1101,2796,2797,2800,2802,2805,2807,2809],{"class":1103,"line":1473},[1101,2798,2799],{"class":1325},"    chatId",[1101,2801,1329],{"class":1319},[1101,2803,2804],{"class":1315}," chat",[1101,2806,1823],{"class":1319},[1101,2808,2032],{"class":1315},[1101,2810,1347],{"class":1319},[1101,2812,2813,2816,2818,2820,2822,2824],{"class":1103,"line":1489},[1101,2814,2815],{"class":1325},"    role",[1101,2817,1329],{"class":1319},[1101,2819,1406],{"class":1319},[1101,2821,2162],{"class":1111},[1101,2823,1344],{"class":1319},[1101,2825,1347],{"class":1319},[1101,2827,2828,2831,2833,2835,2837],{"class":1103,"line":1495},[1101,2829,2830],{"class":1325},"    parts",[1101,2832,1329],{"class":1319},[1101,2834,2632],{"class":1315},[1101,2836,1823],{"class":1319},[1101,2838,2839],{"class":1315},"parts\n",[1101,2841,2842,2844],{"class":1103,"line":1500},[1101,2843,2428],{"class":1319},[1101,2845,1506],{"class":1325},[1101,2847,2848],{"class":1103,"line":2289},[1101,2849,1384],{"emptyLinePlaceholder":21},[1101,2851,2852,2855],{"class":1103,"line":2302},[1101,2853,2854],{"class":1305},"  return",[1101,2856,2857],{"class":1315}," chat\n",[1101,2859,2860,2862],{"class":1103,"line":2332},[1101,2861,1503],{"class":1319},[1101,2863,1506],{"class":1315},[1129,2865,2867],{"id":2866},"streaming-ai-responses","Streaming AI responses",[990,2869,2870,2871,2878,2879,2886,2887,2894],{},"Next, create the endpoint that handles the AI conversation. This endpoint uses ",[1044,2872,2875],{"href":2873,"rel":2874},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fstream-text",[1048],[1051,2876,2877],{},"streamText",", ",[1044,2880,2883],{"href":2881,"rel":2882},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream",[1048],[1051,2884,2885],{},"createUIMessageStream",", and ",[1044,2888,2891],{"href":2889,"rel":2890},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response",[1048],[1051,2892,2893],{},"createUIMessageStreamResponse"," from the AI SDK:",[1292,2896,2897],{},[1710,2898,2899],{},[1092,2900,2903],{"className":1296,"code":2901,"filename":2902,"language":1298,"meta":1097,"style":1097},"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",[1051,2904,2905,2937,2956,2978,2996,3002,3009,3016,3023,3030,3035,3047,3067,3071,3083,3117,3147,3178,3183,3187,3209,3242,3258,3270,3274,3312,3372,3386,3395,3426,3439,3444,3450,3481,3525,3532,3537,3555,3594,3600,3605,3611,3631,3659,3675,3694,3722,3729,3734,3800,3805,3810,3816,3845,3886,3915,3927,3943,3957,3964,3969,3974,3980,3997,4019,4037,4045,4062,4083,4093,4103,4113,4130,4141,4147,4153,4163,4173,4186,4201,4206,4211,4221,4237,4252,4258,4264,4272,4277,4283,4303,4318,4335,4358,4369,4377,4383,4388,4411,4417,4437,4443,4489,4505,4538,4552,4560,4565,4572,4577,4595],{"__ignoreMap":1097},[1101,2906,2907,2909,2911,2914,2916,2918,2920,2923,2925,2927,2929,2931,2933,2935],{"class":1103,"line":1104},[1101,2908,1722],{"class":1305},[1101,2910,1725],{"class":1319},[1101,2912,2913],{"class":1315}," createError",[1101,2915,1731],{"class":1319},[1101,2917,2512],{"class":1315},[1101,2919,1731],{"class":1319},[1101,2921,2922],{"class":1315}," getValidatedRouterParams",[1101,2924,1731],{"class":1319},[1101,2926,2517],{"class":1315},[1101,2928,1747],{"class":1319},[1101,2930,1750],{"class":1305},[1101,2932,1406],{"class":1319},[1101,2934,1129],{"class":1111},[1101,2936,1370],{"class":1319},[1101,2938,2939,2941,2943,2946,2948,2950,2952,2954],{"class":1103,"line":1121},[1101,2940,1722],{"class":1305},[1101,2942,1725],{"class":1319},[1101,2944,2945],{"class":1315}," eq",[1101,2947,1747],{"class":1319},[1101,2949,1750],{"class":1305},[1101,2951,1406],{"class":1319},[1101,2953,1775],{"class":1111},[1101,2955,1370],{"class":1319},[1101,2957,2958,2960,2962,2964,2966,2968,2970,2972,2974,2976],{"class":1103,"line":1335},[1101,2959,1722],{"class":1305},[1101,2961,1725],{"class":1319},[1101,2963,2455],{"class":1315},[1101,2965,1731],{"class":1319},[1101,2967,2563],{"class":1315},[1101,2969,1747],{"class":1319},[1101,2971,1750],{"class":1305},[1101,2973,1406],{"class":1319},[1101,2975,2572],{"class":1111},[1101,2977,1370],{"class":1319},[1101,2979,2980,2982,2984,2986,2988,2990,2992,2994],{"class":1103,"line":1350},[1101,2981,1722],{"class":1305},[1101,2983,1725],{"class":1319},[1101,2985,2583],{"class":1315},[1101,2987,1747],{"class":1319},[1101,2989,1750],{"class":1305},[1101,2991,1406],{"class":1319},[1101,2993,2592],{"class":1111},[1101,2995,1370],{"class":1319},[1101,2997,2998,3000],{"class":1103,"line":1362},[1101,2999,1722],{"class":1305},[1101,3001,1395],{"class":1319},[1101,3003,3004,3007],{"class":1103,"line":1373},[1101,3005,3006],{"class":1315},"  convertToModelMessages",[1101,3008,1347],{"class":1319},[1101,3010,3011,3014],{"class":1103,"line":1381},[1101,3012,3013],{"class":1315},"  createUIMessageStream",[1101,3015,1347],{"class":1319},[1101,3017,3018,3021],{"class":1103,"line":1387},[1101,3019,3020],{"class":1315},"  createUIMessageStreamResponse",[1101,3022,1347],{"class":1319},[1101,3024,3025,3028],{"class":1103,"line":1398},[1101,3026,3027],{"class":1315},"  generateText",[1101,3029,1347],{"class":1319},[1101,3031,3032],{"class":1103,"line":1414},[1101,3033,3034],{"class":1315},"  streamText\n",[1101,3036,3037,3039,3041,3043,3045],{"class":1103,"line":1420},[1101,3038,1503],{"class":1319},[1101,3040,1750],{"class":1305},[1101,3042,1406],{"class":1319},[1101,3044,2548],{"class":1111},[1101,3046,1370],{"class":1319},[1101,3048,3049,3051,3053,3055,3057,3059,3061,3063,3065],{"class":1103,"line":1425},[1101,3050,1722],{"class":1305},[1101,3052,2534],{"class":1305},[1101,3054,1725],{"class":1319},[1101,3056,2539],{"class":1315},[1101,3058,1747],{"class":1319},[1101,3060,1750],{"class":1305},[1101,3062,1406],{"class":1319},[1101,3064,2548],{"class":1111},[1101,3066,1370],{"class":1319},[1101,3068,3069],{"class":1103,"line":1448},[1101,3070,1384],{"emptyLinePlaceholder":21},[1101,3072,3073,3076,3079,3081],{"class":1103,"line":1453},[1101,3074,3075],{"class":1602},"const",[1101,3077,3078],{"class":1315}," MODELS ",[1101,3080,1606],{"class":1319},[1101,3082,1332],{"class":1315},[1101,3084,3085,3088,3091,3093,3095,3098,3100,3102,3105,3107,3109,3112,3114],{"class":1103,"line":1463},[1101,3086,3087],{"class":1319},"  {",[1101,3089,3090],{"class":1325}," value",[1101,3092,1329],{"class":1319},[1101,3094,1406],{"class":1319},[1101,3096,3097],{"class":1111},"openai\u002Fgpt-5-nano",[1101,3099,1344],{"class":1319},[1101,3101,1731],{"class":1319},[1101,3103,3104],{"class":1325}," label",[1101,3106,1329],{"class":1319},[1101,3108,1406],{"class":1319},[1101,3110,3111],{"class":1111},"GPT-5 Nano",[1101,3113,1344],{"class":1319},[1101,3115,3116],{"class":1319}," },\n",[1101,3118,3119,3121,3123,3125,3127,3130,3132,3134,3136,3138,3140,3143,3145],{"class":1103,"line":1473},[1101,3120,3087],{"class":1319},[1101,3122,3090],{"class":1325},[1101,3124,1329],{"class":1319},[1101,3126,1406],{"class":1319},[1101,3128,3129],{"class":1111},"anthropic\u002Fclaude-haiku-4.5",[1101,3131,1344],{"class":1319},[1101,3133,1731],{"class":1319},[1101,3135,3104],{"class":1325},[1101,3137,1329],{"class":1319},[1101,3139,1406],{"class":1319},[1101,3141,3142],{"class":1111},"Claude Haiku 4.5",[1101,3144,1344],{"class":1319},[1101,3146,3116],{"class":1319},[1101,3148,3149,3151,3153,3155,3157,3160,3162,3164,3166,3168,3170,3173,3175],{"class":1103,"line":1489},[1101,3150,3087],{"class":1319},[1101,3152,3090],{"class":1325},[1101,3154,1329],{"class":1319},[1101,3156,1406],{"class":1319},[1101,3158,3159],{"class":1111},"google\u002Fgemini-3-flash",[1101,3161,1344],{"class":1319},[1101,3163,1731],{"class":1319},[1101,3165,3104],{"class":1325},[1101,3167,1329],{"class":1319},[1101,3169,1406],{"class":1319},[1101,3171,3172],{"class":1111},"Gemini 3 Flash",[1101,3174,1344],{"class":1319},[1101,3176,3177],{"class":1319}," }\n",[1101,3179,3180],{"class":1103,"line":1495},[1101,3181,3182],{"class":1315},"]\n",[1101,3184,3185],{"class":1103,"line":1500},[1101,3186,1384],{"emptyLinePlaceholder":21},[1101,3188,3189,3191,3193,3195,3197,3199,3201,3203,3205,3207],{"class":1103,"line":2289},[1101,3190,1306],{"class":1305},[1101,3192,1309],{"class":1305},[1101,3194,2512],{"class":1124},[1101,3196,1316],{"class":1315},[1101,3198,2611],{"class":1602},[1101,3200,1966],{"class":1319},[1101,3202,2616],{"class":1957},[1101,3204,1897],{"class":1319},[1101,3206,1840],{"class":1602},[1101,3208,1395],{"class":1319},[1101,3210,3211,3213,3215,3218,3220,3222,3224,3226,3228,3230,3232,3234,3236,3238,3240],{"class":1103,"line":2302},[1101,3212,2627],{"class":1602},[1101,3214,1725],{"class":1319},[1101,3216,3217],{"class":1315}," id",[1101,3219,1747],{"class":1319},[1101,3221,2637],{"class":1319},[1101,3223,2640],{"class":1305},[1101,3225,2922],{"class":1124},[1101,3227,1316],{"class":1325},[1101,3229,2616],{"class":1315},[1101,3231,1731],{"class":1319},[1101,3233,2583],{"class":1315},[1101,3235,1823],{"class":1319},[1101,3237,2655],{"class":1124},[1101,3239,1316],{"class":1325},[1101,3241,1320],{"class":1319},[1101,3243,3244,3247,3249,3251,3253,3256],{"class":1103,"line":2332},[1101,3245,3246],{"class":1325},"    id",[1101,3248,1329],{"class":1319},[1101,3250,2583],{"class":1315},[1101,3252,1823],{"class":1319},[1101,3254,3255],{"class":1124},"string",[1101,3257,2683],{"class":1325},[1101,3259,3260,3262,3264,3266,3268],{"class":1103,"line":2338},[1101,3261,2428],{"class":1319},[1101,3263,1897],{"class":1325},[1101,3265,1823],{"class":1319},[1101,3267,2694],{"class":1315},[1101,3269,1506],{"class":1325},[1101,3271,3272],{"class":1103,"line":2343},[1101,3273,1384],{"emptyLinePlaceholder":21},[1101,3275,3276,3278,3280,3283,3285,3288,3290,3292,3294,3296,3298,3300,3302,3304,3306,3308,3310],{"class":1103,"line":2375},[1101,3277,2627],{"class":1602},[1101,3279,1725],{"class":1319},[1101,3281,3282],{"class":1315}," model",[1101,3284,1731],{"class":1319},[1101,3286,3287],{"class":1315}," messages",[1101,3289,1747],{"class":1319},[1101,3291,2637],{"class":1319},[1101,3293,2640],{"class":1305},[1101,3295,2517],{"class":1124},[1101,3297,1316],{"class":1325},[1101,3299,2616],{"class":1315},[1101,3301,1731],{"class":1319},[1101,3303,2583],{"class":1315},[1101,3305,1823],{"class":1319},[1101,3307,2655],{"class":1124},[1101,3309,1316],{"class":1325},[1101,3311,1320],{"class":1319},[1101,3313,3314,3317,3319,3321,3323,3325,3327,3329,3332,3334,3337,3339,3342,3344,3347,3349,3352,3354,3357,3359,3361,3364,3366,3368,3370],{"class":1103,"line":2391},[1101,3315,3316],{"class":1325},"    model",[1101,3318,1329],{"class":1319},[1101,3320,2583],{"class":1315},[1101,3322,1823],{"class":1319},[1101,3324,3255],{"class":1124},[1101,3326,1820],{"class":1325},[1101,3328,1823],{"class":1319},[1101,3330,3331],{"class":1124},"refine",[1101,3333,1316],{"class":1325},[1101,3335,3336],{"class":1957},"value",[1101,3338,1840],{"class":1602},[1101,3340,3341],{"class":1315}," MODELS",[1101,3343,1823],{"class":1319},[1101,3345,3346],{"class":1124},"some",[1101,3348,1316],{"class":1325},[1101,3350,3351],{"class":1957},"m",[1101,3353,1840],{"class":1602},[1101,3355,3356],{"class":1315}," m",[1101,3358,1823],{"class":1319},[1101,3360,3336],{"class":1315},[1101,3362,3363],{"class":1319}," ===",[1101,3365,3090],{"class":1315},[1101,3367,1897],{"class":1325},[1101,3369,1731],{"class":1319},[1101,3371,1395],{"class":1319},[1101,3373,3374,3377,3379,3381,3384],{"class":1103,"line":2409},[1101,3375,3376],{"class":1325},"      message",[1101,3378,1329],{"class":1319},[1101,3380,1406],{"class":1319},[1101,3382,3383],{"class":1111},"Invalid model",[1101,3385,1370],{"class":1319},[1101,3387,3388,3391,3393],{"class":1103,"line":2425},[1101,3389,3390],{"class":1319},"    }",[1101,3392,1897],{"class":1325},[1101,3394,1347],{"class":1319},[1101,3396,3397,3400,3402,3404,3406,3409,3411,3414,3416,3418,3420,3422,3424],{"class":1103,"line":2433},[1101,3398,3399],{"class":1325},"    messages",[1101,3401,1329],{"class":1319},[1101,3403,2583],{"class":1315},[1101,3405,1823],{"class":1319},[1101,3407,3408],{"class":1124},"array",[1101,3410,1316],{"class":1325},[1101,3412,3413],{"class":1315},"z",[1101,3415,1823],{"class":1319},[1101,3417,2673],{"class":1124},[1101,3419,1574],{"class":1319},[1101,3421,2494],{"class":1107},[1101,3423,2680],{"class":1319},[1101,3425,1923],{"class":1325},[1101,3427,3429,3431,3433,3435,3437],{"class":1103,"line":3428},30,[1101,3430,2428],{"class":1319},[1101,3432,1897],{"class":1325},[1101,3434,1823],{"class":1319},[1101,3436,2694],{"class":1315},[1101,3438,1506],{"class":1325},[1101,3440,3442],{"class":1103,"line":3441},31,[1101,3443,1384],{"emptyLinePlaceholder":21},[1101,3445,3447],{"class":1103,"line":3446},32,[1101,3448,3449],{"class":1485},"  \u002F\u002F Fetch the chat from the database\n",[1101,3451,3453,3455,3457,3459,3461,3463,3465,3468,3470,3472,3474,3477,3479],{"class":1103,"line":3452},33,[1101,3454,2627],{"class":1602},[1101,3456,2804],{"class":1315},[1101,3458,2637],{"class":1319},[1101,3460,2640],{"class":1305},[1101,3462,2455],{"class":1315},[1101,3464,1823],{"class":1319},[1101,3466,3467],{"class":1315},"query",[1101,3469,1823],{"class":1319},[1101,3471,1802],{"class":1315},[1101,3473,1823],{"class":1319},[1101,3475,3476],{"class":1124},"findFirst",[1101,3478,1316],{"class":1325},[1101,3480,1320],{"class":1319},[1101,3482,3484,3487,3489,3491,3493,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3520,3523],{"class":1103,"line":3483},34,[1101,3485,3486],{"class":1124},"    where",[1101,3488,1329],{"class":1319},[1101,3490,1966],{"class":1319},[1101,3492,262],{"class":1957},[1101,3494,1731],{"class":1319},[1101,3496,1725],{"class":1319},[1101,3498,2945],{"class":1957},[1101,3500,1961],{"class":1319},[1101,3502,1840],{"class":1602},[1101,3504,2945],{"class":1124},[1101,3506,1316],{"class":1325},[1101,3508,262],{"class":1315},[1101,3510,1823],{"class":1319},[1101,3512,2032],{"class":1315},[1101,3514,1731],{"class":1319},[1101,3516,3217],{"class":1315},[1101,3518,3519],{"class":1305}," as",[1101,3521,3522],{"class":1107}," string",[1101,3524,1506],{"class":1325},[1101,3526,3528,3530],{"class":1103,"line":3527},35,[1101,3529,2428],{"class":1319},[1101,3531,1506],{"class":1325},[1101,3533,3535],{"class":1103,"line":3534},36,[1101,3536,1384],{"emptyLinePlaceholder":21},[1101,3538,3540,3543,3545,3548,3550,3553],{"class":1103,"line":3539},37,[1101,3541,3542],{"class":1305},"  if",[1101,3544,1966],{"class":1325},[1101,3546,3547],{"class":1319},"!",[1101,3549,262],{"class":1315},[1101,3551,3552],{"class":1325},") ",[1101,3554,1320],{"class":1319},[1101,3556,3558,3561,3563,3565,3567,3570,3572,3576,3578,3581,3583,3585,3588,3590,3592],{"class":1103,"line":3557},38,[1101,3559,3560],{"class":1305},"    throw",[1101,3562,2913],{"class":1124},[1101,3564,1316],{"class":1325},[1101,3566,1880],{"class":1319},[1101,3568,3569],{"class":1325}," statusCode",[1101,3571,1329],{"class":1319},[1101,3573,3575],{"class":3574},"sbssI"," 404",[1101,3577,1731],{"class":1319},[1101,3579,3580],{"class":1325}," statusMessage",[1101,3582,1329],{"class":1319},[1101,3584,1406],{"class":1319},[1101,3586,3587],{"class":1111},"Chat not found",[1101,3589,1344],{"class":1319},[1101,3591,1747],{"class":1319},[1101,3593,1506],{"class":1325},[1101,3595,3597],{"class":1103,"line":3596},39,[1101,3598,3599],{"class":1319},"  }\n",[1101,3601,3603],{"class":1103,"line":3602},40,[1101,3604,1384],{"emptyLinePlaceholder":21},[1101,3606,3608],{"class":1103,"line":3607},41,[1101,3609,3610],{"class":1485},"  \u002F\u002F Generate a title for the chat if it doesn't have one\n",[1101,3612,3614,3616,3618,3620,3622,3624,3627,3629],{"class":1103,"line":3613},42,[1101,3615,3542],{"class":1305},[1101,3617,1966],{"class":1325},[1101,3619,3547],{"class":1319},[1101,3621,262],{"class":1315},[1101,3623,1823],{"class":1319},[1101,3625,3626],{"class":1315},"title",[1101,3628,3552],{"class":1325},[1101,3630,1320],{"class":1319},[1101,3632,3634,3637,3639,3641,3643,3646,3648,3650,3652,3655,3657],{"class":1103,"line":3633},43,[1101,3635,3636],{"class":1602},"    const",[1101,3638,1725],{"class":1319},[1101,3640,1734],{"class":1325},[1101,3642,1329],{"class":1319},[1101,3644,3645],{"class":1315}," title",[1101,3647,1747],{"class":1319},[1101,3649,2637],{"class":1319},[1101,3651,2640],{"class":1305},[1101,3653,3654],{"class":1124}," generateText",[1101,3656,1316],{"class":1325},[1101,3658,1320],{"class":1319},[1101,3660,3662,3665,3667,3669,3671,3673],{"class":1103,"line":3661},44,[1101,3663,3664],{"class":1325},"      model",[1101,3666,1329],{"class":1319},[1101,3668,1406],{"class":1319},[1101,3670,3129],{"class":1111},[1101,3672,1344],{"class":1319},[1101,3674,1347],{"class":1319},[1101,3676,3678,3681,3683,3686,3689,3692],{"class":1103,"line":3677},45,[1101,3679,3680],{"class":1325},"      system",[1101,3682,1329],{"class":1319},[1101,3684,3685],{"class":1319}," `",[1101,3687,3688],{"class":1111},"Generate a short title (max 30 characters) based on the user's message. No quotes or punctuation.",[1101,3690,3691],{"class":1319},"`",[1101,3693,1347],{"class":1319},[1101,3695,3697,3700,3702,3705,3707,3710,3712,3714,3717,3720],{"class":1103,"line":3696},46,[1101,3698,3699],{"class":1325},"      prompt",[1101,3701,1329],{"class":1319},[1101,3703,3704],{"class":1315}," JSON",[1101,3706,1823],{"class":1319},[1101,3708,3709],{"class":1124},"stringify",[1101,3711,1316],{"class":1325},[1101,3713,2011],{"class":1315},[1101,3715,3716],{"class":1325},"[",[1101,3718,3719],{"class":3574},"0",[1101,3721,2335],{"class":1325},[1101,3723,3725,3727],{"class":1103,"line":3724},47,[1101,3726,3390],{"class":1319},[1101,3728,1506],{"class":1325},[1101,3730,3732],{"class":1103,"line":3731},48,[1101,3733,1384],{"emptyLinePlaceholder":21},[1101,3735,3737,3740,3742,3744,3747,3749,3751,3753,3755,3757,3759,3762,3764,3766,3768,3770,3772,3774,3777,3779,3782,3784,3786,3788,3790,3792,3794,3796,3798],{"class":1103,"line":3736},49,[1101,3738,3739],{"class":1305},"    await",[1101,3741,2455],{"class":1315},[1101,3743,1823],{"class":1319},[1101,3745,3746],{"class":1124},"update",[1101,3748,1316],{"class":1325},[1101,3750,2731],{"class":1315},[1101,3752,1823],{"class":1319},[1101,3754,1802],{"class":1315},[1101,3756,1897],{"class":1325},[1101,3758,1823],{"class":1319},[1101,3760,3761],{"class":1124},"set",[1101,3763,1316],{"class":1325},[1101,3765,1880],{"class":1319},[1101,3767,3645],{"class":1315},[1101,3769,1747],{"class":1319},[1101,3771,1897],{"class":1325},[1101,3773,1823],{"class":1319},[1101,3775,3776],{"class":1124},"where",[1101,3778,1316],{"class":1325},[1101,3780,3781],{"class":1124},"eq",[1101,3783,1316],{"class":1325},[1101,3785,2731],{"class":1315},[1101,3787,1823],{"class":1319},[1101,3789,1802],{"class":1315},[1101,3791,1823],{"class":1319},[1101,3793,2032],{"class":1315},[1101,3795,1731],{"class":1319},[1101,3797,3217],{"class":1315},[1101,3799,1987],{"class":1325},[1101,3801,3803],{"class":1103,"line":3802},50,[1101,3804,3599],{"class":1319},[1101,3806,3808],{"class":1103,"line":3807},51,[1101,3809,1384],{"emptyLinePlaceholder":21},[1101,3811,3813],{"class":1103,"line":3812},52,[1101,3814,3815],{"class":1485},"  \u002F\u002F Save the user message if it's a follow-up\n",[1101,3817,3819,3821,3824,3826,3828,3830,3832,3834,3837,3840,3843],{"class":1103,"line":3818},53,[1101,3820,2627],{"class":1602},[1101,3822,3823],{"class":1315}," lastMessage",[1101,3825,2637],{"class":1319},[1101,3827,3287],{"class":1315},[1101,3829,3716],{"class":1325},[1101,3831,2011],{"class":1315},[1101,3833,1823],{"class":1319},[1101,3835,3836],{"class":1315},"length",[1101,3838,3839],{"class":1319}," -",[1101,3841,3842],{"class":3574}," 1",[1101,3844,3182],{"class":1325},[1101,3846,3848,3850,3852,3855,3858,3860,3862,3864,3866,3868,3871,3873,3875,3877,3880,3882,3884],{"class":1103,"line":3847},54,[1101,3849,3542],{"class":1305},[1101,3851,1966],{"class":1325},[1101,3853,3854],{"class":1315},"lastMessage",[1101,3856,3857],{"class":1319},"?.",[1101,3859,2144],{"class":1315},[1101,3861,3363],{"class":1319},[1101,3863,1406],{"class":1319},[1101,3865,2162],{"class":1111},[1101,3867,1344],{"class":1319},[1101,3869,3870],{"class":1319}," &&",[1101,3872,3287],{"class":1315},[1101,3874,1823],{"class":1319},[1101,3876,3836],{"class":1315},[1101,3878,3879],{"class":1319}," >",[1101,3881,3842],{"class":3574},[1101,3883,3552],{"class":1325},[1101,3885,1320],{"class":1319},[1101,3887,3889,3891,3893,3895,3897,3899,3901,3903,3905,3907,3909,3911,3913],{"class":1103,"line":3888},55,[1101,3890,3739],{"class":1305},[1101,3892,2455],{"class":1315},[1101,3894,1823],{"class":1319},[1101,3896,2726],{"class":1124},[1101,3898,1316],{"class":1325},[1101,3900,2731],{"class":1315},[1101,3902,1823],{"class":1319},[1101,3904,2011],{"class":1315},[1101,3906,1897],{"class":1325},[1101,3908,1823],{"class":1319},[1101,3910,2742],{"class":1124},[1101,3912,1316],{"class":1325},[1101,3914,1320],{"class":1319},[1101,3916,3918,3921,3923,3925],{"class":1103,"line":3917},56,[1101,3919,3920],{"class":1325},"      chatId",[1101,3922,1329],{"class":1319},[1101,3924,3217],{"class":1315},[1101,3926,1347],{"class":1319},[1101,3928,3930,3933,3935,3937,3939,3941],{"class":1103,"line":3929},57,[1101,3931,3932],{"class":1325},"      role",[1101,3934,1329],{"class":1319},[1101,3936,1406],{"class":1319},[1101,3938,2162],{"class":1111},[1101,3940,1344],{"class":1319},[1101,3942,1347],{"class":1319},[1101,3944,3946,3949,3951,3953,3955],{"class":1103,"line":3945},58,[1101,3947,3948],{"class":1325},"      parts",[1101,3950,1329],{"class":1319},[1101,3952,3823],{"class":1315},[1101,3954,1823],{"class":1319},[1101,3956,2839],{"class":1315},[1101,3958,3960,3962],{"class":1103,"line":3959},59,[1101,3961,3390],{"class":1319},[1101,3963,1506],{"class":1325},[1101,3965,3967],{"class":1103,"line":3966},60,[1101,3968,3599],{"class":1319},[1101,3970,3972],{"class":1103,"line":3971},61,[1101,3973,1384],{"emptyLinePlaceholder":21},[1101,3975,3977],{"class":1103,"line":3976},62,[1101,3978,3979],{"class":1485},"  \u002F\u002F Create the streaming response\n",[1101,3981,3983,3985,3988,3990,3993,3995],{"class":1103,"line":3982},63,[1101,3984,2627],{"class":1602},[1101,3986,3987],{"class":1315}," stream",[1101,3989,2637],{"class":1319},[1101,3991,3992],{"class":1124}," createUIMessageStream",[1101,3994,1316],{"class":1325},[1101,3996,1320],{"class":1319},[1101,3998,4000,4003,4005,4008,4010,4013,4015,4017],{"class":1103,"line":3999},64,[1101,4001,4002],{"class":1124},"    execute",[1101,4004,1329],{"class":1319},[1101,4006,4007],{"class":1602}," async",[1101,4009,1954],{"class":1319},[1101,4011,4012],{"class":1957}," writer",[1101,4014,1961],{"class":1319},[1101,4016,1840],{"class":1602},[1101,4018,1395],{"class":1319},[1101,4020,4022,4025,4028,4030,4033,4035],{"class":1103,"line":4021},65,[1101,4023,4024],{"class":1602},"      const",[1101,4026,4027],{"class":1315}," result",[1101,4029,2637],{"class":1319},[1101,4031,4032],{"class":1124}," streamText",[1101,4034,1316],{"class":1325},[1101,4036,1320],{"class":1319},[1101,4038,4040,4043],{"class":1103,"line":4039},66,[1101,4041,4042],{"class":1315},"        model",[1101,4044,1347],{"class":1319},[1101,4046,4048,4051,4053,4055,4058,4060],{"class":1103,"line":4047},67,[1101,4049,4050],{"class":1325},"        system",[1101,4052,1329],{"class":1319},[1101,4054,3685],{"class":1319},[1101,4056,4057],{"class":1111},"You are a helpful AI assistant. Be concise and friendly.",[1101,4059,3691],{"class":1319},[1101,4061,1347],{"class":1319},[1101,4063,4065,4068,4070,4072,4075,4077,4079,4081],{"class":1103,"line":4064},68,[1101,4066,4067],{"class":1325},"        messages",[1101,4069,1329],{"class":1319},[1101,4071,2640],{"class":1305},[1101,4073,4074],{"class":1124}," convertToModelMessages",[1101,4076,1316],{"class":1325},[1101,4078,2011],{"class":1315},[1101,4080,1897],{"class":1325},[1101,4082,1347],{"class":1319},[1101,4084,4086,4089,4091],{"class":1103,"line":4085},69,[1101,4087,4088],{"class":1325},"        providerOptions",[1101,4090,1329],{"class":1319},[1101,4092,1395],{"class":1319},[1101,4094,4096,4099,4101],{"class":1103,"line":4095},70,[1101,4097,4098],{"class":1325},"          anthropic",[1101,4100,1329],{"class":1319},[1101,4102,1395],{"class":1319},[1101,4104,4106,4109,4111],{"class":1103,"line":4105},71,[1101,4107,4108],{"class":1325},"            thinking",[1101,4110,1329],{"class":1319},[1101,4112,1395],{"class":1319},[1101,4114,4116,4119,4121,4123,4126,4128],{"class":1103,"line":4115},72,[1101,4117,4118],{"class":1325},"              type",[1101,4120,1329],{"class":1319},[1101,4122,1406],{"class":1319},[1101,4124,4125],{"class":1111},"enabled",[1101,4127,1344],{"class":1319},[1101,4129,1347],{"class":1319},[1101,4131,4133,4136,4138],{"class":1103,"line":4132},73,[1101,4134,4135],{"class":1325},"              budgetTokens",[1101,4137,1329],{"class":1319},[1101,4139,4140],{"class":3574}," 2048\n",[1101,4142,4144],{"class":1103,"line":4143},74,[1101,4145,4146],{"class":1319},"            }\n",[1101,4148,4150],{"class":1103,"line":4149},75,[1101,4151,4152],{"class":1319},"          },\n",[1101,4154,4156,4159,4161],{"class":1103,"line":4155},76,[1101,4157,4158],{"class":1325},"          google",[1101,4160,1329],{"class":1319},[1101,4162,1395],{"class":1319},[1101,4164,4166,4169,4171],{"class":1103,"line":4165},77,[1101,4167,4168],{"class":1325},"            thinkingConfig",[1101,4170,1329],{"class":1319},[1101,4172,1395],{"class":1319},[1101,4174,4176,4179,4181,4184],{"class":1103,"line":4175},78,[1101,4177,4178],{"class":1325},"              includeThoughts",[1101,4180,1329],{"class":1319},[1101,4182,4183],{"class":1481}," true",[1101,4185,1347],{"class":1319},[1101,4187,4189,4192,4194,4196,4199],{"class":1103,"line":4188},79,[1101,4190,4191],{"class":1325},"              thinkingLevel",[1101,4193,1329],{"class":1319},[1101,4195,1406],{"class":1319},[1101,4197,4198],{"class":1111},"low",[1101,4200,1370],{"class":1319},[1101,4202,4204],{"class":1103,"line":4203},80,[1101,4205,4146],{"class":1319},[1101,4207,4209],{"class":1103,"line":4208},81,[1101,4210,4152],{"class":1319},[1101,4212,4214,4217,4219],{"class":1103,"line":4213},82,[1101,4215,4216],{"class":1325},"          openai",[1101,4218,1329],{"class":1319},[1101,4220,1395],{"class":1319},[1101,4222,4224,4227,4229,4231,4233,4235],{"class":1103,"line":4223},83,[1101,4225,4226],{"class":1325},"            reasoningEffort",[1101,4228,1329],{"class":1319},[1101,4230,1406],{"class":1319},[1101,4232,4198],{"class":1111},[1101,4234,1344],{"class":1319},[1101,4236,1347],{"class":1319},[1101,4238,4240,4243,4245,4247,4250],{"class":1103,"line":4239},84,[1101,4241,4242],{"class":1325},"            reasoningSummary",[1101,4244,1329],{"class":1319},[1101,4246,1406],{"class":1319},[1101,4248,4249],{"class":1111},"detailed",[1101,4251,1370],{"class":1319},[1101,4253,4255],{"class":1103,"line":4254},85,[1101,4256,4257],{"class":1319},"          }\n",[1101,4259,4261],{"class":1103,"line":4260},86,[1101,4262,4263],{"class":1319},"        }\n",[1101,4265,4267,4270],{"class":1103,"line":4266},87,[1101,4268,4269],{"class":1319},"      }",[1101,4271,1506],{"class":1325},[1101,4273,4275],{"class":1103,"line":4274},88,[1101,4276,1384],{"emptyLinePlaceholder":21},[1101,4278,4280],{"class":1103,"line":4279},89,[1101,4281,4282],{"class":1485},"      \u002F\u002F Notify the client that a title was generated\n",[1101,4284,4286,4289,4291,4293,4295,4297,4299,4301],{"class":1103,"line":4285},90,[1101,4287,4288],{"class":1305},"      if",[1101,4290,1966],{"class":1325},[1101,4292,3547],{"class":1319},[1101,4294,262],{"class":1315},[1101,4296,1823],{"class":1319},[1101,4298,3626],{"class":1315},[1101,4300,3552],{"class":1325},[1101,4302,1320],{"class":1319},[1101,4304,4306,4309,4311,4314,4316],{"class":1103,"line":4305},91,[1101,4307,4308],{"class":1315},"        writer",[1101,4310,1823],{"class":1319},[1101,4312,4313],{"class":1124},"write",[1101,4315,1316],{"class":1325},[1101,4317,1320],{"class":1319},[1101,4319,4321,4324,4326,4328,4331,4333],{"class":1103,"line":4320},92,[1101,4322,4323],{"class":1325},"          type",[1101,4325,1329],{"class":1319},[1101,4327,1406],{"class":1319},[1101,4329,4330],{"class":1111},"data-chat-title",[1101,4332,1344],{"class":1319},[1101,4334,1347],{"class":1319},[1101,4336,4338,4341,4343,4345,4347,4349,4351,4354,4356],{"class":1103,"line":4337},93,[1101,4339,4340],{"class":1325},"          data",[1101,4342,1329],{"class":1319},[1101,4344,1725],{"class":1319},[1101,4346,2632],{"class":1325},[1101,4348,1329],{"class":1319},[1101,4350,1406],{"class":1319},[1101,4352,4353],{"class":1111},"Title generated",[1101,4355,1344],{"class":1319},[1101,4357,3116],{"class":1319},[1101,4359,4361,4364,4366],{"class":1103,"line":4360},94,[1101,4362,4363],{"class":1325},"          transient",[1101,4365,1329],{"class":1319},[1101,4367,4368],{"class":1481}," true\n",[1101,4370,4372,4375],{"class":1103,"line":4371},95,[1101,4373,4374],{"class":1319},"        }",[1101,4376,1506],{"class":1325},[1101,4378,4380],{"class":1103,"line":4379},96,[1101,4381,4382],{"class":1319},"      }\n",[1101,4384,4386],{"class":1103,"line":4385},97,[1101,4387,1384],{"emptyLinePlaceholder":21},[1101,4389,4391,4394,4396,4399,4401,4404,4406,4409],{"class":1103,"line":4390},98,[1101,4392,4393],{"class":1315},"      writer",[1101,4395,1823],{"class":1319},[1101,4397,4398],{"class":1124},"merge",[1101,4400,1316],{"class":1325},[1101,4402,4403],{"class":1315},"result",[1101,4405,1823],{"class":1319},[1101,4407,4408],{"class":1124},"toUIMessageStream",[1101,4410,1923],{"class":1325},[1101,4412,4414],{"class":1103,"line":4413},99,[1101,4415,4416],{"class":1319},"    },\n",[1101,4418,4420,4423,4425,4427,4429,4431,4433,4435],{"class":1103,"line":4419},100,[1101,4421,4422],{"class":1124},"    onFinish",[1101,4424,1329],{"class":1319},[1101,4426,4007],{"class":1602},[1101,4428,1954],{"class":1319},[1101,4430,3287],{"class":1957},[1101,4432,1961],{"class":1319},[1101,4434,1840],{"class":1602},[1101,4436,1395],{"class":1319},[1101,4438,4440],{"class":1103,"line":4439},101,[1101,4441,4442],{"class":1485},"      \u002F\u002F Save the assistant's response to the database\n",[1101,4444,4446,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467,4469,4471,4473,4475,4478,4480,4483,4485,4487],{"class":1103,"line":4445},102,[1101,4447,4448],{"class":1305},"      await",[1101,4450,2455],{"class":1315},[1101,4452,1823],{"class":1319},[1101,4454,2726],{"class":1124},[1101,4456,1316],{"class":1325},[1101,4458,2731],{"class":1315},[1101,4460,1823],{"class":1319},[1101,4462,2011],{"class":1315},[1101,4464,1897],{"class":1325},[1101,4466,1823],{"class":1319},[1101,4468,2742],{"class":1124},[1101,4470,1316],{"class":1325},[1101,4472,2011],{"class":1315},[1101,4474,1823],{"class":1319},[1101,4476,4477],{"class":1124},"map",[1101,4479,1316],{"class":1325},[1101,4481,4482],{"class":1957},"message",[1101,4484,1840],{"class":1602},[1101,4486,1966],{"class":1325},[1101,4488,1320],{"class":1319},[1101,4490,4492,4495,4497,4499,4501,4503],{"class":1103,"line":4491},103,[1101,4493,4494],{"class":1325},"        chatId",[1101,4496,1329],{"class":1319},[1101,4498,2804],{"class":1315},[1101,4500,1823],{"class":1319},[1101,4502,2032],{"class":1315},[1101,4504,1347],{"class":1319},[1101,4506,4508,4511,4513,4515,4517,4519,4521,4523,4525,4527,4530,4532,4534,4536],{"class":1103,"line":4507},104,[1101,4509,4510],{"class":1325},"        role",[1101,4512,1329],{"class":1319},[1101,4514,2632],{"class":1315},[1101,4516,1823],{"class":1319},[1101,4518,2144],{"class":1315},[1101,4520,3519],{"class":1305},[1101,4522,1406],{"class":1319},[1101,4524,2162],{"class":1111},[1101,4526,1344],{"class":1319},[1101,4528,4529],{"class":1319}," |",[1101,4531,1406],{"class":1319},[1101,4533,2171],{"class":1111},[1101,4535,1344],{"class":1319},[1101,4537,1347],{"class":1319},[1101,4539,4541,4544,4546,4548,4550],{"class":1103,"line":4540},105,[1101,4542,4543],{"class":1325},"        parts",[1101,4545,1329],{"class":1319},[1101,4547,2632],{"class":1315},[1101,4549,1823],{"class":1319},[1101,4551,2839],{"class":1315},[1101,4553,4555,4557],{"class":1103,"line":4554},106,[1101,4556,4269],{"class":1319},[1101,4558,4559],{"class":1325},")))\n",[1101,4561,4563],{"class":1103,"line":4562},107,[1101,4564,1492],{"class":1319},[1101,4566,4568,4570],{"class":1103,"line":4567},108,[1101,4569,2428],{"class":1319},[1101,4571,1506],{"class":1325},[1101,4573,4575],{"class":1103,"line":4574},109,[1101,4576,1384],{"emptyLinePlaceholder":21},[1101,4578,4580,4582,4585,4587,4589,4591,4593],{"class":1103,"line":4579},110,[1101,4581,2854],{"class":1305},[1101,4583,4584],{"class":1124}," createUIMessageStreamResponse",[1101,4586,1316],{"class":1325},[1101,4588,1880],{"class":1319},[1101,4590,3987],{"class":1315},[1101,4592,1747],{"class":1319},[1101,4594,1506],{"class":1325},[1101,4596,4598,4600],{"class":1103,"line":4597},111,[1101,4599,1503],{"class":1319},[1101,4601,1506],{"class":1315},[990,4603,4604],{},"Here's what each part does:",[990,4606,4607],{},[1008,4608,4609],{},"AI Gateway",[990,4611,4612,4613,4616],{},"Thanks to ",[1044,4614,1082],{"href":1080,"rel":4615},[1048],", we can use any AI model supported by the gateway just by specifying the model name.",[990,4618,4619],{},[1008,4620,4621],{},"Automatic Title Generation",[990,4623,4624,4625,4632],{},"When a chat doesn't have a title yet, we use ",[1044,4626,4629],{"href":4627,"rel":4628},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fgenerate-text#generatetext",[1048],[1051,4630,4631],{},"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\".",[990,4634,4635],{},[1008,4636,4637],{},"Streaming with streamText",[990,4639,4640,4641,4646],{},"The ",[1044,4642,4644],{"href":2873,"rel":4643},[1048],[1051,4645,2877],{}," function generates a streaming response from the AI model. Key options include:",[1002,4648,4649,4655,4660],{},[1005,4650,4651,4654],{},[1051,4652,4653],{},"model",": The AI model to use",[1005,4656,4657,4659],{},[1051,4658,2180],{},": Instructions that guide the AI's behavior",[1005,4661,4662,4664],{},[1051,4663,2011],{},": The conversation history",[990,4666,4667],{},[1008,4668,4669],{},"UIMessageStream",[990,4671,4640,4672,1054,4678,4684],{},[1044,4673,4676],{"href":4674,"rel":4675},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream#createuimessagestream",[1048],[1051,4677,2885],{},[1044,4679,4682],{"href":4680,"rel":4681},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response#createuimessagestreamresponse",[1048],[1051,4683,2893],{}," 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.",[990,4686,4640,4687,4690,4691,4693,4694,4697],{},[1051,4688,4689],{},"writer.write()"," method allows sending custom data events to the client (like ",[1051,4692,4330],{},"), while ",[1051,4695,4696],{},"onFinish"," is called when streaming completes, perfect for persisting the assistant's response.",[1129,4699,4701],{"id":4700},"fetching-a-chat","Fetching a chat",[990,4703,4704],{},"Add an endpoint to fetch existing chat data from your database:",[1292,4706,4707],{},[1092,4708,4711],{"className":1296,"code":4709,"filename":4710,"language":1298,"meta":1097,"style":1097},"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",[1051,4712,4713,4739,4762,4784,4802,4806,4828,4860,4874,4886,4890,4918,4949,4958,4967,4996,5000,5004,5010,5014,5028,5060,5064,5068,5074],{"__ignoreMap":1097},[1101,4714,4715,4717,4719,4721,4723,4725,4727,4729,4731,4733,4735,4737],{"class":1103,"line":1104},[1101,4716,1722],{"class":1305},[1101,4718,1725],{"class":1319},[1101,4720,2913],{"class":1315},[1101,4722,1731],{"class":1319},[1101,4724,2512],{"class":1315},[1101,4726,1731],{"class":1319},[1101,4728,2922],{"class":1315},[1101,4730,1747],{"class":1319},[1101,4732,1750],{"class":1305},[1101,4734,1406],{"class":1319},[1101,4736,1129],{"class":1111},[1101,4738,1370],{"class":1319},[1101,4740,4741,4743,4745,4748,4750,4752,4754,4756,4758,4760],{"class":1103,"line":1121},[1101,4742,1722],{"class":1305},[1101,4744,1725],{"class":1319},[1101,4746,4747],{"class":1315}," asc",[1101,4749,1731],{"class":1319},[1101,4751,2945],{"class":1315},[1101,4753,1747],{"class":1319},[1101,4755,1750],{"class":1305},[1101,4757,1406],{"class":1319},[1101,4759,1775],{"class":1111},[1101,4761,1370],{"class":1319},[1101,4763,4764,4766,4768,4770,4772,4774,4776,4778,4780,4782],{"class":1103,"line":1335},[1101,4765,1722],{"class":1305},[1101,4767,1725],{"class":1319},[1101,4769,2455],{"class":1315},[1101,4771,1731],{"class":1319},[1101,4773,2563],{"class":1315},[1101,4775,1747],{"class":1319},[1101,4777,1750],{"class":1305},[1101,4779,1406],{"class":1319},[1101,4781,2572],{"class":1111},[1101,4783,1370],{"class":1319},[1101,4785,4786,4788,4790,4792,4794,4796,4798,4800],{"class":1103,"line":1350},[1101,4787,1722],{"class":1305},[1101,4789,1725],{"class":1319},[1101,4791,2583],{"class":1315},[1101,4793,1747],{"class":1319},[1101,4795,1750],{"class":1305},[1101,4797,1406],{"class":1319},[1101,4799,2592],{"class":1111},[1101,4801,1370],{"class":1319},[1101,4803,4804],{"class":1103,"line":1362},[1101,4805,1384],{"emptyLinePlaceholder":21},[1101,4807,4808,4810,4812,4814,4816,4818,4820,4822,4824,4826],{"class":1103,"line":1373},[1101,4809,1306],{"class":1305},[1101,4811,1309],{"class":1305},[1101,4813,2512],{"class":1124},[1101,4815,1316],{"class":1315},[1101,4817,2611],{"class":1602},[1101,4819,1966],{"class":1319},[1101,4821,2616],{"class":1957},[1101,4823,1897],{"class":1319},[1101,4825,1840],{"class":1602},[1101,4827,1395],{"class":1319},[1101,4829,4830,4832,4834,4836,4838,4840,4842,4844,4846,4848,4850,4852,4854,4856,4858],{"class":1103,"line":1381},[1101,4831,2627],{"class":1602},[1101,4833,1725],{"class":1319},[1101,4835,3217],{"class":1315},[1101,4837,1747],{"class":1319},[1101,4839,2637],{"class":1319},[1101,4841,2640],{"class":1305},[1101,4843,2922],{"class":1124},[1101,4845,1316],{"class":1325},[1101,4847,2616],{"class":1315},[1101,4849,1731],{"class":1319},[1101,4851,2583],{"class":1315},[1101,4853,1823],{"class":1319},[1101,4855,2655],{"class":1124},[1101,4857,1316],{"class":1325},[1101,4859,1320],{"class":1319},[1101,4861,4862,4864,4866,4868,4870,4872],{"class":1103,"line":1387},[1101,4863,3246],{"class":1325},[1101,4865,1329],{"class":1319},[1101,4867,2583],{"class":1315},[1101,4869,1823],{"class":1319},[1101,4871,3255],{"class":1124},[1101,4873,2683],{"class":1325},[1101,4875,4876,4878,4880,4882,4884],{"class":1103,"line":1398},[1101,4877,2428],{"class":1319},[1101,4879,1897],{"class":1325},[1101,4881,1823],{"class":1319},[1101,4883,2694],{"class":1315},[1101,4885,1506],{"class":1325},[1101,4887,4888],{"class":1103,"line":1414},[1101,4889,1384],{"emptyLinePlaceholder":21},[1101,4891,4892,4894,4896,4898,4900,4902,4904,4906,4908,4910,4912,4914,4916],{"class":1103,"line":1420},[1101,4893,2627],{"class":1602},[1101,4895,2804],{"class":1315},[1101,4897,2637],{"class":1319},[1101,4899,2640],{"class":1305},[1101,4901,2455],{"class":1315},[1101,4903,1823],{"class":1319},[1101,4905,3467],{"class":1315},[1101,4907,1823],{"class":1319},[1101,4909,1802],{"class":1315},[1101,4911,1823],{"class":1319},[1101,4913,3476],{"class":1124},[1101,4915,1316],{"class":1325},[1101,4917,1320],{"class":1319},[1101,4919,4920,4922,4924,4926,4928,4930,4932,4934,4936,4938,4940,4942,4944,4947],{"class":1103,"line":1425},[1101,4921,3486],{"class":1325},[1101,4923,1329],{"class":1319},[1101,4925,1966],{"class":1325},[1101,4927,3781],{"class":1124},[1101,4929,1316],{"class":1325},[1101,4931,2731],{"class":1315},[1101,4933,1823],{"class":1319},[1101,4935,1802],{"class":1315},[1101,4937,1823],{"class":1319},[1101,4939,2032],{"class":1315},[1101,4941,1731],{"class":1319},[1101,4943,3217],{"class":1315},[1101,4945,4946],{"class":1325},"))",[1101,4948,1347],{"class":1319},[1101,4950,4951,4954,4956],{"class":1103,"line":1448},[1101,4952,4953],{"class":1325},"    with",[1101,4955,1329],{"class":1319},[1101,4957,1395],{"class":1319},[1101,4959,4960,4963,4965],{"class":1103,"line":1453},[1101,4961,4962],{"class":1325},"      messages",[1101,4964,1329],{"class":1319},[1101,4966,1395],{"class":1319},[1101,4968,4969,4972,4974,4977,4979,4981,4983,4985,4987,4989,4991,4994],{"class":1103,"line":1463},[1101,4970,4971],{"class":1124},"        orderBy",[1101,4973,1329],{"class":1319},[1101,4975,4976],{"class":1319}," ()",[1101,4978,1840],{"class":1602},[1101,4980,4747],{"class":1124},[1101,4982,1316],{"class":1325},[1101,4984,2731],{"class":1315},[1101,4986,1823],{"class":1319},[1101,4988,2011],{"class":1315},[1101,4990,1823],{"class":1319},[1101,4992,4993],{"class":1315},"createdAt",[1101,4995,1506],{"class":1325},[1101,4997,4998],{"class":1103,"line":1473},[1101,4999,4382],{"class":1319},[1101,5001,5002],{"class":1103,"line":1489},[1101,5003,1492],{"class":1319},[1101,5005,5006,5008],{"class":1103,"line":1495},[1101,5007,2428],{"class":1319},[1101,5009,1506],{"class":1325},[1101,5011,5012],{"class":1103,"line":1500},[1101,5013,1384],{"emptyLinePlaceholder":21},[1101,5015,5016,5018,5020,5022,5024,5026],{"class":1103,"line":2289},[1101,5017,3542],{"class":1305},[1101,5019,1966],{"class":1325},[1101,5021,3547],{"class":1319},[1101,5023,262],{"class":1315},[1101,5025,3552],{"class":1325},[1101,5027,1320],{"class":1319},[1101,5029,5030,5032,5034,5036,5038,5040,5042,5044,5046,5048,5050,5052,5054,5056,5058],{"class":1103,"line":2302},[1101,5031,3560],{"class":1305},[1101,5033,2913],{"class":1124},[1101,5035,1316],{"class":1325},[1101,5037,1880],{"class":1319},[1101,5039,3569],{"class":1325},[1101,5041,1329],{"class":1319},[1101,5043,3575],{"class":3574},[1101,5045,1731],{"class":1319},[1101,5047,3580],{"class":1325},[1101,5049,1329],{"class":1319},[1101,5051,1406],{"class":1319},[1101,5053,3587],{"class":1111},[1101,5055,1344],{"class":1319},[1101,5057,1747],{"class":1319},[1101,5059,1506],{"class":1325},[1101,5061,5062],{"class":1103,"line":2332},[1101,5063,3599],{"class":1319},[1101,5065,5066],{"class":1103,"line":2338},[1101,5067,1384],{"emptyLinePlaceholder":21},[1101,5069,5070,5072],{"class":1103,"line":2343},[1101,5071,2854],{"class":1305},[1101,5073,2857],{"class":1315},[1101,5075,5076,5078],{"class":1103,"line":2375},[1101,5077,1503],{"class":1319},[1101,5079,1506],{"class":1315},[994,5081,5083],{"id":5082},"wire-up-the-ui","Wire up the UI",[990,5085,5086,5087,5092,5093,5098],{},"Nuxt UI provides purpose-built components for AI chat interfaces: ",[1044,5088,5089],{"href":281},[1051,5090,5091],{},"UChatPrompt"," for the input area and ",[1044,5094,5095],{"href":271},[1051,5096,5097],{},"UChatMessages"," for displaying the conversation.",[1129,5100,5102],{"id":5101},"creating-the-home-page","Creating the home page",[990,5104,5105,5106,5110],{},"The home page is where users start a new conversation. The ",[1044,5107,5108],{"href":281},[1051,5109,5091],{}," component provides a textarea with auto-resize, keyboard shortcuts, and a submit button:",[1292,5112,5113],{},[1092,5114,5118],{"className":1564,"code":5115,"filename":5116,"highlights":5117,"language":34,"meta":1097,"style":1097},"\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",[3483,3527,3534,3539,3557,3596,3602,3607,3613],[1051,5119,5120,5143,5162,5180,5184,5198,5224,5228,5241,5245,5250,5276,5292,5301,5309,5323,5361,5365,5369,5375,5379,5384,5410,5415,5423,5427,5435,5456,5470,5491,5512,5517,5526,5530,5538,5553,5568,5583,5598,5613,5619,5642,5651,5660,5668,5676],{"__ignoreMap":1097},[1101,5121,5122,5124,5127,5130,5133,5135,5137,5139,5141],{"class":1103,"line":1104},[1101,5123,1574],{"class":1319},[1101,5125,5126],{"class":1325},"script",[1101,5128,5129],{"class":1602}," setup",[1101,5131,5132],{"class":1602}," lang",[1101,5134,1606],{"class":1319},[1101,5136,1533],{"class":1319},[1101,5138,1298],{"class":1111},[1101,5140,1533],{"class":1319},[1101,5142,1580],{"class":1319},[1101,5144,5145,5147,5150,5152,5155,5157,5160],{"class":1103,"line":1121},[1101,5146,3075],{"class":1602},[1101,5148,5149],{"class":1315}," input ",[1101,5151,1606],{"class":1319},[1101,5153,5154],{"class":1124}," ref",[1101,5156,1316],{"class":1315},[1101,5158,5159],{"class":1319},"''",[1101,5161,1506],{"class":1315},[1101,5163,5164,5166,5169,5171,5173,5175,5178],{"class":1103,"line":1335},[1101,5165,3075],{"class":1602},[1101,5167,5168],{"class":1315}," loading ",[1101,5170,1606],{"class":1319},[1101,5172,5154],{"class":1124},[1101,5174,1316],{"class":1315},[1101,5176,5177],{"class":1481},"false",[1101,5179,1506],{"class":1315},[1101,5181,5182],{"class":1103,"line":1350},[1101,5183,1384],{"emptyLinePlaceholder":21},[1101,5185,5186,5188,5191,5194,5196],{"class":1103,"line":1362},[1101,5187,2611],{"class":1602},[1101,5189,5190],{"class":1602}," function",[1101,5192,5193],{"class":1124}," createChat",[1101,5195,1820],{"class":1319},[1101,5197,1395],{"class":1319},[1101,5199,5200,5202,5204,5206,5209,5211,5213,5215,5218,5221],{"class":1103,"line":1373},[1101,5201,3542],{"class":1305},[1101,5203,1966],{"class":1325},[1101,5205,3547],{"class":1319},[1101,5207,5208],{"class":1315},"input",[1101,5210,1823],{"class":1319},[1101,5212,3336],{"class":1315},[1101,5214,1823],{"class":1319},[1101,5216,5217],{"class":1124},"trim",[1101,5219,5220],{"class":1325},"()) ",[1101,5222,5223],{"class":1305},"return\n",[1101,5225,5226],{"class":1103,"line":1381},[1101,5227,1384],{"emptyLinePlaceholder":21},[1101,5229,5230,5233,5235,5237,5239],{"class":1103,"line":1387},[1101,5231,5232],{"class":1315},"  loading",[1101,5234,1823],{"class":1319},[1101,5236,3336],{"class":1315},[1101,5238,2637],{"class":1319},[1101,5240,4368],{"class":1481},[1101,5242,5243],{"class":1103,"line":1398},[1101,5244,1384],{"emptyLinePlaceholder":21},[1101,5246,5247],{"class":1103,"line":1414},[1101,5248,5249],{"class":1485},"  \u002F\u002F Create a new chat on the server\n",[1101,5251,5252,5254,5256,5258,5260,5263,5265,5267,5270,5272,5274],{"class":1103,"line":1420},[1101,5253,2627],{"class":1602},[1101,5255,2804],{"class":1315},[1101,5257,2637],{"class":1319},[1101,5259,2640],{"class":1305},[1101,5261,5262],{"class":1124}," $fetch",[1101,5264,1316],{"class":1325},[1101,5266,1344],{"class":1319},[1101,5268,5269],{"class":1111},"\u002Fapi\u002Fchats",[1101,5271,1344],{"class":1319},[1101,5273,1731],{"class":1319},[1101,5275,1395],{"class":1319},[1101,5277,5278,5281,5283,5285,5288,5290],{"class":1103,"line":1425},[1101,5279,5280],{"class":1325},"    method",[1101,5282,1329],{"class":1319},[1101,5284,1406],{"class":1319},[1101,5286,5287],{"class":1111},"POST",[1101,5289,1344],{"class":1319},[1101,5291,1347],{"class":1319},[1101,5293,5294,5297,5299],{"class":1103,"line":1448},[1101,5295,5296],{"class":1325},"    body",[1101,5298,1329],{"class":1319},[1101,5300,1395],{"class":1319},[1101,5302,5303,5305,5307],{"class":1103,"line":1453},[1101,5304,3376],{"class":1325},[1101,5306,1329],{"class":1319},[1101,5308,1395],{"class":1319},[1101,5310,5311,5313,5315,5317,5319,5321],{"class":1103,"line":1463},[1101,5312,4510],{"class":1325},[1101,5314,1329],{"class":1319},[1101,5316,1406],{"class":1319},[1101,5318,2162],{"class":1111},[1101,5320,1344],{"class":1319},[1101,5322,1347],{"class":1319},[1101,5324,5325,5327,5329,5331,5333,5335,5337,5339,5342,5344,5346,5348,5350,5353,5355,5357,5359],{"class":1103,"line":1473},[1101,5326,4543],{"class":1325},[1101,5328,1329],{"class":1319},[1101,5330,1433],{"class":1325},[1101,5332,1880],{"class":1319},[1101,5334,2534],{"class":1325},[1101,5336,1329],{"class":1319},[1101,5338,1406],{"class":1319},[1101,5340,5341],{"class":1111},"text",[1101,5343,1344],{"class":1319},[1101,5345,1731],{"class":1319},[1101,5347,1734],{"class":1325},[1101,5349,1329],{"class":1319},[1101,5351,5352],{"class":1315}," input",[1101,5354,1823],{"class":1319},[1101,5356,3336],{"class":1315},[1101,5358,1747],{"class":1319},[1101,5360,3182],{"class":1325},[1101,5362,5363],{"class":1103,"line":1489},[1101,5364,4382],{"class":1319},[1101,5366,5367],{"class":1103,"line":1495},[1101,5368,1492],{"class":1319},[1101,5370,5371,5373],{"class":1103,"line":1500},[1101,5372,2428],{"class":1319},[1101,5374,1506],{"class":1325},[1101,5376,5377],{"class":1103,"line":2289},[1101,5378,1384],{"emptyLinePlaceholder":21},[1101,5380,5381],{"class":1103,"line":2302},[1101,5382,5383],{"class":1485},"  \u002F\u002F Navigate to the chat page\n",[1101,5385,5386,5389,5391,5393,5396,5399,5401,5403,5405,5408],{"class":1103,"line":2332},[1101,5387,5388],{"class":1124},"  navigateTo",[1101,5390,1316],{"class":1325},[1101,5392,3691],{"class":1319},[1101,5394,5395],{"class":1111},"\u002Fchat\u002F",[1101,5397,5398],{"class":1319},"${",[1101,5400,262],{"class":1315},[1101,5402,1823],{"class":1319},[1101,5404,2032],{"class":1315},[1101,5406,5407],{"class":1319},"}`",[1101,5409,1506],{"class":1325},[1101,5411,5412],{"class":1103,"line":2338},[1101,5413,5414],{"class":1319},"}\n",[1101,5416,5417,5419,5421],{"class":1103,"line":2343},[1101,5418,1650],{"class":1319},[1101,5420,5126],{"class":1325},[1101,5422,1580],{"class":1319},[1101,5424,5425],{"class":1103,"line":2375},[1101,5426,1384],{"emptyLinePlaceholder":21},[1101,5428,5429,5431,5433],{"class":1103,"line":2391},[1101,5430,1574],{"class":1319},[1101,5432,1577],{"class":1325},[1101,5434,1580],{"class":1319},[1101,5436,5437,5439,5442,5445,5447,5449,5452,5454],{"class":1103,"line":2409},[1101,5438,1587],{"class":1319},[1101,5440,5441],{"class":1325},"UDashboardPanel",[1101,5443,5444],{"class":1602}," :ui",[1101,5446,1606],{"class":1319},[1101,5448,1533],{"class":1319},[1101,5450,5451],{"class":1111},"{ body: 'p-0 sm:p-0' }",[1101,5453,1533],{"class":1319},[1101,5455,1580],{"class":1319},[1101,5457,5458,5460,5462,5465,5468],{"class":1103,"line":2425},[1101,5459,1596],{"class":1319},[1101,5461,1577],{"class":1325},[1101,5463,5464],{"class":1319}," #",[1101,5466,5467],{"class":1602},"body",[1101,5469,1580],{"class":1319},[1101,5471,5472,5474,5477,5480,5482,5484,5487,5489],{"class":1103,"line":2433},[1101,5473,1620],{"class":1319},[1101,5475,5476],{"class":1325},"UContainer",[1101,5478,5479],{"class":1602}," class",[1101,5481,1606],{"class":1319},[1101,5483,1533],{"class":1319},[1101,5485,5486],{"class":1111},"min-h-dvh flex flex-col justify-center gap-6 py-8",[1101,5488,1533],{"class":1319},[1101,5490,1580],{"class":1319},[1101,5492,5493,5496,5499,5501,5503,5505,5508,5510],{"class":1103,"line":3428},[1101,5494,5495],{"class":1319},"        \u003C",[1101,5497,5498],{"class":1325},"h1",[1101,5500,5479],{"class":1602},[1101,5502,1606],{"class":1319},[1101,5504,1533],{"class":1319},[1101,5506,5507],{"class":1111},"text-3xl sm:text-4xl text-highlighted font-bold",[1101,5509,1533],{"class":1319},[1101,5511,1580],{"class":1319},[1101,5513,5514],{"class":1103,"line":3441},[1101,5515,5516],{"class":1315},"          How can I help you today?\n",[1101,5518,5519,5522,5524],{"class":1103,"line":3446},[1101,5520,5521],{"class":1319},"        \u003C\u002F",[1101,5523,5498],{"class":1325},[1101,5525,1580],{"class":1319},[1101,5527,5528],{"class":1103,"line":3452},[1101,5529,1384],{"emptyLinePlaceholder":21},[1101,5531,5533,5535],{"class":5532,"line":3483},[1103,1584],[1101,5534,5495],{"class":1319},[1101,5536,5537],{"class":1325},"UChatPrompt\n",[1101,5539,5541,5544,5546,5548,5550],{"class":5540,"line":3527},[1103,1584],[1101,5542,5543],{"class":1602},"          v-model",[1101,5545,1606],{"class":1319},[1101,5547,1533],{"class":1319},[1101,5549,5208],{"class":1111},[1101,5551,5552],{"class":1319},"\"\n",[1101,5554,5556,5559,5561,5563,5566],{"class":5555,"line":3534},[1103,1584],[1101,5557,5558],{"class":1602},"          :status",[1101,5560,1606],{"class":1319},[1101,5562,1533],{"class":1319},[1101,5564,5565],{"class":1111},"loading ? 'streaming' : 'ready'",[1101,5567,5552],{"class":1319},[1101,5569,5571,5574,5576,5578,5581],{"class":5570,"line":3539},[1103,1584],[1101,5572,5573],{"class":1602},"          variant",[1101,5575,1606],{"class":1319},[1101,5577,1533],{"class":1319},[1101,5579,5580],{"class":1111},"subtle",[1101,5582,5552],{"class":1319},[1101,5584,5586,5589,5591,5593,5596],{"class":5585,"line":3557},[1103,1584],[1101,5587,5588],{"class":1602},"          placeholder",[1101,5590,1606],{"class":1319},[1101,5592,1533],{"class":1319},[1101,5594,5595],{"class":1111},"Ask me anything...",[1101,5597,5552],{"class":1319},[1101,5599,5601,5604,5606,5608,5611],{"class":5600,"line":3596},[1103,1584],[1101,5602,5603],{"class":1602},"          @submit",[1101,5605,1606],{"class":1319},[1101,5607,1533],{"class":1319},[1101,5609,5610],{"class":1111},"createChat",[1101,5612,5552],{"class":1319},[1101,5614,5616],{"class":5615,"line":3602},[1103,1584],[1101,5617,5618],{"class":1319},"        >\n",[1101,5620,5622,5625,5628,5631,5633,5635,5638,5640],{"class":5621,"line":3607},[1103,1584],[1101,5623,5624],{"class":1319},"          \u003C",[1101,5626,5627],{"class":1325},"UChatPromptSubmit",[1101,5629,5630],{"class":1602}," color",[1101,5632,1606],{"class":1319},[1101,5634,1533],{"class":1319},[1101,5636,5637],{"class":1111},"neutral",[1101,5639,1533],{"class":1319},[1101,5641,1626],{"class":1319},[1101,5643,5645,5647,5649],{"class":5644,"line":3613},[1103,1584],[1101,5646,5521],{"class":1319},[1101,5648,5091],{"class":1325},[1101,5650,1580],{"class":1319},[1101,5652,5653,5656,5658],{"class":1103,"line":3633},[1101,5654,5655],{"class":1319},"      \u003C\u002F",[1101,5657,5476],{"class":1325},[1101,5659,1580],{"class":1319},[1101,5661,5662,5664,5666],{"class":1103,"line":3661},[1101,5663,1631],{"class":1319},[1101,5665,1577],{"class":1325},[1101,5667,1580],{"class":1319},[1101,5669,5670,5672,5674],{"class":1103,"line":3677},[1101,5671,1641],{"class":1319},[1101,5673,5441],{"class":1325},[1101,5675,1580],{"class":1319},[1101,5677,5678,5680,5682],{"class":1103,"line":3696},[1101,5679,1650],{"class":1319},[1101,5681,1577],{"class":1325},[1101,5683,1580],{"class":1319},[990,5685,4640,5686,5690],{},[1044,5687,5688],{"href":281},[1051,5689,5091],{}," component automatically handles:",[1002,5692,5693,5700,5703,5713],{},[1005,5694,5695,5696],{},"Form submission when pressing ",[5697,5698],"kbd",{"value":5699},"enter",[1005,5701,5702],{},"Auto-resizing as you type",[1005,5704,5705,5706,5709,5710],{},"A loading state when ",[1051,5707,5708],{},"status"," is set to ",[1051,5711,5712],{},"streaming",[1005,5714,5715],{},"Focus management and keyboard shortcuts",[994,5717,5719],{"id":5718},"creating-the-chat-page","Creating the chat page",[990,5721,5722,5723,5729,5730,5737],{},"The chat page is where the actual conversation happens. It integrates the AI SDK's ",[1044,5724,5727],{"href":5725,"rel":5726},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fchat",[1048],[1051,5728,259],{}," class and ",[1044,5731,5734],{"href":5732,"rel":5733},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fdefault-chat-transport",[1048],[1051,5735,5736],{},"DefaultChatTransport"," for real-time streaming.",[1292,5739,5740],{},[1710,5741,5742],{},[1092,5743,5747],{"className":1564,"code":5744,"filename":5745,"highlights":5746,"language":34,"meta":1097,"style":1097},"\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",[1121,1335,1350,1500,2289,2302,2332,2338,2343,2375,2391,2409,2425,2433,3428,3441,3446,3452,3483,3527,3534,3539,3557],[1051,5748,5749,5769,5799,5820,5841,5845,5859,5873,5877,5882,5930,5934,5953,5995,5999,6003,6019,6023,6028,6046,6066,6085,6101,6128,6137,6152,6158,6185,6201,6206,6211,6226,6241,6257,6274,6288,6295,6300,6307,6311,6333,6345,6365,6393,6407,6411,6415,6419,6424,6437,6465,6476,6480,6486,6494,6498,6506,6524,6536,6555,6562,6576,6589,6594,6608,6612,6637,6715,6723,6737,6751,6765,6770,6778,6791,6805,6819,6824,6834,6838,6844,6858,6871,6885,6898,6903,6912,6921,6929,6933,6939,6951,6965,6977,6990,7003,7007,7014,7027,7040,7054,7068,7073,7081,7089,7097,7105],{"__ignoreMap":1097},[1101,5750,5751,5753,5755,5757,5759,5761,5763,5765,5767],{"class":1103,"line":1104},[1101,5752,1574],{"class":1319},[1101,5754,5126],{"class":1325},[1101,5756,5129],{"class":1602},[1101,5758,5132],{"class":1602},[1101,5760,1606],{"class":1319},[1101,5762,1533],{"class":1319},[1101,5764,1298],{"class":1111},[1101,5766,1533],{"class":1319},[1101,5768,1580],{"class":1319},[1101,5770,5772,5774,5776,5779,5781,5784,5786,5789,5791,5793,5795,5797],{"class":5771,"line":1121},[1103,1584],[1101,5773,1722],{"class":1305},[1101,5775,1725],{"class":1319},[1101,5777,5778],{"class":1315}," DefaultChatTransport",[1101,5780,1731],{"class":1319},[1101,5782,5783],{"class":1315}," isReasoningUIPart",[1101,5785,1731],{"class":1319},[1101,5787,5788],{"class":1315}," isTextUIPart",[1101,5790,1747],{"class":1319},[1101,5792,1750],{"class":1305},[1101,5794,1406],{"class":1319},[1101,5796,2548],{"class":1111},[1101,5798,1370],{"class":1319},[1101,5800,5802,5804,5806,5809,5811,5813,5815,5818],{"class":5801,"line":1335},[1103,1584],[1101,5803,1722],{"class":1305},[1101,5805,1725],{"class":1319},[1101,5807,5808],{"class":1315}," Chat",[1101,5810,1747],{"class":1319},[1101,5812,1750],{"class":1305},[1101,5814,1406],{"class":1319},[1101,5816,5817],{"class":1111},"@ai-sdk\u002Fvue",[1101,5819,1370],{"class":1319},[1101,5821,5823,5825,5827,5830,5832,5834,5836,5839],{"class":5822,"line":1350},[1103,1584],[1101,5824,1722],{"class":1305},[1101,5826,1725],{"class":1319},[1101,5828,5829],{"class":1315}," isReasoningStreaming",[1101,5831,1747],{"class":1319},[1101,5833,1750],{"class":1305},[1101,5835,1406],{"class":1319},[1101,5837,5838],{"class":1111},"@nuxt\u002Fui\u002Futils\u002Fai",[1101,5840,1370],{"class":1319},[1101,5842,5843],{"class":1103,"line":1362},[1101,5844,1384],{"emptyLinePlaceholder":21},[1101,5846,5847,5849,5852,5854,5857],{"class":1103,"line":1373},[1101,5848,3075],{"class":1602},[1101,5850,5851],{"class":1315}," route ",[1101,5853,1606],{"class":1319},[1101,5855,5856],{"class":1124}," useRoute",[1101,5858,2683],{"class":1315},[1101,5860,5861,5863,5866,5868,5871],{"class":1103,"line":1381},[1101,5862,3075],{"class":1602},[1101,5864,5865],{"class":1315}," toast ",[1101,5867,1606],{"class":1319},[1101,5869,5870],{"class":1124}," useToast",[1101,5872,2683],{"class":1315},[1101,5874,5875],{"class":1103,"line":1387},[1101,5876,1384],{"emptyLinePlaceholder":21},[1101,5878,5879],{"class":1103,"line":1398},[1101,5880,5881],{"class":1485},"\u002F\u002F Fetch existing chat data\n",[1101,5883,5884,5886,5888,5891,5893,5896,5898,5900,5902,5905,5907,5909,5912,5914,5917,5919,5922,5924,5926,5928],{"class":1103,"line":1414},[1101,5885,3075],{"class":1602},[1101,5887,1725],{"class":1319},[1101,5889,5890],{"class":1325}," data",[1101,5892,1329],{"class":1319},[1101,5894,5895],{"class":1315}," chatData ",[1101,5897,1503],{"class":1319},[1101,5899,2637],{"class":1319},[1101,5901,2640],{"class":1305},[1101,5903,5904],{"class":1124}," useFetch",[1101,5906,1316],{"class":1315},[1101,5908,3691],{"class":1319},[1101,5910,5911],{"class":1111},"\u002Fapi\u002Fchats\u002F",[1101,5913,5398],{"class":1319},[1101,5915,5916],{"class":1315},"route",[1101,5918,1823],{"class":1319},[1101,5920,5921],{"class":1315},"params",[1101,5923,1823],{"class":1319},[1101,5925,2032],{"class":1315},[1101,5927,5407],{"class":1319},[1101,5929,1506],{"class":1315},[1101,5931,5932],{"class":1103,"line":1420},[1101,5933,1384],{"emptyLinePlaceholder":21},[1101,5935,5936,5939,5941,5943,5946,5948,5951],{"class":1103,"line":1425},[1101,5937,5938],{"class":1305},"if",[1101,5940,1966],{"class":1315},[1101,5942,3547],{"class":1319},[1101,5944,5945],{"class":1315},"chatData",[1101,5947,1823],{"class":1319},[1101,5949,5950],{"class":1315},"value) ",[1101,5952,1320],{"class":1319},[1101,5954,5955,5958,5960,5962,5964,5966,5968,5970,5972,5974,5976,5978,5980,5982,5984,5987,5989,5991,5993],{"class":1103,"line":1448},[1101,5956,5957],{"class":1305},"  throw",[1101,5959,2913],{"class":1124},[1101,5961,1316],{"class":1325},[1101,5963,1880],{"class":1319},[1101,5965,3569],{"class":1325},[1101,5967,1329],{"class":1319},[1101,5969,3575],{"class":3574},[1101,5971,1731],{"class":1319},[1101,5973,3580],{"class":1325},[1101,5975,1329],{"class":1319},[1101,5977,1406],{"class":1319},[1101,5979,3587],{"class":1111},[1101,5981,1344],{"class":1319},[1101,5983,1731],{"class":1319},[1101,5985,5986],{"class":1325}," fatal",[1101,5988,1329],{"class":1319},[1101,5990,4183],{"class":1481},[1101,5992,1747],{"class":1319},[1101,5994,1506],{"class":1325},[1101,5996,5997],{"class":1103,"line":1453},[1101,5998,5414],{"class":1319},[1101,6000,6001],{"class":1103,"line":1463},[1101,6002,1384],{"emptyLinePlaceholder":21},[1101,6004,6005,6007,6009,6011,6013,6015,6017],{"class":1103,"line":1473},[1101,6006,3075],{"class":1602},[1101,6008,5149],{"class":1315},[1101,6010,1606],{"class":1319},[1101,6012,5154],{"class":1124},[1101,6014,1316],{"class":1315},[1101,6016,5159],{"class":1319},[1101,6018,1506],{"class":1315},[1101,6020,6021],{"class":1103,"line":1489},[1101,6022,1384],{"emptyLinePlaceholder":21},[1101,6024,6025],{"class":1103,"line":1495},[1101,6026,6027],{"class":1485},"\u002F\u002F Initialize the Chat class from AI SDK\n",[1101,6029,6031,6033,6036,6038,6040,6042,6044],{"class":6030,"line":1500},[1103,1584],[1101,6032,3075],{"class":1602},[1101,6034,6035],{"class":1315}," chat ",[1101,6037,1606],{"class":1319},[1101,6039,1917],{"class":1319},[1101,6041,5808],{"class":1124},[1101,6043,1316],{"class":1315},[1101,6045,1320],{"class":1319},[1101,6047,6049,6051,6053,6056,6058,6060,6062,6064],{"class":6048,"line":2289},[1103,1584],[1101,6050,1813],{"class":1325},[1101,6052,1329],{"class":1319},[1101,6054,6055],{"class":1315}," chatData",[1101,6057,1823],{"class":1319},[1101,6059,3336],{"class":1315},[1101,6061,1823],{"class":1319},[1101,6063,2032],{"class":1315},[1101,6065,1347],{"class":1319},[1101,6067,6069,6071,6073,6075,6077,6079,6081,6083],{"class":6068,"line":2302},[1103,1584],[1101,6070,1973],{"class":1325},[1101,6072,1329],{"class":1319},[1101,6074,6055],{"class":1315},[1101,6076,1823],{"class":1319},[1101,6078,3336],{"class":1315},[1101,6080,1823],{"class":1319},[1101,6082,2011],{"class":1315},[1101,6084,1347],{"class":1319},[1101,6086,6088,6091,6093,6095,6097,6099],{"class":6087,"line":2332},[1103,1584],[1101,6089,6090],{"class":1325},"  transport",[1101,6092,1329],{"class":1319},[1101,6094,1917],{"class":1319},[1101,6096,5778],{"class":1124},[1101,6098,1316],{"class":1315},[1101,6100,1320],{"class":1319},[1101,6102,6104,6107,6109,6111,6113,6115,6117,6119,6121,6123,6125],{"class":6103,"line":2338},[1103,1584],[1101,6105,6106],{"class":1325},"    api",[1101,6108,1329],{"class":1319},[1101,6110,3685],{"class":1319},[1101,6112,5911],{"class":1111},[1101,6114,5398],{"class":1319},[1101,6116,5945],{"class":1315},[1101,6118,1823],{"class":1319},[1101,6120,3336],{"class":1315},[1101,6122,1823],{"class":1319},[1101,6124,2032],{"class":1315},[1101,6126,6127],{"class":1319},"}`\n",[1101,6129,6131,6133,6135],{"class":6130,"line":2343},[1103,1584],[1101,6132,2428],{"class":1319},[1101,6134,1897],{"class":1315},[1101,6136,1347],{"class":1319},[1101,6138,6140,6143,6145,6148,6150],{"class":6139,"line":2375},[1103,1584],[1101,6141,6142],{"class":1325},"  onData",[1101,6144,1316],{"class":1319},[1101,6146,6147],{"class":1957},"dataPart",[1101,6149,1897],{"class":1319},[1101,6151,1395],{"class":1319},[1101,6153,6155],{"class":6154,"line":2391},[1103,1584],[1101,6156,6157],{"class":1485},"    \u002F\u002F Refresh the chat list when a title is generated\n",[1101,6159,6161,6164,6166,6168,6170,6173,6175,6177,6179,6181,6183],{"class":6160,"line":2409},[1103,1584],[1101,6162,6163],{"class":1305},"    if",[1101,6165,1966],{"class":1325},[1101,6167,6147],{"class":1315},[1101,6169,1823],{"class":1319},[1101,6171,6172],{"class":1315},"type",[1101,6174,3363],{"class":1319},[1101,6176,1406],{"class":1319},[1101,6178,4330],{"class":1111},[1101,6180,1344],{"class":1319},[1101,6182,3552],{"class":1325},[1101,6184,1320],{"class":1319},[1101,6186,6188,6191,6193,6195,6197,6199],{"class":6187,"line":2425},[1103,1584],[1101,6189,6190],{"class":1124},"      refreshNuxtData",[1101,6192,1316],{"class":1325},[1101,6194,1344],{"class":1319},[1101,6196,1802],{"class":1111},[1101,6198,1344],{"class":1319},[1101,6200,1506],{"class":1325},[1101,6202,6204],{"class":6203,"line":2433},[1103,1584],[1101,6205,1492],{"class":1319},[1101,6207,6209],{"class":6208,"line":3428},[1103,1584],[1101,6210,1417],{"class":1319},[1101,6212,6214,6217,6219,6222,6224],{"class":6213,"line":3441},[1103,1584],[1101,6215,6216],{"class":1325},"  onError",[1101,6218,1316],{"class":1319},[1101,6220,6221],{"class":1957},"error",[1101,6223,1897],{"class":1319},[1101,6225,1395],{"class":1319},[1101,6227,6229,6232,6234,6237,6239],{"class":6228,"line":3446},[1103,1584],[1101,6230,6231],{"class":1315},"    toast",[1101,6233,1823],{"class":1319},[1101,6235,6236],{"class":1124},"add",[1101,6238,1316],{"class":1325},[1101,6240,1320],{"class":1319},[1101,6242,6244,6247,6249,6251,6253,6255],{"class":6243,"line":3452},[1103,1584],[1101,6245,6246],{"class":1325},"      title",[1101,6248,1329],{"class":1319},[1101,6250,1406],{"class":1319},[1101,6252,497],{"class":1111},[1101,6254,1344],{"class":1319},[1101,6256,1347],{"class":1319},[1101,6258,6260,6263,6265,6268,6270,6272],{"class":6259,"line":3483},[1103,1584],[1101,6261,6262],{"class":1325},"      description",[1101,6264,1329],{"class":1319},[1101,6266,6267],{"class":1315}," error",[1101,6269,1823],{"class":1319},[1101,6271,4482],{"class":1315},[1101,6273,1347],{"class":1319},[1101,6275,6277,6280,6282,6284,6286],{"class":6276,"line":3527},[1103,1584],[1101,6278,6279],{"class":1325},"      color",[1101,6281,1329],{"class":1319},[1101,6283,1406],{"class":1319},[1101,6285,6221],{"class":1111},[1101,6287,1370],{"class":1319},[1101,6289,6291,6293],{"class":6290,"line":3534},[1103,1584],[1101,6292,3390],{"class":1319},[1101,6294,1506],{"class":1325},[1101,6296,6298],{"class":6297,"line":3539},[1103,1584],[1101,6299,3599],{"class":1319},[1101,6301,6303,6305],{"class":6302,"line":3557},[1103,1584],[1101,6304,1503],{"class":1319},[1101,6306,1506],{"class":1315},[1101,6308,6309],{"class":1103,"line":3596},[1101,6310,1384],{"emptyLinePlaceholder":21},[1101,6312,6313,6316,6319,6321,6324,6326,6329,6331],{"class":1103,"line":3602},[1101,6314,6315],{"class":1602},"function",[1101,6317,6318],{"class":1124}," handleSubmit",[1101,6320,1316],{"class":1319},[1101,6322,6323],{"class":1957},"e",[1101,6325,1329],{"class":1319},[1101,6327,6328],{"class":1107}," Event",[1101,6330,1897],{"class":1319},[1101,6332,1395],{"class":1319},[1101,6334,6335,6338,6340,6343],{"class":1103,"line":3607},[1101,6336,6337],{"class":1315},"  e",[1101,6339,1823],{"class":1319},[1101,6341,6342],{"class":1124},"preventDefault",[1101,6344,2683],{"class":1325},[1101,6346,6347,6349,6351,6353,6355,6357,6359,6361,6363],{"class":1103,"line":3613},[1101,6348,3542],{"class":1305},[1101,6350,1966],{"class":1325},[1101,6352,5208],{"class":1315},[1101,6354,1823],{"class":1319},[1101,6356,3336],{"class":1315},[1101,6358,1823],{"class":1319},[1101,6360,5217],{"class":1124},[1101,6362,5220],{"class":1325},[1101,6364,1320],{"class":1319},[1101,6366,6367,6370,6372,6375,6377,6379,6381,6383,6385,6387,6389,6391],{"class":1103,"line":3633},[1101,6368,6369],{"class":1315},"    chat",[1101,6371,1823],{"class":1319},[1101,6373,6374],{"class":1124},"sendMessage",[1101,6376,1316],{"class":1325},[1101,6378,1880],{"class":1319},[1101,6380,1734],{"class":1325},[1101,6382,1329],{"class":1319},[1101,6384,5352],{"class":1315},[1101,6386,1823],{"class":1319},[1101,6388,3336],{"class":1315},[1101,6390,1747],{"class":1319},[1101,6392,1506],{"class":1325},[1101,6394,6395,6398,6400,6402,6404],{"class":1103,"line":3661},[1101,6396,6397],{"class":1315},"    input",[1101,6399,1823],{"class":1319},[1101,6401,3336],{"class":1315},[1101,6403,2637],{"class":1319},[1101,6405,6406],{"class":1319}," ''\n",[1101,6408,6409],{"class":1103,"line":3677},[1101,6410,3599],{"class":1319},[1101,6412,6413],{"class":1103,"line":3696},[1101,6414,5414],{"class":1319},[1101,6416,6417],{"class":1103,"line":3724},[1101,6418,1384],{"emptyLinePlaceholder":21},[1101,6420,6421],{"class":1103,"line":3731},[1101,6422,6423],{"class":1485},"\u002F\u002F Auto-generate response for first message\n",[1101,6425,6426,6429,6431,6433,6435],{"class":1103,"line":3736},[1101,6427,6428],{"class":1124},"onMounted",[1101,6430,1316],{"class":1315},[1101,6432,1820],{"class":1319},[1101,6434,1840],{"class":1602},[1101,6436,1395],{"class":1319},[1101,6438,6439,6441,6443,6445,6447,6449,6451,6453,6455,6457,6459,6461,6463],{"class":1103,"line":3802},[1101,6440,3542],{"class":1305},[1101,6442,1966],{"class":1325},[1101,6444,5945],{"class":1315},[1101,6446,1823],{"class":1319},[1101,6448,3336],{"class":1315},[1101,6450,3857],{"class":1319},[1101,6452,2011],{"class":1315},[1101,6454,1823],{"class":1319},[1101,6456,3836],{"class":1315},[1101,6458,3363],{"class":1319},[1101,6460,3842],{"class":3574},[1101,6462,3552],{"class":1325},[1101,6464,1320],{"class":1319},[1101,6466,6467,6469,6471,6474],{"class":1103,"line":3807},[1101,6468,6369],{"class":1315},[1101,6470,1823],{"class":1319},[1101,6472,6473],{"class":1124},"regenerate",[1101,6475,2683],{"class":1325},[1101,6477,6478],{"class":1103,"line":3812},[1101,6479,3599],{"class":1319},[1101,6481,6482,6484],{"class":1103,"line":3818},[1101,6483,1503],{"class":1319},[1101,6485,1506],{"class":1315},[1101,6487,6488,6490,6492],{"class":1103,"line":3847},[1101,6489,1650],{"class":1319},[1101,6491,5126],{"class":1325},[1101,6493,1580],{"class":1319},[1101,6495,6496],{"class":1103,"line":3888},[1101,6497,1384],{"emptyLinePlaceholder":21},[1101,6499,6500,6502,6504],{"class":1103,"line":3917},[1101,6501,1574],{"class":1319},[1101,6503,1577],{"class":1325},[1101,6505,1580],{"class":1319},[1101,6507,6508,6510,6512,6514,6516,6518,6520,6522],{"class":1103,"line":3929},[1101,6509,1587],{"class":1319},[1101,6511,5441],{"class":1325},[1101,6513,5444],{"class":1602},[1101,6515,1606],{"class":1319},[1101,6517,1533],{"class":1319},[1101,6519,5451],{"class":1111},[1101,6521,1533],{"class":1319},[1101,6523,1580],{"class":1319},[1101,6525,6526,6528,6530,6532,6534],{"class":1103,"line":3945},[1101,6527,1596],{"class":1319},[1101,6529,1577],{"class":1325},[1101,6531,5464],{"class":1319},[1101,6533,5467],{"class":1602},[1101,6535,1580],{"class":1319},[1101,6537,6538,6540,6542,6544,6546,6548,6551,6553],{"class":1103,"line":3959},[1101,6539,1620],{"class":1319},[1101,6541,5476],{"class":1325},[1101,6543,5479],{"class":1602},[1101,6545,1606],{"class":1319},[1101,6547,1533],{"class":1319},[1101,6549,6550],{"class":1111},"min-h-dvh flex flex-col py-4 sm:py-6",[1101,6552,1533],{"class":1319},[1101,6554,1580],{"class":1319},[1101,6556,6557,6559],{"class":1103,"line":3966},[1101,6558,5495],{"class":1319},[1101,6560,6561],{"class":1325},"UChatMessages\n",[1101,6563,6564,6567,6569,6571,6574],{"class":1103,"line":3971},[1101,6565,6566],{"class":1602},"          :messages",[1101,6568,1606],{"class":1319},[1101,6570,1533],{"class":1319},[1101,6572,6573],{"class":1111},"chat.messages",[1101,6575,5552],{"class":1319},[1101,6577,6578,6580,6582,6584,6587],{"class":1103,"line":3976},[1101,6579,5558],{"class":1602},[1101,6581,1606],{"class":1319},[1101,6583,1533],{"class":1319},[1101,6585,6586],{"class":1111},"chat.status",[1101,6588,5552],{"class":1319},[1101,6590,6591],{"class":1103,"line":3982},[1101,6592,6593],{"class":1602},"          should-auto-scroll\n",[1101,6595,6596,6599,6601,6603,6606],{"class":1103,"line":3999},[1101,6597,6598],{"class":1602},"          class",[1101,6600,1606],{"class":1319},[1101,6602,1533],{"class":1319},[1101,6604,6605],{"class":1111},"flex-1",[1101,6607,5552],{"class":1319},[1101,6609,6610],{"class":1103,"line":4021},[1101,6611,5618],{"class":1319},[1101,6613,6614,6616,6618,6620,6622,6624,6626,6628,6631,6633,6635],{"class":1103,"line":4039},[1101,6615,5624],{"class":1319},[1101,6617,1577],{"class":1325},[1101,6619,5464],{"class":1319},[1101,6621,371],{"class":1602},[1101,6623,1606],{"class":1319},[1101,6625,1533],{"class":1319},[1101,6627,1880],{"class":1319},[1101,6629,6630],{"class":1315}," message ",[1101,6632,1503],{"class":1319},[1101,6634,1533],{"class":1319},[1101,6636,1580],{"class":1319},[1101,6638,6639,6642,6644,6647,6649,6651,6654,6656,6659,6662,6664,6666,6668,6670,6673,6676,6678,6681,6683,6685,6687,6689,6692,6694,6697,6699,6701,6703,6705,6707,6710,6713],{"class":1103,"line":4047},[1101,6640,6641],{"class":1319},"            \u003C",[1101,6643,1577],{"class":1325},[1101,6645,6646],{"class":1305}," v-for",[1101,6648,1606],{"class":1319},[1101,6650,1533],{"class":1319},[1101,6652,6653],{"class":1315},"(part",[1101,6655,1731],{"class":1319},[1101,6657,6658],{"class":1315}," index) ",[1101,6660,6661],{"class":1319},"in",[1101,6663,2632],{"class":1315},[1101,6665,1823],{"class":1319},[1101,6667,2213],{"class":1315},[1101,6669,1533],{"class":1319},[1101,6671,6672],{"class":1319}," :",[1101,6674,6675],{"class":1602},"key",[1101,6677,1606],{"class":1319},[1101,6679,6680],{"class":1319},"\"`${",[1101,6682,4482],{"class":1315},[1101,6684,1823],{"class":1319},[1101,6686,2032],{"class":1315},[1101,6688,1503],{"class":1319},[1101,6690,6691],{"class":1111},"-",[1101,6693,5398],{"class":1319},[1101,6695,6696],{"class":1315},"part",[1101,6698,1823],{"class":1319},[1101,6700,6172],{"class":1315},[1101,6702,1503],{"class":1319},[1101,6704,6691],{"class":1111},[1101,6706,5398],{"class":1319},[1101,6708,6709],{"class":1315},"index",[1101,6711,6712],{"class":1319},"}`\"",[1101,6714,1580],{"class":1319},[1101,6716,6717,6720],{"class":1103,"line":4064},[1101,6718,6719],{"class":1319},"              \u003C",[1101,6721,6722],{"class":1325},"UChatReasoning\n",[1101,6724,6725,6728,6730,6732,6735],{"class":1103,"line":4085},[1101,6726,6727],{"class":1602},"                v-if",[1101,6729,1606],{"class":1319},[1101,6731,1533],{"class":1319},[1101,6733,6734],{"class":1111},"isReasoningUIPart(part)",[1101,6736,5552],{"class":1319},[1101,6738,6739,6742,6744,6746,6749],{"class":1103,"line":4095},[1101,6740,6741],{"class":1602},"                :text",[1101,6743,1606],{"class":1319},[1101,6745,1533],{"class":1319},[1101,6747,6748],{"class":1111},"part.text",[1101,6750,5552],{"class":1319},[1101,6752,6753,6756,6758,6760,6763],{"class":1103,"line":4105},[1101,6754,6755],{"class":1602},"                :streaming",[1101,6757,1606],{"class":1319},[1101,6759,1533],{"class":1319},[1101,6761,6762],{"class":1111},"isReasoningStreaming(message, index, chat)",[1101,6764,5552],{"class":1319},[1101,6766,6767],{"class":1103,"line":4115},[1101,6768,6769],{"class":1319},"              >\n",[1101,6771,6772,6775],{"class":1103,"line":4132},[1101,6773,6774],{"class":1319},"                \u003C",[1101,6776,6777],{"class":1325},"MDC\n",[1101,6779,6780,6783,6785,6787,6789],{"class":1103,"line":4143},[1101,6781,6782],{"class":1602},"                  :value",[1101,6784,1606],{"class":1319},[1101,6786,1533],{"class":1319},[1101,6788,6748],{"class":1111},[1101,6790,5552],{"class":1319},[1101,6792,6793,6796,6798,6800,6803],{"class":1103,"line":4149},[1101,6794,6795],{"class":1602},"                  :cache-key",[1101,6797,1606],{"class":1319},[1101,6799,1533],{"class":1319},[1101,6801,6802],{"class":1111},"`reasoning-${message.id}-${index}`",[1101,6804,5552],{"class":1319},[1101,6806,6807,6810,6812,6814,6817],{"class":1103,"line":4155},[1101,6808,6809],{"class":1602},"                  class",[1101,6811,1606],{"class":1319},[1101,6813,1533],{"class":1319},[1101,6815,6816],{"class":1111},"*:first:mt-0 *:last:mb-0",[1101,6818,5552],{"class":1319},[1101,6820,6821],{"class":1103,"line":4165},[1101,6822,6823],{"class":1319},"                \u002F>\n",[1101,6825,6826,6829,6832],{"class":1103,"line":4175},[1101,6827,6828],{"class":1319},"              \u003C\u002F",[1101,6830,6831],{"class":1325},"UChatReasoning",[1101,6833,1580],{"class":1319},[1101,6835,6836],{"class":1103,"line":4188},[1101,6837,1384],{"emptyLinePlaceholder":21},[1101,6839,6840,6842],{"class":1103,"line":4203},[1101,6841,6719],{"class":1319},[1101,6843,6777],{"class":1325},[1101,6845,6846,6849,6851,6853,6856],{"class":1103,"line":4208},[1101,6847,6848],{"class":1602},"                v-else-if",[1101,6850,1606],{"class":1319},[1101,6852,1533],{"class":1319},[1101,6854,6855],{"class":1111},"isTextUIPart(part)",[1101,6857,5552],{"class":1319},[1101,6859,6860,6863,6865,6867,6869],{"class":1103,"line":4213},[1101,6861,6862],{"class":1602},"                :value",[1101,6864,1606],{"class":1319},[1101,6866,1533],{"class":1319},[1101,6868,6748],{"class":1111},[1101,6870,5552],{"class":1319},[1101,6872,6873,6876,6878,6880,6883],{"class":1103,"line":4223},[1101,6874,6875],{"class":1602},"                :cache-key",[1101,6877,1606],{"class":1319},[1101,6879,1533],{"class":1319},[1101,6881,6882],{"class":1111},"`${message.id}-${index}`",[1101,6884,5552],{"class":1319},[1101,6886,6887,6890,6892,6894,6896],{"class":1103,"line":4239},[1101,6888,6889],{"class":1602},"                class",[1101,6891,1606],{"class":1319},[1101,6893,1533],{"class":1319},[1101,6895,6816],{"class":1111},[1101,6897,5552],{"class":1319},[1101,6899,6900],{"class":1103,"line":4254},[1101,6901,6902],{"class":1319},"              \u002F>\n",[1101,6904,6905,6908,6910],{"class":1103,"line":4260},[1101,6906,6907],{"class":1319},"            \u003C\u002F",[1101,6909,1577],{"class":1325},[1101,6911,1580],{"class":1319},[1101,6913,6914,6917,6919],{"class":1103,"line":4266},[1101,6915,6916],{"class":1319},"          \u003C\u002F",[1101,6918,1577],{"class":1325},[1101,6920,1580],{"class":1319},[1101,6922,6923,6925,6927],{"class":1103,"line":4274},[1101,6924,5521],{"class":1319},[1101,6926,5097],{"class":1325},[1101,6928,1580],{"class":1319},[1101,6930,6931],{"class":1103,"line":4279},[1101,6932,1384],{"emptyLinePlaceholder":21},[1101,6934,6935,6937],{"class":1103,"line":4285},[1101,6936,5495],{"class":1319},[1101,6938,5537],{"class":1325},[1101,6940,6941,6943,6945,6947,6949],{"class":1103,"line":4305},[1101,6942,5543],{"class":1602},[1101,6944,1606],{"class":1319},[1101,6946,1533],{"class":1319},[1101,6948,5208],{"class":1111},[1101,6950,5552],{"class":1319},[1101,6952,6953,6956,6958,6960,6963],{"class":1103,"line":4320},[1101,6954,6955],{"class":1602},"          :error",[1101,6957,1606],{"class":1319},[1101,6959,1533],{"class":1319},[1101,6961,6962],{"class":1111},"chat.error",[1101,6964,5552],{"class":1319},[1101,6966,6967,6969,6971,6973,6975],{"class":1103,"line":4337},[1101,6968,5573],{"class":1602},[1101,6970,1606],{"class":1319},[1101,6972,1533],{"class":1319},[1101,6974,5580],{"class":1111},[1101,6976,5552],{"class":1319},[1101,6978,6979,6981,6983,6985,6988],{"class":1103,"line":4360},[1101,6980,6598],{"class":1602},[1101,6982,1606],{"class":1319},[1101,6984,1533],{"class":1319},[1101,6986,6987],{"class":1111},"sticky bottom-0",[1101,6989,5552],{"class":1319},[1101,6991,6992,6994,6996,6998,7001],{"class":1103,"line":4371},[1101,6993,5603],{"class":1602},[1101,6995,1606],{"class":1319},[1101,6997,1533],{"class":1319},[1101,6999,7000],{"class":1111},"handleSubmit",[1101,7002,5552],{"class":1319},[1101,7004,7005],{"class":1103,"line":4379},[1101,7006,5618],{"class":1319},[1101,7008,7009,7011],{"class":1103,"line":4385},[1101,7010,5624],{"class":1319},[1101,7012,7013],{"class":1325},"UChatPromptSubmit\n",[1101,7015,7016,7019,7021,7023,7025],{"class":1103,"line":4390},[1101,7017,7018],{"class":1602},"            :status",[1101,7020,1606],{"class":1319},[1101,7022,1533],{"class":1319},[1101,7024,6586],{"class":1111},[1101,7026,5552],{"class":1319},[1101,7028,7029,7032,7034,7036,7038],{"class":1103,"line":4413},[1101,7030,7031],{"class":1602},"            color",[1101,7033,1606],{"class":1319},[1101,7035,1533],{"class":1319},[1101,7037,5637],{"class":1111},[1101,7039,5552],{"class":1319},[1101,7041,7042,7045,7047,7049,7052],{"class":1103,"line":4419},[1101,7043,7044],{"class":1602},"            @stop",[1101,7046,1606],{"class":1319},[1101,7048,1533],{"class":1319},[1101,7050,7051],{"class":1111},"chat.stop()",[1101,7053,5552],{"class":1319},[1101,7055,7056,7059,7061,7063,7066],{"class":1103,"line":4439},[1101,7057,7058],{"class":1602},"            @reload",[1101,7060,1606],{"class":1319},[1101,7062,1533],{"class":1319},[1101,7064,7065],{"class":1111},"chat.regenerate()",[1101,7067,5552],{"class":1319},[1101,7069,7070],{"class":1103,"line":4445},[1101,7071,7072],{"class":1319},"          \u002F>\n",[1101,7074,7075,7077,7079],{"class":1103,"line":4491},[1101,7076,5521],{"class":1319},[1101,7078,5091],{"class":1325},[1101,7080,1580],{"class":1319},[1101,7082,7083,7085,7087],{"class":1103,"line":4507},[1101,7084,5655],{"class":1319},[1101,7086,5476],{"class":1325},[1101,7088,1580],{"class":1319},[1101,7090,7091,7093,7095],{"class":1103,"line":4540},[1101,7092,1631],{"class":1319},[1101,7094,1577],{"class":1325},[1101,7096,1580],{"class":1319},[1101,7098,7099,7101,7103],{"class":1103,"line":4554},[1101,7100,1641],{"class":1319},[1101,7102,5441],{"class":1325},[1101,7104,1580],{"class":1319},[1101,7106,7107,7109,7111],{"class":1103,"line":4562},[1101,7108,1650],{"class":1319},[1101,7110,1577],{"class":1325},[1101,7112,1580],{"class":1319},[990,7114,7115],{},"Here's a breakdown of the key parts:",[990,7117,7118],{},[1008,7119,7120],{},"The Chat Class",[990,7122,4640,7123,7128,7129,7131],{},[1044,7124,7126],{"href":5725,"rel":7125},[1048],[1051,7127,259],{}," class from ",[1051,7130,5817],{}," manages the entire conversation state. It handles:",[1002,7133,7134,7139,7154,7160,7165],{},[1005,7135,7136,7137],{},"Message history with ",[1051,7138,6573],{},[1005,7140,7141,7142,1966,7144,2878,7147,2878,7150,2878,7152,1897],{},"Connection status with ",[1051,7143,6586],{},[1051,7145,7146],{},"ready",[1051,7148,7149],{},"submitted",[1051,7151,5712],{},[1051,7153,6221],{},[1005,7155,7156,7157],{},"Sending messages with ",[1051,7158,7159],{},"chat.sendMessage()",[1005,7161,7162,7163],{},"Stopping generation with ",[1051,7164,7051],{},[1005,7166,7167,7168],{},"Regenerating responses with ",[1051,7169,7065],{},[990,7171,4640,7172,7175,7176,7181,7182,7184],{},[1051,7173,7174],{},"onData"," callback receives ",[1044,7177,7180],{"href":7178,"rel":7179},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fstreaming-data",[1048],"custom data events"," from the server (like ",[1051,7183,4330],{},"), allowing you to react to server-side events during streaming.",[990,7186,7187],{},[1008,7188,7189],{},"UChatMessages Component",[990,7191,4640,7192,7196],{},[1044,7193,7194],{"href":271},[1051,7195,5097],{}," component is purpose-built for AI chatbots with:",[1002,7198,7199,7202,7205,7208],{},[1005,7200,7201],{},"Auto-scroll to bottom on load",[1005,7203,7204],{},"Continuous scrolling as messages stream in",[1005,7206,7207],{},"A loading indicator while the assistant processes",[1005,7209,7210],{},"An \"Auto scroll\" button when scrolled up",[990,7212,7213],{},[1008,7214,7215],{},"Rendering Markdown with MDC",[990,7217,7218,7219,7221,7222,1054,7225,7228,7229,7236,7237,7243,7244,7248,7249,7252,7253,7255],{},"AI models often respond with Markdown formatting (code blocks, lists, bold text, etc.). We iterate over message ",[1051,7220,2213],{}," using AI SDK helpers like ",[1051,7223,7224],{},"isTextUIPart",[1051,7226,7227],{},"isReasoningUIPart",", rendering text with the ",[1044,7230,7233],{"href":7231,"rel":7232},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc#mdc",[1048],[1051,7234,7235],{},"MDC"," component from ",[1044,7238,7241],{"href":7239,"rel":7240},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc",[1048],[1051,7242,1355],{}," and reasoning with ",[1044,7245,7246],{"href":291},[1051,7247,6831],{},". The ",[1051,7250,7251],{},"isReasoningStreaming"," utility from ",[1051,7254,5838],{}," detects if a reasoning part is currently being streamed.",[1680,7257,7258],{"to":860},[990,7259,7260],{},"Nuxt UI provides pre-styled prose components, so your markdown content will be automatically styled to match your theme.",[990,7262,7263],{},[1008,7264,7265],{},"UChatPromptSubmit Component",[990,7267,4640,7268,7272],{},[1044,7269,7270],{"href":286},[1051,7271,5627],{}," component adapts based on the chat status:",[1002,7274,7275,7278,7281],{},[1005,7276,7277],{},"Shows a send button when ready",[1005,7279,7280],{},"Shows a stop button while streaming",[1005,7282,7283],{},"Shows a reload button after an error",[994,7285,7287],{"id":7286},"adding-chat-history","Adding chat history",[990,7289,7290],{},"This section adds a dropdown menu to list previous chats and navigate between them.",[1129,7292,7294],{"id":7293},"listing-chats-api","Listing chats API",[990,7296,7297],{},"First, create an endpoint to fetch all chats:",[1292,7299,7300],{},[1092,7301,7304],{"className":1296,"code":7302,"filename":7303,"language":1298,"meta":1097,"style":1097},"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",[1051,7305,7306,7324,7346,7365,7369,7387,7412,7439,7445],{"__ignoreMap":1097},[1101,7307,7308,7310,7312,7314,7316,7318,7320,7322],{"class":1103,"line":1104},[1101,7309,1722],{"class":1305},[1101,7311,1725],{"class":1319},[1101,7313,2512],{"class":1315},[1101,7315,1747],{"class":1319},[1101,7317,1750],{"class":1305},[1101,7319,1406],{"class":1319},[1101,7321,1129],{"class":1111},[1101,7323,1370],{"class":1319},[1101,7325,7326,7328,7330,7332,7334,7336,7338,7340,7342,7344],{"class":1103,"line":1121},[1101,7327,1722],{"class":1305},[1101,7329,1725],{"class":1319},[1101,7331,2455],{"class":1315},[1101,7333,1731],{"class":1319},[1101,7335,2563],{"class":1315},[1101,7337,1747],{"class":1319},[1101,7339,1750],{"class":1305},[1101,7341,1406],{"class":1319},[1101,7343,2572],{"class":1111},[1101,7345,1370],{"class":1319},[1101,7347,7348,7350,7352,7355,7357,7359,7361,7363],{"class":1103,"line":1335},[1101,7349,1722],{"class":1305},[1101,7351,1725],{"class":1319},[1101,7353,7354],{"class":1315}," desc",[1101,7356,1747],{"class":1319},[1101,7358,1750],{"class":1305},[1101,7360,1406],{"class":1319},[1101,7362,1775],{"class":1111},[1101,7364,1370],{"class":1319},[1101,7366,7367],{"class":1103,"line":1350},[1101,7368,1384],{"emptyLinePlaceholder":21},[1101,7370,7371,7373,7375,7377,7379,7381,7383,7385],{"class":1103,"line":1362},[1101,7372,1306],{"class":1305},[1101,7374,1309],{"class":1305},[1101,7376,2512],{"class":1124},[1101,7378,1316],{"class":1315},[1101,7380,2611],{"class":1602},[1101,7382,4976],{"class":1319},[1101,7384,1840],{"class":1602},[1101,7386,1395],{"class":1319},[1101,7388,7389,7391,7393,7395,7397,7399,7401,7403,7405,7408,7410],{"class":1103,"line":1373},[1101,7390,2854],{"class":1305},[1101,7392,2640],{"class":1305},[1101,7394,2455],{"class":1315},[1101,7396,1823],{"class":1319},[1101,7398,3467],{"class":1315},[1101,7400,1823],{"class":1319},[1101,7402,1802],{"class":1315},[1101,7404,1823],{"class":1319},[1101,7406,7407],{"class":1124},"findMany",[1101,7409,1316],{"class":1325},[1101,7411,1320],{"class":1319},[1101,7413,7414,7417,7419,7421,7423,7425,7427,7429,7431,7433,7435,7437],{"class":1103,"line":1381},[1101,7415,7416],{"class":1124},"    orderBy",[1101,7418,1329],{"class":1319},[1101,7420,4976],{"class":1319},[1101,7422,1840],{"class":1602},[1101,7424,7354],{"class":1124},[1101,7426,1316],{"class":1325},[1101,7428,2731],{"class":1315},[1101,7430,1823],{"class":1319},[1101,7432,1802],{"class":1315},[1101,7434,1823],{"class":1319},[1101,7436,4993],{"class":1315},[1101,7438,1506],{"class":1325},[1101,7440,7441,7443],{"class":1103,"line":1387},[1101,7442,2428],{"class":1319},[1101,7444,1506],{"class":1325},[1101,7446,7447,7449],{"class":1103,"line":1398},[1101,7448,1503],{"class":1319},[1101,7450,1506],{"class":1315},[1129,7452,7454],{"id":7453},"building-the-chats-history-dropdown","Building the chats history dropdown",[990,7456,7457,7458,7463,7464,7469,7470,7463,7477,7479],{},"The component uses ",[1044,7459,7460],{"href":457},[1051,7461,7462],{},"UDropdownMenu"," with a ",[1044,7465,7466],{"href":230},[1051,7467,7468],{},"UButton"," as trigger. Use ",[1044,7471,7474],{"href":7472,"rel":7473},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-fetch",[1048],[1051,7475,7476],{},"useFetch",[1051,7478,6675],{}," to fetch and cache the chat list:",[1292,7481,7482],{},[1092,7483,7486],{"className":1564,"code":7484,"filename":7485,"language":34,"meta":1097,"style":1097},"\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",[1051,7487,7488,7508,7520,7524,7556,7571,7585,7591,7595,7615,7620,7636,7652,7668,7692,7696,7721,7746,7768,7794,7800,7804,7812,7816,7824,7855,7862,7876,7890,7904,7916,7930,7935,7943],{"__ignoreMap":1097},[1101,7489,7490,7492,7494,7496,7498,7500,7502,7504,7506],{"class":1103,"line":1104},[1101,7491,1574],{"class":1319},[1101,7493,5126],{"class":1325},[1101,7495,5129],{"class":1602},[1101,7497,5132],{"class":1602},[1101,7499,1606],{"class":1319},[1101,7501,1533],{"class":1319},[1101,7503,1298],{"class":1111},[1101,7505,1533],{"class":1319},[1101,7507,1580],{"class":1319},[1101,7509,7510,7512,7514,7516,7518],{"class":1103,"line":1121},[1101,7511,3075],{"class":1602},[1101,7513,5851],{"class":1315},[1101,7515,1606],{"class":1319},[1101,7517,5856],{"class":1124},[1101,7519,2683],{"class":1315},[1101,7521,7522],{"class":1103,"line":1335},[1101,7523,1384],{"emptyLinePlaceholder":21},[1101,7525,7526,7528,7530,7532,7534,7536,7538,7540,7542,7544,7546,7548,7550,7552,7554],{"class":1103,"line":1350},[1101,7527,3075],{"class":1602},[1101,7529,1725],{"class":1319},[1101,7531,5890],{"class":1325},[1101,7533,1329],{"class":1319},[1101,7535,1791],{"class":1315},[1101,7537,1503],{"class":1319},[1101,7539,2637],{"class":1319},[1101,7541,2640],{"class":1305},[1101,7543,5904],{"class":1124},[1101,7545,1316],{"class":1315},[1101,7547,1344],{"class":1319},[1101,7549,5269],{"class":1111},[1101,7551,1344],{"class":1319},[1101,7553,1731],{"class":1319},[1101,7555,1395],{"class":1319},[1101,7557,7558,7561,7563,7565,7567,7569],{"class":1103,"line":1362},[1101,7559,7560],{"class":1325},"  key",[1101,7562,1329],{"class":1319},[1101,7564,1406],{"class":1319},[1101,7566,1802],{"class":1111},[1101,7568,1344],{"class":1319},[1101,7570,1347],{"class":1319},[1101,7572,7573,7576,7578,7580,7582],{"class":1103,"line":1373},[1101,7574,7575],{"class":1124},"  default",[1101,7577,1329],{"class":1319},[1101,7579,4976],{"class":1319},[1101,7581,1840],{"class":1602},[1101,7583,7584],{"class":1315}," []\n",[1101,7586,7587,7589],{"class":1103,"line":1381},[1101,7588,1503],{"class":1319},[1101,7590,1506],{"class":1315},[1101,7592,7593],{"class":1103,"line":1387},[1101,7594,1384],{"emptyLinePlaceholder":21},[1101,7596,7597,7599,7602,7604,7607,7609,7611,7613],{"class":1103,"line":1398},[1101,7598,3075],{"class":1602},[1101,7600,7601],{"class":1315}," items ",[1101,7603,1606],{"class":1319},[1101,7605,7606],{"class":1124}," computed",[1101,7608,1316],{"class":1315},[1101,7610,1820],{"class":1319},[1101,7612,1840],{"class":1602},[1101,7614,1332],{"class":1315},[1101,7616,7617],{"class":1103,"line":1414},[1101,7618,7619],{"class":1319},"  {\n",[1101,7621,7622,7625,7627,7629,7632,7634],{"class":1103,"line":1420},[1101,7623,7624],{"class":1325},"    label",[1101,7626,1329],{"class":1319},[1101,7628,1406],{"class":1319},[1101,7630,7631],{"class":1111},"New chat",[1101,7633,1344],{"class":1319},[1101,7635,1347],{"class":1319},[1101,7637,7638,7641,7643,7645,7648,7650],{"class":1103,"line":1425},[1101,7639,7640],{"class":1325},"    to",[1101,7642,1329],{"class":1319},[1101,7644,1406],{"class":1319},[1101,7646,7647],{"class":1111},"\u002F",[1101,7649,1344],{"class":1319},[1101,7651,1347],{"class":1319},[1101,7653,7654,7657,7659,7661,7664,7666],{"class":1103,"line":1448},[1101,7655,7656],{"class":1325},"    icon",[1101,7658,1329],{"class":1319},[1101,7660,1406],{"class":1319},[1101,7662,7663],{"class":1111},"i-lucide-plus-square",[1101,7665,1344],{"class":1319},[1101,7667,1347],{"class":1319},[1101,7669,7670,7673,7675,7678,7680,7683,7686,7688,7690],{"class":1103,"line":1453},[1101,7671,7672],{"class":1325},"    active",[1101,7674,1329],{"class":1319},[1101,7676,7677],{"class":1315}," route",[1101,7679,1823],{"class":1319},[1101,7681,7682],{"class":1315},"name ",[1101,7684,7685],{"class":1319},"===",[1101,7687,1406],{"class":1319},[1101,7689,6709],{"class":1111},[1101,7691,1370],{"class":1319},[1101,7693,7694],{"class":1103,"line":1463},[1101,7695,1417],{"class":1319},[1101,7697,7698,7701,7703,7705,7707,7709,7711,7713,7715,7717,7719],{"class":1103,"line":1473},[1101,7699,7700],{"class":1319},"  ...",[1101,7702,1802],{"class":1315},[1101,7704,1823],{"class":1319},[1101,7706,3336],{"class":1315},[1101,7708,1823],{"class":1319},[1101,7710,4477],{"class":1124},[1101,7712,1316],{"class":1315},[1101,7714,262],{"class":1957},[1101,7716,1840],{"class":1602},[1101,7718,1966],{"class":1315},[1101,7720,1320],{"class":1319},[1101,7722,7723,7725,7727,7729,7731,7734,7737,7739,7742,7744],{"class":1103,"line":1489},[1101,7724,7624],{"class":1325},[1101,7726,1329],{"class":1319},[1101,7728,2804],{"class":1315},[1101,7730,1823],{"class":1319},[1101,7732,7733],{"class":1315},"title ",[1101,7735,7736],{"class":1319},"||",[1101,7738,1406],{"class":1319},[1101,7740,7741],{"class":1111},"Untitled",[1101,7743,1344],{"class":1319},[1101,7745,1347],{"class":1319},[1101,7747,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766],{"class":1103,"line":1495},[1101,7749,7640],{"class":1325},[1101,7751,1329],{"class":1319},[1101,7753,3685],{"class":1319},[1101,7755,5395],{"class":1111},[1101,7757,5398],{"class":1319},[1101,7759,262],{"class":1315},[1101,7761,1823],{"class":1319},[1101,7763,2032],{"class":1315},[1101,7765,5407],{"class":1319},[1101,7767,1347],{"class":1319},[1101,7769,7770,7772,7774,7776,7778,7780,7782,7785,7787,7789,7791],{"class":1103,"line":1500},[1101,7771,7672],{"class":1325},[1101,7773,1329],{"class":1319},[1101,7775,7677],{"class":1315},[1101,7777,1823],{"class":1319},[1101,7779,5921],{"class":1315},[1101,7781,1823],{"class":1319},[1101,7783,7784],{"class":1315},"id ",[1101,7786,7685],{"class":1319},[1101,7788,2804],{"class":1315},[1101,7790,1823],{"class":1319},[1101,7792,7793],{"class":1315},"id\n",[1101,7795,7796,7798],{"class":1103,"line":2289},[1101,7797,2428],{"class":1319},[1101,7799,1987],{"class":1315},[1101,7801,7802],{"class":1103,"line":2302},[1101,7803,2335],{"class":1315},[1101,7805,7806,7808,7810],{"class":1103,"line":2332},[1101,7807,1650],{"class":1319},[1101,7809,5126],{"class":1325},[1101,7811,1580],{"class":1319},[1101,7813,7814],{"class":1103,"line":2338},[1101,7815,1384],{"emptyLinePlaceholder":21},[1101,7817,7818,7820,7822],{"class":1103,"line":2343},[1101,7819,1574],{"class":1319},[1101,7821,1577],{"class":1325},[1101,7823,1580],{"class":1319},[1101,7825,7826,7828,7830,7833,7835,7837,7840,7842,7844,7846,7848,7851,7853],{"class":1103,"line":2375},[1101,7827,1587],{"class":1319},[1101,7829,7462],{"class":1325},[1101,7831,7832],{"class":1602}," :items",[1101,7834,1606],{"class":1319},[1101,7836,1533],{"class":1319},[1101,7838,7839],{"class":1111},"items",[1101,7841,1533],{"class":1319},[1101,7843,5479],{"class":1602},[1101,7845,1606],{"class":1319},[1101,7847,1533],{"class":1319},[1101,7849,7850],{"class":1111},"m-2",[1101,7852,1533],{"class":1319},[1101,7854,1580],{"class":1319},[1101,7856,7857,7859],{"class":1103,"line":2391},[1101,7858,1596],{"class":1319},[1101,7860,7861],{"class":1325},"UButton\n",[1101,7863,7864,7867,7869,7871,7874],{"class":1103,"line":2409},[1101,7865,7866],{"class":1602},"      icon",[1101,7868,1606],{"class":1319},[1101,7870,1533],{"class":1319},[1101,7872,7873],{"class":1111},"i-lucide-messages-square",[1101,7875,5552],{"class":1319},[1101,7877,7878,7881,7883,7885,7888],{"class":1103,"line":2425},[1101,7879,7880],{"class":1602},"      variant",[1101,7882,1606],{"class":1319},[1101,7884,1533],{"class":1319},[1101,7886,7887],{"class":1111},"ghost",[1101,7889,5552],{"class":1319},[1101,7891,7892,7895,7897,7899,7902],{"class":1103,"line":2433},[1101,7893,7894],{"class":1602},"      label",[1101,7896,1606],{"class":1319},[1101,7898,1533],{"class":1319},[1101,7900,7901],{"class":1111},"Chats History",[1101,7903,5552],{"class":1319},[1101,7905,7906,7908,7910,7912,7914],{"class":1103,"line":3428},[1101,7907,6279],{"class":1602},[1101,7909,1606],{"class":1319},[1101,7911,1533],{"class":1319},[1101,7913,5637],{"class":1111},[1101,7915,5552],{"class":1319},[1101,7917,7918,7921,7923,7925,7928],{"class":1103,"line":3441},[1101,7919,7920],{"class":1602},"      class",[1101,7922,1606],{"class":1319},[1101,7924,1533],{"class":1319},[1101,7926,7927],{"class":1111},"w-fit",[1101,7929,5552],{"class":1319},[1101,7931,7932],{"class":1103,"line":3446},[1101,7933,7934],{"class":1319},"    \u002F>\n",[1101,7936,7937,7939,7941],{"class":1103,"line":3452},[1101,7938,1641],{"class":1319},[1101,7940,7462],{"class":1325},[1101,7942,1580],{"class":1319},[1101,7944,7945,7947,7949],{"class":1103,"line":3483},[1101,7946,1650],{"class":1319},[1101,7948,1577],{"class":1325},[1101,7950,1580],{"class":1319},[994,7952,7954],{"id":7953},"integrating-history-in-the-home-page","Integrating history in the home page",[1292,7956,7957],{},[1710,7958,7959],{},[1092,7960,7963],{"className":1564,"code":7961,"filename":5116,"highlights":7962,"language":34,"meta":1097,"style":1097},"\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",[2425,2433,3428],[1051,7964,7965,7985,8001,8017,8021,8033,8055,8059,8071,8075,8079,8103,8117,8125,8133,8147,8183,8187,8191,8197,8201,8205,8227,8231,8239,8243,8251,8269,8283,8293,8302,8314,8332,8350,8354,8362,8366,8372,8384,8396,8408,8420,8432,8436,8454,8462,8470,8478,8486],{"__ignoreMap":1097},[1101,7966,7967,7969,7971,7973,7975,7977,7979,7981,7983],{"class":1103,"line":1104},[1101,7968,1574],{"class":1319},[1101,7970,5126],{"class":1325},[1101,7972,5129],{"class":1602},[1101,7974,5132],{"class":1602},[1101,7976,1606],{"class":1319},[1101,7978,1533],{"class":1319},[1101,7980,1298],{"class":1111},[1101,7982,1533],{"class":1319},[1101,7984,1580],{"class":1319},[1101,7986,7987,7989,7991,7993,7995,7997,7999],{"class":1103,"line":1121},[1101,7988,3075],{"class":1602},[1101,7990,5149],{"class":1315},[1101,7992,1606],{"class":1319},[1101,7994,5154],{"class":1124},[1101,7996,1316],{"class":1315},[1101,7998,5159],{"class":1319},[1101,8000,1506],{"class":1315},[1101,8002,8003,8005,8007,8009,8011,8013,8015],{"class":1103,"line":1335},[1101,8004,3075],{"class":1602},[1101,8006,5168],{"class":1315},[1101,8008,1606],{"class":1319},[1101,8010,5154],{"class":1124},[1101,8012,1316],{"class":1315},[1101,8014,5177],{"class":1481},[1101,8016,1506],{"class":1315},[1101,8018,8019],{"class":1103,"line":1350},[1101,8020,1384],{"emptyLinePlaceholder":21},[1101,8022,8023,8025,8027,8029,8031],{"class":1103,"line":1362},[1101,8024,2611],{"class":1602},[1101,8026,5190],{"class":1602},[1101,8028,5193],{"class":1124},[1101,8030,1820],{"class":1319},[1101,8032,1395],{"class":1319},[1101,8034,8035,8037,8039,8041,8043,8045,8047,8049,8051,8053],{"class":1103,"line":1373},[1101,8036,3542],{"class":1305},[1101,8038,1966],{"class":1325},[1101,8040,3547],{"class":1319},[1101,8042,5208],{"class":1315},[1101,8044,1823],{"class":1319},[1101,8046,3336],{"class":1315},[1101,8048,1823],{"class":1319},[1101,8050,5217],{"class":1124},[1101,8052,5220],{"class":1325},[1101,8054,5223],{"class":1305},[1101,8056,8057],{"class":1103,"line":1381},[1101,8058,1384],{"emptyLinePlaceholder":21},[1101,8060,8061,8063,8065,8067,8069],{"class":1103,"line":1387},[1101,8062,5232],{"class":1315},[1101,8064,1823],{"class":1319},[1101,8066,3336],{"class":1315},[1101,8068,2637],{"class":1319},[1101,8070,4368],{"class":1481},[1101,8072,8073],{"class":1103,"line":1398},[1101,8074,1384],{"emptyLinePlaceholder":21},[1101,8076,8077],{"class":1103,"line":1414},[1101,8078,5249],{"class":1485},[1101,8080,8081,8083,8085,8087,8089,8091,8093,8095,8097,8099,8101],{"class":1103,"line":1420},[1101,8082,2627],{"class":1602},[1101,8084,2804],{"class":1315},[1101,8086,2637],{"class":1319},[1101,8088,2640],{"class":1305},[1101,8090,5262],{"class":1124},[1101,8092,1316],{"class":1325},[1101,8094,1344],{"class":1319},[1101,8096,5269],{"class":1111},[1101,8098,1344],{"class":1319},[1101,8100,1731],{"class":1319},[1101,8102,1395],{"class":1319},[1101,8104,8105,8107,8109,8111,8113,8115],{"class":1103,"line":1425},[1101,8106,5280],{"class":1325},[1101,8108,1329],{"class":1319},[1101,8110,1406],{"class":1319},[1101,8112,5287],{"class":1111},[1101,8114,1344],{"class":1319},[1101,8116,1347],{"class":1319},[1101,8118,8119,8121,8123],{"class":1103,"line":1448},[1101,8120,5296],{"class":1325},[1101,8122,1329],{"class":1319},[1101,8124,1395],{"class":1319},[1101,8126,8127,8129,8131],{"class":1103,"line":1453},[1101,8128,3376],{"class":1325},[1101,8130,1329],{"class":1319},[1101,8132,1395],{"class":1319},[1101,8134,8135,8137,8139,8141,8143,8145],{"class":1103,"line":1463},[1101,8136,4510],{"class":1325},[1101,8138,1329],{"class":1319},[1101,8140,1406],{"class":1319},[1101,8142,2162],{"class":1111},[1101,8144,1344],{"class":1319},[1101,8146,1347],{"class":1319},[1101,8148,8149,8151,8153,8155,8157,8159,8161,8163,8165,8167,8169,8171,8173,8175,8177,8179,8181],{"class":1103,"line":1473},[1101,8150,4543],{"class":1325},[1101,8152,1329],{"class":1319},[1101,8154,1433],{"class":1325},[1101,8156,1880],{"class":1319},[1101,8158,2534],{"class":1325},[1101,8160,1329],{"class":1319},[1101,8162,1406],{"class":1319},[1101,8164,5341],{"class":1111},[1101,8166,1344],{"class":1319},[1101,8168,1731],{"class":1319},[1101,8170,1734],{"class":1325},[1101,8172,1329],{"class":1319},[1101,8174,5352],{"class":1315},[1101,8176,1823],{"class":1319},[1101,8178,3336],{"class":1315},[1101,8180,1747],{"class":1319},[1101,8182,3182],{"class":1325},[1101,8184,8185],{"class":1103,"line":1489},[1101,8186,4382],{"class":1319},[1101,8188,8189],{"class":1103,"line":1495},[1101,8190,1492],{"class":1319},[1101,8192,8193,8195],{"class":1103,"line":1500},[1101,8194,2428],{"class":1319},[1101,8196,1506],{"class":1325},[1101,8198,8199],{"class":1103,"line":2289},[1101,8200,1384],{"emptyLinePlaceholder":21},[1101,8202,8203],{"class":1103,"line":2302},[1101,8204,5383],{"class":1485},[1101,8206,8207,8209,8211,8213,8215,8217,8219,8221,8223,8225],{"class":1103,"line":2332},[1101,8208,5388],{"class":1124},[1101,8210,1316],{"class":1325},[1101,8212,3691],{"class":1319},[1101,8214,5395],{"class":1111},[1101,8216,5398],{"class":1319},[1101,8218,262],{"class":1315},[1101,8220,1823],{"class":1319},[1101,8222,2032],{"class":1315},[1101,8224,5407],{"class":1319},[1101,8226,1506],{"class":1325},[1101,8228,8229],{"class":1103,"line":2338},[1101,8230,5414],{"class":1319},[1101,8232,8233,8235,8237],{"class":1103,"line":2343},[1101,8234,1650],{"class":1319},[1101,8236,5126],{"class":1325},[1101,8238,1580],{"class":1319},[1101,8240,8241],{"class":1103,"line":2375},[1101,8242,1384],{"emptyLinePlaceholder":21},[1101,8244,8245,8247,8249],{"class":1103,"line":2391},[1101,8246,1574],{"class":1319},[1101,8248,1577],{"class":1325},[1101,8250,1580],{"class":1319},[1101,8252,8253,8255,8257,8259,8261,8263,8265,8267],{"class":1103,"line":2409},[1101,8254,1587],{"class":1319},[1101,8256,5441],{"class":1325},[1101,8258,5444],{"class":1602},[1101,8260,1606],{"class":1319},[1101,8262,1533],{"class":1319},[1101,8264,5451],{"class":1111},[1101,8266,1533],{"class":1319},[1101,8268,1580],{"class":1319},[1101,8270,8272,8274,8276,8278,8281],{"class":8271,"line":2425},[1103,1584],[1101,8273,1596],{"class":1319},[1101,8275,1577],{"class":1325},[1101,8277,5464],{"class":1319},[1101,8279,8280],{"class":1602},"header",[1101,8282,1580],{"class":1319},[1101,8284,8286,8288,8291],{"class":8285,"line":2433},[1103,1584],[1101,8287,1620],{"class":1319},[1101,8289,8290],{"class":1325},"ChatsHistory",[1101,8292,1626],{"class":1319},[1101,8294,8296,8298,8300],{"class":8295,"line":3428},[1103,1584],[1101,8297,1631],{"class":1319},[1101,8299,1577],{"class":1325},[1101,8301,1580],{"class":1319},[1101,8303,8304,8306,8308,8310,8312],{"class":1103,"line":3441},[1101,8305,1596],{"class":1319},[1101,8307,1577],{"class":1325},[1101,8309,5464],{"class":1319},[1101,8311,5467],{"class":1602},[1101,8313,1580],{"class":1319},[1101,8315,8316,8318,8320,8322,8324,8326,8328,8330],{"class":1103,"line":3446},[1101,8317,1620],{"class":1319},[1101,8319,5476],{"class":1325},[1101,8321,5479],{"class":1602},[1101,8323,1606],{"class":1319},[1101,8325,1533],{"class":1319},[1101,8327,5486],{"class":1111},[1101,8329,1533],{"class":1319},[1101,8331,1580],{"class":1319},[1101,8333,8334,8336,8338,8340,8342,8344,8346,8348],{"class":1103,"line":3452},[1101,8335,5495],{"class":1319},[1101,8337,5498],{"class":1325},[1101,8339,5479],{"class":1602},[1101,8341,1606],{"class":1319},[1101,8343,1533],{"class":1319},[1101,8345,5507],{"class":1111},[1101,8347,1533],{"class":1319},[1101,8349,1580],{"class":1319},[1101,8351,8352],{"class":1103,"line":3483},[1101,8353,5516],{"class":1315},[1101,8355,8356,8358,8360],{"class":1103,"line":3527},[1101,8357,5521],{"class":1319},[1101,8359,5498],{"class":1325},[1101,8361,1580],{"class":1319},[1101,8363,8364],{"class":1103,"line":3534},[1101,8365,1384],{"emptyLinePlaceholder":21},[1101,8367,8368,8370],{"class":1103,"line":3539},[1101,8369,5495],{"class":1319},[1101,8371,5537],{"class":1325},[1101,8373,8374,8376,8378,8380,8382],{"class":1103,"line":3557},[1101,8375,5543],{"class":1602},[1101,8377,1606],{"class":1319},[1101,8379,1533],{"class":1319},[1101,8381,5208],{"class":1111},[1101,8383,5552],{"class":1319},[1101,8385,8386,8388,8390,8392,8394],{"class":1103,"line":3596},[1101,8387,5558],{"class":1602},[1101,8389,1606],{"class":1319},[1101,8391,1533],{"class":1319},[1101,8393,5565],{"class":1111},[1101,8395,5552],{"class":1319},[1101,8397,8398,8400,8402,8404,8406],{"class":1103,"line":3602},[1101,8399,5573],{"class":1602},[1101,8401,1606],{"class":1319},[1101,8403,1533],{"class":1319},[1101,8405,5580],{"class":1111},[1101,8407,5552],{"class":1319},[1101,8409,8410,8412,8414,8416,8418],{"class":1103,"line":3607},[1101,8411,5588],{"class":1602},[1101,8413,1606],{"class":1319},[1101,8415,1533],{"class":1319},[1101,8417,5595],{"class":1111},[1101,8419,5552],{"class":1319},[1101,8421,8422,8424,8426,8428,8430],{"class":1103,"line":3613},[1101,8423,5603],{"class":1602},[1101,8425,1606],{"class":1319},[1101,8427,1533],{"class":1319},[1101,8429,5610],{"class":1111},[1101,8431,5552],{"class":1319},[1101,8433,8434],{"class":1103,"line":3633},[1101,8435,5618],{"class":1319},[1101,8437,8438,8440,8442,8444,8446,8448,8450,8452],{"class":1103,"line":3661},[1101,8439,5624],{"class":1319},[1101,8441,5627],{"class":1325},[1101,8443,5630],{"class":1602},[1101,8445,1606],{"class":1319},[1101,8447,1533],{"class":1319},[1101,8449,5637],{"class":1111},[1101,8451,1533],{"class":1319},[1101,8453,1626],{"class":1319},[1101,8455,8456,8458,8460],{"class":1103,"line":3677},[1101,8457,5521],{"class":1319},[1101,8459,5091],{"class":1325},[1101,8461,1580],{"class":1319},[1101,8463,8464,8466,8468],{"class":1103,"line":3696},[1101,8465,5655],{"class":1319},[1101,8467,5476],{"class":1325},[1101,8469,1580],{"class":1319},[1101,8471,8472,8474,8476],{"class":1103,"line":3724},[1101,8473,1631],{"class":1319},[1101,8475,1577],{"class":1325},[1101,8477,1580],{"class":1319},[1101,8479,8480,8482,8484],{"class":1103,"line":3731},[1101,8481,1641],{"class":1319},[1101,8483,5441],{"class":1325},[1101,8485,1580],{"class":1319},[1101,8487,8488,8490,8492],{"class":1103,"line":3736},[1101,8489,1650],{"class":1319},[1101,8491,1577],{"class":1325},[1101,8493,1580],{"class":1319},[994,8495,8497],{"id":8496},"integrating-history-in-the-chat-page","Integrating history in the chat page",[1292,8499,8500],{},[1710,8501,8502],{},[1092,8503,8506],{"className":1564,"code":8504,"filename":5745,"highlights":8505,"language":34,"meta":1097,"style":1097},"\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",[3976,3982,3999],[1051,8507,8508,8528,8554,8572,8590,8594,8606,8618,8622,8626,8668,8672,8688,8728,8732,8736,8752,8756,8760,8776,8794,8812,8826,8850,8858,8870,8874,8898,8912,8916,8920,8932,8944,8958,8972,8984,8990,8994,9000,9004,9022,9032,9052,9078,9090,9094,9098,9102,9106,9118,9146,9156,9160,9166,9174,9178,9186,9204,9216,9224,9232,9244,9263,9270,9283,9295,9299,9311,9315,9339,9405,9411,9423,9435,9447,9451,9457,9469,9481,9493,9497,9505,9509,9515,9527,9539,9551,9563,9567,9575,9583,9591,9595,9601,9613,9625,9637,9649,9661,9665,9671,9683,9695,9707,9719,9723,9731,9739,9747,9755],{"__ignoreMap":1097},[1101,8509,8510,8512,8514,8516,8518,8520,8522,8524,8526],{"class":1103,"line":1104},[1101,8511,1574],{"class":1319},[1101,8513,5126],{"class":1325},[1101,8515,5129],{"class":1602},[1101,8517,5132],{"class":1602},[1101,8519,1606],{"class":1319},[1101,8521,1533],{"class":1319},[1101,8523,1298],{"class":1111},[1101,8525,1533],{"class":1319},[1101,8527,1580],{"class":1319},[1101,8529,8530,8532,8534,8536,8538,8540,8542,8544,8546,8548,8550,8552],{"class":1103,"line":1121},[1101,8531,1722],{"class":1305},[1101,8533,1725],{"class":1319},[1101,8535,5778],{"class":1315},[1101,8537,1731],{"class":1319},[1101,8539,5783],{"class":1315},[1101,8541,1731],{"class":1319},[1101,8543,5788],{"class":1315},[1101,8545,1747],{"class":1319},[1101,8547,1750],{"class":1305},[1101,8549,1406],{"class":1319},[1101,8551,2548],{"class":1111},[1101,8553,1370],{"class":1319},[1101,8555,8556,8558,8560,8562,8564,8566,8568,8570],{"class":1103,"line":1335},[1101,8557,1722],{"class":1305},[1101,8559,1725],{"class":1319},[1101,8561,5808],{"class":1315},[1101,8563,1747],{"class":1319},[1101,8565,1750],{"class":1305},[1101,8567,1406],{"class":1319},[1101,8569,5817],{"class":1111},[1101,8571,1370],{"class":1319},[1101,8573,8574,8576,8578,8580,8582,8584,8586,8588],{"class":1103,"line":1350},[1101,8575,1722],{"class":1305},[1101,8577,1725],{"class":1319},[1101,8579,5829],{"class":1315},[1101,8581,1747],{"class":1319},[1101,8583,1750],{"class":1305},[1101,8585,1406],{"class":1319},[1101,8587,5838],{"class":1111},[1101,8589,1370],{"class":1319},[1101,8591,8592],{"class":1103,"line":1362},[1101,8593,1384],{"emptyLinePlaceholder":21},[1101,8595,8596,8598,8600,8602,8604],{"class":1103,"line":1373},[1101,8597,3075],{"class":1602},[1101,8599,5851],{"class":1315},[1101,8601,1606],{"class":1319},[1101,8603,5856],{"class":1124},[1101,8605,2683],{"class":1315},[1101,8607,8608,8610,8612,8614,8616],{"class":1103,"line":1381},[1101,8609,3075],{"class":1602},[1101,8611,5865],{"class":1315},[1101,8613,1606],{"class":1319},[1101,8615,5870],{"class":1124},[1101,8617,2683],{"class":1315},[1101,8619,8620],{"class":1103,"line":1387},[1101,8621,1384],{"emptyLinePlaceholder":21},[1101,8623,8624],{"class":1103,"line":1398},[1101,8625,5881],{"class":1485},[1101,8627,8628,8630,8632,8634,8636,8638,8640,8642,8644,8646,8648,8650,8652,8654,8656,8658,8660,8662,8664,8666],{"class":1103,"line":1414},[1101,8629,3075],{"class":1602},[1101,8631,1725],{"class":1319},[1101,8633,5890],{"class":1325},[1101,8635,1329],{"class":1319},[1101,8637,5895],{"class":1315},[1101,8639,1503],{"class":1319},[1101,8641,2637],{"class":1319},[1101,8643,2640],{"class":1305},[1101,8645,5904],{"class":1124},[1101,8647,1316],{"class":1315},[1101,8649,3691],{"class":1319},[1101,8651,5911],{"class":1111},[1101,8653,5398],{"class":1319},[1101,8655,5916],{"class":1315},[1101,8657,1823],{"class":1319},[1101,8659,5921],{"class":1315},[1101,8661,1823],{"class":1319},[1101,8663,2032],{"class":1315},[1101,8665,5407],{"class":1319},[1101,8667,1506],{"class":1315},[1101,8669,8670],{"class":1103,"line":1420},[1101,8671,1384],{"emptyLinePlaceholder":21},[1101,8673,8674,8676,8678,8680,8682,8684,8686],{"class":1103,"line":1425},[1101,8675,5938],{"class":1305},[1101,8677,1966],{"class":1315},[1101,8679,3547],{"class":1319},[1101,8681,5945],{"class":1315},[1101,8683,1823],{"class":1319},[1101,8685,5950],{"class":1315},[1101,8687,1320],{"class":1319},[1101,8689,8690,8692,8694,8696,8698,8700,8702,8704,8706,8708,8710,8712,8714,8716,8718,8720,8722,8724,8726],{"class":1103,"line":1448},[1101,8691,5957],{"class":1305},[1101,8693,2913],{"class":1124},[1101,8695,1316],{"class":1325},[1101,8697,1880],{"class":1319},[1101,8699,3569],{"class":1325},[1101,8701,1329],{"class":1319},[1101,8703,3575],{"class":3574},[1101,8705,1731],{"class":1319},[1101,8707,3580],{"class":1325},[1101,8709,1329],{"class":1319},[1101,8711,1406],{"class":1319},[1101,8713,3587],{"class":1111},[1101,8715,1344],{"class":1319},[1101,8717,1731],{"class":1319},[1101,8719,5986],{"class":1325},[1101,8721,1329],{"class":1319},[1101,8723,4183],{"class":1481},[1101,8725,1747],{"class":1319},[1101,8727,1506],{"class":1325},[1101,8729,8730],{"class":1103,"line":1453},[1101,8731,5414],{"class":1319},[1101,8733,8734],{"class":1103,"line":1463},[1101,8735,1384],{"emptyLinePlaceholder":21},[1101,8737,8738,8740,8742,8744,8746,8748,8750],{"class":1103,"line":1473},[1101,8739,3075],{"class":1602},[1101,8741,5149],{"class":1315},[1101,8743,1606],{"class":1319},[1101,8745,5154],{"class":1124},[1101,8747,1316],{"class":1315},[1101,8749,5159],{"class":1319},[1101,8751,1506],{"class":1315},[1101,8753,8754],{"class":1103,"line":1489},[1101,8755,1384],{"emptyLinePlaceholder":21},[1101,8757,8758],{"class":1103,"line":1495},[1101,8759,6027],{"class":1485},[1101,8761,8762,8764,8766,8768,8770,8772,8774],{"class":1103,"line":1500},[1101,8763,3075],{"class":1602},[1101,8765,6035],{"class":1315},[1101,8767,1606],{"class":1319},[1101,8769,1917],{"class":1319},[1101,8771,5808],{"class":1124},[1101,8773,1316],{"class":1315},[1101,8775,1320],{"class":1319},[1101,8777,8778,8780,8782,8784,8786,8788,8790,8792],{"class":1103,"line":2289},[1101,8779,1813],{"class":1325},[1101,8781,1329],{"class":1319},[1101,8783,6055],{"class":1315},[1101,8785,1823],{"class":1319},[1101,8787,3336],{"class":1315},[1101,8789,1823],{"class":1319},[1101,8791,2032],{"class":1315},[1101,8793,1347],{"class":1319},[1101,8795,8796,8798,8800,8802,8804,8806,8808,8810],{"class":1103,"line":2302},[1101,8797,1973],{"class":1325},[1101,8799,1329],{"class":1319},[1101,8801,6055],{"class":1315},[1101,8803,1823],{"class":1319},[1101,8805,3336],{"class":1315},[1101,8807,1823],{"class":1319},[1101,8809,2011],{"class":1315},[1101,8811,1347],{"class":1319},[1101,8813,8814,8816,8818,8820,8822,8824],{"class":1103,"line":2332},[1101,8815,6090],{"class":1325},[1101,8817,1329],{"class":1319},[1101,8819,1917],{"class":1319},[1101,8821,5778],{"class":1124},[1101,8823,1316],{"class":1315},[1101,8825,1320],{"class":1319},[1101,8827,8828,8830,8832,8834,8836,8838,8840,8842,8844,8846,8848],{"class":1103,"line":2338},[1101,8829,6106],{"class":1325},[1101,8831,1329],{"class":1319},[1101,8833,3685],{"class":1319},[1101,8835,5911],{"class":1111},[1101,8837,5398],{"class":1319},[1101,8839,5945],{"class":1315},[1101,8841,1823],{"class":1319},[1101,8843,3336],{"class":1315},[1101,8845,1823],{"class":1319},[1101,8847,2032],{"class":1315},[1101,8849,6127],{"class":1319},[1101,8851,8852,8854,8856],{"class":1103,"line":2343},[1101,8853,2428],{"class":1319},[1101,8855,1897],{"class":1315},[1101,8857,1347],{"class":1319},[1101,8859,8860,8862,8864,8866,8868],{"class":1103,"line":2375},[1101,8861,6142],{"class":1325},[1101,8863,1316],{"class":1319},[1101,8865,6147],{"class":1957},[1101,8867,1897],{"class":1319},[1101,8869,1395],{"class":1319},[1101,8871,8872],{"class":1103,"line":2391},[1101,8873,6157],{"class":1485},[1101,8875,8876,8878,8880,8882,8884,8886,8888,8890,8892,8894,8896],{"class":1103,"line":2409},[1101,8877,6163],{"class":1305},[1101,8879,1966],{"class":1325},[1101,8881,6147],{"class":1315},[1101,8883,1823],{"class":1319},[1101,8885,6172],{"class":1315},[1101,8887,3363],{"class":1319},[1101,8889,1406],{"class":1319},[1101,8891,4330],{"class":1111},[1101,8893,1344],{"class":1319},[1101,8895,3552],{"class":1325},[1101,8897,1320],{"class":1319},[1101,8899,8900,8902,8904,8906,8908,8910],{"class":1103,"line":2425},[1101,8901,6190],{"class":1124},[1101,8903,1316],{"class":1325},[1101,8905,1344],{"class":1319},[1101,8907,1802],{"class":1111},[1101,8909,1344],{"class":1319},[1101,8911,1506],{"class":1325},[1101,8913,8914],{"class":1103,"line":2433},[1101,8915,1492],{"class":1319},[1101,8917,8918],{"class":1103,"line":3428},[1101,8919,1417],{"class":1319},[1101,8921,8922,8924,8926,8928,8930],{"class":1103,"line":3441},[1101,8923,6216],{"class":1325},[1101,8925,1316],{"class":1319},[1101,8927,6221],{"class":1957},[1101,8929,1897],{"class":1319},[1101,8931,1395],{"class":1319},[1101,8933,8934,8936,8938,8940,8942],{"class":1103,"line":3446},[1101,8935,6231],{"class":1315},[1101,8937,1823],{"class":1319},[1101,8939,6236],{"class":1124},[1101,8941,1316],{"class":1325},[1101,8943,1320],{"class":1319},[1101,8945,8946,8948,8950,8952,8954,8956],{"class":1103,"line":3452},[1101,8947,6246],{"class":1325},[1101,8949,1329],{"class":1319},[1101,8951,1406],{"class":1319},[1101,8953,497],{"class":1111},[1101,8955,1344],{"class":1319},[1101,8957,1347],{"class":1319},[1101,8959,8960,8962,8964,8966,8968,8970],{"class":1103,"line":3483},[1101,8961,6262],{"class":1325},[1101,8963,1329],{"class":1319},[1101,8965,6267],{"class":1315},[1101,8967,1823],{"class":1319},[1101,8969,4482],{"class":1315},[1101,8971,1347],{"class":1319},[1101,8973,8974,8976,8978,8980,8982],{"class":1103,"line":3527},[1101,8975,6279],{"class":1325},[1101,8977,1329],{"class":1319},[1101,8979,1406],{"class":1319},[1101,8981,6221],{"class":1111},[1101,8983,1370],{"class":1319},[1101,8985,8986,8988],{"class":1103,"line":3534},[1101,8987,3390],{"class":1319},[1101,8989,1506],{"class":1325},[1101,8991,8992],{"class":1103,"line":3539},[1101,8993,3599],{"class":1319},[1101,8995,8996,8998],{"class":1103,"line":3557},[1101,8997,1503],{"class":1319},[1101,8999,1506],{"class":1315},[1101,9001,9002],{"class":1103,"line":3596},[1101,9003,1384],{"emptyLinePlaceholder":21},[1101,9005,9006,9008,9010,9012,9014,9016,9018,9020],{"class":1103,"line":3602},[1101,9007,6315],{"class":1602},[1101,9009,6318],{"class":1124},[1101,9011,1316],{"class":1319},[1101,9013,6323],{"class":1957},[1101,9015,1329],{"class":1319},[1101,9017,6328],{"class":1107},[1101,9019,1897],{"class":1319},[1101,9021,1395],{"class":1319},[1101,9023,9024,9026,9028,9030],{"class":1103,"line":3607},[1101,9025,6337],{"class":1315},[1101,9027,1823],{"class":1319},[1101,9029,6342],{"class":1124},[1101,9031,2683],{"class":1325},[1101,9033,9034,9036,9038,9040,9042,9044,9046,9048,9050],{"class":1103,"line":3613},[1101,9035,3542],{"class":1305},[1101,9037,1966],{"class":1325},[1101,9039,5208],{"class":1315},[1101,9041,1823],{"class":1319},[1101,9043,3336],{"class":1315},[1101,9045,1823],{"class":1319},[1101,9047,5217],{"class":1124},[1101,9049,5220],{"class":1325},[1101,9051,1320],{"class":1319},[1101,9053,9054,9056,9058,9060,9062,9064,9066,9068,9070,9072,9074,9076],{"class":1103,"line":3633},[1101,9055,6369],{"class":1315},[1101,9057,1823],{"class":1319},[1101,9059,6374],{"class":1124},[1101,9061,1316],{"class":1325},[1101,9063,1880],{"class":1319},[1101,9065,1734],{"class":1325},[1101,9067,1329],{"class":1319},[1101,9069,5352],{"class":1315},[1101,9071,1823],{"class":1319},[1101,9073,3336],{"class":1315},[1101,9075,1747],{"class":1319},[1101,9077,1506],{"class":1325},[1101,9079,9080,9082,9084,9086,9088],{"class":1103,"line":3661},[1101,9081,6397],{"class":1315},[1101,9083,1823],{"class":1319},[1101,9085,3336],{"class":1315},[1101,9087,2637],{"class":1319},[1101,9089,6406],{"class":1319},[1101,9091,9092],{"class":1103,"line":3677},[1101,9093,3599],{"class":1319},[1101,9095,9096],{"class":1103,"line":3696},[1101,9097,5414],{"class":1319},[1101,9099,9100],{"class":1103,"line":3724},[1101,9101,1384],{"emptyLinePlaceholder":21},[1101,9103,9104],{"class":1103,"line":3731},[1101,9105,6423],{"class":1485},[1101,9107,9108,9110,9112,9114,9116],{"class":1103,"line":3736},[1101,9109,6428],{"class":1124},[1101,9111,1316],{"class":1315},[1101,9113,1820],{"class":1319},[1101,9115,1840],{"class":1602},[1101,9117,1395],{"class":1319},[1101,9119,9120,9122,9124,9126,9128,9130,9132,9134,9136,9138,9140,9142,9144],{"class":1103,"line":3802},[1101,9121,3542],{"class":1305},[1101,9123,1966],{"class":1325},[1101,9125,5945],{"class":1315},[1101,9127,1823],{"class":1319},[1101,9129,3336],{"class":1315},[1101,9131,3857],{"class":1319},[1101,9133,2011],{"class":1315},[1101,9135,1823],{"class":1319},[1101,9137,3836],{"class":1315},[1101,9139,3363],{"class":1319},[1101,9141,3842],{"class":3574},[1101,9143,3552],{"class":1325},[1101,9145,1320],{"class":1319},[1101,9147,9148,9150,9152,9154],{"class":1103,"line":3807},[1101,9149,6369],{"class":1315},[1101,9151,1823],{"class":1319},[1101,9153,6473],{"class":1124},[1101,9155,2683],{"class":1325},[1101,9157,9158],{"class":1103,"line":3812},[1101,9159,3599],{"class":1319},[1101,9161,9162,9164],{"class":1103,"line":3818},[1101,9163,1503],{"class":1319},[1101,9165,1506],{"class":1315},[1101,9167,9168,9170,9172],{"class":1103,"line":3847},[1101,9169,1650],{"class":1319},[1101,9171,5126],{"class":1325},[1101,9173,1580],{"class":1319},[1101,9175,9176],{"class":1103,"line":3888},[1101,9177,1384],{"emptyLinePlaceholder":21},[1101,9179,9180,9182,9184],{"class":1103,"line":3917},[1101,9181,1574],{"class":1319},[1101,9183,1577],{"class":1325},[1101,9185,1580],{"class":1319},[1101,9187,9188,9190,9192,9194,9196,9198,9200,9202],{"class":1103,"line":3929},[1101,9189,1587],{"class":1319},[1101,9191,5441],{"class":1325},[1101,9193,5444],{"class":1602},[1101,9195,1606],{"class":1319},[1101,9197,1533],{"class":1319},[1101,9199,5451],{"class":1111},[1101,9201,1533],{"class":1319},[1101,9203,1580],{"class":1319},[1101,9205,9206,9208,9210,9212,9214],{"class":1103,"line":3945},[1101,9207,1596],{"class":1319},[1101,9209,1577],{"class":1325},[1101,9211,5464],{"class":1319},[1101,9213,8280],{"class":1602},[1101,9215,1580],{"class":1319},[1101,9217,9218,9220,9222],{"class":1103,"line":3959},[1101,9219,1620],{"class":1319},[1101,9221,8290],{"class":1325},[1101,9223,1626],{"class":1319},[1101,9225,9226,9228,9230],{"class":1103,"line":3966},[1101,9227,1631],{"class":1319},[1101,9229,1577],{"class":1325},[1101,9231,1580],{"class":1319},[1101,9233,9234,9236,9238,9240,9242],{"class":1103,"line":3971},[1101,9235,1596],{"class":1319},[1101,9237,1577],{"class":1325},[1101,9239,5464],{"class":1319},[1101,9241,5467],{"class":1602},[1101,9243,1580],{"class":1319},[1101,9245,9247,9249,9251,9253,9255,9257,9259,9261],{"class":9246,"line":3976},[1103,1584],[1101,9248,1620],{"class":1319},[1101,9250,5476],{"class":1325},[1101,9252,5479],{"class":1602},[1101,9254,1606],{"class":1319},[1101,9256,1533],{"class":1319},[1101,9258,6550],{"class":1111},[1101,9260,1533],{"class":1319},[1101,9262,1580],{"class":1319},[1101,9264,9266,9268],{"class":9265,"line":3982},[1103,1584],[1101,9267,5495],{"class":1319},[1101,9269,6561],{"class":1325},[1101,9271,9273,9275,9277,9279,9281],{"class":9272,"line":3999},[1103,1584],[1101,9274,6566],{"class":1602},[1101,9276,1606],{"class":1319},[1101,9278,1533],{"class":1319},[1101,9280,6573],{"class":1111},[1101,9282,5552],{"class":1319},[1101,9284,9285,9287,9289,9291,9293],{"class":1103,"line":4021},[1101,9286,5558],{"class":1602},[1101,9288,1606],{"class":1319},[1101,9290,1533],{"class":1319},[1101,9292,6586],{"class":1111},[1101,9294,5552],{"class":1319},[1101,9296,9297],{"class":1103,"line":4039},[1101,9298,6593],{"class":1602},[1101,9300,9301,9303,9305,9307,9309],{"class":1103,"line":4047},[1101,9302,6598],{"class":1602},[1101,9304,1606],{"class":1319},[1101,9306,1533],{"class":1319},[1101,9308,6605],{"class":1111},[1101,9310,5552],{"class":1319},[1101,9312,9313],{"class":1103,"line":4064},[1101,9314,5618],{"class":1319},[1101,9316,9317,9319,9321,9323,9325,9327,9329,9331,9333,9335,9337],{"class":1103,"line":4085},[1101,9318,5624],{"class":1319},[1101,9320,1577],{"class":1325},[1101,9322,5464],{"class":1319},[1101,9324,371],{"class":1602},[1101,9326,1606],{"class":1319},[1101,9328,1533],{"class":1319},[1101,9330,1880],{"class":1319},[1101,9332,6630],{"class":1315},[1101,9334,1503],{"class":1319},[1101,9336,1533],{"class":1319},[1101,9338,1580],{"class":1319},[1101,9340,9341,9343,9345,9347,9349,9351,9353,9355,9357,9359,9361,9363,9365,9367,9369,9371,9373,9375,9377,9379,9381,9383,9385,9387,9389,9391,9393,9395,9397,9399,9401,9403],{"class":1103,"line":4095},[1101,9342,6641],{"class":1319},[1101,9344,1577],{"class":1325},[1101,9346,6646],{"class":1305},[1101,9348,1606],{"class":1319},[1101,9350,1533],{"class":1319},[1101,9352,6653],{"class":1315},[1101,9354,1731],{"class":1319},[1101,9356,6658],{"class":1315},[1101,9358,6661],{"class":1319},[1101,9360,2632],{"class":1315},[1101,9362,1823],{"class":1319},[1101,9364,2213],{"class":1315},[1101,9366,1533],{"class":1319},[1101,9368,6672],{"class":1319},[1101,9370,6675],{"class":1602},[1101,9372,1606],{"class":1319},[1101,9374,6680],{"class":1319},[1101,9376,4482],{"class":1315},[1101,9378,1823],{"class":1319},[1101,9380,2032],{"class":1315},[1101,9382,1503],{"class":1319},[1101,9384,6691],{"class":1111},[1101,9386,5398],{"class":1319},[1101,9388,6696],{"class":1315},[1101,9390,1823],{"class":1319},[1101,9392,6172],{"class":1315},[1101,9394,1503],{"class":1319},[1101,9396,6691],{"class":1111},[1101,9398,5398],{"class":1319},[1101,9400,6709],{"class":1315},[1101,9402,6712],{"class":1319},[1101,9404,1580],{"class":1319},[1101,9406,9407,9409],{"class":1103,"line":4105},[1101,9408,6719],{"class":1319},[1101,9410,6722],{"class":1325},[1101,9412,9413,9415,9417,9419,9421],{"class":1103,"line":4115},[1101,9414,6727],{"class":1602},[1101,9416,1606],{"class":1319},[1101,9418,1533],{"class":1319},[1101,9420,6734],{"class":1111},[1101,9422,5552],{"class":1319},[1101,9424,9425,9427,9429,9431,9433],{"class":1103,"line":4132},[1101,9426,6741],{"class":1602},[1101,9428,1606],{"class":1319},[1101,9430,1533],{"class":1319},[1101,9432,6748],{"class":1111},[1101,9434,5552],{"class":1319},[1101,9436,9437,9439,9441,9443,9445],{"class":1103,"line":4143},[1101,9438,6755],{"class":1602},[1101,9440,1606],{"class":1319},[1101,9442,1533],{"class":1319},[1101,9444,6762],{"class":1111},[1101,9446,5552],{"class":1319},[1101,9448,9449],{"class":1103,"line":4149},[1101,9450,6769],{"class":1319},[1101,9452,9453,9455],{"class":1103,"line":4155},[1101,9454,6774],{"class":1319},[1101,9456,6777],{"class":1325},[1101,9458,9459,9461,9463,9465,9467],{"class":1103,"line":4165},[1101,9460,6782],{"class":1602},[1101,9462,1606],{"class":1319},[1101,9464,1533],{"class":1319},[1101,9466,6748],{"class":1111},[1101,9468,5552],{"class":1319},[1101,9470,9471,9473,9475,9477,9479],{"class":1103,"line":4175},[1101,9472,6795],{"class":1602},[1101,9474,1606],{"class":1319},[1101,9476,1533],{"class":1319},[1101,9478,6802],{"class":1111},[1101,9480,5552],{"class":1319},[1101,9482,9483,9485,9487,9489,9491],{"class":1103,"line":4188},[1101,9484,6809],{"class":1602},[1101,9486,1606],{"class":1319},[1101,9488,1533],{"class":1319},[1101,9490,6816],{"class":1111},[1101,9492,5552],{"class":1319},[1101,9494,9495],{"class":1103,"line":4203},[1101,9496,6823],{"class":1319},[1101,9498,9499,9501,9503],{"class":1103,"line":4208},[1101,9500,6828],{"class":1319},[1101,9502,6831],{"class":1325},[1101,9504,1580],{"class":1319},[1101,9506,9507],{"class":1103,"line":4213},[1101,9508,1384],{"emptyLinePlaceholder":21},[1101,9510,9511,9513],{"class":1103,"line":4223},[1101,9512,6719],{"class":1319},[1101,9514,6777],{"class":1325},[1101,9516,9517,9519,9521,9523,9525],{"class":1103,"line":4239},[1101,9518,6848],{"class":1602},[1101,9520,1606],{"class":1319},[1101,9522,1533],{"class":1319},[1101,9524,6855],{"class":1111},[1101,9526,5552],{"class":1319},[1101,9528,9529,9531,9533,9535,9537],{"class":1103,"line":4254},[1101,9530,6862],{"class":1602},[1101,9532,1606],{"class":1319},[1101,9534,1533],{"class":1319},[1101,9536,6748],{"class":1111},[1101,9538,5552],{"class":1319},[1101,9540,9541,9543,9545,9547,9549],{"class":1103,"line":4260},[1101,9542,6875],{"class":1602},[1101,9544,1606],{"class":1319},[1101,9546,1533],{"class":1319},[1101,9548,6882],{"class":1111},[1101,9550,5552],{"class":1319},[1101,9552,9553,9555,9557,9559,9561],{"class":1103,"line":4266},[1101,9554,6889],{"class":1602},[1101,9556,1606],{"class":1319},[1101,9558,1533],{"class":1319},[1101,9560,6816],{"class":1111},[1101,9562,5552],{"class":1319},[1101,9564,9565],{"class":1103,"line":4274},[1101,9566,6902],{"class":1319},[1101,9568,9569,9571,9573],{"class":1103,"line":4279},[1101,9570,6907],{"class":1319},[1101,9572,1577],{"class":1325},[1101,9574,1580],{"class":1319},[1101,9576,9577,9579,9581],{"class":1103,"line":4285},[1101,9578,6916],{"class":1319},[1101,9580,1577],{"class":1325},[1101,9582,1580],{"class":1319},[1101,9584,9585,9587,9589],{"class":1103,"line":4305},[1101,9586,5521],{"class":1319},[1101,9588,5097],{"class":1325},[1101,9590,1580],{"class":1319},[1101,9592,9593],{"class":1103,"line":4320},[1101,9594,1384],{"emptyLinePlaceholder":21},[1101,9596,9597,9599],{"class":1103,"line":4337},[1101,9598,5495],{"class":1319},[1101,9600,5537],{"class":1325},[1101,9602,9603,9605,9607,9609,9611],{"class":1103,"line":4360},[1101,9604,5543],{"class":1602},[1101,9606,1606],{"class":1319},[1101,9608,1533],{"class":1319},[1101,9610,5208],{"class":1111},[1101,9612,5552],{"class":1319},[1101,9614,9615,9617,9619,9621,9623],{"class":1103,"line":4371},[1101,9616,6955],{"class":1602},[1101,9618,1606],{"class":1319},[1101,9620,1533],{"class":1319},[1101,9622,6962],{"class":1111},[1101,9624,5552],{"class":1319},[1101,9626,9627,9629,9631,9633,9635],{"class":1103,"line":4379},[1101,9628,5573],{"class":1602},[1101,9630,1606],{"class":1319},[1101,9632,1533],{"class":1319},[1101,9634,5580],{"class":1111},[1101,9636,5552],{"class":1319},[1101,9638,9639,9641,9643,9645,9647],{"class":1103,"line":4385},[1101,9640,6598],{"class":1602},[1101,9642,1606],{"class":1319},[1101,9644,1533],{"class":1319},[1101,9646,6987],{"class":1111},[1101,9648,5552],{"class":1319},[1101,9650,9651,9653,9655,9657,9659],{"class":1103,"line":4390},[1101,9652,5603],{"class":1602},[1101,9654,1606],{"class":1319},[1101,9656,1533],{"class":1319},[1101,9658,7000],{"class":1111},[1101,9660,5552],{"class":1319},[1101,9662,9663],{"class":1103,"line":4413},[1101,9664,5618],{"class":1319},[1101,9666,9667,9669],{"class":1103,"line":4419},[1101,9668,5624],{"class":1319},[1101,9670,7013],{"class":1325},[1101,9672,9673,9675,9677,9679,9681],{"class":1103,"line":4439},[1101,9674,7018],{"class":1602},[1101,9676,1606],{"class":1319},[1101,9678,1533],{"class":1319},[1101,9680,6586],{"class":1111},[1101,9682,5552],{"class":1319},[1101,9684,9685,9687,9689,9691,9693],{"class":1103,"line":4445},[1101,9686,7031],{"class":1602},[1101,9688,1606],{"class":1319},[1101,9690,1533],{"class":1319},[1101,9692,5637],{"class":1111},[1101,9694,5552],{"class":1319},[1101,9696,9697,9699,9701,9703,9705],{"class":1103,"line":4491},[1101,9698,7044],{"class":1602},[1101,9700,1606],{"class":1319},[1101,9702,1533],{"class":1319},[1101,9704,7051],{"class":1111},[1101,9706,5552],{"class":1319},[1101,9708,9709,9711,9713,9715,9717],{"class":1103,"line":4507},[1101,9710,7058],{"class":1602},[1101,9712,1606],{"class":1319},[1101,9714,1533],{"class":1319},[1101,9716,7065],{"class":1111},[1101,9718,5552],{"class":1319},[1101,9720,9721],{"class":1103,"line":4540},[1101,9722,7072],{"class":1319},[1101,9724,9725,9727,9729],{"class":1103,"line":4554},[1101,9726,5521],{"class":1319},[1101,9728,5091],{"class":1325},[1101,9730,1580],{"class":1319},[1101,9732,9733,9735,9737],{"class":1103,"line":4562},[1101,9734,5655],{"class":1319},[1101,9736,5476],{"class":1325},[1101,9738,1580],{"class":1319},[1101,9740,9741,9743,9745],{"class":1103,"line":4567},[1101,9742,1631],{"class":1319},[1101,9744,1577],{"class":1325},[1101,9746,1580],{"class":1319},[1101,9748,9749,9751,9753],{"class":1103,"line":4574},[1101,9750,1641],{"class":1319},[1101,9752,5441],{"class":1325},[1101,9754,1580],{"class":1319},[1101,9756,9757,9759,9761],{"class":1103,"line":4579},[1101,9758,1650],{"class":1319},[1101,9760,1577],{"class":1325},[1101,9762,1580],{"class":1319},[990,9764,4640,9765,9768,9769,9771],{},[1051,9766,9767],{},"refreshNuxtData('chats')"," call in the chat page's ",[1051,9770,7174],{}," callback (as shown earlier) ensures the chat list updates automatically when a new title is generated.",[994,9773,9775],{"id":9774},"adding-multi-model-support","Adding multi-model support",[990,9777,9778,9779,9782],{},"One of the benefits of using ",[1044,9780,4609],{"href":1080,"rel":9781},[1048]," is the ability to switch between models seamlessly. This section adds a model selector to the chat.",[1129,9784,9786],{"id":9785},"creating-a-models-composable","Creating a models composable",[990,9788,9789,9790,1329],{},"Define the available models and persist the user's selection using ",[1044,9791,9794],{"href":9792,"rel":9793},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-cookie",[1048],[1051,9795,9796],{},"useCookie",[1292,9798,9799],{},[1092,9800,9803],{"className":1296,"code":9801,"filename":9802,"language":1298,"meta":1097,"style":1097},"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",[1051,9804,9805,9818,9829,9872,9913,9954,9959,9963,9993,10010,10016,10020,10026,10033,10038,10042],{"__ignoreMap":1097},[1101,9806,9807,9809,9811,9814,9816],{"class":1103,"line":1104},[1101,9808,1306],{"class":1305},[1101,9810,5190],{"class":1602},[1101,9812,9813],{"class":1124}," useModels",[1101,9815,1820],{"class":1319},[1101,9817,1395],{"class":1319},[1101,9819,9820,9822,9825,9827],{"class":1103,"line":1121},[1101,9821,2627],{"class":1602},[1101,9823,9824],{"class":1315}," models",[1101,9826,2637],{"class":1319},[1101,9828,1332],{"class":1325},[1101,9830,9831,9834,9836,9838,9840,9842,9844,9846,9848,9850,9852,9854,9856,9858,9861,9863,9865,9868,9870],{"class":1103,"line":1335},[1101,9832,9833],{"class":1319},"    {",[1101,9835,3104],{"class":1325},[1101,9837,1329],{"class":1319},[1101,9839,1406],{"class":1319},[1101,9841,3111],{"class":1111},[1101,9843,1344],{"class":1319},[1101,9845,1731],{"class":1319},[1101,9847,3090],{"class":1325},[1101,9849,1329],{"class":1319},[1101,9851,1406],{"class":1319},[1101,9853,3097],{"class":1111},[1101,9855,1344],{"class":1319},[1101,9857,1731],{"class":1319},[1101,9859,9860],{"class":1325}," icon",[1101,9862,1329],{"class":1319},[1101,9864,1406],{"class":1319},[1101,9866,9867],{"class":1111},"i-simple-icons-openai",[1101,9869,1344],{"class":1319},[1101,9871,3116],{"class":1319},[1101,9873,9874,9876,9878,9880,9882,9884,9886,9888,9890,9892,9894,9896,9898,9900,9902,9904,9906,9909,9911],{"class":1103,"line":1350},[1101,9875,9833],{"class":1319},[1101,9877,3104],{"class":1325},[1101,9879,1329],{"class":1319},[1101,9881,1406],{"class":1319},[1101,9883,3142],{"class":1111},[1101,9885,1344],{"class":1319},[1101,9887,1731],{"class":1319},[1101,9889,3090],{"class":1325},[1101,9891,1329],{"class":1319},[1101,9893,1406],{"class":1319},[1101,9895,3129],{"class":1111},[1101,9897,1344],{"class":1319},[1101,9899,1731],{"class":1319},[1101,9901,9860],{"class":1325},[1101,9903,1329],{"class":1319},[1101,9905,1406],{"class":1319},[1101,9907,9908],{"class":1111},"i-simple-icons-anthropic",[1101,9910,1344],{"class":1319},[1101,9912,3116],{"class":1319},[1101,9914,9915,9917,9919,9921,9923,9925,9927,9929,9931,9933,9935,9937,9939,9941,9943,9945,9947,9950,9952],{"class":1103,"line":1362},[1101,9916,9833],{"class":1319},[1101,9918,3104],{"class":1325},[1101,9920,1329],{"class":1319},[1101,9922,1406],{"class":1319},[1101,9924,3172],{"class":1111},[1101,9926,1344],{"class":1319},[1101,9928,1731],{"class":1319},[1101,9930,3090],{"class":1325},[1101,9932,1329],{"class":1319},[1101,9934,1406],{"class":1319},[1101,9936,3159],{"class":1111},[1101,9938,1344],{"class":1319},[1101,9940,1731],{"class":1319},[1101,9942,9860],{"class":1325},[1101,9944,1329],{"class":1319},[1101,9946,1406],{"class":1319},[1101,9948,9949],{"class":1111},"i-simple-icons-google",[1101,9951,1344],{"class":1319},[1101,9953,3177],{"class":1319},[1101,9955,9956],{"class":1103,"line":1373},[1101,9957,9958],{"class":1325},"  ]\n",[1101,9960,9961],{"class":1103,"line":1381},[1101,9962,1384],{"emptyLinePlaceholder":21},[1101,9964,9965,9967,9969,9971,9974,9976,9978,9980,9982,9984,9987,9989,9991],{"class":1103,"line":1387},[1101,9966,2627],{"class":1602},[1101,9968,3282],{"class":1315},[1101,9970,2637],{"class":1319},[1101,9972,9973],{"class":1124}," useCookie",[1101,9975,1574],{"class":1319},[1101,9977,3255],{"class":1107},[1101,9979,2680],{"class":1319},[1101,9981,1316],{"class":1325},[1101,9983,1344],{"class":1319},[1101,9985,9986],{"class":1111},"ai-model",[1101,9988,1344],{"class":1319},[1101,9990,1731],{"class":1319},[1101,9992,1395],{"class":1319},[1101,9994,9995,9998,10000,10002,10004,10006,10008],{"class":1103,"line":1398},[1101,9996,9997],{"class":1124},"    default",[1101,9999,1329],{"class":1319},[1101,10001,4976],{"class":1319},[1101,10003,1840],{"class":1602},[1101,10005,1406],{"class":1319},[1101,10007,3129],{"class":1111},[1101,10009,1370],{"class":1319},[1101,10011,10012,10014],{"class":1103,"line":1414},[1101,10013,2428],{"class":1319},[1101,10015,1506],{"class":1325},[1101,10017,10018],{"class":1103,"line":1420},[1101,10019,1384],{"emptyLinePlaceholder":21},[1101,10021,10022,10024],{"class":1103,"line":1425},[1101,10023,2854],{"class":1305},[1101,10025,1395],{"class":1319},[1101,10027,10028,10031],{"class":1103,"line":1448},[1101,10029,10030],{"class":1315},"    models",[1101,10032,1347],{"class":1319},[1101,10034,10035],{"class":1103,"line":1453},[1101,10036,10037],{"class":1315},"    model\n",[1101,10039,10040],{"class":1103,"line":1463},[1101,10041,3599],{"class":1319},[1101,10043,10044],{"class":1103,"line":1473},[1101,10045,5414],{"class":1319},[1129,10047,10049],{"id":10048},"building-the-model-selector","Building the model selector",[990,10051,1657,10052,10057],{},[1044,10053,10054],{"href":734},[1051,10055,10056],{},"USelectMenu"," component that displays the available models:",[1292,10059,10060],{},[1092,10061,10064],{"className":1564,"code":10062,"filename":10063,"language":34,"meta":1097,"style":1097},"\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",[1051,10065,10066,10086,10119,10123,10140,10144,10162,10194,10198,10206,10210,10218,10225,10238,10252,10266,10279,10292,10297],{"__ignoreMap":1097},[1101,10067,10068,10070,10072,10074,10076,10078,10080,10082,10084],{"class":1103,"line":1104},[1101,10069,1574],{"class":1319},[1101,10071,5126],{"class":1325},[1101,10073,5129],{"class":1602},[1101,10075,5132],{"class":1602},[1101,10077,1606],{"class":1319},[1101,10079,1533],{"class":1319},[1101,10081,1298],{"class":1111},[1101,10083,1533],{"class":1319},[1101,10085,1580],{"class":1319},[1101,10087,10088,10090,10093,10095,10098,10100,10102,10104,10106,10108,10111,10113,10115,10117],{"class":1103,"line":1121},[1101,10089,3075],{"class":1602},[1101,10091,10092],{"class":1315}," model ",[1101,10094,1606],{"class":1319},[1101,10096,10097],{"class":1124}," defineModel",[1101,10099,1574],{"class":1319},[1101,10101,3255],{"class":1107},[1101,10103,2680],{"class":1319},[1101,10105,1316],{"class":1315},[1101,10107,1880],{"class":1319},[1101,10109,10110],{"class":1325}," required",[1101,10112,1329],{"class":1319},[1101,10114,4183],{"class":1481},[1101,10116,1747],{"class":1319},[1101,10118,1506],{"class":1315},[1101,10120,10121],{"class":1103,"line":1335},[1101,10122,1384],{"emptyLinePlaceholder":21},[1101,10124,10125,10127,10129,10132,10134,10136,10138],{"class":1103,"line":1350},[1101,10126,3075],{"class":1602},[1101,10128,1725],{"class":1319},[1101,10130,10131],{"class":1315}," models ",[1101,10133,1503],{"class":1319},[1101,10135,2637],{"class":1319},[1101,10137,9813],{"class":1124},[1101,10139,2683],{"class":1315},[1101,10141,10142],{"class":1103,"line":1362},[1101,10143,1384],{"emptyLinePlaceholder":21},[1101,10145,10146,10148,10151,10153,10155,10157,10159],{"class":1103,"line":1373},[1101,10147,3075],{"class":1602},[1101,10149,10150],{"class":1315}," selectedModel ",[1101,10152,1606],{"class":1319},[1101,10154,7606],{"class":1124},[1101,10156,1316],{"class":1315},[1101,10158,1820],{"class":1319},[1101,10160,10161],{"class":1602}," =>\n",[1101,10163,10164,10167,10169,10172,10174,10176,10178,10180,10182,10185,10187,10189,10191],{"class":1103,"line":1381},[1101,10165,10166],{"class":1315},"  models",[1101,10168,1823],{"class":1319},[1101,10170,10171],{"class":1124},"find",[1101,10173,1316],{"class":1315},[1101,10175,3351],{"class":1957},[1101,10177,1840],{"class":1602},[1101,10179,3356],{"class":1315},[1101,10181,1823],{"class":1319},[1101,10183,10184],{"class":1315},"value ",[1101,10186,7685],{"class":1319},[1101,10188,3282],{"class":1315},[1101,10190,1823],{"class":1319},[1101,10192,10193],{"class":1315},"value)\n",[1101,10195,10196],{"class":1103,"line":1387},[1101,10197,1506],{"class":1315},[1101,10199,10200,10202,10204],{"class":1103,"line":1398},[1101,10201,1650],{"class":1319},[1101,10203,5126],{"class":1325},[1101,10205,1580],{"class":1319},[1101,10207,10208],{"class":1103,"line":1414},[1101,10209,1384],{"emptyLinePlaceholder":21},[1101,10211,10212,10214,10216],{"class":1103,"line":1420},[1101,10213,1574],{"class":1319},[1101,10215,1577],{"class":1325},[1101,10217,1580],{"class":1319},[1101,10219,10220,10222],{"class":1103,"line":1425},[1101,10221,1587],{"class":1319},[1101,10223,10224],{"class":1325},"USelectMenu\n",[1101,10226,10227,10230,10232,10234,10236],{"class":1103,"line":1448},[1101,10228,10229],{"class":1602},"    v-model",[1101,10231,1606],{"class":1319},[1101,10233,1533],{"class":1319},[1101,10235,4653],{"class":1111},[1101,10237,5552],{"class":1319},[1101,10239,10240,10243,10245,10247,10250],{"class":1103,"line":1453},[1101,10241,10242],{"class":1602},"    :items",[1101,10244,1606],{"class":1319},[1101,10246,1533],{"class":1319},[1101,10248,10249],{"class":1111},"models",[1101,10251,5552],{"class":1319},[1101,10253,10254,10257,10259,10261,10264],{"class":1103,"line":1463},[1101,10255,10256],{"class":1602},"    :icon",[1101,10258,1606],{"class":1319},[1101,10260,1533],{"class":1319},[1101,10262,10263],{"class":1111},"selectedModel?.icon",[1101,10265,5552],{"class":1319},[1101,10267,10268,10271,10273,10275,10277],{"class":1103,"line":1473},[1101,10269,10270],{"class":1602},"    variant",[1101,10272,1606],{"class":1319},[1101,10274,1533],{"class":1319},[1101,10276,7887],{"class":1111},[1101,10278,5552],{"class":1319},[1101,10280,10281,10284,10286,10288,10290],{"class":1103,"line":1489},[1101,10282,10283],{"class":1602},"    value-key",[1101,10285,1606],{"class":1319},[1101,10287,1533],{"class":1319},[1101,10289,3336],{"class":1111},[1101,10291,5552],{"class":1319},[1101,10293,10294],{"class":1103,"line":1495},[1101,10295,10296],{"class":1319},"  \u002F>\n",[1101,10298,10299,10301,10303],{"class":1103,"line":1500},[1101,10300,1650],{"class":1319},[1101,10302,1577],{"class":1325},[1101,10304,1580],{"class":1319},[1129,10306,10308],{"id":10307},"integrating-with-the-chat","Integrating with the chat",[990,10310,10311],{},"Update the chat page to include the model selector and pass the selected model to the server:",[1292,10313,10314],{},[1710,10315,10316],{},[1092,10317,10320],{"className":1564,"code":10318,"filename":5745,"highlights":10319,"language":34,"meta":1097,"style":1097},"\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",[1387,2343,2375,2391,4360,4371,4379],[1051,10321,10322,10342,10368,10386,10404,10408,10420,10432,10449,10453,10495,10499,10515,10555,10559,10563,10579,10583,10599,10617,10635,10649,10675,10683,10699,10704,10713,10725,10749,10763,10767,10771,10783,10795,10809,10823,10835,10841,10845,10851,10855,10873,10883,10903,10929,10941,10945,10949,10953,10965,10993,11003,11007,11013,11021,11025,11033,11051,11063,11071,11079,11091,11109,11115,11127,11139,11143,11155,11159,11183,11249,11255,11267,11279,11291,11295,11301,11313,11325,11337,11341,11349,11353,11359,11371,11383,11395,11407,11411,11419,11427,11435,11439,11445,11458,11471,11484,11496,11508,11512,11525,11545,11553,11557,11563,11575,11587,11599,11611,11615,11623,11631,11640,11649],{"__ignoreMap":1097},[1101,10323,10324,10326,10328,10330,10332,10334,10336,10338,10340],{"class":1103,"line":1104},[1101,10325,1574],{"class":1319},[1101,10327,5126],{"class":1325},[1101,10329,5129],{"class":1602},[1101,10331,5132],{"class":1602},[1101,10333,1606],{"class":1319},[1101,10335,1533],{"class":1319},[1101,10337,1298],{"class":1111},[1101,10339,1533],{"class":1319},[1101,10341,1580],{"class":1319},[1101,10343,10344,10346,10348,10350,10352,10354,10356,10358,10360,10362,10364,10366],{"class":1103,"line":1121},[1101,10345,1722],{"class":1305},[1101,10347,1725],{"class":1319},[1101,10349,5778],{"class":1315},[1101,10351,1731],{"class":1319},[1101,10353,5783],{"class":1315},[1101,10355,1731],{"class":1319},[1101,10357,5788],{"class":1315},[1101,10359,1747],{"class":1319},[1101,10361,1750],{"class":1305},[1101,10363,1406],{"class":1319},[1101,10365,2548],{"class":1111},[1101,10367,1370],{"class":1319},[1101,10369,10370,10372,10374,10376,10378,10380,10382,10384],{"class":1103,"line":1335},[1101,10371,1722],{"class":1305},[1101,10373,1725],{"class":1319},[1101,10375,5808],{"class":1315},[1101,10377,1747],{"class":1319},[1101,10379,1750],{"class":1305},[1101,10381,1406],{"class":1319},[1101,10383,5817],{"class":1111},[1101,10385,1370],{"class":1319},[1101,10387,10388,10390,10392,10394,10396,10398,10400,10402],{"class":1103,"line":1350},[1101,10389,1722],{"class":1305},[1101,10391,1725],{"class":1319},[1101,10393,5829],{"class":1315},[1101,10395,1747],{"class":1319},[1101,10397,1750],{"class":1305},[1101,10399,1406],{"class":1319},[1101,10401,5838],{"class":1111},[1101,10403,1370],{"class":1319},[1101,10405,10406],{"class":1103,"line":1362},[1101,10407,1384],{"emptyLinePlaceholder":21},[1101,10409,10410,10412,10414,10416,10418],{"class":1103,"line":1373},[1101,10411,3075],{"class":1602},[1101,10413,5851],{"class":1315},[1101,10415,1606],{"class":1319},[1101,10417,5856],{"class":1124},[1101,10419,2683],{"class":1315},[1101,10421,10422,10424,10426,10428,10430],{"class":1103,"line":1381},[1101,10423,3075],{"class":1602},[1101,10425,5865],{"class":1315},[1101,10427,1606],{"class":1319},[1101,10429,5870],{"class":1124},[1101,10431,2683],{"class":1315},[1101,10433,10435,10437,10439,10441,10443,10445,10447],{"class":10434,"line":1387},[1103,1584],[1101,10436,3075],{"class":1602},[1101,10438,1725],{"class":1319},[1101,10440,10092],{"class":1315},[1101,10442,1503],{"class":1319},[1101,10444,2637],{"class":1319},[1101,10446,9813],{"class":1124},[1101,10448,2683],{"class":1315},[1101,10450,10451],{"class":1103,"line":1398},[1101,10452,1384],{"emptyLinePlaceholder":21},[1101,10454,10455,10457,10459,10461,10463,10465,10467,10469,10471,10473,10475,10477,10479,10481,10483,10485,10487,10489,10491,10493],{"class":1103,"line":1414},[1101,10456,3075],{"class":1602},[1101,10458,1725],{"class":1319},[1101,10460,5890],{"class":1325},[1101,10462,1329],{"class":1319},[1101,10464,5895],{"class":1315},[1101,10466,1503],{"class":1319},[1101,10468,2637],{"class":1319},[1101,10470,2640],{"class":1305},[1101,10472,5904],{"class":1124},[1101,10474,1316],{"class":1315},[1101,10476,3691],{"class":1319},[1101,10478,5911],{"class":1111},[1101,10480,5398],{"class":1319},[1101,10482,5916],{"class":1315},[1101,10484,1823],{"class":1319},[1101,10486,5921],{"class":1315},[1101,10488,1823],{"class":1319},[1101,10490,2032],{"class":1315},[1101,10492,5407],{"class":1319},[1101,10494,1506],{"class":1315},[1101,10496,10497],{"class":1103,"line":1420},[1101,10498,1384],{"emptyLinePlaceholder":21},[1101,10500,10501,10503,10505,10507,10509,10511,10513],{"class":1103,"line":1425},[1101,10502,5938],{"class":1305},[1101,10504,1966],{"class":1315},[1101,10506,3547],{"class":1319},[1101,10508,5945],{"class":1315},[1101,10510,1823],{"class":1319},[1101,10512,5950],{"class":1315},[1101,10514,1320],{"class":1319},[1101,10516,10517,10519,10521,10523,10525,10527,10529,10531,10533,10535,10537,10539,10541,10543,10545,10547,10549,10551,10553],{"class":1103,"line":1448},[1101,10518,5957],{"class":1305},[1101,10520,2913],{"class":1124},[1101,10522,1316],{"class":1325},[1101,10524,1880],{"class":1319},[1101,10526,3569],{"class":1325},[1101,10528,1329],{"class":1319},[1101,10530,3575],{"class":3574},[1101,10532,1731],{"class":1319},[1101,10534,3580],{"class":1325},[1101,10536,1329],{"class":1319},[1101,10538,1406],{"class":1319},[1101,10540,3587],{"class":1111},[1101,10542,1344],{"class":1319},[1101,10544,1731],{"class":1319},[1101,10546,5986],{"class":1325},[1101,10548,1329],{"class":1319},[1101,10550,4183],{"class":1481},[1101,10552,1747],{"class":1319},[1101,10554,1506],{"class":1325},[1101,10556,10557],{"class":1103,"line":1453},[1101,10558,5414],{"class":1319},[1101,10560,10561],{"class":1103,"line":1463},[1101,10562,1384],{"emptyLinePlaceholder":21},[1101,10564,10565,10567,10569,10571,10573,10575,10577],{"class":1103,"line":1473},[1101,10566,3075],{"class":1602},[1101,10568,5149],{"class":1315},[1101,10570,1606],{"class":1319},[1101,10572,5154],{"class":1124},[1101,10574,1316],{"class":1315},[1101,10576,5159],{"class":1319},[1101,10578,1506],{"class":1315},[1101,10580,10581],{"class":1103,"line":1489},[1101,10582,1384],{"emptyLinePlaceholder":21},[1101,10584,10585,10587,10589,10591,10593,10595,10597],{"class":1103,"line":1495},[1101,10586,3075],{"class":1602},[1101,10588,6035],{"class":1315},[1101,10590,1606],{"class":1319},[1101,10592,1917],{"class":1319},[1101,10594,5808],{"class":1124},[1101,10596,1316],{"class":1315},[1101,10598,1320],{"class":1319},[1101,10600,10601,10603,10605,10607,10609,10611,10613,10615],{"class":1103,"line":1500},[1101,10602,1813],{"class":1325},[1101,10604,1329],{"class":1319},[1101,10606,6055],{"class":1315},[1101,10608,1823],{"class":1319},[1101,10610,3336],{"class":1315},[1101,10612,1823],{"class":1319},[1101,10614,2032],{"class":1315},[1101,10616,1347],{"class":1319},[1101,10618,10619,10621,10623,10625,10627,10629,10631,10633],{"class":1103,"line":2289},[1101,10620,1973],{"class":1325},[1101,10622,1329],{"class":1319},[1101,10624,6055],{"class":1315},[1101,10626,1823],{"class":1319},[1101,10628,3336],{"class":1315},[1101,10630,1823],{"class":1319},[1101,10632,2011],{"class":1315},[1101,10634,1347],{"class":1319},[1101,10636,10637,10639,10641,10643,10645,10647],{"class":1103,"line":2302},[1101,10638,6090],{"class":1325},[1101,10640,1329],{"class":1319},[1101,10642,1917],{"class":1319},[1101,10644,5778],{"class":1124},[1101,10646,1316],{"class":1315},[1101,10648,1320],{"class":1319},[1101,10650,10651,10653,10655,10657,10659,10661,10663,10665,10667,10669,10671,10673],{"class":1103,"line":2332},[1101,10652,6106],{"class":1325},[1101,10654,1329],{"class":1319},[1101,10656,3685],{"class":1319},[1101,10658,5911],{"class":1111},[1101,10660,5398],{"class":1319},[1101,10662,5945],{"class":1315},[1101,10664,1823],{"class":1319},[1101,10666,3336],{"class":1315},[1101,10668,1823],{"class":1319},[1101,10670,2032],{"class":1315},[1101,10672,5407],{"class":1319},[1101,10674,1347],{"class":1319},[1101,10676,10677,10679,10681],{"class":1103,"line":2338},[1101,10678,5296],{"class":1325},[1101,10680,1329],{"class":1319},[1101,10682,1395],{"class":1319},[1101,10684,10686,10688,10690,10692,10694,10696],{"class":10685,"line":2343},[1103,1584],[1101,10687,3664],{"class":1325},[1101,10689,1329],{"class":1319},[1101,10691,3282],{"class":1315},[1101,10693,1823],{"class":1319},[1101,10695,10184],{"class":1315},[1101,10697,10698],{"class":1485},"\u002F\u002F Pass the selected model\n",[1101,10700,10702],{"class":10701,"line":2375},[1103,1584],[1101,10703,1492],{"class":1319},[1101,10705,10707,10709,10711],{"class":10706,"line":2391},[1103,1584],[1101,10708,2428],{"class":1319},[1101,10710,1897],{"class":1315},[1101,10712,1347],{"class":1319},[1101,10714,10715,10717,10719,10721,10723],{"class":1103,"line":2409},[1101,10716,6142],{"class":1325},[1101,10718,1316],{"class":1319},[1101,10720,6147],{"class":1957},[1101,10722,1897],{"class":1319},[1101,10724,1395],{"class":1319},[1101,10726,10727,10729,10731,10733,10735,10737,10739,10741,10743,10745,10747],{"class":1103,"line":2425},[1101,10728,6163],{"class":1305},[1101,10730,1966],{"class":1325},[1101,10732,6147],{"class":1315},[1101,10734,1823],{"class":1319},[1101,10736,6172],{"class":1315},[1101,10738,3363],{"class":1319},[1101,10740,1406],{"class":1319},[1101,10742,4330],{"class":1111},[1101,10744,1344],{"class":1319},[1101,10746,3552],{"class":1325},[1101,10748,1320],{"class":1319},[1101,10750,10751,10753,10755,10757,10759,10761],{"class":1103,"line":2433},[1101,10752,6190],{"class":1124},[1101,10754,1316],{"class":1325},[1101,10756,1344],{"class":1319},[1101,10758,1802],{"class":1111},[1101,10760,1344],{"class":1319},[1101,10762,1506],{"class":1325},[1101,10764,10765],{"class":1103,"line":3428},[1101,10766,1492],{"class":1319},[1101,10768,10769],{"class":1103,"line":3441},[1101,10770,1417],{"class":1319},[1101,10772,10773,10775,10777,10779,10781],{"class":1103,"line":3446},[1101,10774,6216],{"class":1325},[1101,10776,1316],{"class":1319},[1101,10778,6221],{"class":1957},[1101,10780,1897],{"class":1319},[1101,10782,1395],{"class":1319},[1101,10784,10785,10787,10789,10791,10793],{"class":1103,"line":3452},[1101,10786,6231],{"class":1315},[1101,10788,1823],{"class":1319},[1101,10790,6236],{"class":1124},[1101,10792,1316],{"class":1325},[1101,10794,1320],{"class":1319},[1101,10796,10797,10799,10801,10803,10805,10807],{"class":1103,"line":3483},[1101,10798,6246],{"class":1325},[1101,10800,1329],{"class":1319},[1101,10802,1406],{"class":1319},[1101,10804,497],{"class":1111},[1101,10806,1344],{"class":1319},[1101,10808,1347],{"class":1319},[1101,10810,10811,10813,10815,10817,10819,10821],{"class":1103,"line":3527},[1101,10812,6262],{"class":1325},[1101,10814,1329],{"class":1319},[1101,10816,6267],{"class":1315},[1101,10818,1823],{"class":1319},[1101,10820,4482],{"class":1315},[1101,10822,1347],{"class":1319},[1101,10824,10825,10827,10829,10831,10833],{"class":1103,"line":3534},[1101,10826,6279],{"class":1325},[1101,10828,1329],{"class":1319},[1101,10830,1406],{"class":1319},[1101,10832,6221],{"class":1111},[1101,10834,1370],{"class":1319},[1101,10836,10837,10839],{"class":1103,"line":3539},[1101,10838,3390],{"class":1319},[1101,10840,1506],{"class":1325},[1101,10842,10843],{"class":1103,"line":3557},[1101,10844,3599],{"class":1319},[1101,10846,10847,10849],{"class":1103,"line":3596},[1101,10848,1503],{"class":1319},[1101,10850,1506],{"class":1315},[1101,10852,10853],{"class":1103,"line":3602},[1101,10854,1384],{"emptyLinePlaceholder":21},[1101,10856,10857,10859,10861,10863,10865,10867,10869,10871],{"class":1103,"line":3607},[1101,10858,6315],{"class":1602},[1101,10860,6318],{"class":1124},[1101,10862,1316],{"class":1319},[1101,10864,6323],{"class":1957},[1101,10866,1329],{"class":1319},[1101,10868,6328],{"class":1107},[1101,10870,1897],{"class":1319},[1101,10872,1395],{"class":1319},[1101,10874,10875,10877,10879,10881],{"class":1103,"line":3613},[1101,10876,6337],{"class":1315},[1101,10878,1823],{"class":1319},[1101,10880,6342],{"class":1124},[1101,10882,2683],{"class":1325},[1101,10884,10885,10887,10889,10891,10893,10895,10897,10899,10901],{"class":1103,"line":3633},[1101,10886,3542],{"class":1305},[1101,10888,1966],{"class":1325},[1101,10890,5208],{"class":1315},[1101,10892,1823],{"class":1319},[1101,10894,3336],{"class":1315},[1101,10896,1823],{"class":1319},[1101,10898,5217],{"class":1124},[1101,10900,5220],{"class":1325},[1101,10902,1320],{"class":1319},[1101,10904,10905,10907,10909,10911,10913,10915,10917,10919,10921,10923,10925,10927],{"class":1103,"line":3661},[1101,10906,6369],{"class":1315},[1101,10908,1823],{"class":1319},[1101,10910,6374],{"class":1124},[1101,10912,1316],{"class":1325},[1101,10914,1880],{"class":1319},[1101,10916,1734],{"class":1325},[1101,10918,1329],{"class":1319},[1101,10920,5352],{"class":1315},[1101,10922,1823],{"class":1319},[1101,10924,3336],{"class":1315},[1101,10926,1747],{"class":1319},[1101,10928,1506],{"class":1325},[1101,10930,10931,10933,10935,10937,10939],{"class":1103,"line":3677},[1101,10932,6397],{"class":1315},[1101,10934,1823],{"class":1319},[1101,10936,3336],{"class":1315},[1101,10938,2637],{"class":1319},[1101,10940,6406],{"class":1319},[1101,10942,10943],{"class":1103,"line":3696},[1101,10944,3599],{"class":1319},[1101,10946,10947],{"class":1103,"line":3724},[1101,10948,5414],{"class":1319},[1101,10950,10951],{"class":1103,"line":3731},[1101,10952,1384],{"emptyLinePlaceholder":21},[1101,10954,10955,10957,10959,10961,10963],{"class":1103,"line":3736},[1101,10956,6428],{"class":1124},[1101,10958,1316],{"class":1315},[1101,10960,1820],{"class":1319},[1101,10962,1840],{"class":1602},[1101,10964,1395],{"class":1319},[1101,10966,10967,10969,10971,10973,10975,10977,10979,10981,10983,10985,10987,10989,10991],{"class":1103,"line":3802},[1101,10968,3542],{"class":1305},[1101,10970,1966],{"class":1325},[1101,10972,5945],{"class":1315},[1101,10974,1823],{"class":1319},[1101,10976,3336],{"class":1315},[1101,10978,3857],{"class":1319},[1101,10980,2011],{"class":1315},[1101,10982,1823],{"class":1319},[1101,10984,3836],{"class":1315},[1101,10986,3363],{"class":1319},[1101,10988,3842],{"class":3574},[1101,10990,3552],{"class":1325},[1101,10992,1320],{"class":1319},[1101,10994,10995,10997,10999,11001],{"class":1103,"line":3807},[1101,10996,6369],{"class":1315},[1101,10998,1823],{"class":1319},[1101,11000,6473],{"class":1124},[1101,11002,2683],{"class":1325},[1101,11004,11005],{"class":1103,"line":3812},[1101,11006,3599],{"class":1319},[1101,11008,11009,11011],{"class":1103,"line":3818},[1101,11010,1503],{"class":1319},[1101,11012,1506],{"class":1315},[1101,11014,11015,11017,11019],{"class":1103,"line":3847},[1101,11016,1650],{"class":1319},[1101,11018,5126],{"class":1325},[1101,11020,1580],{"class":1319},[1101,11022,11023],{"class":1103,"line":3888},[1101,11024,1384],{"emptyLinePlaceholder":21},[1101,11026,11027,11029,11031],{"class":1103,"line":3917},[1101,11028,1574],{"class":1319},[1101,11030,1577],{"class":1325},[1101,11032,1580],{"class":1319},[1101,11034,11035,11037,11039,11041,11043,11045,11047,11049],{"class":1103,"line":3929},[1101,11036,1587],{"class":1319},[1101,11038,5441],{"class":1325},[1101,11040,5444],{"class":1602},[1101,11042,1606],{"class":1319},[1101,11044,1533],{"class":1319},[1101,11046,5451],{"class":1111},[1101,11048,1533],{"class":1319},[1101,11050,1580],{"class":1319},[1101,11052,11053,11055,11057,11059,11061],{"class":1103,"line":3945},[1101,11054,1596],{"class":1319},[1101,11056,1577],{"class":1325},[1101,11058,5464],{"class":1319},[1101,11060,8280],{"class":1602},[1101,11062,1580],{"class":1319},[1101,11064,11065,11067,11069],{"class":1103,"line":3959},[1101,11066,1620],{"class":1319},[1101,11068,8290],{"class":1325},[1101,11070,1626],{"class":1319},[1101,11072,11073,11075,11077],{"class":1103,"line":3966},[1101,11074,1631],{"class":1319},[1101,11076,1577],{"class":1325},[1101,11078,1580],{"class":1319},[1101,11080,11081,11083,11085,11087,11089],{"class":1103,"line":3971},[1101,11082,1596],{"class":1319},[1101,11084,1577],{"class":1325},[1101,11086,5464],{"class":1319},[1101,11088,5467],{"class":1602},[1101,11090,1580],{"class":1319},[1101,11092,11093,11095,11097,11099,11101,11103,11105,11107],{"class":1103,"line":3976},[1101,11094,1620],{"class":1319},[1101,11096,5476],{"class":1325},[1101,11098,5479],{"class":1602},[1101,11100,1606],{"class":1319},[1101,11102,1533],{"class":1319},[1101,11104,6550],{"class":1111},[1101,11106,1533],{"class":1319},[1101,11108,1580],{"class":1319},[1101,11110,11111,11113],{"class":1103,"line":3982},[1101,11112,5495],{"class":1319},[1101,11114,6561],{"class":1325},[1101,11116,11117,11119,11121,11123,11125],{"class":1103,"line":3999},[1101,11118,6566],{"class":1602},[1101,11120,1606],{"class":1319},[1101,11122,1533],{"class":1319},[1101,11124,6573],{"class":1111},[1101,11126,5552],{"class":1319},[1101,11128,11129,11131,11133,11135,11137],{"class":1103,"line":4021},[1101,11130,5558],{"class":1602},[1101,11132,1606],{"class":1319},[1101,11134,1533],{"class":1319},[1101,11136,6586],{"class":1111},[1101,11138,5552],{"class":1319},[1101,11140,11141],{"class":1103,"line":4039},[1101,11142,6593],{"class":1602},[1101,11144,11145,11147,11149,11151,11153],{"class":1103,"line":4047},[1101,11146,6598],{"class":1602},[1101,11148,1606],{"class":1319},[1101,11150,1533],{"class":1319},[1101,11152,6605],{"class":1111},[1101,11154,5552],{"class":1319},[1101,11156,11157],{"class":1103,"line":4064},[1101,11158,5618],{"class":1319},[1101,11160,11161,11163,11165,11167,11169,11171,11173,11175,11177,11179,11181],{"class":1103,"line":4085},[1101,11162,5624],{"class":1319},[1101,11164,1577],{"class":1325},[1101,11166,5464],{"class":1319},[1101,11168,371],{"class":1602},[1101,11170,1606],{"class":1319},[1101,11172,1533],{"class":1319},[1101,11174,1880],{"class":1319},[1101,11176,6630],{"class":1315},[1101,11178,1503],{"class":1319},[1101,11180,1533],{"class":1319},[1101,11182,1580],{"class":1319},[1101,11184,11185,11187,11189,11191,11193,11195,11197,11199,11201,11203,11205,11207,11209,11211,11213,11215,11217,11219,11221,11223,11225,11227,11229,11231,11233,11235,11237,11239,11241,11243,11245,11247],{"class":1103,"line":4095},[1101,11186,6641],{"class":1319},[1101,11188,1577],{"class":1325},[1101,11190,6646],{"class":1305},[1101,11192,1606],{"class":1319},[1101,11194,1533],{"class":1319},[1101,11196,6653],{"class":1315},[1101,11198,1731],{"class":1319},[1101,11200,6658],{"class":1315},[1101,11202,6661],{"class":1319},[1101,11204,2632],{"class":1315},[1101,11206,1823],{"class":1319},[1101,11208,2213],{"class":1315},[1101,11210,1533],{"class":1319},[1101,11212,6672],{"class":1319},[1101,11214,6675],{"class":1602},[1101,11216,1606],{"class":1319},[1101,11218,6680],{"class":1319},[1101,11220,4482],{"class":1315},[1101,11222,1823],{"class":1319},[1101,11224,2032],{"class":1315},[1101,11226,1503],{"class":1319},[1101,11228,6691],{"class":1111},[1101,11230,5398],{"class":1319},[1101,11232,6696],{"class":1315},[1101,11234,1823],{"class":1319},[1101,11236,6172],{"class":1315},[1101,11238,1503],{"class":1319},[1101,11240,6691],{"class":1111},[1101,11242,5398],{"class":1319},[1101,11244,6709],{"class":1315},[1101,11246,6712],{"class":1319},[1101,11248,1580],{"class":1319},[1101,11250,11251,11253],{"class":1103,"line":4105},[1101,11252,6719],{"class":1319},[1101,11254,6722],{"class":1325},[1101,11256,11257,11259,11261,11263,11265],{"class":1103,"line":4115},[1101,11258,6727],{"class":1602},[1101,11260,1606],{"class":1319},[1101,11262,1533],{"class":1319},[1101,11264,6734],{"class":1111},[1101,11266,5552],{"class":1319},[1101,11268,11269,11271,11273,11275,11277],{"class":1103,"line":4132},[1101,11270,6741],{"class":1602},[1101,11272,1606],{"class":1319},[1101,11274,1533],{"class":1319},[1101,11276,6748],{"class":1111},[1101,11278,5552],{"class":1319},[1101,11280,11281,11283,11285,11287,11289],{"class":1103,"line":4143},[1101,11282,6755],{"class":1602},[1101,11284,1606],{"class":1319},[1101,11286,1533],{"class":1319},[1101,11288,6762],{"class":1111},[1101,11290,5552],{"class":1319},[1101,11292,11293],{"class":1103,"line":4149},[1101,11294,6769],{"class":1319},[1101,11296,11297,11299],{"class":1103,"line":4155},[1101,11298,6774],{"class":1319},[1101,11300,6777],{"class":1325},[1101,11302,11303,11305,11307,11309,11311],{"class":1103,"line":4165},[1101,11304,6782],{"class":1602},[1101,11306,1606],{"class":1319},[1101,11308,1533],{"class":1319},[1101,11310,6748],{"class":1111},[1101,11312,5552],{"class":1319},[1101,11314,11315,11317,11319,11321,11323],{"class":1103,"line":4175},[1101,11316,6795],{"class":1602},[1101,11318,1606],{"class":1319},[1101,11320,1533],{"class":1319},[1101,11322,6802],{"class":1111},[1101,11324,5552],{"class":1319},[1101,11326,11327,11329,11331,11333,11335],{"class":1103,"line":4188},[1101,11328,6809],{"class":1602},[1101,11330,1606],{"class":1319},[1101,11332,1533],{"class":1319},[1101,11334,6816],{"class":1111},[1101,11336,5552],{"class":1319},[1101,11338,11339],{"class":1103,"line":4203},[1101,11340,6823],{"class":1319},[1101,11342,11343,11345,11347],{"class":1103,"line":4208},[1101,11344,6828],{"class":1319},[1101,11346,6831],{"class":1325},[1101,11348,1580],{"class":1319},[1101,11350,11351],{"class":1103,"line":4213},[1101,11352,1384],{"emptyLinePlaceholder":21},[1101,11354,11355,11357],{"class":1103,"line":4223},[1101,11356,6719],{"class":1319},[1101,11358,6777],{"class":1325},[1101,11360,11361,11363,11365,11367,11369],{"class":1103,"line":4239},[1101,11362,6848],{"class":1602},[1101,11364,1606],{"class":1319},[1101,11366,1533],{"class":1319},[1101,11368,6855],{"class":1111},[1101,11370,5552],{"class":1319},[1101,11372,11373,11375,11377,11379,11381],{"class":1103,"line":4254},[1101,11374,6862],{"class":1602},[1101,11376,1606],{"class":1319},[1101,11378,1533],{"class":1319},[1101,11380,6748],{"class":1111},[1101,11382,5552],{"class":1319},[1101,11384,11385,11387,11389,11391,11393],{"class":1103,"line":4260},[1101,11386,6875],{"class":1602},[1101,11388,1606],{"class":1319},[1101,11390,1533],{"class":1319},[1101,11392,6882],{"class":1111},[1101,11394,5552],{"class":1319},[1101,11396,11397,11399,11401,11403,11405],{"class":1103,"line":4266},[1101,11398,6889],{"class":1602},[1101,11400,1606],{"class":1319},[1101,11402,1533],{"class":1319},[1101,11404,6816],{"class":1111},[1101,11406,5552],{"class":1319},[1101,11408,11409],{"class":1103,"line":4274},[1101,11410,6902],{"class":1319},[1101,11412,11413,11415,11417],{"class":1103,"line":4279},[1101,11414,6907],{"class":1319},[1101,11416,1577],{"class":1325},[1101,11418,1580],{"class":1319},[1101,11420,11421,11423,11425],{"class":1103,"line":4285},[1101,11422,6916],{"class":1319},[1101,11424,1577],{"class":1325},[1101,11426,1580],{"class":1319},[1101,11428,11429,11431,11433],{"class":1103,"line":4305},[1101,11430,5521],{"class":1319},[1101,11432,5097],{"class":1325},[1101,11434,1580],{"class":1319},[1101,11436,11437],{"class":1103,"line":4320},[1101,11438,1384],{"emptyLinePlaceholder":21},[1101,11440,11441,11443],{"class":1103,"line":4337},[1101,11442,5495],{"class":1319},[1101,11444,5537],{"class":1325},[1101,11446,11448,11450,11452,11454,11456],{"class":11447,"line":4360},[1103,1584],[1101,11449,5543],{"class":1602},[1101,11451,1606],{"class":1319},[1101,11453,1533],{"class":1319},[1101,11455,5208],{"class":1111},[1101,11457,5552],{"class":1319},[1101,11459,11461,11463,11465,11467,11469],{"class":11460,"line":4371},[1103,1584],[1101,11462,6955],{"class":1602},[1101,11464,1606],{"class":1319},[1101,11466,1533],{"class":1319},[1101,11468,6962],{"class":1111},[1101,11470,5552],{"class":1319},[1101,11472,11474,11476,11478,11480,11482],{"class":11473,"line":4379},[1103,1584],[1101,11475,5573],{"class":1602},[1101,11477,1606],{"class":1319},[1101,11479,1533],{"class":1319},[1101,11481,5580],{"class":1111},[1101,11483,5552],{"class":1319},[1101,11485,11486,11488,11490,11492,11494],{"class":1103,"line":4385},[1101,11487,6598],{"class":1602},[1101,11489,1606],{"class":1319},[1101,11491,1533],{"class":1319},[1101,11493,6987],{"class":1111},[1101,11495,5552],{"class":1319},[1101,11497,11498,11500,11502,11504,11506],{"class":1103,"line":4390},[1101,11499,5603],{"class":1602},[1101,11501,1606],{"class":1319},[1101,11503,1533],{"class":1319},[1101,11505,7000],{"class":1111},[1101,11507,5552],{"class":1319},[1101,11509,11510],{"class":1103,"line":4413},[1101,11511,5618],{"class":1319},[1101,11513,11514,11516,11518,11520,11523],{"class":1103,"line":4419},[1101,11515,5624],{"class":1319},[1101,11517,1577],{"class":1325},[1101,11519,5464],{"class":1319},[1101,11521,11522],{"class":1602},"footer",[1101,11524,1580],{"class":1319},[1101,11526,11527,11529,11532,11535,11537,11539,11541,11543],{"class":1103,"line":4439},[1101,11528,6641],{"class":1319},[1101,11530,11531],{"class":1325},"ModelSelect",[1101,11533,11534],{"class":1602}," v-model",[1101,11536,1606],{"class":1319},[1101,11538,1533],{"class":1319},[1101,11540,4653],{"class":1111},[1101,11542,1533],{"class":1319},[1101,11544,1626],{"class":1319},[1101,11546,11547,11549,11551],{"class":1103,"line":4445},[1101,11548,6916],{"class":1319},[1101,11550,1577],{"class":1325},[1101,11552,1580],{"class":1319},[1101,11554,11555],{"class":1103,"line":4491},[1101,11556,1384],{"emptyLinePlaceholder":21},[1101,11558,11559,11561],{"class":1103,"line":4507},[1101,11560,5624],{"class":1319},[1101,11562,7013],{"class":1325},[1101,11564,11565,11567,11569,11571,11573],{"class":1103,"line":4540},[1101,11566,7018],{"class":1602},[1101,11568,1606],{"class":1319},[1101,11570,1533],{"class":1319},[1101,11572,6586],{"class":1111},[1101,11574,5552],{"class":1319},[1101,11576,11577,11579,11581,11583,11585],{"class":1103,"line":4554},[1101,11578,7031],{"class":1602},[1101,11580,1606],{"class":1319},[1101,11582,1533],{"class":1319},[1101,11584,5637],{"class":1111},[1101,11586,5552],{"class":1319},[1101,11588,11589,11591,11593,11595,11597],{"class":1103,"line":4562},[1101,11590,7044],{"class":1602},[1101,11592,1606],{"class":1319},[1101,11594,1533],{"class":1319},[1101,11596,7051],{"class":1111},[1101,11598,5552],{"class":1319},[1101,11600,11601,11603,11605,11607,11609],{"class":1103,"line":4567},[1101,11602,7058],{"class":1602},[1101,11604,1606],{"class":1319},[1101,11606,1533],{"class":1319},[1101,11608,7065],{"class":1111},[1101,11610,5552],{"class":1319},[1101,11612,11613],{"class":1103,"line":4574},[1101,11614,7072],{"class":1319},[1101,11616,11617,11619,11621],{"class":1103,"line":4579},[1101,11618,5521],{"class":1319},[1101,11620,5091],{"class":1325},[1101,11622,1580],{"class":1319},[1101,11624,11625,11627,11629],{"class":1103,"line":4597},[1101,11626,5655],{"class":1319},[1101,11628,5476],{"class":1325},[1101,11630,1580],{"class":1319},[1101,11632,11634,11636,11638],{"class":1103,"line":11633},112,[1101,11635,1631],{"class":1319},[1101,11637,1577],{"class":1325},[1101,11639,1580],{"class":1319},[1101,11641,11643,11645,11647],{"class":1103,"line":11642},113,[1101,11644,1641],{"class":1319},[1101,11646,5441],{"class":1325},[1101,11648,1580],{"class":1319},[1101,11650,11652,11654,11656],{"class":1103,"line":11651},114,[1101,11653,1650],{"class":1319},[1101,11655,1577],{"class":1325},[1101,11657,1580],{"class":1319},[994,11659,11661],{"id":11660},"going-further","Going further",[990,11663,11664],{},"You now have a working AI chatbot with database persistence! To take it further, consider adding:",[990,11666,11667],{},[1008,11668,11669],{},"User Authentication",[990,11671,11672,11673,11678],{},"Add authentication with ",[1044,11674,11677],{"href":11675,"rel":11676},"https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",[1048],"nuxt-auth-utils"," to let users access their chat history across devices and keep conversations private.",[990,11680,11681],{},[1008,11682,11683],{},"AI Tools",[990,11685,11686,11687,11692],{},"Extend your chatbot with ",[1044,11688,11691],{"href":11689,"rel":11690},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Ftools-and-tool-calling",[1048],"AI SDK tools"," that can fetch real-time data, generate charts, or interact with external APIs:",[1092,11694,11696],{"className":1296,"code":11695,"language":1298,"meta":1097,"style":1097},"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",[1051,11697,11698,11717,11735,11739,11754,11770,11787,11818,11826,11846,11851,11886,11890],{"__ignoreMap":1097},[1101,11699,11700,11702,11704,11707,11709,11711,11713,11715],{"class":1103,"line":1104},[1101,11701,1722],{"class":1305},[1101,11703,1725],{"class":1319},[1101,11705,11706],{"class":1315}," tool",[1101,11708,1747],{"class":1319},[1101,11710,1750],{"class":1305},[1101,11712,1406],{"class":1319},[1101,11714,2548],{"class":1111},[1101,11716,1370],{"class":1319},[1101,11718,11719,11721,11723,11725,11727,11729,11731,11733],{"class":1103,"line":1121},[1101,11720,1722],{"class":1305},[1101,11722,1725],{"class":1319},[1101,11724,2583],{"class":1315},[1101,11726,1747],{"class":1319},[1101,11728,1750],{"class":1305},[1101,11730,1406],{"class":1319},[1101,11732,2592],{"class":1111},[1101,11734,1370],{"class":1319},[1101,11736,11737],{"class":1103,"line":1335},[1101,11738,1384],{"emptyLinePlaceholder":21},[1101,11740,11741,11743,11746,11748,11750,11752],{"class":1103,"line":1350},[1101,11742,3075],{"class":1602},[1101,11744,11745],{"class":1315}," weatherTool ",[1101,11747,1606],{"class":1319},[1101,11749,11706],{"class":1124},[1101,11751,1316],{"class":1315},[1101,11753,1320],{"class":1319},[1101,11755,11756,11759,11761,11763,11766,11768],{"class":1103,"line":1362},[1101,11757,11758],{"class":1325},"  description",[1101,11760,1329],{"class":1319},[1101,11762,1406],{"class":1319},[1101,11764,11765],{"class":1111},"Get the current weather for a location",[1101,11767,1344],{"class":1319},[1101,11769,1347],{"class":1319},[1101,11771,11772,11775,11777,11779,11781,11783,11785],{"class":1103,"line":1373},[1101,11773,11774],{"class":1325},"  parameters",[1101,11776,1329],{"class":1319},[1101,11778,2583],{"class":1315},[1101,11780,1823],{"class":1319},[1101,11782,2655],{"class":1124},[1101,11784,1316],{"class":1315},[1101,11786,1320],{"class":1319},[1101,11788,11789,11792,11794,11796,11798,11800,11802,11804,11807,11809,11811,11814,11816],{"class":1103,"line":1381},[1101,11790,11791],{"class":1325},"    location",[1101,11793,1329],{"class":1319},[1101,11795,2583],{"class":1315},[1101,11797,1823],{"class":1319},[1101,11799,3255],{"class":1124},[1101,11801,1820],{"class":1315},[1101,11803,1823],{"class":1319},[1101,11805,11806],{"class":1124},"describe",[1101,11808,1316],{"class":1315},[1101,11810,1344],{"class":1319},[1101,11812,11813],{"class":1111},"The city name",[1101,11815,1344],{"class":1319},[1101,11817,1506],{"class":1315},[1101,11819,11820,11822,11824],{"class":1103,"line":1387},[1101,11821,2428],{"class":1319},[1101,11823,1897],{"class":1315},[1101,11825,1347],{"class":1319},[1101,11827,11828,11831,11833,11835,11837,11840,11842,11844],{"class":1103,"line":1398},[1101,11829,11830],{"class":1124},"  execute",[1101,11832,1329],{"class":1319},[1101,11834,4007],{"class":1602},[1101,11836,1954],{"class":1319},[1101,11838,11839],{"class":1957}," location",[1101,11841,1961],{"class":1319},[1101,11843,1840],{"class":1602},[1101,11845,1395],{"class":1319},[1101,11847,11848],{"class":1103,"line":1414},[1101,11849,11850],{"class":1485},"    \u002F\u002F Fetch weather data from an API\n",[1101,11852,11853,11856,11858,11860,11862,11865,11867,11870,11872,11875,11877,11879,11882,11884],{"class":1103,"line":1420},[1101,11854,11855],{"class":1305},"    return",[1101,11857,1725],{"class":1319},[1101,11859,11839],{"class":1315},[1101,11861,1731],{"class":1319},[1101,11863,11864],{"class":1325}," temperature",[1101,11866,1329],{"class":1319},[1101,11868,11869],{"class":3574}," 22",[1101,11871,1731],{"class":1319},[1101,11873,11874],{"class":1325}," condition",[1101,11876,1329],{"class":1319},[1101,11878,1406],{"class":1319},[1101,11880,11881],{"class":1111},"Sunny",[1101,11883,1344],{"class":1319},[1101,11885,3177],{"class":1319},[1101,11887,11888],{"class":1103,"line":1425},[1101,11889,3599],{"class":1319},[1101,11891,11892,11894],{"class":1103,"line":1448},[1101,11893,1503],{"class":1319},[1101,11895,1506],{"class":1315},[994,11897,11899],{"id":11898},"deploying-to-vercel","Deploying to Vercel",[990,11901,11902],{},"Deploy your chatbot to Vercel with zero configuration:",[1092,11904,11906],{"className":1094,"code":11905,"language":1096,"meta":1097,"style":1097},"npx vercel deploy\n",[1051,11907,11908],{"__ignoreMap":1097},[1101,11909,11910,11912,11915],{"class":1103,"line":1104},[1101,11911,1108],{"class":1107},[1101,11913,11914],{"class":1111}," vercel",[1101,11916,11917],{"class":1111}," deploy\n",[990,11919,11920],{},"Then, in the Vercel dashboard:",[1002,11922,11923,11929],{},[1005,11924,11925,11926,11928],{},"Enable ",[1008,11927,4609],{}," and add credits so requests can be processed.",[1005,11930,11931,11932,11935],{},"Add a ",[1008,11933,11934],{},"Turso"," database from the Vercel Marketplace and connect it to your project (it will provision the database and add the required environment variables automatically).",[11937,11938,11939],"blockquote",{},[990,11940,11941,11942,11947,11948,11950],{},"Note: On Vercel, you ",[1008,11943,11944,11945],{},"don’t need to manually add ",[1051,11946,1673],{}," — Vercel handles the gateway configuration for deployments. Keep using ",[1051,11949,1660],{}," locally for development.",[1680,11952,11953],{"to":1080,"target":1049},[990,11954,11955,11956,1823],{},"Learn more about setting up AI Gateway in the ",[1008,11957,11958],{},"Vercel AI Gateway documentation",[994,11960,11962],{"id":11961},"conclusion","Conclusion",[990,11964,11965],{},"You've built a complete AI chatbot with:",[1002,11967,11968,11974,11980,11985,11990],{},[1005,11969,11970,11973],{},[1008,11971,11972],{},"A complete chat interface"," using Nuxt UI components",[1005,11975,11976,11979],{},[1008,11977,11978],{},"Real-time streaming responses"," with the AI SDK",[1005,11981,11982,11984],{},[1008,11983,1022],{}," with MDC for rich content display",[1005,11986,11987,11989],{},[1008,11988,1028],{}," via AI Gateway",[1005,11991,11992,11995],{},[1008,11993,11994],{},"Database persistence"," with SQLite (local) \u002F Turso (production) and Drizzle ORM",[990,11997,11998],{},"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.",[990,12000,12001],{},[1008,12002,12003],{},"Resources:",[1002,12005,12006,12013,12020,12027,12033,12039],{},[1005,12007,12008],{},[1044,12009,12012],{"href":12010,"rel":12011},"https:\u002F\u002Fui.nuxt.com\u002Fcomponents\u002Fchat",[1048],"Nuxt UI Chat Components",[1005,12014,12015],{},[1044,12016,12019],{"href":12017,"rel":12018},"https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Ffeatures\u002Fdatabase",[1048],"NuxtHub Database",[1005,12021,12022],{},[1044,12023,12026],{"href":12024,"rel":12025},"https:\u002F\u002Fai-sdk.dev",[1048],"AI SDK Documentation",[1005,12028,12029],{},[1044,12030,12032],{"href":1080,"rel":12031},[1048],"AI Gateway Documentation",[1005,12034,12035],{},[1044,12036,12038],{"href":1046,"rel":12037},[1048],"Nuxt AI Chat Template",[1005,12040,12041],{},[1044,12042,12044],{"href":1057,"rel":12043},[1048],"Vue AI Chat Template",[990,12046,12047],{},"We're excited to see what you'll build!",[12049,12050,12051],"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":1097,"searchDepth":1121,"depth":1121,"links":12053},[12054,12055,12056,12062,12067,12070,12071,12075,12076,12077,12082,12083,12084],{"id":996,"depth":1121,"text":997},{"id":1065,"depth":1121,"text":1066},{"id":1086,"depth":1121,"text":1087,"children":12057},[12058,12059,12060,12061],{"id":1131,"depth":1335,"text":1132},{"id":1282,"depth":1335,"text":1283},{"id":1551,"depth":1335,"text":1552},{"id":1691,"depth":1335,"text":1692},{"id":2471,"depth":1121,"text":2472,"children":12063},[12064,12065,12066],{"id":2483,"depth":1335,"text":2484},{"id":2866,"depth":1335,"text":2867},{"id":4700,"depth":1335,"text":4701},{"id":5082,"depth":1121,"text":5083,"children":12068},[12069],{"id":5101,"depth":1335,"text":5102},{"id":5718,"depth":1121,"text":5719},{"id":7286,"depth":1121,"text":7287,"children":12072},[12073,12074],{"id":7293,"depth":1335,"text":7294},{"id":7453,"depth":1335,"text":7454},{"id":7953,"depth":1121,"text":7954},{"id":8496,"depth":1121,"text":8497},{"id":9774,"depth":1121,"text":9775,"children":12078},[12079,12080,12081],{"id":9785,"depth":1335,"text":9786},{"id":10048,"depth":1335,"text":10049},{"id":10307,"depth":1335,"text":10308},{"id":11660,"depth":1121,"text":11661},{"id":11898,"depth":1121,"text":11899},{"id":11961,"depth":1121,"text":11962},"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":12090},"Tutorial","\u002Fblog\u002Fhow-to-build-an-ai-chat",{"title":974,"description":12086},"blog\u002Fhow-to-build-an-ai-chat","ugglJqLsGgnnltNBbTrx1KjoUNVnc0W4pVd_V3GiLRg",{"data":12096,"body":12097},{},{"type":12098,"children":12099},"root",[12100],{"type":178,"tag":990,"props":12101,"children":12102},{},[12103,12105,12112],{"type":5341,"value":12104},"Nuxt ",{"type":178,"tag":1101,"props":12106,"children":12109},{"className":12107},[12108],"text-primary",[12110],{"type":5341,"value":12111},"UI",{"type":5341,"value":12113}," Blog",{"data":12115,"body":12116},{},{"type":12098,"children":12117},[12118],{"type":178,"tag":990,"props":12119,"children":12120},{},[12121],{"type":5341,"value":962},1773928182890]