[{"data":1,"prerenderedAt":12292},["ShallowReactive",2],{"navigation":3,"-blog-how-to-build-an-ai-chat":958},[4],{"title":5,"path":6,"stem":7,"children":8,"page":36},"Docs","\u002Fdocs","docs",[9,163,816,857],{"title":10,"path":11,"stem":12,"children":13,"framework":16,"category":16,"description":16,"icon":30},"Get Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[14,19,37,47,53,76,141],{"title":15,"path":11,"stem":12,"framework":16,"category":16,"description":17,"icon":18},"Introduction",null,"Nuxt UI is a comprehensive Vue UI component library (Nuxt optional), offering 125+ accessible, Tailwind CSS components for building modern web applications.","i-lucide-house",{"title":20,"framework":16,"category":16,"description":16,"shadow":21,"path":22,"stem":23,"children":24,"page":36},"Installation",true,"\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",[25,31],{"title":20,"path":26,"stem":27,"framework":28,"category":16,"description":29,"icon":30},"\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fnuxt","docs\u002F1.getting-started\u002F2.installation\u002F1.nuxt","nuxt","Learn how to install and configure Nuxt UI in your Nuxt application.","i-lucide-square-play",{"title":20,"path":32,"stem":33,"framework":34,"category":16,"description":35,"icon":30},"\u002Fdocs\u002Fgetting-started\u002Finstallation\u002Fvue","docs\u002F1.getting-started\u002F2.installation\u002F2.vue","vue","Learn how to install and configure Nuxt UI in your Vue application, compatible with both plain Vite and Inertia.",false,{"title":38,"framework":16,"category":16,"description":16,"icon":39,"shadow":21,"path":40,"stem":41,"children":42,"page":36},"Migration","i-lucide-arrow-right-left","\u002Fdocs\u002Fgetting-started\u002Fmigration","docs\u002F1.getting-started\u002F3.migration",[43],{"title":38,"path":44,"stem":45,"framework":16,"category":16,"description":46,"icon":39},"\u002Fdocs\u002Fgetting-started\u002Fmigration\u002Fv4","docs\u002F1.getting-started\u002F3.migration\u002F1.v4","A comprehensive guide to migrate your application from Nuxt UI v3 to Nuxt UI v4.",{"title":48,"path":49,"stem":50,"framework":16,"category":16,"description":51,"icon":52},"Contribution","\u002Fdocs\u002Fgetting-started\u002Fcontribution","docs\u002F1.getting-started\u002F4.contribution","A comprehensive guide on contributing to Nuxt UI, including project structure, development workflow, and best practices.","i-lucide-handshake",{"title":54,"path":55,"stem":56,"children":57,"page":36},"Theme","\u002Fdocs\u002Fgetting-started\u002Ftheme","docs\u002F1.getting-started\u002F5.theme",[58,64,70],{"title":59,"path":60,"stem":61,"framework":16,"category":16,"description":62,"icon":63},"Design System","\u002Fdocs\u002Fgetting-started\u002Ftheme\u002Fdesign-system","docs\u002F1.getting-started\u002F5.theme\u002F1.design-system","Nuxt UI's design system uses Tailwind CSS for simple theming and easy customization.","i-lucide-palette",{"title":65,"path":66,"stem":67,"framework":16,"category":16,"description":68,"icon":69},"CSS Variables","\u002Fdocs\u002Fgetting-started\u002Ftheme\u002Fcss-variables","docs\u002F1.getting-started\u002F5.theme\u002F2.css-variables","Nuxt UI uses CSS variables as design tokens for flexible, consistent theming with built-in light and dark mode support.","i-lucide-swatch-book",{"title":71,"path":72,"stem":73,"framework":16,"category":16,"description":74,"icon":75},"Components","\u002Fdocs\u002Fgetting-started\u002Ftheme\u002Fcomponents","docs\u002F1.getting-started\u002F5.theme\u002F3.components","Learn how to customize Nuxt UI components with the Tailwind Variants API for advanced, flexible, and maintainable styling.","i-lucide-layout-grid",{"title":77,"framework":16,"category":16,"description":16,"path":78,"stem":79,"children":80,"page":36},"Integrations","\u002Fdocs\u002Fgetting-started\u002Fintegrations","docs\u002F1.getting-started\u002F6.integrations",[81,95,101,115,129,135],{"title":82,"framework":16,"category":16,"description":16,"shadow":21,"path":83,"stem":84,"children":85,"page":36},"Icons","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ficons","docs\u002F1.getting-started\u002F6.integrations\u002F1.icons",[86,91],{"title":82,"path":87,"stem":88,"framework":28,"category":16,"description":89,"icon":90},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ficons\u002Fnuxt","docs\u002F1.getting-started\u002F6.integrations\u002F1.icons\u002F1.nuxt","Nuxt UI integrates with Nuxt Icon to access over 200,000+ icons from Iconify.","i-lucide-smile",{"title":82,"path":92,"stem":93,"framework":34,"category":16,"description":94,"icon":90},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ficons\u002Fvue","docs\u002F1.getting-started\u002F6.integrations\u002F1.icons\u002F2.vue","Nuxt UI integrates with Iconify to access over 200,000+ icons.",{"title":96,"path":97,"stem":98,"framework":28,"category":16,"description":99,"icon":100},"Fonts","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Ffonts","docs\u002F1.getting-started\u002F6.integrations\u002F2.fonts","Nuxt UI integrates with Nuxt Fonts to provide plug-and-play font optimization.","i-lucide-a-large-small",{"title":102,"framework":16,"category":16,"description":16,"shadow":21,"path":103,"stem":104,"children":105,"page":36},"Color Mode","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcolor-mode","docs\u002F1.getting-started\u002F6.integrations\u002F3.color-mode",[106,111],{"title":102,"path":107,"stem":108,"framework":28,"category":16,"description":109,"icon":110},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcolor-mode\u002Fnuxt","docs\u002F1.getting-started\u002F6.integrations\u002F3.color-mode\u002F1.nuxt","Nuxt UI integrates with Nuxt Color Mode to allow for easy switching between light and dark themes.","i-lucide-sun-moon",{"title":102,"path":112,"stem":113,"framework":34,"category":16,"description":114,"icon":110},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcolor-mode\u002Fvue","docs\u002F1.getting-started\u002F6.integrations\u002F3.color-mode\u002F2.vue","Nuxt UI integrates with VueUse to allow for easy switching between light and dark themes.",{"title":116,"framework":16,"category":16,"description":16,"shadow":21,"path":117,"stem":118,"children":119,"page":36},"I18n","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fi18n","docs\u002F1.getting-started\u002F6.integrations\u002F4.i18n",[120,126],{"title":121,"path":122,"stem":123,"framework":28,"category":16,"description":124,"icon":125},"Internationalization (i18n)","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fi18n\u002Fnuxt","docs\u002F1.getting-started\u002F6.integrations\u002F4.i18n\u002F1.nuxt","Nuxt UI supports 50+ locales and multi-directional (LTR\u002FRTL) internationalization.","i-lucide-languages",{"title":121,"path":127,"stem":128,"framework":34,"category":16,"description":124,"icon":125},"\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fi18n\u002Fvue","docs\u002F1.getting-started\u002F6.integrations\u002F4.i18n\u002F2.vue",{"title":130,"path":131,"stem":132,"framework":28,"category":16,"description":133,"icon":134},"Content","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fcontent","docs\u002F1.getting-started\u002F6.integrations\u002F5.content","Nuxt UI integrates with Nuxt Content to deliver beautiful typography and consistent component styling.","i-simple-icons-markdown",{"title":136,"path":137,"stem":138,"framework":34,"category":16,"description":139,"icon":140},"SSR","\u002Fdocs\u002Fgetting-started\u002Fintegrations\u002Fssr","docs\u002F1.getting-started\u002F6.integrations\u002F6.ssr","Nuxt UI has first-party support for Vue SSR. This guide will help you have it fully enabled.","i-lucide-server",{"title":142,"framework":16,"category":16,"description":16,"path":143,"stem":144,"children":145,"page":36},"Agents","\u002Fdocs\u002Fgetting-started\u002Fai","docs\u002F1.getting-started\u002F7.ai",[146,151,157],{"title":147,"path":148,"stem":149,"framework":16,"category":16,"description":150,"icon":140},"MCP Server","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fmcp","docs\u002F1.getting-started\u002F7.ai\u002F1.mcp","Use Nuxt UI components in your AI assistants with Model Context Protocol support.",{"title":152,"path":153,"stem":154,"framework":16,"category":16,"description":155,"icon":156},"LLMs.txt","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fllms-txt","docs\u002F1.getting-started\u002F7.ai\u002F2.llms-txt","How to get AI tools like Cursor, Windsurf, GitHub Copilot, ChatGPT, and Claude to understand Nuxt UI components, theming, and best practices.","i-lucide-bot",{"title":158,"path":159,"stem":160,"framework":16,"category":16,"description":161,"icon":162},"Skills","\u002Fdocs\u002Fgetting-started\u002Fai\u002Fskills","docs\u002F1.getting-started\u002F7.ai\u002F3.skills","Install Nuxt UI skills to give AI coding agents deep knowledge of components, theming, and best practices.","i-lucide-sparkles",{"title":71,"framework":16,"category":16,"description":16,"icon":164,"path":165,"stem":166,"children":167,"page":36},"i-lucide-square-code","\u002Fdocs\u002Fcomponents","docs\u002F2.components",[168,174,180,186,192,197,202,207,212,217,222,228,233,238,243,248,253,258,264,269,274,279,284,289,295,300,305,311,316,321,326,332,337,342,347,352,357,362,367,373,378,383,388,393,399,405,410,415,420,425,430,435,440,445,450,455,460,466,471,476,481,486,491,496,501,506,511,516,521,526,531,536,541,546,551,556,561,566,571,576,581,587,592,597,602,607,612,617,622,627,632,637,642,647,652,657,662,667,672,677,682,687,692,697,702,707,712,717,722,727,732,737,742,747,752,757,762,767,772,777,782,787,791,796,801,806,811],{"title":169,"path":170,"stem":171,"framework":16,"category":172,"description":173},"Accordion","\u002Fdocs\u002Fcomponents\u002Faccordion","docs\u002F2.components\u002Faccordion","data","A stacked set of collapsible panels.",{"title":175,"path":176,"stem":177,"framework":16,"category":178,"description":179},"Alert","\u002Fdocs\u002Fcomponents\u002Falert","docs\u002F2.components\u002Falert","element","A callout to draw user's attention.",{"title":181,"path":182,"stem":183,"framework":16,"category":184,"description":185},"App","\u002Fdocs\u002Fcomponents\u002Fapp","docs\u002F2.components\u002Fapp","layout","Wraps your app to provide global configurations and more.",{"title":187,"path":188,"stem":189,"framework":16,"category":190,"description":191},"AuthForm","\u002Fdocs\u002Fcomponents\u002Fauth-form","docs\u002F2.components\u002Fauth-form","page","A customizable Form to create login, register or password reset forms.",{"title":193,"path":194,"stem":195,"framework":16,"category":178,"description":196},"Avatar","\u002Fdocs\u002Fcomponents\u002Favatar","docs\u002F2.components\u002Favatar","An img element with fallback and Nuxt Image support.",{"title":198,"path":199,"stem":200,"framework":16,"category":178,"description":201},"AvatarGroup","\u002Fdocs\u002Fcomponents\u002Favatar-group","docs\u002F2.components\u002Favatar-group","Stack multiple avatars in a group.",{"title":203,"path":204,"stem":205,"framework":16,"category":178,"description":206},"Badge","\u002Fdocs\u002Fcomponents\u002Fbadge","docs\u002F2.components\u002Fbadge","A short text to represent a status or a category.",{"title":208,"path":209,"stem":210,"framework":16,"category":178,"description":211},"Banner","\u002Fdocs\u002Fcomponents\u002Fbanner","docs\u002F2.components\u002Fbanner","Display a banner at the top of your website to inform users about important information.",{"title":213,"path":214,"stem":215,"framework":16,"category":190,"description":216},"BlogPost","\u002Fdocs\u002Fcomponents\u002Fblog-post","docs\u002F2.components\u002Fblog-post","A customizable article to display in a blog page.",{"title":218,"path":219,"stem":220,"framework":16,"category":190,"description":221},"BlogPosts","\u002Fdocs\u002Fcomponents\u002Fblog-posts","docs\u002F2.components\u002Fblog-posts","Display a list of blog posts in a responsive grid layout.",{"title":223,"path":224,"stem":225,"framework":16,"category":226,"description":227},"Breadcrumb","\u002Fdocs\u002Fcomponents\u002Fbreadcrumb","docs\u002F2.components\u002Fbreadcrumb","navigation","A hierarchy of links to navigate through a website.",{"title":229,"path":230,"stem":231,"framework":16,"category":178,"description":232},"Button","\u002Fdocs\u002Fcomponents\u002Fbutton","docs\u002F2.components\u002Fbutton","A button element that can act as a link or trigger an action.",{"title":234,"path":235,"stem":236,"framework":16,"category":178,"description":237},"Calendar","\u002Fdocs\u002Fcomponents\u002Fcalendar","docs\u002F2.components\u002Fcalendar","A calendar component for selecting single dates, multiple dates or date ranges.",{"title":239,"path":240,"stem":241,"framework":16,"category":178,"description":242},"Card","\u002Fdocs\u002Fcomponents\u002Fcard","docs\u002F2.components\u002Fcard","Display content in a card with a header, body and footer.",{"title":244,"path":245,"stem":246,"framework":16,"category":172,"description":247},"Carousel","\u002Fdocs\u002Fcomponents\u002Fcarousel","docs\u002F2.components\u002Fcarousel","A carousel with motion and swipe built using Embla.",{"title":249,"path":250,"stem":251,"framework":16,"category":190,"description":252},"ChangelogVersion","\u002Fdocs\u002Fcomponents\u002Fchangelog-version","docs\u002F2.components\u002Fchangelog-version","A customizable article to display in a changelog.",{"title":254,"path":255,"stem":256,"framework":16,"category":190,"description":257},"ChangelogVersions","\u002Fdocs\u002Fcomponents\u002Fchangelog-versions","docs\u002F2.components\u002Fchangelog-versions","Display a list of changelog versions in a timeline.",{"title":259,"path":260,"stem":261,"framework":16,"category":262,"description":263},"Chat","\u002Fdocs\u002Fcomponents\u002Fchat","docs\u002F2.components\u002Fchat","chat","Build AI chat interfaces with streaming, reasoning, and tool calling.",{"title":265,"path":266,"stem":267,"framework":16,"category":262,"description":268},"ChatMessage","\u002Fdocs\u002Fcomponents\u002Fchat-message","docs\u002F2.components\u002Fchat-message","Display a chat message with icon, avatar, and actions.",{"title":270,"path":271,"stem":272,"framework":16,"category":262,"description":273},"ChatMessages","\u002Fdocs\u002Fcomponents\u002Fchat-messages","docs\u002F2.components\u002Fchat-messages","Display a list of chat messages, designed to work seamlessly with Vercel AI SDK.",{"title":275,"path":276,"stem":277,"framework":16,"category":262,"description":278},"ChatPalette","\u002Fdocs\u002Fcomponents\u002Fchat-palette","docs\u002F2.components\u002Fchat-palette","A chat palette to create a chatbot interface inside an overlay.",{"title":280,"path":281,"stem":282,"framework":16,"category":262,"description":283},"ChatPrompt","\u002Fdocs\u002Fcomponents\u002Fchat-prompt","docs\u002F2.components\u002Fchat-prompt","An enhanced Textarea for submitting prompts in AI chat interfaces.",{"title":285,"path":286,"stem":287,"framework":16,"category":262,"description":288},"ChatPromptSubmit","\u002Fdocs\u002Fcomponents\u002Fchat-prompt-submit","docs\u002F2.components\u002Fchat-prompt-submit","A Button for submitting chat prompts with automatic status handling.",{"title":290,"path":291,"stem":292,"framework":16,"category":262,"description":293,"badge":294},"ChatReasoning","\u002Fdocs\u002Fcomponents\u002Fchat-reasoning","docs\u002F2.components\u002Fchat-reasoning","Display a collapsible AI reasoning or thinking process.","New",{"title":296,"path":297,"stem":298,"framework":16,"category":262,"description":299,"badge":294},"ChatShimmer","\u002Fdocs\u002Fcomponents\u002Fchat-shimmer","docs\u002F2.components\u002Fchat-shimmer","Display a text shimmer animation effect.",{"title":301,"path":302,"stem":303,"framework":16,"category":262,"description":304,"badge":294},"ChatTool","\u002Fdocs\u002Fcomponents\u002Fchat-tool","docs\u002F2.components\u002Fchat-tool","Display a collapsible AI tool invocation status.",{"title":306,"path":307,"stem":308,"framework":16,"category":309,"description":310},"Checkbox","\u002Fdocs\u002Fcomponents\u002Fcheckbox","docs\u002F2.components\u002Fcheckbox","form","An input element to toggle between checked and unchecked states.",{"title":312,"path":313,"stem":314,"framework":16,"category":309,"description":315},"CheckboxGroup","\u002Fdocs\u002Fcomponents\u002Fcheckbox-group","docs\u002F2.components\u002Fcheckbox-group","A set of checklist buttons to select multiple option from a list.",{"title":317,"path":318,"stem":319,"framework":16,"category":178,"description":320},"Chip","\u002Fdocs\u002Fcomponents\u002Fchip","docs\u002F2.components\u002Fchip","An indicator of a numeric value or a state.",{"title":322,"path":323,"stem":324,"framework":16,"category":178,"description":325},"Collapsible","\u002Fdocs\u002Fcomponents\u002Fcollapsible","docs\u002F2.components\u002Fcollapsible","A collapsible element to toggle visibility of its content.",{"title":327,"path":328,"stem":329,"framework":16,"category":330,"description":331},"ColorModeAvatar","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-avatar","docs\u002F2.components\u002Fcolor-mode-avatar","color-mode","An Avatar with a different source for light and dark mode.",{"title":333,"path":334,"stem":335,"framework":16,"category":330,"description":336},"ColorModeButton","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-button","docs\u002F2.components\u002Fcolor-mode-button","A Button to switch between light and dark mode.",{"title":338,"path":339,"stem":340,"framework":16,"category":330,"description":341},"ColorModeImage","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-image","docs\u002F2.components\u002Fcolor-mode-image","An image element with a different source for light and dark mode.",{"title":343,"path":344,"stem":345,"framework":16,"category":330,"description":346},"ColorModeSelect","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-select","docs\u002F2.components\u002Fcolor-mode-select","A Select to switch between system, dark & light mode.",{"title":348,"path":349,"stem":350,"framework":16,"category":330,"description":351},"ColorModeSwitch","\u002Fdocs\u002Fcomponents\u002Fcolor-mode-switch","docs\u002F2.components\u002Fcolor-mode-switch","A switch to toggle between light and dark mode.",{"title":353,"path":354,"stem":355,"framework":16,"category":309,"description":356},"ColorPicker","\u002Fdocs\u002Fcomponents\u002Fcolor-picker","docs\u002F2.components\u002Fcolor-picker","A component to select a color.",{"title":358,"path":359,"stem":360,"framework":16,"category":226,"description":361},"CommandPalette","\u002Fdocs\u002Fcomponents\u002Fcommand-palette","docs\u002F2.components\u002Fcommand-palette","A command palette with full-text search powered by Fuse.js for efficient fuzzy matching.",{"title":363,"path":364,"stem":365,"framework":16,"category":184,"description":366},"Container","\u002Fdocs\u002Fcomponents\u002Fcontainer","docs\u002F2.components\u002Fcontainer","A container lets you center and constrain the width of your content.",{"title":368,"path":369,"stem":370,"framework":28,"category":371,"description":372},"ContentNavigation","\u002Fdocs\u002Fcomponents\u002Fcontent-navigation","docs\u002F2.components\u002Fcontent-navigation","content","An accordion-style navigation component for organizing page links.",{"title":374,"path":375,"stem":376,"framework":28,"category":371,"description":377},"ContentSearch","\u002Fdocs\u002Fcomponents\u002Fcontent-search","docs\u002F2.components\u002Fcontent-search","A ready to use CommandPalette to add to your documentation.",{"title":379,"path":380,"stem":381,"framework":28,"category":371,"description":382},"ContentSearchButton","\u002Fdocs\u002Fcomponents\u002Fcontent-search-button","docs\u002F2.components\u002Fcontent-search-button","A pre-styled Button to open the ContentSearch modal.",{"title":384,"path":385,"stem":386,"framework":28,"category":371,"description":387},"ContentSurround","\u002Fdocs\u002Fcomponents\u002Fcontent-surround","docs\u002F2.components\u002Fcontent-surround","A pair of prev and next links to navigate between pages.",{"title":389,"path":390,"stem":391,"framework":28,"category":371,"description":392},"ContentToc","\u002Fdocs\u002Fcomponents\u002Fcontent-toc","docs\u002F2.components\u002Fcontent-toc","A sticky Table of Contents with automatic active anchor link highlighting.",{"title":394,"path":395,"stem":396,"framework":16,"category":397,"description":398},"ContextMenu","\u002Fdocs\u002Fcomponents\u002Fcontext-menu","docs\u002F2.components\u002Fcontext-menu","overlay","A menu to display actions when right-clicking on an element.",{"title":400,"path":401,"stem":402,"framework":16,"category":403,"description":404},"DashboardGroup","\u002Fdocs\u002Fcomponents\u002Fdashboard-group","docs\u002F2.components\u002Fdashboard-group","dashboard","A fixed layout component that provides context for dashboard components with sidebar state management and persistence.",{"title":406,"path":407,"stem":408,"framework":16,"category":403,"description":409},"DashboardNavbar","\u002Fdocs\u002Fcomponents\u002Fdashboard-navbar","docs\u002F2.components\u002Fdashboard-navbar","A responsive navbar to display in a dashboard.",{"title":411,"path":412,"stem":413,"framework":16,"category":403,"description":414},"DashboardPanel","\u002Fdocs\u002Fcomponents\u002Fdashboard-panel","docs\u002F2.components\u002Fdashboard-panel","A resizable panel to display in a dashboard.",{"title":416,"path":417,"stem":418,"framework":16,"category":403,"description":419},"DashboardResizeHandle","\u002Fdocs\u002Fcomponents\u002Fdashboard-resize-handle","docs\u002F2.components\u002Fdashboard-resize-handle","A handle to resize a sidebar or panel.",{"title":421,"path":422,"stem":423,"framework":16,"category":403,"description":424},"DashboardSearch","\u002Fdocs\u002Fcomponents\u002Fdashboard-search","docs\u002F2.components\u002Fdashboard-search","A ready to use CommandPalette to add to your dashboard.",{"title":426,"path":427,"stem":428,"framework":16,"category":403,"description":429},"DashboardSearchButton","\u002Fdocs\u002Fcomponents\u002Fdashboard-search-button","docs\u002F2.components\u002Fdashboard-search-button","A pre-styled Button to open the DashboardSearch modal.",{"title":431,"path":432,"stem":433,"framework":16,"category":403,"description":434},"DashboardSidebar","\u002Fdocs\u002Fcomponents\u002Fdashboard-sidebar","docs\u002F2.components\u002Fdashboard-sidebar","A resizable and collapsible sidebar to display in a dashboard.",{"title":436,"path":437,"stem":438,"framework":16,"category":403,"description":439},"DashboardSidebarCollapse","\u002Fdocs\u002Fcomponents\u002Fdashboard-sidebar-collapse","docs\u002F2.components\u002Fdashboard-sidebar-collapse","A Button to collapse the sidebar on desktop.",{"title":441,"path":442,"stem":443,"framework":16,"category":403,"description":444},"DashboardSidebarToggle","\u002Fdocs\u002Fcomponents\u002Fdashboard-sidebar-toggle","docs\u002F2.components\u002Fdashboard-sidebar-toggle","A Button to toggle the sidebar on mobile.",{"title":446,"path":447,"stem":448,"framework":16,"category":403,"description":449},"DashboardToolbar","\u002Fdocs\u002Fcomponents\u002Fdashboard-toolbar","docs\u002F2.components\u002Fdashboard-toolbar","A toolbar to display under the navbar in a dashboard.",{"title":451,"path":452,"stem":453,"framework":16,"category":397,"description":454},"Drawer","\u002Fdocs\u002Fcomponents\u002Fdrawer","docs\u002F2.components\u002Fdrawer","A drawer that smoothly slides in & out of the screen.",{"title":456,"path":457,"stem":458,"framework":16,"category":397,"description":459},"DropdownMenu","\u002Fdocs\u002Fcomponents\u002Fdropdown-menu","docs\u002F2.components\u002Fdropdown-menu","A menu to display actions when clicking on an element.",{"title":461,"path":462,"stem":463,"framework":16,"category":464,"description":465},"Editor","\u002Fdocs\u002Fcomponents\u002Feditor","docs\u002F2.components\u002Feditor","editor","A rich text editor component based on TipTap with support for markdown, HTML, and JSON content types.",{"title":467,"path":468,"stem":469,"framework":16,"category":464,"description":470},"EditorDragHandle","\u002Fdocs\u002Fcomponents\u002Feditor-drag-handle","docs\u002F2.components\u002Feditor-drag-handle","A draggable handle for reordering and selecting blocks in the editor.",{"title":472,"path":473,"stem":474,"framework":16,"category":464,"description":475},"EditorEmojiMenu","\u002Fdocs\u002Fcomponents\u002Feditor-emoji-menu","docs\u002F2.components\u002Feditor-emoji-menu","An emoji picker menu that displays emoji suggestions when typing the : character in the editor.",{"title":477,"path":478,"stem":479,"framework":16,"category":464,"description":480},"EditorMentionMenu","\u002Fdocs\u002Fcomponents\u002Feditor-mention-menu","docs\u002F2.components\u002Feditor-mention-menu","A mention menu that displays user suggestions when typing a trigger character in the editor.",{"title":482,"path":483,"stem":484,"framework":16,"category":464,"description":485},"EditorSuggestionMenu","\u002Fdocs\u002Fcomponents\u002Feditor-suggestion-menu","docs\u002F2.components\u002Feditor-suggestion-menu","A command menu that displays formatting and action suggestions when typing the \u002F character in the editor.",{"title":487,"path":488,"stem":489,"framework":16,"category":464,"description":490},"EditorToolbar","\u002Fdocs\u002Fcomponents\u002Feditor-toolbar","docs\u002F2.components\u002Feditor-toolbar","A customizable toolbar for editor actions that can be displayed as fixed, bubble, or floating menu.",{"title":492,"path":493,"stem":494,"framework":16,"category":172,"description":495},"Empty","\u002Fdocs\u002Fcomponents\u002Fempty","docs\u002F2.components\u002Fempty","A component to display an empty state.",{"title":497,"path":498,"stem":499,"framework":16,"category":184,"description":500},"Error","\u002Fdocs\u002Fcomponents\u002Ferror","docs\u002F2.components\u002Ferror","A pre-built error component with NuxtError support.",{"title":502,"path":503,"stem":504,"framework":16,"category":178,"description":505},"FieldGroup","\u002Fdocs\u002Fcomponents\u002Ffield-group","docs\u002F2.components\u002Ffield-group","Group multiple button-like elements together.",{"title":507,"path":508,"stem":509,"framework":16,"category":309,"description":510},"FileUpload","\u002Fdocs\u002Fcomponents\u002Ffile-upload","docs\u002F2.components\u002Ffile-upload","An input element to upload files.",{"title":512,"path":513,"stem":514,"framework":16,"category":184,"description":515},"Footer","\u002Fdocs\u002Fcomponents\u002Ffooter","docs\u002F2.components\u002Ffooter","A responsive footer component.",{"title":517,"path":518,"stem":519,"framework":16,"category":226,"description":520},"FooterColumns","\u002Fdocs\u002Fcomponents\u002Ffooter-columns","docs\u002F2.components\u002Ffooter-columns","A list of links as columns to display in your Footer.",{"title":522,"path":523,"stem":524,"framework":16,"category":309,"description":525},"Form","\u002Fdocs\u002Fcomponents\u002Fform","docs\u002F2.components\u002Fform","A form component with built-in validation and submission handling.",{"title":527,"path":528,"stem":529,"framework":16,"category":309,"description":530},"FormField","\u002Fdocs\u002Fcomponents\u002Fform-field","docs\u002F2.components\u002Fform-field","A wrapper for form elements that provides validation and error handling.",{"title":532,"path":533,"stem":534,"framework":16,"category":184,"description":535},"Header","\u002Fdocs\u002Fcomponents\u002Fheader","docs\u002F2.components\u002Fheader","A responsive header component.",{"title":537,"path":538,"stem":539,"framework":16,"category":178,"description":540},"Icon","\u002Fdocs\u002Fcomponents\u002Ficon","docs\u002F2.components\u002Ficon","A component to display any icon from Iconify or another component.",{"title":542,"path":543,"stem":544,"framework":16,"category":309,"description":545},"Input","\u002Fdocs\u002Fcomponents\u002Finput","docs\u002F2.components\u002Finput","An input element to enter text.",{"title":547,"path":548,"stem":549,"framework":16,"category":309,"description":550},"InputDate","\u002Fdocs\u002Fcomponents\u002Finput-date","docs\u002F2.components\u002Finput-date","An input component for date selection.",{"title":552,"path":553,"stem":554,"framework":16,"category":309,"description":555},"InputMenu","\u002Fdocs\u002Fcomponents\u002Finput-menu","docs\u002F2.components\u002Finput-menu","An autocomplete input with real-time suggestions.",{"title":557,"path":558,"stem":559,"framework":16,"category":309,"description":560},"InputNumber","\u002Fdocs\u002Fcomponents\u002Finput-number","docs\u002F2.components\u002Finput-number","An input for numerical values with a customizable range.",{"title":562,"path":563,"stem":564,"framework":16,"category":309,"description":565},"InputTags","\u002Fdocs\u002Fcomponents\u002Finput-tags","docs\u002F2.components\u002Finput-tags","An input element that displays interactive tags.",{"title":567,"path":568,"stem":569,"framework":16,"category":309,"description":570},"InputTime","\u002Fdocs\u002Fcomponents\u002Finput-time","docs\u002F2.components\u002Finput-time","An input for selecting a time.",{"title":572,"path":573,"stem":574,"framework":16,"category":178,"description":575},"Kbd","\u002Fdocs\u002Fcomponents\u002Fkbd","docs\u002F2.components\u002Fkbd","A kbd element to display a keyboard key.",{"title":577,"path":578,"stem":579,"framework":16,"category":226,"description":580},"Link","\u002Fdocs\u002Fcomponents\u002Flink","docs\u002F2.components\u002Flink","A wrapper around \u003CNuxtLink> with extra props.",{"title":582,"path":583,"stem":584,"framework":16,"category":585,"description":586},"LocaleSelect","\u002Fdocs\u002Fcomponents\u002Flocale-select","docs\u002F2.components\u002Flocale-select","i18n","A Select to switch between locales.",{"title":588,"path":589,"stem":590,"framework":16,"category":184,"description":591},"Main","\u002Fdocs\u002Fcomponents\u002Fmain","docs\u002F2.components\u002Fmain","A main element that fills the available viewport height.",{"title":593,"path":594,"stem":595,"framework":16,"category":172,"description":596},"Marquee","\u002Fdocs\u002Fcomponents\u002Fmarquee","docs\u002F2.components\u002Fmarquee","A component to create infinite scrolling content.",{"title":598,"path":599,"stem":600,"framework":16,"category":397,"description":601},"Modal","\u002Fdocs\u002Fcomponents\u002Fmodal","docs\u002F2.components\u002Fmodal","A dialog window that can be used to display a message or request user input.",{"title":603,"path":604,"stem":605,"framework":16,"category":226,"description":606},"NavigationMenu","\u002Fdocs\u002Fcomponents\u002Fnavigation-menu","docs\u002F2.components\u002Fnavigation-menu","A list of links that can be displayed horizontally or vertically.",{"title":608,"path":609,"stem":610,"framework":16,"category":190,"description":611},"Page","\u002Fdocs\u002Fcomponents\u002Fpage","docs\u002F2.components\u002Fpage","A grid layout for your pages with left and right columns.",{"title":613,"path":614,"stem":615,"framework":16,"category":190,"description":616},"PageAnchors","\u002Fdocs\u002Fcomponents\u002Fpage-anchors","docs\u002F2.components\u002Fpage-anchors","A list of anchors to be displayed in the page.",{"title":618,"path":619,"stem":620,"framework":16,"category":190,"description":621},"PageAside","\u002Fdocs\u002Fcomponents\u002Fpage-aside","docs\u002F2.components\u002Fpage-aside","A sticky aside to display your page navigation.",{"title":623,"path":624,"stem":625,"framework":16,"category":190,"description":626},"PageBody","\u002Fdocs\u002Fcomponents\u002Fpage-body","docs\u002F2.components\u002Fpage-body","The main content of your page.",{"title":628,"path":629,"stem":630,"framework":16,"category":190,"description":631},"PageCard","\u002Fdocs\u002Fcomponents\u002Fpage-card","docs\u002F2.components\u002Fpage-card","A pre-styled card component that displays a title, description and optional link.",{"title":633,"path":634,"stem":635,"framework":16,"category":190,"description":636},"PageColumns","\u002Fdocs\u002Fcomponents\u002Fpage-columns","docs\u002F2.components\u002Fpage-columns","A responsive multi-column layout system for organizing content side-by-side.",{"title":638,"path":639,"stem":640,"framework":16,"category":190,"description":641},"PageCTA","\u002Fdocs\u002Fcomponents\u002Fpage-cta","docs\u002F2.components\u002Fpage-cta","A call to action section to display in your pages.",{"title":643,"path":644,"stem":645,"framework":16,"category":190,"description":646},"PageFeature","\u002Fdocs\u002Fcomponents\u002Fpage-feature","docs\u002F2.components\u002Fpage-feature","A component to showcase key features of your application.",{"title":648,"path":649,"stem":650,"framework":16,"category":190,"description":651},"PageGrid","\u002Fdocs\u002Fcomponents\u002Fpage-grid","docs\u002F2.components\u002Fpage-grid","A responsive grid system for displaying content in a flexible layout.",{"title":653,"path":654,"stem":655,"framework":16,"category":190,"description":656},"PageHeader","\u002Fdocs\u002Fcomponents\u002Fpage-header","docs\u002F2.components\u002Fpage-header","A responsive header for your pages.",{"title":658,"path":659,"stem":660,"framework":16,"category":190,"description":661},"PageHero","\u002Fdocs\u002Fcomponents\u002Fpage-hero","docs\u002F2.components\u002Fpage-hero","A responsive hero for your pages.",{"title":663,"path":664,"stem":665,"framework":16,"category":190,"description":666},"PageLinks","\u002Fdocs\u002Fcomponents\u002Fpage-links","docs\u002F2.components\u002Fpage-links","A list of links to be displayed in the page.",{"title":668,"path":669,"stem":670,"framework":16,"category":190,"description":671},"PageList","\u002Fdocs\u002Fcomponents\u002Fpage-list","docs\u002F2.components\u002Fpage-list","A vertical list layout for displaying content in a stacked format.",{"title":673,"path":674,"stem":675,"framework":16,"category":190,"description":676},"PageLogos","\u002Fdocs\u002Fcomponents\u002Fpage-logos","docs\u002F2.components\u002Fpage-logos","A list of logos or images to display on your pages.",{"title":678,"path":679,"stem":680,"framework":16,"category":190,"description":681},"PageSection","\u002Fdocs\u002Fcomponents\u002Fpage-section","docs\u002F2.components\u002Fpage-section","A responsive section for your pages.",{"title":683,"path":684,"stem":685,"framework":16,"category":226,"description":686},"Pagination","\u002Fdocs\u002Fcomponents\u002Fpagination","docs\u002F2.components\u002Fpagination","A list of buttons or links to navigate through pages.",{"title":688,"path":689,"stem":690,"framework":16,"category":309,"description":691},"PinInput","\u002Fdocs\u002Fcomponents\u002Fpin-input","docs\u002F2.components\u002Fpin-input","An input element to enter a pin.",{"title":693,"path":694,"stem":695,"framework":16,"category":397,"description":696},"Popover","\u002Fdocs\u002Fcomponents\u002Fpopover","docs\u002F2.components\u002Fpopover","A non-modal dialog that floats around a trigger element.",{"title":698,"path":699,"stem":700,"framework":16,"category":190,"description":701},"PricingPlan","\u002Fdocs\u002Fcomponents\u002Fpricing-plan","docs\u002F2.components\u002Fpricing-plan","A customizable pricing plan to display in a pricing page.",{"title":703,"path":704,"stem":705,"framework":16,"category":190,"description":706},"PricingPlans","\u002Fdocs\u002Fcomponents\u002Fpricing-plans","docs\u002F2.components\u002Fpricing-plans","Display a list of pricing plans in a responsive grid layout.",{"title":708,"path":709,"stem":710,"framework":16,"category":190,"description":711},"PricingTable","\u002Fdocs\u002Fcomponents\u002Fpricing-table","docs\u002F2.components\u002Fpricing-table","A responsive pricing table component that displays tiered pricing plans with feature comparisons.",{"title":713,"path":714,"stem":715,"framework":16,"category":178,"description":716},"Progress","\u002Fdocs\u002Fcomponents\u002Fprogress","docs\u002F2.components\u002Fprogress","An indicator showing the progress of a task.",{"title":718,"path":719,"stem":720,"framework":16,"category":309,"description":721},"RadioGroup","\u002Fdocs\u002Fcomponents\u002Fradio-group","docs\u002F2.components\u002Fradio-group","A set of radio buttons to select a single option from a list.",{"title":723,"path":724,"stem":725,"framework":16,"category":172,"description":726},"ScrollArea","\u002Fdocs\u002Fcomponents\u002Fscroll-area","docs\u002F2.components\u002Fscroll-area","A flexible scroll container with virtualization support.",{"title":728,"path":729,"stem":730,"framework":16,"category":309,"description":731},"Select","\u002Fdocs\u002Fcomponents\u002Fselect","docs\u002F2.components\u002Fselect","A select element to choose from a list of options.",{"title":733,"path":734,"stem":735,"framework":16,"category":309,"description":736},"SelectMenu","\u002Fdocs\u002Fcomponents\u002Fselect-menu","docs\u002F2.components\u002Fselect-menu","An advanced searchable select element.",{"title":738,"path":739,"stem":740,"framework":16,"category":178,"description":741},"Separator","\u002Fdocs\u002Fcomponents\u002Fseparator","docs\u002F2.components\u002Fseparator","Separates content horizontally or vertically.",{"title":743,"path":744,"stem":745,"framework":16,"category":184,"description":746,"badge":294},"Sidebar","\u002Fdocs\u002Fcomponents\u002Fsidebar","docs\u002F2.components\u002Fsidebar","A collapsible sidebar with multiple visual variants.",{"title":748,"path":749,"stem":750,"framework":16,"category":178,"description":751},"Skeleton","\u002Fdocs\u002Fcomponents\u002Fskeleton","docs\u002F2.components\u002Fskeleton","A placeholder to show while content is loading.",{"title":753,"path":754,"stem":755,"framework":16,"category":397,"description":756},"Slideover","\u002Fdocs\u002Fcomponents\u002Fslideover","docs\u002F2.components\u002Fslideover","A dialog that slides in from any side of the screen.",{"title":758,"path":759,"stem":760,"framework":16,"category":309,"description":761},"Slider","\u002Fdocs\u002Fcomponents\u002Fslider","docs\u002F2.components\u002Fslider","An input to select a numeric value within a range.",{"title":763,"path":764,"stem":765,"framework":16,"category":226,"description":766},"Stepper","\u002Fdocs\u002Fcomponents\u002Fstepper","docs\u002F2.components\u002Fstepper","A set of steps that are used to indicate progress through a multi-step process.",{"title":768,"path":769,"stem":770,"framework":16,"category":309,"description":771},"Switch","\u002Fdocs\u002Fcomponents\u002Fswitch","docs\u002F2.components\u002Fswitch","A control that toggles between two states.",{"title":773,"path":774,"stem":775,"framework":16,"category":172,"description":776},"Table","\u002Fdocs\u002Fcomponents\u002Ftable","docs\u002F2.components\u002Ftable","A responsive table element to display data in rows and columns.",{"title":778,"path":779,"stem":780,"framework":16,"category":226,"description":781},"Tabs","\u002Fdocs\u002Fcomponents\u002Ftabs","docs\u002F2.components\u002Ftabs","A set of tab panels that are displayed one at a time.",{"title":783,"path":784,"stem":785,"framework":16,"category":309,"description":786},"Textarea","\u002Fdocs\u002Fcomponents\u002Ftextarea","docs\u002F2.components\u002Ftextarea","A textarea element to input multi-line text.",{"title":54,"path":788,"stem":789,"framework":16,"category":184,"description":790},"\u002Fdocs\u002Fcomponents\u002Ftheme","docs\u002F2.components\u002Ftheme","A headless component to theme child components.",{"title":792,"path":793,"stem":794,"framework":16,"category":172,"description":795},"Timeline","\u002Fdocs\u002Fcomponents\u002Ftimeline","docs\u002F2.components\u002Ftimeline","A component that displays a sequence of events with dates, titles, icons or avatars.",{"title":797,"path":798,"stem":799,"framework":16,"category":397,"description":800},"Toast","\u002Fdocs\u002Fcomponents\u002Ftoast","docs\u002F2.components\u002Ftoast","A succinct message to provide information or feedback to the user.",{"title":802,"path":803,"stem":804,"framework":16,"category":397,"description":805},"Tooltip","\u002Fdocs\u002Fcomponents\u002Ftooltip","docs\u002F2.components\u002Ftooltip","A popup that reveals information when hovering over an element.",{"title":807,"path":808,"stem":809,"framework":16,"category":172,"description":810},"Tree","\u002Fdocs\u002Fcomponents\u002Ftree","docs\u002F2.components\u002Ftree","A tree view component to display and interact with hierarchical data structures.",{"title":812,"path":813,"stem":814,"framework":16,"category":172,"description":815},"User","\u002Fdocs\u002Fcomponents\u002Fuser","docs\u002F2.components\u002Fuser","Display user information with name, description and avatar.",{"title":817,"framework":16,"category":16,"description":16,"icon":818,"path":819,"stem":820,"children":821,"page":36},"Composables","i-lucide-square-function","\u002Fdocs\u002Fcomposables","docs\u002F3.composables",[822,827,832,837,842,847,852],{"title":823,"path":824,"stem":825,"framework":16,"category":16,"description":826},"defineLocale","\u002Fdocs\u002Fcomposables\u002Fdefine-locale","docs\u002F3.composables\u002Fdefine-locale","A utility to create a custom locale for your app.",{"title":828,"path":829,"stem":830,"framework":16,"category":16,"description":831},"defineShortcuts","\u002Fdocs\u002Fcomposables\u002Fdefine-shortcuts","docs\u002F3.composables\u002Fdefine-shortcuts","A composable to define keyboard shortcuts in your app.",{"title":833,"path":834,"stem":835,"framework":16,"category":16,"description":836},"extendLocale","\u002Fdocs\u002Fcomposables\u002Fextend-locale","docs\u002F3.composables\u002Fextend-locale","A utility to extend an existing locale with custom translations.",{"title":838,"path":839,"stem":840,"framework":16,"category":16,"description":841},"extractShortcuts","\u002Fdocs\u002Fcomposables\u002Fextract-shortcuts","docs\u002F3.composables\u002Fextract-shortcuts","A utility to extract keyboard shortcuts from menu items.",{"title":843,"path":844,"stem":845,"framework":16,"category":16,"description":846},"useOverlay","\u002Fdocs\u002Fcomposables\u002Fuse-overlay","docs\u002F3.composables\u002Fuse-overlay","A composable to programmatically control overlays.",{"title":848,"path":849,"stem":850,"framework":16,"category":16,"description":851,"badge":294},"useScrollShadow","\u002Fdocs\u002Fcomposables\u002Fuse-scroll-shadow","docs\u002F3.composables\u002Fuse-scroll-shadow","A composable to apply scroll shadow effects on any scrollable element.",{"title":853,"path":854,"stem":855,"framework":16,"category":16,"description":856},"useToast","\u002Fdocs\u002Fcomposables\u002Fuse-toast","docs\u002F3.composables\u002Fuse-toast","A composable to display toast notifications in your app.",{"title":858,"path":859,"stem":860,"children":861,"framework":28,"category":16,"description":16,"icon":957},"Typography","\u002Fdocs\u002Ftypography","docs\u002F4.typography\u002F1.index",[862,864,869,874,879,884,889,893,898,902,907,912,917,922,927,931,936,940,944,948,953],{"title":15,"path":859,"stem":860,"framework":28,"category":16,"description":863},"Beautiful typography components and utilities to style your content with Nuxt UI.",{"title":865,"path":866,"stem":867,"framework":28,"category":16,"description":868},"Headers and text","\u002Fdocs\u002Ftypography\u002Fheaders-and-text","docs\u002F4.typography\u002F2.headers-and-text","Beautifully styled headings, paragraphs, text formatting, and links for optimal readability.",{"title":870,"path":871,"stem":872,"framework":28,"category":16,"description":873},"Lists and tables","\u002Fdocs\u002Ftypography\u002Flists-and-tables","docs\u002F4.typography\u002F3.lists-and-tables","Organize information with styled lists and responsive tables for clear, consistent readability.",{"title":875,"path":876,"stem":877,"framework":28,"category":16,"description":878},"Images and embeds","\u002Fdocs\u002Ftypography\u002Fimages-and-embeds","docs\u002F4.typography\u002F4.images-and-embeds","Responsive images, videos, and rich media embeds to enhance and illustrate your documentation.",{"title":880,"path":881,"stem":882,"framework":28,"category":16,"description":883},"Code","\u002Fdocs\u002Ftypography\u002Fcode","docs\u002F4.typography\u002F5.code","Display inline code and syntax-highlighted code blocks with copy-to-clipboard support.",{"title":169,"path":885,"stem":886,"framework":28,"category":887,"description":888},"\u002Fdocs\u002Ftypography\u002Faccordion","docs\u002F4.typography\u002Faccordion","components","Create expandable content sections for better information organization.",{"title":203,"path":890,"stem":891,"framework":28,"category":887,"description":892},"\u002Fdocs\u002Ftypography\u002Fbadge","docs\u002F4.typography\u002Fbadge","Display version numbers, status labels, and tags within your content.",{"title":894,"path":895,"stem":896,"framework":28,"category":887,"description":897},"Callout","\u002Fdocs\u002Ftypography\u002Fcallout","docs\u002F4.typography\u002Fcallout","Highlight important information with eye-catching colored boxes and icons.",{"title":239,"path":899,"stem":900,"framework":28,"category":887,"description":901},"\u002Fdocs\u002Ftypography\u002Fcard","docs\u002F4.typography\u002Fcard","Create highlighted content blocks with optional links and navigation.",{"title":903,"path":904,"stem":905,"framework":28,"category":887,"description":906},"CardGroup","\u002Fdocs\u002Ftypography\u002Fcard-group","docs\u002F4.typography\u002Fcard-group","Organize multiple cards in responsive grid layouts for better content presentation.",{"title":908,"path":909,"stem":910,"framework":28,"category":887,"description":911},"CodeCollapse","\u002Fdocs\u002Ftypography\u002Fcode-collapse","docs\u002F4.typography\u002Fcode-collapse","Make long code blocks collapsible to save space and improve readability.",{"title":913,"path":914,"stem":915,"framework":28,"category":887,"description":916},"CodeGroup","\u002Fdocs\u002Ftypography\u002Fcode-group","docs\u002F4.typography\u002Fcode-group","Group multiple code examples in tabbed interfaces for easy comparison.",{"title":918,"path":919,"stem":920,"framework":28,"category":887,"description":921},"CodePreview","\u002Fdocs\u002Ftypography\u002Fcode-preview","docs\u002F4.typography\u002Fcode-preview","Display code examples with a preview and their source for clearer documentation.",{"title":923,"path":924,"stem":925,"framework":28,"category":887,"description":926},"CodeTree","\u002Fdocs\u002Ftypography\u002Fcode-tree","docs\u002F4.typography\u002Fcode-tree","Visualize file and folder structures with syntax-highlighted code.",{"title":322,"path":928,"stem":929,"framework":28,"category":887,"description":930},"\u002Fdocs\u002Ftypography\u002Fcollapsible","docs\u002F4.typography\u002Fcollapsible","Toggle content visibility with smooth expand and collapse animations.",{"title":932,"path":933,"stem":934,"framework":28,"category":887,"description":935},"Field","\u002Fdocs\u002Ftypography\u002Ffield","docs\u002F4.typography\u002Ffield","Document API parameters, props, and configuration options clearly.",{"title":502,"path":937,"stem":938,"framework":28,"category":887,"description":939},"\u002Fdocs\u002Ftypography\u002Ffield-group","docs\u002F4.typography\u002Ffield-group","Group related fields together for comprehensive API documentation.",{"title":537,"path":941,"stem":942,"framework":28,"category":887,"description":943},"\u002Fdocs\u002Ftypography\u002Ficon","docs\u002F4.typography\u002Ficon","Display icons from popular icon libraries to enhance your content.",{"title":572,"path":945,"stem":946,"framework":28,"category":887,"description":947},"\u002Fdocs\u002Ftypography\u002Fkbd","docs\u002F4.typography\u002Fkbd","Display keyboard shortcuts and key combinations with proper styling.",{"title":949,"path":950,"stem":951,"framework":28,"category":887,"description":952},"Steps","\u002Fdocs\u002Ftypography\u002Fsteps","docs\u002F4.typography\u002Fsteps","Transform headings into numbered step-by-step guides and tutorials.",{"title":778,"path":954,"stem":955,"framework":28,"category":887,"description":956},"\u002Fdocs\u002Ftypography\u002Ftabs","docs\u002F4.typography\u002Ftabs","Organize related content in interactive tabbed interfaces.","i-lucide-square-pilcrow",{"id":959,"title":960,"authors":961,"body":972,"date":12282,"description":12283,"extension":12284,"image":12285,"meta":12286,"navigation":36,"path":12288,"seo":12289,"stem":12290,"__hash__":12291},"posts\u002Fblog\u002Fhow-to-build-an-ai-chat.md","Build an AI Chatbot with Nuxt, Nuxt UI, and AI SDK",[962,967],{"name":963,"avatar":964,"to":966},"Hugo Richard",{"src":965},"https:\u002F\u002Fgithub.com\u002Fhugorcd.png","https:\u002F\u002Fx.com\u002Fhugorcd",{"name":968,"avatar":969,"to":971},"Benjamin Canac",{"src":970},"https:\u002F\u002Fgithub.com\u002Fbenjamincanac.png","https:\u002F\u002Fx.com\u002Fbenjamincanac",{"type":973,"value":974,"toc":12249},"minimark",[975,979,984,987,1022,1049,1053,1056,1070,1074,1077,1114,1119,1122,1266,1270,1277,1493,1496,1535,1539,1546,1641,1648,1665,1675,1679,1693,2424,2427,2445,2455,2459,2467,2471,2482,2850,2854,2881,4588,4591,4596,4603,4608,4619,4624,4633,4651,4656,4671,4684,4688,4691,5066,5070,5085,5089,5097,5670,5677,5702,5706,5724,7171,7174,7179,7190,7228,7243,7248,7255,7269,7274,7313,7318,7323,7330,7341,7345,7348,7352,7355,7508,7512,7537,8008,8012,8551,8555,9891,9900,9904,9911,9915,9925,10174,10178,10186,10433,10437,10440,11855,11859,11862,11867,11876,11881,11890,12093,12097,12100,12115,12118,12133,12148,12156,12160,12163,12193,12196,12201,12242,12245],[976,977,978],"p",{},"Building AI-powered applications has never been more accessible. This guide walks through creating a full-featured AI chatbot using Nuxt, Nuxt UI, and the Vercel AI SDK. Each step is explained in detail so you understand how every piece works together.",[980,981,983],"h2",{"id":982},"what-were-building","What we're building",[976,985,986],{},"By the end of this tutorial, you'll have a fully functional AI chatbot with:",[988,989,990,998,1004,1010,1016],"ul",{},[991,992,993,997],"li",{},[994,995,996],"strong",{},"Streaming responses"," that appear in real-time as the AI generates them",[991,999,1000,1003],{},[994,1001,1002],{},"A beautiful chat interface"," built with Nuxt UI's purpose-built chat components",[991,1005,1006,1009],{},[994,1007,1008],{},"Markdown rendering"," for rich AI responses with code highlighting",[991,1011,1012,1015],{},[994,1013,1014],{},"Multi-model support"," allowing users to switch between OpenAI, Anthropic, and Google models",[991,1017,1018,1021],{},[994,1019,1020],{},"Server-side AI integration"," using Nitro API routes and the AI SDK",[1023,1024,1026],"callout",{"icon":1025},"i-simple-icons-github",[976,1027,1028,1029,1040,1041,1048],{},"Check out the ",[1030,1031,1036],"a",{"href":1032,"rel":1033,"target":1035},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat",[1034],"nofollow","_blank",[1037,1038,1039],"code",{},"Nuxt"," and ",[1030,1042,1045],{"href":1043,"rel":1044,"target":1035},"https:\u002F\u002Fgithub.com\u002Fnuxt-ui-templates\u002Fchat-vue",[1034],[1037,1046,1047],{},"Vue"," AI Chat templates on GitHub for production-ready implementations with authentication, database persistence, and more.",[980,1050,1052],{"id":1051},"prerequisites","Prerequisites",[976,1054,1055],{},"Before we start, make sure you have:",[988,1057,1058,1061],{},[991,1059,1060],{},"Node.js 20+ installed",[991,1062,1063,1064,1069],{},"A ",[1030,1065,1068],{"href":1066,"rel":1067},"https:\u002F\u002Fvercel.com\u002Fdocs\u002Fai-gateway",[1034],"Vercel AI Gateway"," API key (provides access to multiple AI providers through a single endpoint)",[980,1071,1073],{"id":1072},"project-setup","Project setup",[976,1075,1076],{},"Start by creating a new Nuxt project:",[1078,1079,1084],"pre",{"className":1080,"code":1081,"language":1082,"meta":1083,"style":1083},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npx nuxi@latest init nuxt-ai-chat\ncd nuxt-ai-chat\n","bash","",[1037,1085,1086,1105],{"__ignoreMap":1083},[1087,1088,1091,1095,1099,1102],"span",{"class":1089,"line":1090},"line",1,[1087,1092,1094],{"class":1093},"sBMFI","npx",[1087,1096,1098],{"class":1097},"sfazB"," nuxi@latest",[1087,1100,1101],{"class":1097}," init",[1087,1103,1104],{"class":1097}," nuxt-ai-chat\n",[1087,1106,1108,1112],{"class":1089,"line":1107},2,[1087,1109,1111],{"class":1110},"s2Zo4","cd",[1087,1113,1104],{"class":1097},[1115,1116,1118],"h3",{"id":1117},"installing-dependencies","Installing dependencies",[976,1120,1121],{},"Install Nuxt UI and the AI-specific dependencies:",[1123,1124,1126,1169,1201,1234],"code-group",{"sync":1125},"pm",[1078,1127,1130],{"className":1080,"code":1128,"filename":1129,"language":1082,"meta":1083,"style":1083},"pnpm add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","pnpm",[1037,1131,1132],{"__ignoreMap":1083},[1087,1133,1134,1136,1139,1142,1145,1148,1151,1154,1157,1160,1163,1166],{"class":1089,"line":1090},[1087,1135,1129],{"class":1093},[1087,1137,1138],{"class":1097}," add",[1087,1140,1141],{"class":1097}," @nuxt\u002Fui",[1087,1143,1144],{"class":1097}," tailwindcss",[1087,1146,1147],{"class":1097}," @nuxtjs\u002Fmdc",[1087,1149,1150],{"class":1097}," @nuxthub\u002Fcore",[1087,1152,1153],{"class":1097}," drizzle-orm",[1087,1155,1156],{"class":1097}," drizzle-kit",[1087,1158,1159],{"class":1097}," @libsql\u002Fclient",[1087,1161,1162],{"class":1097}," ai",[1087,1164,1165],{"class":1097}," @ai-sdk\u002Fvue",[1087,1167,1168],{"class":1097}," zod\n",[1078,1170,1173],{"className":1080,"code":1171,"filename":1172,"language":1082,"meta":1083,"style":1083},"yarn add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","yarn",[1037,1174,1175],{"__ignoreMap":1083},[1087,1176,1177,1179,1181,1183,1185,1187,1189,1191,1193,1195,1197,1199],{"class":1089,"line":1090},[1087,1178,1172],{"class":1093},[1087,1180,1138],{"class":1097},[1087,1182,1141],{"class":1097},[1087,1184,1144],{"class":1097},[1087,1186,1147],{"class":1097},[1087,1188,1150],{"class":1097},[1087,1190,1153],{"class":1097},[1087,1192,1156],{"class":1097},[1087,1194,1159],{"class":1097},[1087,1196,1162],{"class":1097},[1087,1198,1165],{"class":1097},[1087,1200,1168],{"class":1097},[1078,1202,1205],{"className":1080,"code":1203,"filename":1204,"language":1082,"meta":1083,"style":1083},"npm install @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","npm",[1037,1206,1207],{"__ignoreMap":1083},[1087,1208,1209,1211,1214,1216,1218,1220,1222,1224,1226,1228,1230,1232],{"class":1089,"line":1090},[1087,1210,1204],{"class":1093},[1087,1212,1213],{"class":1097}," install",[1087,1215,1141],{"class":1097},[1087,1217,1144],{"class":1097},[1087,1219,1147],{"class":1097},[1087,1221,1150],{"class":1097},[1087,1223,1153],{"class":1097},[1087,1225,1156],{"class":1097},[1087,1227,1159],{"class":1097},[1087,1229,1162],{"class":1097},[1087,1231,1165],{"class":1097},[1087,1233,1168],{"class":1097},[1078,1235,1238],{"className":1080,"code":1236,"filename":1237,"language":1082,"meta":1083,"style":1083},"bun add @nuxt\u002Fui tailwindcss @nuxtjs\u002Fmdc @nuxthub\u002Fcore drizzle-orm drizzle-kit @libsql\u002Fclient ai @ai-sdk\u002Fvue zod\n","bun",[1037,1239,1240],{"__ignoreMap":1083},[1087,1241,1242,1244,1246,1248,1250,1252,1254,1256,1258,1260,1262,1264],{"class":1089,"line":1090},[1087,1243,1237],{"class":1093},[1087,1245,1138],{"class":1097},[1087,1247,1141],{"class":1097},[1087,1249,1144],{"class":1097},[1087,1251,1147],{"class":1097},[1087,1253,1150],{"class":1097},[1087,1255,1153],{"class":1097},[1087,1257,1156],{"class":1097},[1087,1259,1159],{"class":1097},[1087,1261,1162],{"class":1097},[1087,1263,1165],{"class":1097},[1087,1265,1168],{"class":1097},[1115,1267,1269],{"id":1268},"configuration","Configuration",[976,1271,1272,1273,1276],{},"Update your ",[1037,1274,1275],{},"nuxt.config.ts"," to register the modules:",[1278,1279,1280],"code-tree-intersection",{},[1078,1281,1285],{"className":1282,"code":1283,"filename":1275,"language":1284,"meta":1083,"style":1083},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","export default defineNuxtConfig({\n  modules: [\n    '@nuxt\u002Fui',\n    '@nuxtjs\u002Fmdc',\n    '@nuxthub\u002Fcore'\n  ],\n\n  hub: {\n    db: 'sqlite'\n  },\n\n  css: ['~\u002Fassets\u002Fcss\u002Fmain.css'],\n\n  mdc: {\n    headings: {\n      anchorLinks: false \u002F\u002F Disable anchor links in AI responses\n    }\n  },\n})\n","ts",[1037,1286,1287,1307,1319,1334,1346,1357,1365,1371,1382,1398,1404,1409,1432,1437,1447,1457,1473,1479,1484],{"__ignoreMap":1083},[1087,1288,1289,1293,1296,1299,1303],{"class":1089,"line":1090},[1087,1290,1292],{"class":1291},"s7zQu","export",[1087,1294,1295],{"class":1291}," default",[1087,1297,1298],{"class":1110}," defineNuxtConfig",[1087,1300,1302],{"class":1301},"sTEyZ","(",[1087,1304,1306],{"class":1305},"sMK4o","{\n",[1087,1308,1309,1313,1316],{"class":1089,"line":1107},[1087,1310,1312],{"class":1311},"swJcz","  modules",[1087,1314,1315],{"class":1305},":",[1087,1317,1318],{"class":1301}," [\n",[1087,1320,1322,1325,1328,1331],{"class":1089,"line":1321},3,[1087,1323,1324],{"class":1305},"    '",[1087,1326,1327],{"class":1097},"@nuxt\u002Fui",[1087,1329,1330],{"class":1305},"'",[1087,1332,1333],{"class":1305},",\n",[1087,1335,1337,1339,1342,1344],{"class":1089,"line":1336},4,[1087,1338,1324],{"class":1305},[1087,1340,1341],{"class":1097},"@nuxtjs\u002Fmdc",[1087,1343,1330],{"class":1305},[1087,1345,1333],{"class":1305},[1087,1347,1349,1351,1354],{"class":1089,"line":1348},5,[1087,1350,1324],{"class":1305},[1087,1352,1353],{"class":1097},"@nuxthub\u002Fcore",[1087,1355,1356],{"class":1305},"'\n",[1087,1358,1360,1363],{"class":1089,"line":1359},6,[1087,1361,1362],{"class":1301},"  ]",[1087,1364,1333],{"class":1305},[1087,1366,1368],{"class":1089,"line":1367},7,[1087,1369,1370],{"emptyLinePlaceholder":21},"\n",[1087,1372,1374,1377,1379],{"class":1089,"line":1373},8,[1087,1375,1376],{"class":1311},"  hub",[1087,1378,1315],{"class":1305},[1087,1380,1381],{"class":1305}," {\n",[1087,1383,1385,1388,1390,1393,1396],{"class":1089,"line":1384},9,[1087,1386,1387],{"class":1311},"    db",[1087,1389,1315],{"class":1305},[1087,1391,1392],{"class":1305}," '",[1087,1394,1395],{"class":1097},"sqlite",[1087,1397,1356],{"class":1305},[1087,1399,1401],{"class":1089,"line":1400},10,[1087,1402,1403],{"class":1305},"  },\n",[1087,1405,1407],{"class":1089,"line":1406},11,[1087,1408,1370],{"emptyLinePlaceholder":21},[1087,1410,1412,1415,1417,1420,1422,1425,1427,1430],{"class":1089,"line":1411},12,[1087,1413,1414],{"class":1311},"  css",[1087,1416,1315],{"class":1305},[1087,1418,1419],{"class":1301}," [",[1087,1421,1330],{"class":1305},[1087,1423,1424],{"class":1097},"~\u002Fassets\u002Fcss\u002Fmain.css",[1087,1426,1330],{"class":1305},[1087,1428,1429],{"class":1301},"]",[1087,1431,1333],{"class":1305},[1087,1433,1435],{"class":1089,"line":1434},13,[1087,1436,1370],{"emptyLinePlaceholder":21},[1087,1438,1440,1443,1445],{"class":1089,"line":1439},14,[1087,1441,1442],{"class":1311},"  mdc",[1087,1444,1315],{"class":1305},[1087,1446,1381],{"class":1305},[1087,1448,1450,1453,1455],{"class":1089,"line":1449},15,[1087,1451,1452],{"class":1311},"    headings",[1087,1454,1315],{"class":1305},[1087,1456,1381],{"class":1305},[1087,1458,1460,1463,1465,1469],{"class":1089,"line":1459},16,[1087,1461,1462],{"class":1311},"      anchorLinks",[1087,1464,1315],{"class":1305},[1087,1466,1468],{"class":1467},"sfNiH"," false",[1087,1470,1472],{"class":1471},"sHwdD"," \u002F\u002F Disable anchor links in AI responses\n",[1087,1474,1476],{"class":1089,"line":1475},17,[1087,1477,1478],{"class":1305},"    }\n",[1087,1480,1482],{"class":1089,"line":1481},18,[1087,1483,1403],{"class":1305},[1087,1485,1487,1490],{"class":1089,"line":1486},19,[1087,1488,1489],{"class":1305},"}",[1087,1491,1492],{"class":1301},")\n",[976,1494,1495],{},"Create the main CSS file to import Tailwind CSS and Nuxt UI:",[1278,1497,1498],{},[1078,1499,1504],{"className":1500,"code":1501,"filename":1502,"language":1503,"meta":1083,"style":1083},"language-css shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","@import \"tailwindcss\";\n@import \"@nuxt\u002Fui\";\n","app\u002Fassets\u002Fcss\u002Fmain.css","css",[1037,1505,1506,1523],{"__ignoreMap":1083},[1087,1507,1508,1511,1514,1517,1520],{"class":1089,"line":1090},[1087,1509,1510],{"class":1291},"@import",[1087,1512,1513],{"class":1305}," \"",[1087,1515,1516],{"class":1097},"tailwindcss",[1087,1518,1519],{"class":1305},"\"",[1087,1521,1522],{"class":1305},";\n",[1087,1524,1525,1527,1529,1531,1533],{"class":1089,"line":1107},[1087,1526,1510],{"class":1291},[1087,1528,1513],{"class":1305},[1087,1530,1327],{"class":1097},[1087,1532,1519],{"class":1305},[1087,1534,1522],{"class":1305},[1115,1536,1538],{"id":1537},"setting-up-the-app","Setting up the app",[976,1540,1541,1542,1545],{},"Nuxt UI requires wrapping your app with ",[1037,1543,1544],{},"UApp"," for modals, toasts, and overlays to work properly:",[1278,1547,1548],{},[1078,1549,1554],{"className":1550,"code":1551,"filename":1552,"highlights":1553,"language":34,"meta":1083,"style":1083},"language-vue shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Ctemplate>\n  \u003CUApp>\n    \u003CUDashboardGroup unit=\"rem\">\n      \u003CNuxtPage \u002F>\n    \u003C\u002FUDashboardGroup>\n  \u003C\u002FUApp>\n\u003C\u002Ftemplate>\n","app\u002Fapp.vue",[1107,1359],[1037,1555,1556,1567,1578,1602,1613,1622,1632],{"__ignoreMap":1083},[1087,1557,1558,1561,1564],{"class":1089,"line":1090},[1087,1559,1560],{"class":1305},"\u003C",[1087,1562,1563],{"class":1311},"template",[1087,1565,1566],{"class":1305},">\n",[1087,1568,1571,1574,1576],{"class":1569,"line":1107},[1089,1570],"highlight",[1087,1572,1573],{"class":1305},"  \u003C",[1087,1575,1544],{"class":1311},[1087,1577,1566],{"class":1305},[1087,1579,1580,1583,1586,1590,1593,1595,1598,1600],{"class":1089,"line":1321},[1087,1581,1582],{"class":1305},"    \u003C",[1087,1584,1585],{"class":1311},"UDashboardGroup",[1087,1587,1589],{"class":1588},"spNyl"," unit",[1087,1591,1592],{"class":1305},"=",[1087,1594,1519],{"class":1305},[1087,1596,1597],{"class":1097},"rem",[1087,1599,1519],{"class":1305},[1087,1601,1566],{"class":1305},[1087,1603,1604,1607,1610],{"class":1089,"line":1336},[1087,1605,1606],{"class":1305},"      \u003C",[1087,1608,1609],{"class":1311},"NuxtPage",[1087,1611,1612],{"class":1305}," \u002F>\n",[1087,1614,1615,1618,1620],{"class":1089,"line":1348},[1087,1616,1617],{"class":1305},"    \u003C\u002F",[1087,1619,1585],{"class":1311},[1087,1621,1566],{"class":1305},[1087,1623,1625,1628,1630],{"class":1624,"line":1359},[1089,1570],[1087,1626,1627],{"class":1305},"  \u003C\u002F",[1087,1629,1544],{"class":1311},[1087,1631,1566],{"class":1305},[1087,1633,1634,1637,1639],{"class":1089,"line":1367},[1087,1635,1636],{"class":1305},"\u003C\u002F",[1087,1638,1563],{"class":1311},[1087,1640,1566],{"class":1305},[976,1642,1643,1644,1647],{},"Create a ",[1037,1645,1646],{},".env"," file with your AI Gateway API key:",[1278,1649,1650],{},[1078,1651,1653],{"className":1080,"code":1652,"filename":1646,"language":1082,"meta":1083,"style":1083},"AI_GATEWAY_API_KEY=your-api-key-here\n",[1037,1654,1655],{"__ignoreMap":1083},[1087,1656,1657,1660,1662],{"class":1089,"line":1090},[1087,1658,1659],{"class":1301},"AI_GATEWAY_API_KEY",[1087,1661,1592],{"class":1305},[1087,1663,1664],{"class":1097},"your-api-key-here\n",[1666,1667,1668],"note",{},[976,1669,1670,1671,1674],{},"With ",[1030,1672,1068],{"href":1066,"rel":1673},[1034],", you don't need individual API keys for OpenAI, Anthropic, or Google. The AI Gateway provides a unified API to access hundreds of models through a single endpoint.",[1115,1676,1678],{"id":1677},"setting-up-the-database","Setting up the database",[976,1680,1681,1686,1687,1692],{},[1030,1682,1685],{"href":1683,"rel":1684},"https:\u002F\u002Fhub.nuxt.com",[1034],"NuxtHub"," provides a zero-config database powered by ",[1030,1688,1691],{"href":1689,"rel":1690},"https:\u002F\u002Form.drizzle.team",[1034],"Drizzle ORM",". Here is the schema for the chat application:",[1278,1694,1695],{},[1696,1697,1698],"code-collapse",{},[1078,1699,1702],{"className":1282,"code":1700,"filename":1701,"language":1284,"meta":1083,"style":1083},"import { sqliteTable, text, integer, index } from 'drizzle-orm\u002Fsqlite-core'\nimport { relations } from 'drizzle-orm'\n\nexport const chats = sqliteTable('chats', {\n  id: text().primaryKey().$defaultFn(() => crypto.randomUUID()),\n  title: text(),\n  createdAt: integer({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date())\n})\n\nexport const chatsRelations = relations(chats, ({ many }) => ({\n  messages: many(messages)\n}))\n\nexport const messages = sqliteTable('messages', {\n  id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()),\n  chatId: text('chat_id').notNull().references(() => chats.id, { onDelete: 'cascade' }),\n  role: text('role', { enum: ['user', 'assistant', 'system'] }).notNull(),\n  parts: text('parts', { mode: 'json' }),\n  createdAt: integer({ mode: 'timestamp' }).notNull().$defaultFn(() => new Date()),\n}, table => [\n  index('messages_chat_id_idx').on(table.chatId)\n])\n\nexport const messagesRelations = relations(messages, ({ one }) => ({\n  chat: one(chats, {\n    fields: [messages.chatId],\n    references: [chats.id]\n  })\n}))\n","server\u002Fdb\u002Fschema.ts",[1037,1703,1704,1744,1764,1768,1795,1840,1853,1910,1916,1920,1955,1967,1974,1978,2004,2049,2115,2184,2223,2273,2286,2316,2322,2327,2359,2375,2393,2409,2417],{"__ignoreMap":1083},[1087,1705,1706,1709,1712,1715,1718,1721,1723,1726,1728,1731,1734,1737,1739,1742],{"class":1089,"line":1090},[1087,1707,1708],{"class":1291},"import",[1087,1710,1711],{"class":1305}," {",[1087,1713,1714],{"class":1301}," sqliteTable",[1087,1716,1717],{"class":1305},",",[1087,1719,1720],{"class":1301}," text",[1087,1722,1717],{"class":1305},[1087,1724,1725],{"class":1301}," integer",[1087,1727,1717],{"class":1305},[1087,1729,1730],{"class":1301}," index",[1087,1732,1733],{"class":1305}," }",[1087,1735,1736],{"class":1291}," from",[1087,1738,1392],{"class":1305},[1087,1740,1741],{"class":1097},"drizzle-orm\u002Fsqlite-core",[1087,1743,1356],{"class":1305},[1087,1745,1746,1748,1750,1753,1755,1757,1759,1762],{"class":1089,"line":1107},[1087,1747,1708],{"class":1291},[1087,1749,1711],{"class":1305},[1087,1751,1752],{"class":1301}," relations",[1087,1754,1733],{"class":1305},[1087,1756,1736],{"class":1291},[1087,1758,1392],{"class":1305},[1087,1760,1761],{"class":1097},"drizzle-orm",[1087,1763,1356],{"class":1305},[1087,1765,1766],{"class":1089,"line":1321},[1087,1767,1370],{"emptyLinePlaceholder":21},[1087,1769,1770,1772,1775,1778,1780,1782,1784,1786,1789,1791,1793],{"class":1089,"line":1336},[1087,1771,1292],{"class":1291},[1087,1773,1774],{"class":1588}," const",[1087,1776,1777],{"class":1301}," chats ",[1087,1779,1592],{"class":1305},[1087,1781,1714],{"class":1110},[1087,1783,1302],{"class":1301},[1087,1785,1330],{"class":1305},[1087,1787,1788],{"class":1097},"chats",[1087,1790,1330],{"class":1305},[1087,1792,1717],{"class":1305},[1087,1794,1381],{"class":1305},[1087,1796,1797,1800,1802,1804,1807,1810,1813,1815,1817,1820,1822,1824,1827,1830,1832,1835,1838],{"class":1089,"line":1348},[1087,1798,1799],{"class":1311},"  id",[1087,1801,1315],{"class":1305},[1087,1803,1720],{"class":1110},[1087,1805,1806],{"class":1301},"()",[1087,1808,1809],{"class":1305},".",[1087,1811,1812],{"class":1110},"primaryKey",[1087,1814,1806],{"class":1301},[1087,1816,1809],{"class":1305},[1087,1818,1819],{"class":1110},"$defaultFn",[1087,1821,1302],{"class":1301},[1087,1823,1806],{"class":1305},[1087,1825,1826],{"class":1588}," =>",[1087,1828,1829],{"class":1301}," crypto",[1087,1831,1809],{"class":1305},[1087,1833,1834],{"class":1110},"randomUUID",[1087,1836,1837],{"class":1301},"())",[1087,1839,1333],{"class":1305},[1087,1841,1842,1845,1847,1849,1851],{"class":1089,"line":1359},[1087,1843,1844],{"class":1311},"  title",[1087,1846,1315],{"class":1305},[1087,1848,1720],{"class":1110},[1087,1850,1806],{"class":1301},[1087,1852,1333],{"class":1305},[1087,1854,1855,1858,1860,1862,1864,1867,1870,1872,1874,1877,1879,1881,1884,1886,1889,1891,1893,1895,1897,1899,1901,1904,1907],{"class":1089,"line":1367},[1087,1856,1857],{"class":1311},"  createdAt",[1087,1859,1315],{"class":1305},[1087,1861,1725],{"class":1110},[1087,1863,1302],{"class":1301},[1087,1865,1866],{"class":1305},"{",[1087,1868,1869],{"class":1311}," mode",[1087,1871,1315],{"class":1305},[1087,1873,1392],{"class":1305},[1087,1875,1876],{"class":1097},"timestamp",[1087,1878,1330],{"class":1305},[1087,1880,1733],{"class":1305},[1087,1882,1883],{"class":1301},")",[1087,1885,1809],{"class":1305},[1087,1887,1888],{"class":1110},"notNull",[1087,1890,1806],{"class":1301},[1087,1892,1809],{"class":1305},[1087,1894,1819],{"class":1110},[1087,1896,1302],{"class":1301},[1087,1898,1806],{"class":1305},[1087,1900,1826],{"class":1588},[1087,1902,1903],{"class":1305}," new",[1087,1905,1906],{"class":1110}," Date",[1087,1908,1909],{"class":1301},"())\n",[1087,1911,1912,1914],{"class":1089,"line":1373},[1087,1913,1489],{"class":1305},[1087,1915,1492],{"class":1301},[1087,1917,1918],{"class":1089,"line":1384},[1087,1919,1370],{"emptyLinePlaceholder":21},[1087,1921,1922,1924,1926,1929,1931,1933,1936,1938,1941,1945,1948,1950,1953],{"class":1089,"line":1400},[1087,1923,1292],{"class":1291},[1087,1925,1774],{"class":1588},[1087,1927,1928],{"class":1301}," chatsRelations ",[1087,1930,1592],{"class":1305},[1087,1932,1752],{"class":1110},[1087,1934,1935],{"class":1301},"(chats",[1087,1937,1717],{"class":1305},[1087,1939,1940],{"class":1305}," ({",[1087,1942,1944],{"class":1943},"sHdIc"," many",[1087,1946,1947],{"class":1305}," })",[1087,1949,1826],{"class":1588},[1087,1951,1952],{"class":1301}," (",[1087,1954,1306],{"class":1305},[1087,1956,1957,1960,1962,1964],{"class":1089,"line":1406},[1087,1958,1959],{"class":1311},"  messages",[1087,1961,1315],{"class":1305},[1087,1963,1944],{"class":1110},[1087,1965,1966],{"class":1301},"(messages)\n",[1087,1968,1969,1971],{"class":1089,"line":1411},[1087,1970,1489],{"class":1305},[1087,1972,1973],{"class":1301},"))\n",[1087,1975,1976],{"class":1089,"line":1434},[1087,1977,1370],{"emptyLinePlaceholder":21},[1087,1979,1980,1982,1984,1987,1989,1991,1993,1995,1998,2000,2002],{"class":1089,"line":1439},[1087,1981,1292],{"class":1291},[1087,1983,1774],{"class":1588},[1087,1985,1986],{"class":1301}," messages ",[1087,1988,1592],{"class":1305},[1087,1990,1714],{"class":1110},[1087,1992,1302],{"class":1301},[1087,1994,1330],{"class":1305},[1087,1996,1997],{"class":1097},"messages",[1087,1999,1330],{"class":1305},[1087,2001,1717],{"class":1305},[1087,2003,1381],{"class":1305},[1087,2005,2006,2008,2010,2012,2014,2016,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047],{"class":1089,"line":1449},[1087,2007,1799],{"class":1311},[1087,2009,1315],{"class":1305},[1087,2011,1720],{"class":1110},[1087,2013,1302],{"class":1301},[1087,2015,1330],{"class":1305},[1087,2017,2018],{"class":1097},"id",[1087,2020,1330],{"class":1305},[1087,2022,1883],{"class":1301},[1087,2024,1809],{"class":1305},[1087,2026,1812],{"class":1110},[1087,2028,1806],{"class":1301},[1087,2030,1809],{"class":1305},[1087,2032,1819],{"class":1110},[1087,2034,1302],{"class":1301},[1087,2036,1806],{"class":1305},[1087,2038,1826],{"class":1588},[1087,2040,1829],{"class":1301},[1087,2042,1809],{"class":1305},[1087,2044,1834],{"class":1110},[1087,2046,1837],{"class":1301},[1087,2048,1333],{"class":1305},[1087,2050,2051,2054,2056,2058,2060,2062,2065,2067,2069,2071,2073,2075,2077,2080,2082,2084,2086,2089,2091,2093,2095,2097,2100,2102,2104,2107,2109,2111,2113],{"class":1089,"line":1459},[1087,2052,2053],{"class":1311},"  chatId",[1087,2055,1315],{"class":1305},[1087,2057,1720],{"class":1110},[1087,2059,1302],{"class":1301},[1087,2061,1330],{"class":1305},[1087,2063,2064],{"class":1097},"chat_id",[1087,2066,1330],{"class":1305},[1087,2068,1883],{"class":1301},[1087,2070,1809],{"class":1305},[1087,2072,1888],{"class":1110},[1087,2074,1806],{"class":1301},[1087,2076,1809],{"class":1305},[1087,2078,2079],{"class":1110},"references",[1087,2081,1302],{"class":1301},[1087,2083,1806],{"class":1305},[1087,2085,1826],{"class":1588},[1087,2087,2088],{"class":1301}," chats",[1087,2090,1809],{"class":1305},[1087,2092,2018],{"class":1301},[1087,2094,1717],{"class":1305},[1087,2096,1711],{"class":1305},[1087,2098,2099],{"class":1311}," onDelete",[1087,2101,1315],{"class":1305},[1087,2103,1392],{"class":1305},[1087,2105,2106],{"class":1097},"cascade",[1087,2108,1330],{"class":1305},[1087,2110,1733],{"class":1305},[1087,2112,1883],{"class":1301},[1087,2114,1333],{"class":1305},[1087,2116,2117,2120,2122,2124,2126,2128,2131,2133,2135,2137,2140,2142,2144,2146,2149,2151,2153,2155,2158,2160,2162,2164,2167,2169,2172,2174,2176,2178,2180,2182],{"class":1089,"line":1475},[1087,2118,2119],{"class":1311},"  role",[1087,2121,1315],{"class":1305},[1087,2123,1720],{"class":1110},[1087,2125,1302],{"class":1301},[1087,2127,1330],{"class":1305},[1087,2129,2130],{"class":1097},"role",[1087,2132,1330],{"class":1305},[1087,2134,1717],{"class":1305},[1087,2136,1711],{"class":1305},[1087,2138,2139],{"class":1311}," enum",[1087,2141,1315],{"class":1305},[1087,2143,1419],{"class":1301},[1087,2145,1330],{"class":1305},[1087,2147,2148],{"class":1097},"user",[1087,2150,1330],{"class":1305},[1087,2152,1717],{"class":1305},[1087,2154,1392],{"class":1305},[1087,2156,2157],{"class":1097},"assistant",[1087,2159,1330],{"class":1305},[1087,2161,1717],{"class":1305},[1087,2163,1392],{"class":1305},[1087,2165,2166],{"class":1097},"system",[1087,2168,1330],{"class":1305},[1087,2170,2171],{"class":1301},"] ",[1087,2173,1489],{"class":1305},[1087,2175,1883],{"class":1301},[1087,2177,1809],{"class":1305},[1087,2179,1888],{"class":1110},[1087,2181,1806],{"class":1301},[1087,2183,1333],{"class":1305},[1087,2185,2186,2189,2191,2193,2195,2197,2200,2202,2204,2206,2208,2210,2212,2215,2217,2219,2221],{"class":1089,"line":1481},[1087,2187,2188],{"class":1311},"  parts",[1087,2190,1315],{"class":1305},[1087,2192,1720],{"class":1110},[1087,2194,1302],{"class":1301},[1087,2196,1330],{"class":1305},[1087,2198,2199],{"class":1097},"parts",[1087,2201,1330],{"class":1305},[1087,2203,1717],{"class":1305},[1087,2205,1711],{"class":1305},[1087,2207,1869],{"class":1311},[1087,2209,1315],{"class":1305},[1087,2211,1392],{"class":1305},[1087,2213,2214],{"class":1097},"json",[1087,2216,1330],{"class":1305},[1087,2218,1733],{"class":1305},[1087,2220,1883],{"class":1301},[1087,2222,1333],{"class":1305},[1087,2224,2225,2227,2229,2231,2233,2235,2237,2239,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259,2261,2263,2265,2267,2269,2271],{"class":1089,"line":1486},[1087,2226,1857],{"class":1311},[1087,2228,1315],{"class":1305},[1087,2230,1725],{"class":1110},[1087,2232,1302],{"class":1301},[1087,2234,1866],{"class":1305},[1087,2236,1869],{"class":1311},[1087,2238,1315],{"class":1305},[1087,2240,1392],{"class":1305},[1087,2242,1876],{"class":1097},[1087,2244,1330],{"class":1305},[1087,2246,1733],{"class":1305},[1087,2248,1883],{"class":1301},[1087,2250,1809],{"class":1305},[1087,2252,1888],{"class":1110},[1087,2254,1806],{"class":1301},[1087,2256,1809],{"class":1305},[1087,2258,1819],{"class":1110},[1087,2260,1302],{"class":1301},[1087,2262,1806],{"class":1305},[1087,2264,1826],{"class":1588},[1087,2266,1903],{"class":1305},[1087,2268,1906],{"class":1110},[1087,2270,1837],{"class":1301},[1087,2272,1333],{"class":1305},[1087,2274,2276,2279,2282,2284],{"class":1089,"line":2275},20,[1087,2277,2278],{"class":1305},"},",[1087,2280,2281],{"class":1943}," table",[1087,2283,1826],{"class":1588},[1087,2285,1318],{"class":1301},[1087,2287,2289,2292,2294,2296,2299,2301,2303,2305,2308,2311,2313],{"class":1089,"line":2288},21,[1087,2290,2291],{"class":1110},"  index",[1087,2293,1302],{"class":1301},[1087,2295,1330],{"class":1305},[1087,2297,2298],{"class":1097},"messages_chat_id_idx",[1087,2300,1330],{"class":1305},[1087,2302,1883],{"class":1301},[1087,2304,1809],{"class":1305},[1087,2306,2307],{"class":1110},"on",[1087,2309,2310],{"class":1301},"(table",[1087,2312,1809],{"class":1305},[1087,2314,2315],{"class":1301},"chatId)\n",[1087,2317,2319],{"class":1089,"line":2318},22,[1087,2320,2321],{"class":1301},"])\n",[1087,2323,2325],{"class":1089,"line":2324},23,[1087,2326,1370],{"emptyLinePlaceholder":21},[1087,2328,2330,2332,2334,2337,2339,2341,2344,2346,2348,2351,2353,2355,2357],{"class":1089,"line":2329},24,[1087,2331,1292],{"class":1291},[1087,2333,1774],{"class":1588},[1087,2335,2336],{"class":1301}," messagesRelations ",[1087,2338,1592],{"class":1305},[1087,2340,1752],{"class":1110},[1087,2342,2343],{"class":1301},"(messages",[1087,2345,1717],{"class":1305},[1087,2347,1940],{"class":1305},[1087,2349,2350],{"class":1943}," one",[1087,2352,1947],{"class":1305},[1087,2354,1826],{"class":1588},[1087,2356,1952],{"class":1301},[1087,2358,1306],{"class":1305},[1087,2360,2362,2365,2367,2369,2371,2373],{"class":1089,"line":2361},25,[1087,2363,2364],{"class":1311},"  chat",[1087,2366,1315],{"class":1305},[1087,2368,2350],{"class":1110},[1087,2370,1935],{"class":1301},[1087,2372,1717],{"class":1305},[1087,2374,1381],{"class":1305},[1087,2376,2378,2381,2383,2386,2388,2391],{"class":1089,"line":2377},26,[1087,2379,2380],{"class":1311},"    fields",[1087,2382,1315],{"class":1305},[1087,2384,2385],{"class":1301}," [messages",[1087,2387,1809],{"class":1305},[1087,2389,2390],{"class":1301},"chatId]",[1087,2392,1333],{"class":1305},[1087,2394,2396,2399,2401,2404,2406],{"class":1089,"line":2395},27,[1087,2397,2398],{"class":1311},"    references",[1087,2400,1315],{"class":1305},[1087,2402,2403],{"class":1301}," [chats",[1087,2405,1809],{"class":1305},[1087,2407,2408],{"class":1301},"id]\n",[1087,2410,2412,2415],{"class":1089,"line":2411},28,[1087,2413,2414],{"class":1305},"  }",[1087,2416,1492],{"class":1301},[1087,2418,2420,2422],{"class":1089,"line":2419},29,[1087,2421,1489],{"class":1305},[1087,2423,1973],{"class":1301},[976,2425,2426],{},"Generate the database migrations from your schema:",[1078,2428,2430],{"className":1080,"code":2429,"language":1082,"meta":1083,"style":1083},"npx nuxt db generate\n",[1037,2431,2432],{"__ignoreMap":1083},[1087,2433,2434,2436,2439,2442],{"class":1089,"line":1090},[1087,2435,1094],{"class":1093},[1087,2437,2438],{"class":1097}," nuxt",[1087,2440,2441],{"class":1097}," db",[1087,2443,2444],{"class":1097}," generate\n",[2446,2447,2448],"tip",{},[976,2449,2450,2451,2454],{},"Migrations are automatically applied when you start the development server with ",[1037,2452,2453],{},"npx nuxt dev",". NuxtHub uses SQLite locally, so no external database is required during development.",[980,2456,2458],{"id":2457},"building-the-backend","Building the backend",[976,2460,2461,2462,1809],{},"This section covers integrating AI on the server. The following API endpoints handle chat creation, AI streaming, and data persistence using ",[1030,2463,2466],{"href":2464,"rel":2465},"https:\u002F\u002Fnitro.build",[1034],"Nitro",[1115,2468,2470],{"id":2469},"creating-a-chat","Creating a chat",[976,2472,2473,2474,2481],{},"First, create the endpoint that initializes a new chat and saves the first message to the database. This uses the ",[1030,2475,2478],{"href":2476,"rel":2477},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fui-message",[1034],[1037,2479,2480],{},"UIMessage"," type from the AI SDK:",[1278,2483,2484],{},[1078,2485,2488],{"className":1282,"code":2486,"filename":2487,"language":1284,"meta":1083,"style":1083},"import { defineEventHandler, readValidatedBody } from 'h3'\nimport type { UIMessage } from 'ai'\nimport { db, schema } from 'hub:db'\nimport { z } from 'zod'\n\nexport default defineEventHandler(async (event) => {\n  const { message } = await readValidatedBody(event, z.object({\n    message: z.custom\u003CUIMessage>()\n  }).parse)\n\n  \u002F\u002F Create a new chat\n  const [chat] = await db.insert(schema.chats).values({}).returning()\n\n  \u002F\u002F Save the first user message\n  await db.insert(schema.messages).values({\n    chatId: chat.id,\n    role: 'user',\n    parts: message.parts\n  })\n\n  return chat\n})\n","server\u002Fapi\u002Fchats.post.ts",[1037,2489,2490,2514,2537,2561,2581,2585,2609,2646,2670,2683,2687,2692,2743,2747,2752,2781,2797,2812,2826,2832,2836,2844],{"__ignoreMap":1083},[1087,2491,2492,2494,2496,2499,2501,2504,2506,2508,2510,2512],{"class":1089,"line":1090},[1087,2493,1708],{"class":1291},[1087,2495,1711],{"class":1305},[1087,2497,2498],{"class":1301}," defineEventHandler",[1087,2500,1717],{"class":1305},[1087,2502,2503],{"class":1301}," readValidatedBody",[1087,2505,1733],{"class":1305},[1087,2507,1736],{"class":1291},[1087,2509,1392],{"class":1305},[1087,2511,1115],{"class":1097},[1087,2513,1356],{"class":1305},[1087,2515,2516,2518,2521,2523,2526,2528,2530,2532,2535],{"class":1089,"line":1107},[1087,2517,1708],{"class":1291},[1087,2519,2520],{"class":1291}," type",[1087,2522,1711],{"class":1305},[1087,2524,2525],{"class":1301}," UIMessage",[1087,2527,1733],{"class":1305},[1087,2529,1736],{"class":1291},[1087,2531,1392],{"class":1305},[1087,2533,2534],{"class":1097},"ai",[1087,2536,1356],{"class":1305},[1087,2538,2539,2541,2543,2545,2547,2550,2552,2554,2556,2559],{"class":1089,"line":1321},[1087,2540,1708],{"class":1291},[1087,2542,1711],{"class":1305},[1087,2544,2441],{"class":1301},[1087,2546,1717],{"class":1305},[1087,2548,2549],{"class":1301}," schema",[1087,2551,1733],{"class":1305},[1087,2553,1736],{"class":1291},[1087,2555,1392],{"class":1305},[1087,2557,2558],{"class":1097},"hub:db",[1087,2560,1356],{"class":1305},[1087,2562,2563,2565,2567,2570,2572,2574,2576,2579],{"class":1089,"line":1336},[1087,2564,1708],{"class":1291},[1087,2566,1711],{"class":1305},[1087,2568,2569],{"class":1301}," z",[1087,2571,1733],{"class":1305},[1087,2573,1736],{"class":1291},[1087,2575,1392],{"class":1305},[1087,2577,2578],{"class":1097},"zod",[1087,2580,1356],{"class":1305},[1087,2582,2583],{"class":1089,"line":1348},[1087,2584,1370],{"emptyLinePlaceholder":21},[1087,2586,2587,2589,2591,2593,2595,2598,2600,2603,2605,2607],{"class":1089,"line":1359},[1087,2588,1292],{"class":1291},[1087,2590,1295],{"class":1291},[1087,2592,2498],{"class":1110},[1087,2594,1302],{"class":1301},[1087,2596,2597],{"class":1588},"async",[1087,2599,1952],{"class":1305},[1087,2601,2602],{"class":1943},"event",[1087,2604,1883],{"class":1305},[1087,2606,1826],{"class":1588},[1087,2608,1381],{"class":1305},[1087,2610,2611,2614,2616,2619,2621,2624,2627,2629,2631,2633,2635,2637,2639,2642,2644],{"class":1089,"line":1367},[1087,2612,2613],{"class":1588},"  const",[1087,2615,1711],{"class":1305},[1087,2617,2618],{"class":1301}," message",[1087,2620,1733],{"class":1305},[1087,2622,2623],{"class":1305}," =",[1087,2625,2626],{"class":1291}," await",[1087,2628,2503],{"class":1110},[1087,2630,1302],{"class":1311},[1087,2632,2602],{"class":1301},[1087,2634,1717],{"class":1305},[1087,2636,2569],{"class":1301},[1087,2638,1809],{"class":1305},[1087,2640,2641],{"class":1110},"object",[1087,2643,1302],{"class":1311},[1087,2645,1306],{"class":1305},[1087,2647,2648,2651,2653,2655,2657,2660,2662,2664,2667],{"class":1089,"line":1373},[1087,2649,2650],{"class":1311},"    message",[1087,2652,1315],{"class":1305},[1087,2654,2569],{"class":1301},[1087,2656,1809],{"class":1305},[1087,2658,2659],{"class":1110},"custom",[1087,2661,1560],{"class":1305},[1087,2663,2480],{"class":1093},[1087,2665,2666],{"class":1305},">",[1087,2668,2669],{"class":1311},"()\n",[1087,2671,2672,2674,2676,2678,2681],{"class":1089,"line":1384},[1087,2673,2414],{"class":1305},[1087,2675,1883],{"class":1311},[1087,2677,1809],{"class":1305},[1087,2679,2680],{"class":1301},"parse",[1087,2682,1492],{"class":1311},[1087,2684,2685],{"class":1089,"line":1400},[1087,2686,1370],{"emptyLinePlaceholder":21},[1087,2688,2689],{"class":1089,"line":1406},[1087,2690,2691],{"class":1471},"  \u002F\u002F Create a new chat\n",[1087,2693,2694,2696,2698,2700,2702,2704,2706,2708,2710,2713,2715,2718,2720,2722,2724,2726,2729,2731,2734,2736,2738,2741],{"class":1089,"line":1411},[1087,2695,2613],{"class":1588},[1087,2697,1419],{"class":1305},[1087,2699,262],{"class":1301},[1087,2701,1429],{"class":1305},[1087,2703,2623],{"class":1305},[1087,2705,2626],{"class":1291},[1087,2707,2441],{"class":1301},[1087,2709,1809],{"class":1305},[1087,2711,2712],{"class":1110},"insert",[1087,2714,1302],{"class":1311},[1087,2716,2717],{"class":1301},"schema",[1087,2719,1809],{"class":1305},[1087,2721,1788],{"class":1301},[1087,2723,1883],{"class":1311},[1087,2725,1809],{"class":1305},[1087,2727,2728],{"class":1110},"values",[1087,2730,1302],{"class":1311},[1087,2732,2733],{"class":1305},"{}",[1087,2735,1883],{"class":1311},[1087,2737,1809],{"class":1305},[1087,2739,2740],{"class":1110},"returning",[1087,2742,2669],{"class":1311},[1087,2744,2745],{"class":1089,"line":1434},[1087,2746,1370],{"emptyLinePlaceholder":21},[1087,2748,2749],{"class":1089,"line":1439},[1087,2750,2751],{"class":1471},"  \u002F\u002F Save the first user message\n",[1087,2753,2754,2757,2759,2761,2763,2765,2767,2769,2771,2773,2775,2777,2779],{"class":1089,"line":1449},[1087,2755,2756],{"class":1291},"  await",[1087,2758,2441],{"class":1301},[1087,2760,1809],{"class":1305},[1087,2762,2712],{"class":1110},[1087,2764,1302],{"class":1311},[1087,2766,2717],{"class":1301},[1087,2768,1809],{"class":1305},[1087,2770,1997],{"class":1301},[1087,2772,1883],{"class":1311},[1087,2774,1809],{"class":1305},[1087,2776,2728],{"class":1110},[1087,2778,1302],{"class":1311},[1087,2780,1306],{"class":1305},[1087,2782,2783,2786,2788,2791,2793,2795],{"class":1089,"line":1459},[1087,2784,2785],{"class":1311},"    chatId",[1087,2787,1315],{"class":1305},[1087,2789,2790],{"class":1301}," chat",[1087,2792,1809],{"class":1305},[1087,2794,2018],{"class":1301},[1087,2796,1333],{"class":1305},[1087,2798,2799,2802,2804,2806,2808,2810],{"class":1089,"line":1475},[1087,2800,2801],{"class":1311},"    role",[1087,2803,1315],{"class":1305},[1087,2805,1392],{"class":1305},[1087,2807,2148],{"class":1097},[1087,2809,1330],{"class":1305},[1087,2811,1333],{"class":1305},[1087,2813,2814,2817,2819,2821,2823],{"class":1089,"line":1481},[1087,2815,2816],{"class":1311},"    parts",[1087,2818,1315],{"class":1305},[1087,2820,2618],{"class":1301},[1087,2822,1809],{"class":1305},[1087,2824,2825],{"class":1301},"parts\n",[1087,2827,2828,2830],{"class":1089,"line":1486},[1087,2829,2414],{"class":1305},[1087,2831,1492],{"class":1311},[1087,2833,2834],{"class":1089,"line":2275},[1087,2835,1370],{"emptyLinePlaceholder":21},[1087,2837,2838,2841],{"class":1089,"line":2288},[1087,2839,2840],{"class":1291},"  return",[1087,2842,2843],{"class":1301}," chat\n",[1087,2845,2846,2848],{"class":1089,"line":2318},[1087,2847,1489],{"class":1305},[1087,2849,1492],{"class":1301},[1115,2851,2853],{"id":2852},"streaming-ai-responses","Streaming AI responses",[976,2855,2856,2857,2864,2865,2872,2873,2880],{},"Next, create the endpoint that handles the AI conversation. This endpoint uses ",[1030,2858,2861],{"href":2859,"rel":2860},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fstream-text",[1034],[1037,2862,2863],{},"streamText",", ",[1030,2866,2869],{"href":2867,"rel":2868},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream",[1034],[1037,2870,2871],{},"createUIMessageStream",", and ",[1030,2874,2877],{"href":2875,"rel":2876},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response",[1034],[1037,2878,2879],{},"createUIMessageStreamResponse"," from the AI SDK:",[1278,2882,2883],{},[1696,2884,2885],{},[1078,2886,2889],{"className":1282,"code":2887,"filename":2888,"language":1284,"meta":1083,"style":1083},"import { createError, defineEventHandler, getValidatedRouterParams, readValidatedBody } from 'h3'\nimport { eq } from 'drizzle-orm'\nimport { db, schema } from 'hub:db'\nimport { z } from 'zod'\nimport {\n  convertToModelMessages,\n  createUIMessageStream,\n  createUIMessageStreamResponse,\n  generateText,\n  streamText\n} from 'ai'\nimport type { UIMessage } from 'ai'\n\nconst MODELS = [\n  { value: 'openai\u002Fgpt-5-nano', label: 'GPT-5 Nano' },\n  { value: 'anthropic\u002Fclaude-haiku-4.5', label: 'Claude Haiku 4.5' },\n  { value: 'google\u002Fgemini-3-flash', label: 'Gemini 3 Flash' }\n]\n\nexport default defineEventHandler(async (event) => {\n  const { id } = await getValidatedRouterParams(event, z.object({\n    id: z.string()\n  }).parse)\n\n  const { model, messages } = await readValidatedBody(event, z.object({\n    model: z.string().refine(value => MODELS.some(m => m.value === value), {\n      message: 'Invalid model'\n    }),\n    messages: z.array(z.custom\u003CUIMessage>())\n  }).parse)\n\n  \u002F\u002F Fetch the chat from the database\n  const chat = await db.query.chats.findFirst({\n    where: (chat, { eq }) => eq(chat.id, id as string)\n  })\n\n  if (!chat) {\n    throw createError({ statusCode: 404, statusMessage: 'Chat not found' })\n  }\n\n  \u002F\u002F Generate a title for the chat if it doesn't have one\n  if (!chat.title) {\n    const { text: title } = await generateText({\n      model: 'anthropic\u002Fclaude-haiku-4.5',\n      system: `Generate a short title (max 30 characters) based on the user's message. No quotes or punctuation.`,\n      prompt: JSON.stringify(messages[0])\n    })\n\n    await db.update(schema.chats).set({ title }).where(eq(schema.chats.id, id))\n  }\n\n  \u002F\u002F Save the user message if it's a follow-up\n  const lastMessage = messages[messages.length - 1]\n  if (lastMessage?.role === 'user' && messages.length > 1) {\n    await db.insert(schema.messages).values({\n      chatId: id,\n      role: 'user',\n      parts: lastMessage.parts\n    })\n  }\n\n  \u002F\u002F Create the streaming response\n  const stream = createUIMessageStream({\n    execute: async ({ writer }) => {\n      const result = streamText({\n        model,\n        system: `You are a helpful AI assistant. Be concise and friendly.`,\n        messages: await convertToModelMessages(messages),\n        providerOptions: {\n          anthropic: {\n            thinking: {\n              type: 'enabled',\n              budgetTokens: 2048\n            }\n          },\n          google: {\n            thinkingConfig: {\n              includeThoughts: true,\n              thinkingLevel: 'low'\n            }\n          },\n          openai: {\n            reasoningEffort: 'low',\n            reasoningSummary: 'detailed'\n          }\n        }\n      })\n\n      \u002F\u002F Notify the client that a title was generated\n      if (!chat.title) {\n        writer.write({\n          type: 'data-chat-title',\n          data: { message: 'Title generated' },\n          transient: true\n        })\n      }\n\n      writer.merge(result.toUIMessageStream())\n    },\n    onFinish: async ({ messages }) => {\n      \u002F\u002F Save the assistant's response to the database\n      await db.insert(schema.messages).values(messages.map(message => ({\n        chatId: chat.id,\n        role: message.role as 'user' | 'assistant',\n        parts: message.parts\n      })))\n    }\n  })\n\n  return createUIMessageStreamResponse({ stream })\n})\n","server\u002Fapi\u002Fchats\u002F[id].post.ts",[1037,2890,2891,2923,2942,2964,2982,2988,2995,3002,3009,3016,3021,3033,3053,3057,3069,3103,3133,3164,3169,3173,3195,3228,3244,3256,3260,3298,3358,3372,3381,3412,3425,3430,3436,3467,3511,3518,3523,3541,3580,3586,3591,3597,3617,3645,3661,3680,3708,3715,3720,3786,3791,3796,3802,3831,3872,3901,3913,3929,3943,3950,3955,3960,3966,3983,4005,4023,4031,4048,4069,4079,4089,4099,4116,4127,4133,4139,4149,4159,4172,4187,4192,4197,4207,4223,4238,4244,4250,4258,4263,4269,4289,4304,4321,4344,4355,4363,4369,4374,4397,4403,4423,4429,4475,4491,4524,4538,4546,4551,4558,4563,4581],{"__ignoreMap":1083},[1087,2892,2893,2895,2897,2900,2902,2904,2906,2909,2911,2913,2915,2917,2919,2921],{"class":1089,"line":1090},[1087,2894,1708],{"class":1291},[1087,2896,1711],{"class":1305},[1087,2898,2899],{"class":1301}," createError",[1087,2901,1717],{"class":1305},[1087,2903,2498],{"class":1301},[1087,2905,1717],{"class":1305},[1087,2907,2908],{"class":1301}," getValidatedRouterParams",[1087,2910,1717],{"class":1305},[1087,2912,2503],{"class":1301},[1087,2914,1733],{"class":1305},[1087,2916,1736],{"class":1291},[1087,2918,1392],{"class":1305},[1087,2920,1115],{"class":1097},[1087,2922,1356],{"class":1305},[1087,2924,2925,2927,2929,2932,2934,2936,2938,2940],{"class":1089,"line":1107},[1087,2926,1708],{"class":1291},[1087,2928,1711],{"class":1305},[1087,2930,2931],{"class":1301}," eq",[1087,2933,1733],{"class":1305},[1087,2935,1736],{"class":1291},[1087,2937,1392],{"class":1305},[1087,2939,1761],{"class":1097},[1087,2941,1356],{"class":1305},[1087,2943,2944,2946,2948,2950,2952,2954,2956,2958,2960,2962],{"class":1089,"line":1321},[1087,2945,1708],{"class":1291},[1087,2947,1711],{"class":1305},[1087,2949,2441],{"class":1301},[1087,2951,1717],{"class":1305},[1087,2953,2549],{"class":1301},[1087,2955,1733],{"class":1305},[1087,2957,1736],{"class":1291},[1087,2959,1392],{"class":1305},[1087,2961,2558],{"class":1097},[1087,2963,1356],{"class":1305},[1087,2965,2966,2968,2970,2972,2974,2976,2978,2980],{"class":1089,"line":1336},[1087,2967,1708],{"class":1291},[1087,2969,1711],{"class":1305},[1087,2971,2569],{"class":1301},[1087,2973,1733],{"class":1305},[1087,2975,1736],{"class":1291},[1087,2977,1392],{"class":1305},[1087,2979,2578],{"class":1097},[1087,2981,1356],{"class":1305},[1087,2983,2984,2986],{"class":1089,"line":1348},[1087,2985,1708],{"class":1291},[1087,2987,1381],{"class":1305},[1087,2989,2990,2993],{"class":1089,"line":1359},[1087,2991,2992],{"class":1301},"  convertToModelMessages",[1087,2994,1333],{"class":1305},[1087,2996,2997,3000],{"class":1089,"line":1367},[1087,2998,2999],{"class":1301},"  createUIMessageStream",[1087,3001,1333],{"class":1305},[1087,3003,3004,3007],{"class":1089,"line":1373},[1087,3005,3006],{"class":1301},"  createUIMessageStreamResponse",[1087,3008,1333],{"class":1305},[1087,3010,3011,3014],{"class":1089,"line":1384},[1087,3012,3013],{"class":1301},"  generateText",[1087,3015,1333],{"class":1305},[1087,3017,3018],{"class":1089,"line":1400},[1087,3019,3020],{"class":1301},"  streamText\n",[1087,3022,3023,3025,3027,3029,3031],{"class":1089,"line":1406},[1087,3024,1489],{"class":1305},[1087,3026,1736],{"class":1291},[1087,3028,1392],{"class":1305},[1087,3030,2534],{"class":1097},[1087,3032,1356],{"class":1305},[1087,3034,3035,3037,3039,3041,3043,3045,3047,3049,3051],{"class":1089,"line":1411},[1087,3036,1708],{"class":1291},[1087,3038,2520],{"class":1291},[1087,3040,1711],{"class":1305},[1087,3042,2525],{"class":1301},[1087,3044,1733],{"class":1305},[1087,3046,1736],{"class":1291},[1087,3048,1392],{"class":1305},[1087,3050,2534],{"class":1097},[1087,3052,1356],{"class":1305},[1087,3054,3055],{"class":1089,"line":1434},[1087,3056,1370],{"emptyLinePlaceholder":21},[1087,3058,3059,3062,3065,3067],{"class":1089,"line":1439},[1087,3060,3061],{"class":1588},"const",[1087,3063,3064],{"class":1301}," MODELS ",[1087,3066,1592],{"class":1305},[1087,3068,1318],{"class":1301},[1087,3070,3071,3074,3077,3079,3081,3084,3086,3088,3091,3093,3095,3098,3100],{"class":1089,"line":1449},[1087,3072,3073],{"class":1305},"  {",[1087,3075,3076],{"class":1311}," value",[1087,3078,1315],{"class":1305},[1087,3080,1392],{"class":1305},[1087,3082,3083],{"class":1097},"openai\u002Fgpt-5-nano",[1087,3085,1330],{"class":1305},[1087,3087,1717],{"class":1305},[1087,3089,3090],{"class":1311}," label",[1087,3092,1315],{"class":1305},[1087,3094,1392],{"class":1305},[1087,3096,3097],{"class":1097},"GPT-5 Nano",[1087,3099,1330],{"class":1305},[1087,3101,3102],{"class":1305}," },\n",[1087,3104,3105,3107,3109,3111,3113,3116,3118,3120,3122,3124,3126,3129,3131],{"class":1089,"line":1459},[1087,3106,3073],{"class":1305},[1087,3108,3076],{"class":1311},[1087,3110,1315],{"class":1305},[1087,3112,1392],{"class":1305},[1087,3114,3115],{"class":1097},"anthropic\u002Fclaude-haiku-4.5",[1087,3117,1330],{"class":1305},[1087,3119,1717],{"class":1305},[1087,3121,3090],{"class":1311},[1087,3123,1315],{"class":1305},[1087,3125,1392],{"class":1305},[1087,3127,3128],{"class":1097},"Claude Haiku 4.5",[1087,3130,1330],{"class":1305},[1087,3132,3102],{"class":1305},[1087,3134,3135,3137,3139,3141,3143,3146,3148,3150,3152,3154,3156,3159,3161],{"class":1089,"line":1475},[1087,3136,3073],{"class":1305},[1087,3138,3076],{"class":1311},[1087,3140,1315],{"class":1305},[1087,3142,1392],{"class":1305},[1087,3144,3145],{"class":1097},"google\u002Fgemini-3-flash",[1087,3147,1330],{"class":1305},[1087,3149,1717],{"class":1305},[1087,3151,3090],{"class":1311},[1087,3153,1315],{"class":1305},[1087,3155,1392],{"class":1305},[1087,3157,3158],{"class":1097},"Gemini 3 Flash",[1087,3160,1330],{"class":1305},[1087,3162,3163],{"class":1305}," }\n",[1087,3165,3166],{"class":1089,"line":1481},[1087,3167,3168],{"class":1301},"]\n",[1087,3170,3171],{"class":1089,"line":1486},[1087,3172,1370],{"emptyLinePlaceholder":21},[1087,3174,3175,3177,3179,3181,3183,3185,3187,3189,3191,3193],{"class":1089,"line":2275},[1087,3176,1292],{"class":1291},[1087,3178,1295],{"class":1291},[1087,3180,2498],{"class":1110},[1087,3182,1302],{"class":1301},[1087,3184,2597],{"class":1588},[1087,3186,1952],{"class":1305},[1087,3188,2602],{"class":1943},[1087,3190,1883],{"class":1305},[1087,3192,1826],{"class":1588},[1087,3194,1381],{"class":1305},[1087,3196,3197,3199,3201,3204,3206,3208,3210,3212,3214,3216,3218,3220,3222,3224,3226],{"class":1089,"line":2288},[1087,3198,2613],{"class":1588},[1087,3200,1711],{"class":1305},[1087,3202,3203],{"class":1301}," id",[1087,3205,1733],{"class":1305},[1087,3207,2623],{"class":1305},[1087,3209,2626],{"class":1291},[1087,3211,2908],{"class":1110},[1087,3213,1302],{"class":1311},[1087,3215,2602],{"class":1301},[1087,3217,1717],{"class":1305},[1087,3219,2569],{"class":1301},[1087,3221,1809],{"class":1305},[1087,3223,2641],{"class":1110},[1087,3225,1302],{"class":1311},[1087,3227,1306],{"class":1305},[1087,3229,3230,3233,3235,3237,3239,3242],{"class":1089,"line":2318},[1087,3231,3232],{"class":1311},"    id",[1087,3234,1315],{"class":1305},[1087,3236,2569],{"class":1301},[1087,3238,1809],{"class":1305},[1087,3240,3241],{"class":1110},"string",[1087,3243,2669],{"class":1311},[1087,3245,3246,3248,3250,3252,3254],{"class":1089,"line":2324},[1087,3247,2414],{"class":1305},[1087,3249,1883],{"class":1311},[1087,3251,1809],{"class":1305},[1087,3253,2680],{"class":1301},[1087,3255,1492],{"class":1311},[1087,3257,3258],{"class":1089,"line":2329},[1087,3259,1370],{"emptyLinePlaceholder":21},[1087,3261,3262,3264,3266,3269,3271,3274,3276,3278,3280,3282,3284,3286,3288,3290,3292,3294,3296],{"class":1089,"line":2361},[1087,3263,2613],{"class":1588},[1087,3265,1711],{"class":1305},[1087,3267,3268],{"class":1301}," model",[1087,3270,1717],{"class":1305},[1087,3272,3273],{"class":1301}," messages",[1087,3275,1733],{"class":1305},[1087,3277,2623],{"class":1305},[1087,3279,2626],{"class":1291},[1087,3281,2503],{"class":1110},[1087,3283,1302],{"class":1311},[1087,3285,2602],{"class":1301},[1087,3287,1717],{"class":1305},[1087,3289,2569],{"class":1301},[1087,3291,1809],{"class":1305},[1087,3293,2641],{"class":1110},[1087,3295,1302],{"class":1311},[1087,3297,1306],{"class":1305},[1087,3299,3300,3303,3305,3307,3309,3311,3313,3315,3318,3320,3323,3325,3328,3330,3333,3335,3338,3340,3343,3345,3347,3350,3352,3354,3356],{"class":1089,"line":2377},[1087,3301,3302],{"class":1311},"    model",[1087,3304,1315],{"class":1305},[1087,3306,2569],{"class":1301},[1087,3308,1809],{"class":1305},[1087,3310,3241],{"class":1110},[1087,3312,1806],{"class":1311},[1087,3314,1809],{"class":1305},[1087,3316,3317],{"class":1110},"refine",[1087,3319,1302],{"class":1311},[1087,3321,3322],{"class":1943},"value",[1087,3324,1826],{"class":1588},[1087,3326,3327],{"class":1301}," MODELS",[1087,3329,1809],{"class":1305},[1087,3331,3332],{"class":1110},"some",[1087,3334,1302],{"class":1311},[1087,3336,3337],{"class":1943},"m",[1087,3339,1826],{"class":1588},[1087,3341,3342],{"class":1301}," m",[1087,3344,1809],{"class":1305},[1087,3346,3322],{"class":1301},[1087,3348,3349],{"class":1305}," ===",[1087,3351,3076],{"class":1301},[1087,3353,1883],{"class":1311},[1087,3355,1717],{"class":1305},[1087,3357,1381],{"class":1305},[1087,3359,3360,3363,3365,3367,3370],{"class":1089,"line":2395},[1087,3361,3362],{"class":1311},"      message",[1087,3364,1315],{"class":1305},[1087,3366,1392],{"class":1305},[1087,3368,3369],{"class":1097},"Invalid model",[1087,3371,1356],{"class":1305},[1087,3373,3374,3377,3379],{"class":1089,"line":2411},[1087,3375,3376],{"class":1305},"    }",[1087,3378,1883],{"class":1311},[1087,3380,1333],{"class":1305},[1087,3382,3383,3386,3388,3390,3392,3395,3397,3400,3402,3404,3406,3408,3410],{"class":1089,"line":2419},[1087,3384,3385],{"class":1311},"    messages",[1087,3387,1315],{"class":1305},[1087,3389,2569],{"class":1301},[1087,3391,1809],{"class":1305},[1087,3393,3394],{"class":1110},"array",[1087,3396,1302],{"class":1311},[1087,3398,3399],{"class":1301},"z",[1087,3401,1809],{"class":1305},[1087,3403,2659],{"class":1110},[1087,3405,1560],{"class":1305},[1087,3407,2480],{"class":1093},[1087,3409,2666],{"class":1305},[1087,3411,1909],{"class":1311},[1087,3413,3415,3417,3419,3421,3423],{"class":1089,"line":3414},30,[1087,3416,2414],{"class":1305},[1087,3418,1883],{"class":1311},[1087,3420,1809],{"class":1305},[1087,3422,2680],{"class":1301},[1087,3424,1492],{"class":1311},[1087,3426,3428],{"class":1089,"line":3427},31,[1087,3429,1370],{"emptyLinePlaceholder":21},[1087,3431,3433],{"class":1089,"line":3432},32,[1087,3434,3435],{"class":1471},"  \u002F\u002F Fetch the chat from the database\n",[1087,3437,3439,3441,3443,3445,3447,3449,3451,3454,3456,3458,3460,3463,3465],{"class":1089,"line":3438},33,[1087,3440,2613],{"class":1588},[1087,3442,2790],{"class":1301},[1087,3444,2623],{"class":1305},[1087,3446,2626],{"class":1291},[1087,3448,2441],{"class":1301},[1087,3450,1809],{"class":1305},[1087,3452,3453],{"class":1301},"query",[1087,3455,1809],{"class":1305},[1087,3457,1788],{"class":1301},[1087,3459,1809],{"class":1305},[1087,3461,3462],{"class":1110},"findFirst",[1087,3464,1302],{"class":1311},[1087,3466,1306],{"class":1305},[1087,3468,3470,3473,3475,3477,3479,3481,3483,3485,3487,3489,3491,3493,3495,3497,3499,3501,3503,3506,3509],{"class":1089,"line":3469},34,[1087,3471,3472],{"class":1110},"    where",[1087,3474,1315],{"class":1305},[1087,3476,1952],{"class":1305},[1087,3478,262],{"class":1943},[1087,3480,1717],{"class":1305},[1087,3482,1711],{"class":1305},[1087,3484,2931],{"class":1943},[1087,3486,1947],{"class":1305},[1087,3488,1826],{"class":1588},[1087,3490,2931],{"class":1110},[1087,3492,1302],{"class":1311},[1087,3494,262],{"class":1301},[1087,3496,1809],{"class":1305},[1087,3498,2018],{"class":1301},[1087,3500,1717],{"class":1305},[1087,3502,3203],{"class":1301},[1087,3504,3505],{"class":1291}," as",[1087,3507,3508],{"class":1093}," string",[1087,3510,1492],{"class":1311},[1087,3512,3514,3516],{"class":1089,"line":3513},35,[1087,3515,2414],{"class":1305},[1087,3517,1492],{"class":1311},[1087,3519,3521],{"class":1089,"line":3520},36,[1087,3522,1370],{"emptyLinePlaceholder":21},[1087,3524,3526,3529,3531,3534,3536,3539],{"class":1089,"line":3525},37,[1087,3527,3528],{"class":1291},"  if",[1087,3530,1952],{"class":1311},[1087,3532,3533],{"class":1305},"!",[1087,3535,262],{"class":1301},[1087,3537,3538],{"class":1311},") ",[1087,3540,1306],{"class":1305},[1087,3542,3544,3547,3549,3551,3553,3556,3558,3562,3564,3567,3569,3571,3574,3576,3578],{"class":1089,"line":3543},38,[1087,3545,3546],{"class":1291},"    throw",[1087,3548,2899],{"class":1110},[1087,3550,1302],{"class":1311},[1087,3552,1866],{"class":1305},[1087,3554,3555],{"class":1311}," statusCode",[1087,3557,1315],{"class":1305},[1087,3559,3561],{"class":3560},"sbssI"," 404",[1087,3563,1717],{"class":1305},[1087,3565,3566],{"class":1311}," statusMessage",[1087,3568,1315],{"class":1305},[1087,3570,1392],{"class":1305},[1087,3572,3573],{"class":1097},"Chat not found",[1087,3575,1330],{"class":1305},[1087,3577,1733],{"class":1305},[1087,3579,1492],{"class":1311},[1087,3581,3583],{"class":1089,"line":3582},39,[1087,3584,3585],{"class":1305},"  }\n",[1087,3587,3589],{"class":1089,"line":3588},40,[1087,3590,1370],{"emptyLinePlaceholder":21},[1087,3592,3594],{"class":1089,"line":3593},41,[1087,3595,3596],{"class":1471},"  \u002F\u002F Generate a title for the chat if it doesn't have one\n",[1087,3598,3600,3602,3604,3606,3608,3610,3613,3615],{"class":1089,"line":3599},42,[1087,3601,3528],{"class":1291},[1087,3603,1952],{"class":1311},[1087,3605,3533],{"class":1305},[1087,3607,262],{"class":1301},[1087,3609,1809],{"class":1305},[1087,3611,3612],{"class":1301},"title",[1087,3614,3538],{"class":1311},[1087,3616,1306],{"class":1305},[1087,3618,3620,3623,3625,3627,3629,3632,3634,3636,3638,3641,3643],{"class":1089,"line":3619},43,[1087,3621,3622],{"class":1588},"    const",[1087,3624,1711],{"class":1305},[1087,3626,1720],{"class":1311},[1087,3628,1315],{"class":1305},[1087,3630,3631],{"class":1301}," title",[1087,3633,1733],{"class":1305},[1087,3635,2623],{"class":1305},[1087,3637,2626],{"class":1291},[1087,3639,3640],{"class":1110}," generateText",[1087,3642,1302],{"class":1311},[1087,3644,1306],{"class":1305},[1087,3646,3648,3651,3653,3655,3657,3659],{"class":1089,"line":3647},44,[1087,3649,3650],{"class":1311},"      model",[1087,3652,1315],{"class":1305},[1087,3654,1392],{"class":1305},[1087,3656,3115],{"class":1097},[1087,3658,1330],{"class":1305},[1087,3660,1333],{"class":1305},[1087,3662,3664,3667,3669,3672,3675,3678],{"class":1089,"line":3663},45,[1087,3665,3666],{"class":1311},"      system",[1087,3668,1315],{"class":1305},[1087,3670,3671],{"class":1305}," `",[1087,3673,3674],{"class":1097},"Generate a short title (max 30 characters) based on the user's message. No quotes or punctuation.",[1087,3676,3677],{"class":1305},"`",[1087,3679,1333],{"class":1305},[1087,3681,3683,3686,3688,3691,3693,3696,3698,3700,3703,3706],{"class":1089,"line":3682},46,[1087,3684,3685],{"class":1311},"      prompt",[1087,3687,1315],{"class":1305},[1087,3689,3690],{"class":1301}," JSON",[1087,3692,1809],{"class":1305},[1087,3694,3695],{"class":1110},"stringify",[1087,3697,1302],{"class":1311},[1087,3699,1997],{"class":1301},[1087,3701,3702],{"class":1311},"[",[1087,3704,3705],{"class":3560},"0",[1087,3707,2321],{"class":1311},[1087,3709,3711,3713],{"class":1089,"line":3710},47,[1087,3712,3376],{"class":1305},[1087,3714,1492],{"class":1311},[1087,3716,3718],{"class":1089,"line":3717},48,[1087,3719,1370],{"emptyLinePlaceholder":21},[1087,3721,3723,3726,3728,3730,3733,3735,3737,3739,3741,3743,3745,3748,3750,3752,3754,3756,3758,3760,3763,3765,3768,3770,3772,3774,3776,3778,3780,3782,3784],{"class":1089,"line":3722},49,[1087,3724,3725],{"class":1291},"    await",[1087,3727,2441],{"class":1301},[1087,3729,1809],{"class":1305},[1087,3731,3732],{"class":1110},"update",[1087,3734,1302],{"class":1311},[1087,3736,2717],{"class":1301},[1087,3738,1809],{"class":1305},[1087,3740,1788],{"class":1301},[1087,3742,1883],{"class":1311},[1087,3744,1809],{"class":1305},[1087,3746,3747],{"class":1110},"set",[1087,3749,1302],{"class":1311},[1087,3751,1866],{"class":1305},[1087,3753,3631],{"class":1301},[1087,3755,1733],{"class":1305},[1087,3757,1883],{"class":1311},[1087,3759,1809],{"class":1305},[1087,3761,3762],{"class":1110},"where",[1087,3764,1302],{"class":1311},[1087,3766,3767],{"class":1110},"eq",[1087,3769,1302],{"class":1311},[1087,3771,2717],{"class":1301},[1087,3773,1809],{"class":1305},[1087,3775,1788],{"class":1301},[1087,3777,1809],{"class":1305},[1087,3779,2018],{"class":1301},[1087,3781,1717],{"class":1305},[1087,3783,3203],{"class":1301},[1087,3785,1973],{"class":1311},[1087,3787,3789],{"class":1089,"line":3788},50,[1087,3790,3585],{"class":1305},[1087,3792,3794],{"class":1089,"line":3793},51,[1087,3795,1370],{"emptyLinePlaceholder":21},[1087,3797,3799],{"class":1089,"line":3798},52,[1087,3800,3801],{"class":1471},"  \u002F\u002F Save the user message if it's a follow-up\n",[1087,3803,3805,3807,3810,3812,3814,3816,3818,3820,3823,3826,3829],{"class":1089,"line":3804},53,[1087,3806,2613],{"class":1588},[1087,3808,3809],{"class":1301}," lastMessage",[1087,3811,2623],{"class":1305},[1087,3813,3273],{"class":1301},[1087,3815,3702],{"class":1311},[1087,3817,1997],{"class":1301},[1087,3819,1809],{"class":1305},[1087,3821,3822],{"class":1301},"length",[1087,3824,3825],{"class":1305}," -",[1087,3827,3828],{"class":3560}," 1",[1087,3830,3168],{"class":1311},[1087,3832,3834,3836,3838,3841,3844,3846,3848,3850,3852,3854,3857,3859,3861,3863,3866,3868,3870],{"class":1089,"line":3833},54,[1087,3835,3528],{"class":1291},[1087,3837,1952],{"class":1311},[1087,3839,3840],{"class":1301},"lastMessage",[1087,3842,3843],{"class":1305},"?.",[1087,3845,2130],{"class":1301},[1087,3847,3349],{"class":1305},[1087,3849,1392],{"class":1305},[1087,3851,2148],{"class":1097},[1087,3853,1330],{"class":1305},[1087,3855,3856],{"class":1305}," &&",[1087,3858,3273],{"class":1301},[1087,3860,1809],{"class":1305},[1087,3862,3822],{"class":1301},[1087,3864,3865],{"class":1305}," >",[1087,3867,3828],{"class":3560},[1087,3869,3538],{"class":1311},[1087,3871,1306],{"class":1305},[1087,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891,3893,3895,3897,3899],{"class":1089,"line":3874},55,[1087,3876,3725],{"class":1291},[1087,3878,2441],{"class":1301},[1087,3880,1809],{"class":1305},[1087,3882,2712],{"class":1110},[1087,3884,1302],{"class":1311},[1087,3886,2717],{"class":1301},[1087,3888,1809],{"class":1305},[1087,3890,1997],{"class":1301},[1087,3892,1883],{"class":1311},[1087,3894,1809],{"class":1305},[1087,3896,2728],{"class":1110},[1087,3898,1302],{"class":1311},[1087,3900,1306],{"class":1305},[1087,3902,3904,3907,3909,3911],{"class":1089,"line":3903},56,[1087,3905,3906],{"class":1311},"      chatId",[1087,3908,1315],{"class":1305},[1087,3910,3203],{"class":1301},[1087,3912,1333],{"class":1305},[1087,3914,3916,3919,3921,3923,3925,3927],{"class":1089,"line":3915},57,[1087,3917,3918],{"class":1311},"      role",[1087,3920,1315],{"class":1305},[1087,3922,1392],{"class":1305},[1087,3924,2148],{"class":1097},[1087,3926,1330],{"class":1305},[1087,3928,1333],{"class":1305},[1087,3930,3932,3935,3937,3939,3941],{"class":1089,"line":3931},58,[1087,3933,3934],{"class":1311},"      parts",[1087,3936,1315],{"class":1305},[1087,3938,3809],{"class":1301},[1087,3940,1809],{"class":1305},[1087,3942,2825],{"class":1301},[1087,3944,3946,3948],{"class":1089,"line":3945},59,[1087,3947,3376],{"class":1305},[1087,3949,1492],{"class":1311},[1087,3951,3953],{"class":1089,"line":3952},60,[1087,3954,3585],{"class":1305},[1087,3956,3958],{"class":1089,"line":3957},61,[1087,3959,1370],{"emptyLinePlaceholder":21},[1087,3961,3963],{"class":1089,"line":3962},62,[1087,3964,3965],{"class":1471},"  \u002F\u002F Create the streaming response\n",[1087,3967,3969,3971,3974,3976,3979,3981],{"class":1089,"line":3968},63,[1087,3970,2613],{"class":1588},[1087,3972,3973],{"class":1301}," stream",[1087,3975,2623],{"class":1305},[1087,3977,3978],{"class":1110}," createUIMessageStream",[1087,3980,1302],{"class":1311},[1087,3982,1306],{"class":1305},[1087,3984,3986,3989,3991,3994,3996,3999,4001,4003],{"class":1089,"line":3985},64,[1087,3987,3988],{"class":1110},"    execute",[1087,3990,1315],{"class":1305},[1087,3992,3993],{"class":1588}," async",[1087,3995,1940],{"class":1305},[1087,3997,3998],{"class":1943}," writer",[1087,4000,1947],{"class":1305},[1087,4002,1826],{"class":1588},[1087,4004,1381],{"class":1305},[1087,4006,4008,4011,4014,4016,4019,4021],{"class":1089,"line":4007},65,[1087,4009,4010],{"class":1588},"      const",[1087,4012,4013],{"class":1301}," result",[1087,4015,2623],{"class":1305},[1087,4017,4018],{"class":1110}," streamText",[1087,4020,1302],{"class":1311},[1087,4022,1306],{"class":1305},[1087,4024,4026,4029],{"class":1089,"line":4025},66,[1087,4027,4028],{"class":1301},"        model",[1087,4030,1333],{"class":1305},[1087,4032,4034,4037,4039,4041,4044,4046],{"class":1089,"line":4033},67,[1087,4035,4036],{"class":1311},"        system",[1087,4038,1315],{"class":1305},[1087,4040,3671],{"class":1305},[1087,4042,4043],{"class":1097},"You are a helpful AI assistant. Be concise and friendly.",[1087,4045,3677],{"class":1305},[1087,4047,1333],{"class":1305},[1087,4049,4051,4054,4056,4058,4061,4063,4065,4067],{"class":1089,"line":4050},68,[1087,4052,4053],{"class":1311},"        messages",[1087,4055,1315],{"class":1305},[1087,4057,2626],{"class":1291},[1087,4059,4060],{"class":1110}," convertToModelMessages",[1087,4062,1302],{"class":1311},[1087,4064,1997],{"class":1301},[1087,4066,1883],{"class":1311},[1087,4068,1333],{"class":1305},[1087,4070,4072,4075,4077],{"class":1089,"line":4071},69,[1087,4073,4074],{"class":1311},"        providerOptions",[1087,4076,1315],{"class":1305},[1087,4078,1381],{"class":1305},[1087,4080,4082,4085,4087],{"class":1089,"line":4081},70,[1087,4083,4084],{"class":1311},"          anthropic",[1087,4086,1315],{"class":1305},[1087,4088,1381],{"class":1305},[1087,4090,4092,4095,4097],{"class":1089,"line":4091},71,[1087,4093,4094],{"class":1311},"            thinking",[1087,4096,1315],{"class":1305},[1087,4098,1381],{"class":1305},[1087,4100,4102,4105,4107,4109,4112,4114],{"class":1089,"line":4101},72,[1087,4103,4104],{"class":1311},"              type",[1087,4106,1315],{"class":1305},[1087,4108,1392],{"class":1305},[1087,4110,4111],{"class":1097},"enabled",[1087,4113,1330],{"class":1305},[1087,4115,1333],{"class":1305},[1087,4117,4119,4122,4124],{"class":1089,"line":4118},73,[1087,4120,4121],{"class":1311},"              budgetTokens",[1087,4123,1315],{"class":1305},[1087,4125,4126],{"class":3560}," 2048\n",[1087,4128,4130],{"class":1089,"line":4129},74,[1087,4131,4132],{"class":1305},"            }\n",[1087,4134,4136],{"class":1089,"line":4135},75,[1087,4137,4138],{"class":1305},"          },\n",[1087,4140,4142,4145,4147],{"class":1089,"line":4141},76,[1087,4143,4144],{"class":1311},"          google",[1087,4146,1315],{"class":1305},[1087,4148,1381],{"class":1305},[1087,4150,4152,4155,4157],{"class":1089,"line":4151},77,[1087,4153,4154],{"class":1311},"            thinkingConfig",[1087,4156,1315],{"class":1305},[1087,4158,1381],{"class":1305},[1087,4160,4162,4165,4167,4170],{"class":1089,"line":4161},78,[1087,4163,4164],{"class":1311},"              includeThoughts",[1087,4166,1315],{"class":1305},[1087,4168,4169],{"class":1467}," true",[1087,4171,1333],{"class":1305},[1087,4173,4175,4178,4180,4182,4185],{"class":1089,"line":4174},79,[1087,4176,4177],{"class":1311},"              thinkingLevel",[1087,4179,1315],{"class":1305},[1087,4181,1392],{"class":1305},[1087,4183,4184],{"class":1097},"low",[1087,4186,1356],{"class":1305},[1087,4188,4190],{"class":1089,"line":4189},80,[1087,4191,4132],{"class":1305},[1087,4193,4195],{"class":1089,"line":4194},81,[1087,4196,4138],{"class":1305},[1087,4198,4200,4203,4205],{"class":1089,"line":4199},82,[1087,4201,4202],{"class":1311},"          openai",[1087,4204,1315],{"class":1305},[1087,4206,1381],{"class":1305},[1087,4208,4210,4213,4215,4217,4219,4221],{"class":1089,"line":4209},83,[1087,4211,4212],{"class":1311},"            reasoningEffort",[1087,4214,1315],{"class":1305},[1087,4216,1392],{"class":1305},[1087,4218,4184],{"class":1097},[1087,4220,1330],{"class":1305},[1087,4222,1333],{"class":1305},[1087,4224,4226,4229,4231,4233,4236],{"class":1089,"line":4225},84,[1087,4227,4228],{"class":1311},"            reasoningSummary",[1087,4230,1315],{"class":1305},[1087,4232,1392],{"class":1305},[1087,4234,4235],{"class":1097},"detailed",[1087,4237,1356],{"class":1305},[1087,4239,4241],{"class":1089,"line":4240},85,[1087,4242,4243],{"class":1305},"          }\n",[1087,4245,4247],{"class":1089,"line":4246},86,[1087,4248,4249],{"class":1305},"        }\n",[1087,4251,4253,4256],{"class":1089,"line":4252},87,[1087,4254,4255],{"class":1305},"      }",[1087,4257,1492],{"class":1311},[1087,4259,4261],{"class":1089,"line":4260},88,[1087,4262,1370],{"emptyLinePlaceholder":21},[1087,4264,4266],{"class":1089,"line":4265},89,[1087,4267,4268],{"class":1471},"      \u002F\u002F Notify the client that a title was generated\n",[1087,4270,4272,4275,4277,4279,4281,4283,4285,4287],{"class":1089,"line":4271},90,[1087,4273,4274],{"class":1291},"      if",[1087,4276,1952],{"class":1311},[1087,4278,3533],{"class":1305},[1087,4280,262],{"class":1301},[1087,4282,1809],{"class":1305},[1087,4284,3612],{"class":1301},[1087,4286,3538],{"class":1311},[1087,4288,1306],{"class":1305},[1087,4290,4292,4295,4297,4300,4302],{"class":1089,"line":4291},91,[1087,4293,4294],{"class":1301},"        writer",[1087,4296,1809],{"class":1305},[1087,4298,4299],{"class":1110},"write",[1087,4301,1302],{"class":1311},[1087,4303,1306],{"class":1305},[1087,4305,4307,4310,4312,4314,4317,4319],{"class":1089,"line":4306},92,[1087,4308,4309],{"class":1311},"          type",[1087,4311,1315],{"class":1305},[1087,4313,1392],{"class":1305},[1087,4315,4316],{"class":1097},"data-chat-title",[1087,4318,1330],{"class":1305},[1087,4320,1333],{"class":1305},[1087,4322,4324,4327,4329,4331,4333,4335,4337,4340,4342],{"class":1089,"line":4323},93,[1087,4325,4326],{"class":1311},"          data",[1087,4328,1315],{"class":1305},[1087,4330,1711],{"class":1305},[1087,4332,2618],{"class":1311},[1087,4334,1315],{"class":1305},[1087,4336,1392],{"class":1305},[1087,4338,4339],{"class":1097},"Title generated",[1087,4341,1330],{"class":1305},[1087,4343,3102],{"class":1305},[1087,4345,4347,4350,4352],{"class":1089,"line":4346},94,[1087,4348,4349],{"class":1311},"          transient",[1087,4351,1315],{"class":1305},[1087,4353,4354],{"class":1467}," true\n",[1087,4356,4358,4361],{"class":1089,"line":4357},95,[1087,4359,4360],{"class":1305},"        }",[1087,4362,1492],{"class":1311},[1087,4364,4366],{"class":1089,"line":4365},96,[1087,4367,4368],{"class":1305},"      }\n",[1087,4370,4372],{"class":1089,"line":4371},97,[1087,4373,1370],{"emptyLinePlaceholder":21},[1087,4375,4377,4380,4382,4385,4387,4390,4392,4395],{"class":1089,"line":4376},98,[1087,4378,4379],{"class":1301},"      writer",[1087,4381,1809],{"class":1305},[1087,4383,4384],{"class":1110},"merge",[1087,4386,1302],{"class":1311},[1087,4388,4389],{"class":1301},"result",[1087,4391,1809],{"class":1305},[1087,4393,4394],{"class":1110},"toUIMessageStream",[1087,4396,1909],{"class":1311},[1087,4398,4400],{"class":1089,"line":4399},99,[1087,4401,4402],{"class":1305},"    },\n",[1087,4404,4406,4409,4411,4413,4415,4417,4419,4421],{"class":1089,"line":4405},100,[1087,4407,4408],{"class":1110},"    onFinish",[1087,4410,1315],{"class":1305},[1087,4412,3993],{"class":1588},[1087,4414,1940],{"class":1305},[1087,4416,3273],{"class":1943},[1087,4418,1947],{"class":1305},[1087,4420,1826],{"class":1588},[1087,4422,1381],{"class":1305},[1087,4424,4426],{"class":1089,"line":4425},101,[1087,4427,4428],{"class":1471},"      \u002F\u002F Save the assistant's response to the database\n",[1087,4430,4432,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4464,4466,4469,4471,4473],{"class":1089,"line":4431},102,[1087,4433,4434],{"class":1291},"      await",[1087,4436,2441],{"class":1301},[1087,4438,1809],{"class":1305},[1087,4440,2712],{"class":1110},[1087,4442,1302],{"class":1311},[1087,4444,2717],{"class":1301},[1087,4446,1809],{"class":1305},[1087,4448,1997],{"class":1301},[1087,4450,1883],{"class":1311},[1087,4452,1809],{"class":1305},[1087,4454,2728],{"class":1110},[1087,4456,1302],{"class":1311},[1087,4458,1997],{"class":1301},[1087,4460,1809],{"class":1305},[1087,4462,4463],{"class":1110},"map",[1087,4465,1302],{"class":1311},[1087,4467,4468],{"class":1943},"message",[1087,4470,1826],{"class":1588},[1087,4472,1952],{"class":1311},[1087,4474,1306],{"class":1305},[1087,4476,4478,4481,4483,4485,4487,4489],{"class":1089,"line":4477},103,[1087,4479,4480],{"class":1311},"        chatId",[1087,4482,1315],{"class":1305},[1087,4484,2790],{"class":1301},[1087,4486,1809],{"class":1305},[1087,4488,2018],{"class":1301},[1087,4490,1333],{"class":1305},[1087,4492,4494,4497,4499,4501,4503,4505,4507,4509,4511,4513,4516,4518,4520,4522],{"class":1089,"line":4493},104,[1087,4495,4496],{"class":1311},"        role",[1087,4498,1315],{"class":1305},[1087,4500,2618],{"class":1301},[1087,4502,1809],{"class":1305},[1087,4504,2130],{"class":1301},[1087,4506,3505],{"class":1291},[1087,4508,1392],{"class":1305},[1087,4510,2148],{"class":1097},[1087,4512,1330],{"class":1305},[1087,4514,4515],{"class":1305}," |",[1087,4517,1392],{"class":1305},[1087,4519,2157],{"class":1097},[1087,4521,1330],{"class":1305},[1087,4523,1333],{"class":1305},[1087,4525,4527,4530,4532,4534,4536],{"class":1089,"line":4526},105,[1087,4528,4529],{"class":1311},"        parts",[1087,4531,1315],{"class":1305},[1087,4533,2618],{"class":1301},[1087,4535,1809],{"class":1305},[1087,4537,2825],{"class":1301},[1087,4539,4541,4543],{"class":1089,"line":4540},106,[1087,4542,4255],{"class":1305},[1087,4544,4545],{"class":1311},")))\n",[1087,4547,4549],{"class":1089,"line":4548},107,[1087,4550,1478],{"class":1305},[1087,4552,4554,4556],{"class":1089,"line":4553},108,[1087,4555,2414],{"class":1305},[1087,4557,1492],{"class":1311},[1087,4559,4561],{"class":1089,"line":4560},109,[1087,4562,1370],{"emptyLinePlaceholder":21},[1087,4564,4566,4568,4571,4573,4575,4577,4579],{"class":1089,"line":4565},110,[1087,4567,2840],{"class":1291},[1087,4569,4570],{"class":1110}," createUIMessageStreamResponse",[1087,4572,1302],{"class":1311},[1087,4574,1866],{"class":1305},[1087,4576,3973],{"class":1301},[1087,4578,1733],{"class":1305},[1087,4580,1492],{"class":1311},[1087,4582,4584,4586],{"class":1089,"line":4583},111,[1087,4585,1489],{"class":1305},[1087,4587,1492],{"class":1301},[976,4589,4590],{},"Here's what each part does:",[976,4592,4593],{},[994,4594,4595],{},"AI Gateway",[976,4597,4598,4599,4602],{},"Thanks to ",[1030,4600,1068],{"href":1066,"rel":4601},[1034],", we can use any AI model supported by the gateway just by specifying the model name.",[976,4604,4605],{},[994,4606,4607],{},"Automatic Title Generation",[976,4609,4610,4611,4618],{},"When a chat doesn't have a title yet, we use ",[1030,4612,4615],{"href":4613,"rel":4614},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-core\u002Fgenerate-text#generatetext",[1034],[1037,4616,4617],{},"generateText"," to create one based on the first message. This provides a better UX by showing meaningful titles in the chat history instead of \"Untitled\".",[976,4620,4621],{},[994,4622,4623],{},"Streaming with streamText",[976,4625,4626,4627,4632],{},"The ",[1030,4628,4630],{"href":2859,"rel":4629},[1034],[1037,4631,2863],{}," function generates a streaming response from the AI model. Key options include:",[988,4634,4635,4641,4646],{},[991,4636,4637,4640],{},[1037,4638,4639],{},"model",": The AI model to use",[991,4642,4643,4645],{},[1037,4644,2166],{},": Instructions that guide the AI's behavior",[991,4647,4648,4650],{},[1037,4649,1997],{},": The conversation history",[976,4652,4653],{},[994,4654,4655],{},"UIMessageStream",[976,4657,4626,4658,1040,4664,4670],{},[1030,4659,4662],{"href":4660,"rel":4661},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream#createuimessagestream",[1034],[1037,4663,2871],{},[1030,4665,4668],{"href":4666,"rel":4667},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fcreate-ui-message-stream-response#createuimessagestreamresponse",[1034],[1037,4669,2879],{}," functions create a stream that the AI SDK client can consume. The response streams chunks as they're generated, creating the real-time typing effect.",[976,4672,4626,4673,4676,4677,4679,4680,4683],{},[1037,4674,4675],{},"writer.write()"," method allows sending custom data events to the client (like ",[1037,4678,4316],{},"), while ",[1037,4681,4682],{},"onFinish"," is called when streaming completes, perfect for persisting the assistant's response.",[1115,4685,4687],{"id":4686},"fetching-a-chat","Fetching a chat",[976,4689,4690],{},"Add an endpoint to fetch existing chat data from your database:",[1278,4692,4693],{},[1078,4694,4697],{"className":1282,"code":4695,"filename":4696,"language":1284,"meta":1083,"style":1083},"import { createError, defineEventHandler, getValidatedRouterParams } from 'h3'\nimport { asc, eq } from 'drizzle-orm'\nimport { db, schema } from 'hub:db'\nimport { z } from 'zod'\n\nexport default defineEventHandler(async (event) => {\n  const { id } = await getValidatedRouterParams(event, z.object({\n    id: z.string()\n  }).parse)\n\n  const chat = await db.query.chats.findFirst({\n    where: (eq(schema.chats.id, id)),\n    with: {\n      messages: {\n        orderBy: () => asc(schema.messages.createdAt)\n      }\n    }\n  })\n\n  if (!chat) {\n    throw createError({ statusCode: 404, statusMessage: 'Chat not found' })\n  }\n\n  return chat\n})\n","server\u002Fapi\u002Fchats\u002F[id].get.ts",[1037,4698,4699,4725,4748,4770,4788,4792,4814,4846,4860,4872,4876,4904,4935,4944,4953,4982,4986,4990,4996,5000,5014,5046,5050,5054,5060],{"__ignoreMap":1083},[1087,4700,4701,4703,4705,4707,4709,4711,4713,4715,4717,4719,4721,4723],{"class":1089,"line":1090},[1087,4702,1708],{"class":1291},[1087,4704,1711],{"class":1305},[1087,4706,2899],{"class":1301},[1087,4708,1717],{"class":1305},[1087,4710,2498],{"class":1301},[1087,4712,1717],{"class":1305},[1087,4714,2908],{"class":1301},[1087,4716,1733],{"class":1305},[1087,4718,1736],{"class":1291},[1087,4720,1392],{"class":1305},[1087,4722,1115],{"class":1097},[1087,4724,1356],{"class":1305},[1087,4726,4727,4729,4731,4734,4736,4738,4740,4742,4744,4746],{"class":1089,"line":1107},[1087,4728,1708],{"class":1291},[1087,4730,1711],{"class":1305},[1087,4732,4733],{"class":1301}," asc",[1087,4735,1717],{"class":1305},[1087,4737,2931],{"class":1301},[1087,4739,1733],{"class":1305},[1087,4741,1736],{"class":1291},[1087,4743,1392],{"class":1305},[1087,4745,1761],{"class":1097},[1087,4747,1356],{"class":1305},[1087,4749,4750,4752,4754,4756,4758,4760,4762,4764,4766,4768],{"class":1089,"line":1321},[1087,4751,1708],{"class":1291},[1087,4753,1711],{"class":1305},[1087,4755,2441],{"class":1301},[1087,4757,1717],{"class":1305},[1087,4759,2549],{"class":1301},[1087,4761,1733],{"class":1305},[1087,4763,1736],{"class":1291},[1087,4765,1392],{"class":1305},[1087,4767,2558],{"class":1097},[1087,4769,1356],{"class":1305},[1087,4771,4772,4774,4776,4778,4780,4782,4784,4786],{"class":1089,"line":1336},[1087,4773,1708],{"class":1291},[1087,4775,1711],{"class":1305},[1087,4777,2569],{"class":1301},[1087,4779,1733],{"class":1305},[1087,4781,1736],{"class":1291},[1087,4783,1392],{"class":1305},[1087,4785,2578],{"class":1097},[1087,4787,1356],{"class":1305},[1087,4789,4790],{"class":1089,"line":1348},[1087,4791,1370],{"emptyLinePlaceholder":21},[1087,4793,4794,4796,4798,4800,4802,4804,4806,4808,4810,4812],{"class":1089,"line":1359},[1087,4795,1292],{"class":1291},[1087,4797,1295],{"class":1291},[1087,4799,2498],{"class":1110},[1087,4801,1302],{"class":1301},[1087,4803,2597],{"class":1588},[1087,4805,1952],{"class":1305},[1087,4807,2602],{"class":1943},[1087,4809,1883],{"class":1305},[1087,4811,1826],{"class":1588},[1087,4813,1381],{"class":1305},[1087,4815,4816,4818,4820,4822,4824,4826,4828,4830,4832,4834,4836,4838,4840,4842,4844],{"class":1089,"line":1367},[1087,4817,2613],{"class":1588},[1087,4819,1711],{"class":1305},[1087,4821,3203],{"class":1301},[1087,4823,1733],{"class":1305},[1087,4825,2623],{"class":1305},[1087,4827,2626],{"class":1291},[1087,4829,2908],{"class":1110},[1087,4831,1302],{"class":1311},[1087,4833,2602],{"class":1301},[1087,4835,1717],{"class":1305},[1087,4837,2569],{"class":1301},[1087,4839,1809],{"class":1305},[1087,4841,2641],{"class":1110},[1087,4843,1302],{"class":1311},[1087,4845,1306],{"class":1305},[1087,4847,4848,4850,4852,4854,4856,4858],{"class":1089,"line":1373},[1087,4849,3232],{"class":1311},[1087,4851,1315],{"class":1305},[1087,4853,2569],{"class":1301},[1087,4855,1809],{"class":1305},[1087,4857,3241],{"class":1110},[1087,4859,2669],{"class":1311},[1087,4861,4862,4864,4866,4868,4870],{"class":1089,"line":1384},[1087,4863,2414],{"class":1305},[1087,4865,1883],{"class":1311},[1087,4867,1809],{"class":1305},[1087,4869,2680],{"class":1301},[1087,4871,1492],{"class":1311},[1087,4873,4874],{"class":1089,"line":1400},[1087,4875,1370],{"emptyLinePlaceholder":21},[1087,4877,4878,4880,4882,4884,4886,4888,4890,4892,4894,4896,4898,4900,4902],{"class":1089,"line":1406},[1087,4879,2613],{"class":1588},[1087,4881,2790],{"class":1301},[1087,4883,2623],{"class":1305},[1087,4885,2626],{"class":1291},[1087,4887,2441],{"class":1301},[1087,4889,1809],{"class":1305},[1087,4891,3453],{"class":1301},[1087,4893,1809],{"class":1305},[1087,4895,1788],{"class":1301},[1087,4897,1809],{"class":1305},[1087,4899,3462],{"class":1110},[1087,4901,1302],{"class":1311},[1087,4903,1306],{"class":1305},[1087,4905,4906,4908,4910,4912,4914,4916,4918,4920,4922,4924,4926,4928,4930,4933],{"class":1089,"line":1411},[1087,4907,3472],{"class":1311},[1087,4909,1315],{"class":1305},[1087,4911,1952],{"class":1311},[1087,4913,3767],{"class":1110},[1087,4915,1302],{"class":1311},[1087,4917,2717],{"class":1301},[1087,4919,1809],{"class":1305},[1087,4921,1788],{"class":1301},[1087,4923,1809],{"class":1305},[1087,4925,2018],{"class":1301},[1087,4927,1717],{"class":1305},[1087,4929,3203],{"class":1301},[1087,4931,4932],{"class":1311},"))",[1087,4934,1333],{"class":1305},[1087,4936,4937,4940,4942],{"class":1089,"line":1434},[1087,4938,4939],{"class":1311},"    with",[1087,4941,1315],{"class":1305},[1087,4943,1381],{"class":1305},[1087,4945,4946,4949,4951],{"class":1089,"line":1439},[1087,4947,4948],{"class":1311},"      messages",[1087,4950,1315],{"class":1305},[1087,4952,1381],{"class":1305},[1087,4954,4955,4958,4960,4963,4965,4967,4969,4971,4973,4975,4977,4980],{"class":1089,"line":1449},[1087,4956,4957],{"class":1110},"        orderBy",[1087,4959,1315],{"class":1305},[1087,4961,4962],{"class":1305}," ()",[1087,4964,1826],{"class":1588},[1087,4966,4733],{"class":1110},[1087,4968,1302],{"class":1311},[1087,4970,2717],{"class":1301},[1087,4972,1809],{"class":1305},[1087,4974,1997],{"class":1301},[1087,4976,1809],{"class":1305},[1087,4978,4979],{"class":1301},"createdAt",[1087,4981,1492],{"class":1311},[1087,4983,4984],{"class":1089,"line":1459},[1087,4985,4368],{"class":1305},[1087,4987,4988],{"class":1089,"line":1475},[1087,4989,1478],{"class":1305},[1087,4991,4992,4994],{"class":1089,"line":1481},[1087,4993,2414],{"class":1305},[1087,4995,1492],{"class":1311},[1087,4997,4998],{"class":1089,"line":1486},[1087,4999,1370],{"emptyLinePlaceholder":21},[1087,5001,5002,5004,5006,5008,5010,5012],{"class":1089,"line":2275},[1087,5003,3528],{"class":1291},[1087,5005,1952],{"class":1311},[1087,5007,3533],{"class":1305},[1087,5009,262],{"class":1301},[1087,5011,3538],{"class":1311},[1087,5013,1306],{"class":1305},[1087,5015,5016,5018,5020,5022,5024,5026,5028,5030,5032,5034,5036,5038,5040,5042,5044],{"class":1089,"line":2288},[1087,5017,3546],{"class":1291},[1087,5019,2899],{"class":1110},[1087,5021,1302],{"class":1311},[1087,5023,1866],{"class":1305},[1087,5025,3555],{"class":1311},[1087,5027,1315],{"class":1305},[1087,5029,3561],{"class":3560},[1087,5031,1717],{"class":1305},[1087,5033,3566],{"class":1311},[1087,5035,1315],{"class":1305},[1087,5037,1392],{"class":1305},[1087,5039,3573],{"class":1097},[1087,5041,1330],{"class":1305},[1087,5043,1733],{"class":1305},[1087,5045,1492],{"class":1311},[1087,5047,5048],{"class":1089,"line":2318},[1087,5049,3585],{"class":1305},[1087,5051,5052],{"class":1089,"line":2324},[1087,5053,1370],{"emptyLinePlaceholder":21},[1087,5055,5056,5058],{"class":1089,"line":2329},[1087,5057,2840],{"class":1291},[1087,5059,2843],{"class":1301},[1087,5061,5062,5064],{"class":1089,"line":2361},[1087,5063,1489],{"class":1305},[1087,5065,1492],{"class":1301},[980,5067,5069],{"id":5068},"wire-up-the-ui","Wire up the UI",[976,5071,5072,5073,5078,5079,5084],{},"Nuxt UI provides purpose-built components for AI chat interfaces: ",[1030,5074,5075],{"href":281},[1037,5076,5077],{},"UChatPrompt"," for the input area and ",[1030,5080,5081],{"href":271},[1037,5082,5083],{},"UChatMessages"," for displaying the conversation.",[1115,5086,5088],{"id":5087},"creating-the-home-page","Creating the home page",[976,5090,5091,5092,5096],{},"The home page is where users start a new conversation. The ",[1030,5093,5094],{"href":281},[1037,5095,5077],{}," component provides a textarea with auto-resize, keyboard shortcuts, and a submit button:",[1278,5098,5099],{},[1078,5100,5104],{"className":1550,"code":5101,"filename":5102,"highlights":5103,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst input = ref('')\nconst loading = ref(false)\n\nasync function createChat() {\n  if (!input.value.trim()) return\n\n  loading.value = true\n\n  \u002F\u002F Create a new chat on the server\n  const chat = await $fetch('\u002Fapi\u002Fchats', {\n    method: 'POST',\n    body: {\n      message: {\n        role: 'user',\n        parts: [{ type: 'text', text: input.value }]\n      }\n    }\n  })\n\n  \u002F\u002F Navigate to the chat page\n  navigateTo(`\u002Fchat\u002F${chat.id}`)\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col justify-center gap-6 py-8\">\n        \u003Ch1 class=\"text-3xl sm:text-4xl text-highlighted font-bold\">\n          How can I help you today?\n        \u003C\u002Fh1>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :status=\"loading ? 'streaming' : 'ready'\"\n          variant=\"subtle\"\n          placeholder=\"Ask me anything...\"\n          @submit=\"createChat\"\n        >\n          \u003CUChatPromptSubmit color=\"neutral\" \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n","app\u002Fpages\u002Findex.vue",[3469,3513,3520,3525,3543,3582,3588,3593,3599],[1037,5105,5106,5129,5148,5166,5170,5184,5210,5214,5227,5231,5236,5262,5278,5287,5295,5309,5347,5351,5355,5361,5365,5370,5396,5401,5409,5413,5421,5442,5456,5477,5498,5503,5512,5516,5524,5539,5554,5569,5584,5599,5605,5628,5637,5646,5654,5662],{"__ignoreMap":1083},[1087,5107,5108,5110,5113,5116,5119,5121,5123,5125,5127],{"class":1089,"line":1090},[1087,5109,1560],{"class":1305},[1087,5111,5112],{"class":1311},"script",[1087,5114,5115],{"class":1588}," setup",[1087,5117,5118],{"class":1588}," lang",[1087,5120,1592],{"class":1305},[1087,5122,1519],{"class":1305},[1087,5124,1284],{"class":1097},[1087,5126,1519],{"class":1305},[1087,5128,1566],{"class":1305},[1087,5130,5131,5133,5136,5138,5141,5143,5146],{"class":1089,"line":1107},[1087,5132,3061],{"class":1588},[1087,5134,5135],{"class":1301}," input ",[1087,5137,1592],{"class":1305},[1087,5139,5140],{"class":1110}," ref",[1087,5142,1302],{"class":1301},[1087,5144,5145],{"class":1305},"''",[1087,5147,1492],{"class":1301},[1087,5149,5150,5152,5155,5157,5159,5161,5164],{"class":1089,"line":1321},[1087,5151,3061],{"class":1588},[1087,5153,5154],{"class":1301}," loading ",[1087,5156,1592],{"class":1305},[1087,5158,5140],{"class":1110},[1087,5160,1302],{"class":1301},[1087,5162,5163],{"class":1467},"false",[1087,5165,1492],{"class":1301},[1087,5167,5168],{"class":1089,"line":1336},[1087,5169,1370],{"emptyLinePlaceholder":21},[1087,5171,5172,5174,5177,5180,5182],{"class":1089,"line":1348},[1087,5173,2597],{"class":1588},[1087,5175,5176],{"class":1588}," function",[1087,5178,5179],{"class":1110}," createChat",[1087,5181,1806],{"class":1305},[1087,5183,1381],{"class":1305},[1087,5185,5186,5188,5190,5192,5195,5197,5199,5201,5204,5207],{"class":1089,"line":1359},[1087,5187,3528],{"class":1291},[1087,5189,1952],{"class":1311},[1087,5191,3533],{"class":1305},[1087,5193,5194],{"class":1301},"input",[1087,5196,1809],{"class":1305},[1087,5198,3322],{"class":1301},[1087,5200,1809],{"class":1305},[1087,5202,5203],{"class":1110},"trim",[1087,5205,5206],{"class":1311},"()) ",[1087,5208,5209],{"class":1291},"return\n",[1087,5211,5212],{"class":1089,"line":1367},[1087,5213,1370],{"emptyLinePlaceholder":21},[1087,5215,5216,5219,5221,5223,5225],{"class":1089,"line":1373},[1087,5217,5218],{"class":1301},"  loading",[1087,5220,1809],{"class":1305},[1087,5222,3322],{"class":1301},[1087,5224,2623],{"class":1305},[1087,5226,4354],{"class":1467},[1087,5228,5229],{"class":1089,"line":1384},[1087,5230,1370],{"emptyLinePlaceholder":21},[1087,5232,5233],{"class":1089,"line":1400},[1087,5234,5235],{"class":1471},"  \u002F\u002F Create a new chat on the server\n",[1087,5237,5238,5240,5242,5244,5246,5249,5251,5253,5256,5258,5260],{"class":1089,"line":1406},[1087,5239,2613],{"class":1588},[1087,5241,2790],{"class":1301},[1087,5243,2623],{"class":1305},[1087,5245,2626],{"class":1291},[1087,5247,5248],{"class":1110}," $fetch",[1087,5250,1302],{"class":1311},[1087,5252,1330],{"class":1305},[1087,5254,5255],{"class":1097},"\u002Fapi\u002Fchats",[1087,5257,1330],{"class":1305},[1087,5259,1717],{"class":1305},[1087,5261,1381],{"class":1305},[1087,5263,5264,5267,5269,5271,5274,5276],{"class":1089,"line":1411},[1087,5265,5266],{"class":1311},"    method",[1087,5268,1315],{"class":1305},[1087,5270,1392],{"class":1305},[1087,5272,5273],{"class":1097},"POST",[1087,5275,1330],{"class":1305},[1087,5277,1333],{"class":1305},[1087,5279,5280,5283,5285],{"class":1089,"line":1434},[1087,5281,5282],{"class":1311},"    body",[1087,5284,1315],{"class":1305},[1087,5286,1381],{"class":1305},[1087,5288,5289,5291,5293],{"class":1089,"line":1439},[1087,5290,3362],{"class":1311},[1087,5292,1315],{"class":1305},[1087,5294,1381],{"class":1305},[1087,5296,5297,5299,5301,5303,5305,5307],{"class":1089,"line":1449},[1087,5298,4496],{"class":1311},[1087,5300,1315],{"class":1305},[1087,5302,1392],{"class":1305},[1087,5304,2148],{"class":1097},[1087,5306,1330],{"class":1305},[1087,5308,1333],{"class":1305},[1087,5310,5311,5313,5315,5317,5319,5321,5323,5325,5328,5330,5332,5334,5336,5339,5341,5343,5345],{"class":1089,"line":1459},[1087,5312,4529],{"class":1311},[1087,5314,1315],{"class":1305},[1087,5316,1419],{"class":1311},[1087,5318,1866],{"class":1305},[1087,5320,2520],{"class":1311},[1087,5322,1315],{"class":1305},[1087,5324,1392],{"class":1305},[1087,5326,5327],{"class":1097},"text",[1087,5329,1330],{"class":1305},[1087,5331,1717],{"class":1305},[1087,5333,1720],{"class":1311},[1087,5335,1315],{"class":1305},[1087,5337,5338],{"class":1301}," input",[1087,5340,1809],{"class":1305},[1087,5342,3322],{"class":1301},[1087,5344,1733],{"class":1305},[1087,5346,3168],{"class":1311},[1087,5348,5349],{"class":1089,"line":1475},[1087,5350,4368],{"class":1305},[1087,5352,5353],{"class":1089,"line":1481},[1087,5354,1478],{"class":1305},[1087,5356,5357,5359],{"class":1089,"line":1486},[1087,5358,2414],{"class":1305},[1087,5360,1492],{"class":1311},[1087,5362,5363],{"class":1089,"line":2275},[1087,5364,1370],{"emptyLinePlaceholder":21},[1087,5366,5367],{"class":1089,"line":2288},[1087,5368,5369],{"class":1471},"  \u002F\u002F Navigate to the chat page\n",[1087,5371,5372,5375,5377,5379,5382,5385,5387,5389,5391,5394],{"class":1089,"line":2318},[1087,5373,5374],{"class":1110},"  navigateTo",[1087,5376,1302],{"class":1311},[1087,5378,3677],{"class":1305},[1087,5380,5381],{"class":1097},"\u002Fchat\u002F",[1087,5383,5384],{"class":1305},"${",[1087,5386,262],{"class":1301},[1087,5388,1809],{"class":1305},[1087,5390,2018],{"class":1301},[1087,5392,5393],{"class":1305},"}`",[1087,5395,1492],{"class":1311},[1087,5397,5398],{"class":1089,"line":2324},[1087,5399,5400],{"class":1305},"}\n",[1087,5402,5403,5405,5407],{"class":1089,"line":2329},[1087,5404,1636],{"class":1305},[1087,5406,5112],{"class":1311},[1087,5408,1566],{"class":1305},[1087,5410,5411],{"class":1089,"line":2361},[1087,5412,1370],{"emptyLinePlaceholder":21},[1087,5414,5415,5417,5419],{"class":1089,"line":2377},[1087,5416,1560],{"class":1305},[1087,5418,1563],{"class":1311},[1087,5420,1566],{"class":1305},[1087,5422,5423,5425,5428,5431,5433,5435,5438,5440],{"class":1089,"line":2395},[1087,5424,1573],{"class":1305},[1087,5426,5427],{"class":1311},"UDashboardPanel",[1087,5429,5430],{"class":1588}," :ui",[1087,5432,1592],{"class":1305},[1087,5434,1519],{"class":1305},[1087,5436,5437],{"class":1097},"{ body: 'p-0 sm:p-0' }",[1087,5439,1519],{"class":1305},[1087,5441,1566],{"class":1305},[1087,5443,5444,5446,5448,5451,5454],{"class":1089,"line":2411},[1087,5445,1582],{"class":1305},[1087,5447,1563],{"class":1311},[1087,5449,5450],{"class":1305}," #",[1087,5452,5453],{"class":1588},"body",[1087,5455,1566],{"class":1305},[1087,5457,5458,5460,5463,5466,5468,5470,5473,5475],{"class":1089,"line":2419},[1087,5459,1606],{"class":1305},[1087,5461,5462],{"class":1311},"UContainer",[1087,5464,5465],{"class":1588}," class",[1087,5467,1592],{"class":1305},[1087,5469,1519],{"class":1305},[1087,5471,5472],{"class":1097},"min-h-dvh flex flex-col justify-center gap-6 py-8",[1087,5474,1519],{"class":1305},[1087,5476,1566],{"class":1305},[1087,5478,5479,5482,5485,5487,5489,5491,5494,5496],{"class":1089,"line":3414},[1087,5480,5481],{"class":1305},"        \u003C",[1087,5483,5484],{"class":1311},"h1",[1087,5486,5465],{"class":1588},[1087,5488,1592],{"class":1305},[1087,5490,1519],{"class":1305},[1087,5492,5493],{"class":1097},"text-3xl sm:text-4xl text-highlighted font-bold",[1087,5495,1519],{"class":1305},[1087,5497,1566],{"class":1305},[1087,5499,5500],{"class":1089,"line":3427},[1087,5501,5502],{"class":1301},"          How can I help you today?\n",[1087,5504,5505,5508,5510],{"class":1089,"line":3432},[1087,5506,5507],{"class":1305},"        \u003C\u002F",[1087,5509,5484],{"class":1311},[1087,5511,1566],{"class":1305},[1087,5513,5514],{"class":1089,"line":3438},[1087,5515,1370],{"emptyLinePlaceholder":21},[1087,5517,5519,5521],{"class":5518,"line":3469},[1089,1570],[1087,5520,5481],{"class":1305},[1087,5522,5523],{"class":1311},"UChatPrompt\n",[1087,5525,5527,5530,5532,5534,5536],{"class":5526,"line":3513},[1089,1570],[1087,5528,5529],{"class":1588},"          v-model",[1087,5531,1592],{"class":1305},[1087,5533,1519],{"class":1305},[1087,5535,5194],{"class":1097},[1087,5537,5538],{"class":1305},"\"\n",[1087,5540,5542,5545,5547,5549,5552],{"class":5541,"line":3520},[1089,1570],[1087,5543,5544],{"class":1588},"          :status",[1087,5546,1592],{"class":1305},[1087,5548,1519],{"class":1305},[1087,5550,5551],{"class":1097},"loading ? 'streaming' : 'ready'",[1087,5553,5538],{"class":1305},[1087,5555,5557,5560,5562,5564,5567],{"class":5556,"line":3525},[1089,1570],[1087,5558,5559],{"class":1588},"          variant",[1087,5561,1592],{"class":1305},[1087,5563,1519],{"class":1305},[1087,5565,5566],{"class":1097},"subtle",[1087,5568,5538],{"class":1305},[1087,5570,5572,5575,5577,5579,5582],{"class":5571,"line":3543},[1089,1570],[1087,5573,5574],{"class":1588},"          placeholder",[1087,5576,1592],{"class":1305},[1087,5578,1519],{"class":1305},[1087,5580,5581],{"class":1097},"Ask me anything...",[1087,5583,5538],{"class":1305},[1087,5585,5587,5590,5592,5594,5597],{"class":5586,"line":3582},[1089,1570],[1087,5588,5589],{"class":1588},"          @submit",[1087,5591,1592],{"class":1305},[1087,5593,1519],{"class":1305},[1087,5595,5596],{"class":1097},"createChat",[1087,5598,5538],{"class":1305},[1087,5600,5602],{"class":5601,"line":3588},[1089,1570],[1087,5603,5604],{"class":1305},"        >\n",[1087,5606,5608,5611,5614,5617,5619,5621,5624,5626],{"class":5607,"line":3593},[1089,1570],[1087,5609,5610],{"class":1305},"          \u003C",[1087,5612,5613],{"class":1311},"UChatPromptSubmit",[1087,5615,5616],{"class":1588}," color",[1087,5618,1592],{"class":1305},[1087,5620,1519],{"class":1305},[1087,5622,5623],{"class":1097},"neutral",[1087,5625,1519],{"class":1305},[1087,5627,1612],{"class":1305},[1087,5629,5631,5633,5635],{"class":5630,"line":3599},[1089,1570],[1087,5632,5507],{"class":1305},[1087,5634,5077],{"class":1311},[1087,5636,1566],{"class":1305},[1087,5638,5639,5642,5644],{"class":1089,"line":3619},[1087,5640,5641],{"class":1305},"      \u003C\u002F",[1087,5643,5462],{"class":1311},[1087,5645,1566],{"class":1305},[1087,5647,5648,5650,5652],{"class":1089,"line":3647},[1087,5649,1617],{"class":1305},[1087,5651,1563],{"class":1311},[1087,5653,1566],{"class":1305},[1087,5655,5656,5658,5660],{"class":1089,"line":3663},[1087,5657,1627],{"class":1305},[1087,5659,5427],{"class":1311},[1087,5661,1566],{"class":1305},[1087,5663,5664,5666,5668],{"class":1089,"line":3682},[1087,5665,1636],{"class":1305},[1087,5667,1563],{"class":1311},[1087,5669,1566],{"class":1305},[976,5671,4626,5672,5676],{},[1030,5673,5674],{"href":281},[1037,5675,5077],{}," component automatically handles:",[988,5678,5679,5686,5689,5699],{},[991,5680,5681,5682],{},"Form submission when pressing ",[5683,5684],"kbd",{"value":5685},"enter",[991,5687,5688],{},"Auto-resizing as you type",[991,5690,5691,5692,5695,5696],{},"A loading state when ",[1037,5693,5694],{},"status"," is set to ",[1037,5697,5698],{},"streaming",[991,5700,5701],{},"Focus management and keyboard shortcuts",[980,5703,5705],{"id":5704},"creating-the-chat-page","Creating the chat page",[976,5707,5708,5709,5715,5716,5723],{},"The chat page is where the actual conversation happens. It integrates the AI SDK's ",[1030,5710,5713],{"href":5711,"rel":5712},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fchat",[1034],[1037,5714,259],{}," class and ",[1030,5717,5720],{"href":5718,"rel":5719},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Freference\u002Fai-sdk-ui\u002Fdefault-chat-transport",[1034],[1037,5721,5722],{},"DefaultChatTransport"," for real-time streaming.",[1278,5725,5726],{},[1696,5727,5728],{},[1078,5729,5733],{"className":1550,"code":5730,"filename":5731,"highlights":5732,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nimport { DefaultChatTransport, isReasoningUIPart, isTextUIPart } from 'ai'\nimport { Chat } from '@ai-sdk\u002Fvue'\nimport { isPartStreaming } 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=\"isPartStreaming(part)\"\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              \u003Ctemplate v-else-if=\"isTextUIPart(part)\">\n                \u003CMDC\n                  v-if=\"message.role === 'assistant'\"\n                  :value=\"part.text\"\n                  :cache-key=\"`${message.id}-${index}`\"\n                  class=\"*:first:mt-0 *:last:mb-0\"\n                \u002F>\n                \u003Cp v-else-if=\"message.role === 'user'\" class=\"whitespace-pre-wrap\">\n                  {{ part.text }}\n                \u003C\u002Fp>\n              \u003C\u002Ftemplate>\n            \u003C\u002Ftemplate>\n          \u003C\u002Ftemplate>\n        \u003C\u002FUChatMessages>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :error=\"chat.error\"\n          variant=\"subtle\"\n          class=\"sticky bottom-0\"\n          @submit=\"handleSubmit\"\n        >\n          \u003CUChatPromptSubmit\n            :status=\"chat.status\"\n            color=\"neutral\"\n            @stop=\"chat.stop()\"\n            @reload=\"chat.regenerate()\"\n          \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n","app\u002Fpages\u002Fchat\u002F[id].vue",[1107,1321,1336,1486,2275,2288,2318,2324,2329,2361,2377,2395,2411,2419,3414,3427,3432,3438,3469,3513,3520,3525,3543],[1037,5734,5735,5755,5785,5806,5827,5831,5845,5859,5863,5868,5916,5920,5939,5981,5985,5989,6005,6009,6014,6032,6052,6071,6087,6114,6123,6138,6144,6171,6187,6192,6197,6212,6227,6243,6260,6274,6281,6286,6293,6297,6319,6331,6351,6379,6393,6397,6401,6405,6410,6423,6451,6462,6466,6472,6480,6484,6492,6510,6522,6541,6548,6562,6575,6580,6594,6598,6623,6701,6709,6723,6737,6751,6756,6764,6777,6791,6805,6810,6820,6824,6847,6853,6867,6879,6892,6904,6908,6938,6943,6952,6960,6969,6978,6986,6990,6996,7008,7022,7034,7047,7060,7064,7071,7084,7097,7111,7125,7130,7138,7146,7154,7162],{"__ignoreMap":1083},[1087,5736,5737,5739,5741,5743,5745,5747,5749,5751,5753],{"class":1089,"line":1090},[1087,5738,1560],{"class":1305},[1087,5740,5112],{"class":1311},[1087,5742,5115],{"class":1588},[1087,5744,5118],{"class":1588},[1087,5746,1592],{"class":1305},[1087,5748,1519],{"class":1305},[1087,5750,1284],{"class":1097},[1087,5752,1519],{"class":1305},[1087,5754,1566],{"class":1305},[1087,5756,5758,5760,5762,5765,5767,5770,5772,5775,5777,5779,5781,5783],{"class":5757,"line":1107},[1089,1570],[1087,5759,1708],{"class":1291},[1087,5761,1711],{"class":1305},[1087,5763,5764],{"class":1301}," DefaultChatTransport",[1087,5766,1717],{"class":1305},[1087,5768,5769],{"class":1301}," isReasoningUIPart",[1087,5771,1717],{"class":1305},[1087,5773,5774],{"class":1301}," isTextUIPart",[1087,5776,1733],{"class":1305},[1087,5778,1736],{"class":1291},[1087,5780,1392],{"class":1305},[1087,5782,2534],{"class":1097},[1087,5784,1356],{"class":1305},[1087,5786,5788,5790,5792,5795,5797,5799,5801,5804],{"class":5787,"line":1321},[1089,1570],[1087,5789,1708],{"class":1291},[1087,5791,1711],{"class":1305},[1087,5793,5794],{"class":1301}," Chat",[1087,5796,1733],{"class":1305},[1087,5798,1736],{"class":1291},[1087,5800,1392],{"class":1305},[1087,5802,5803],{"class":1097},"@ai-sdk\u002Fvue",[1087,5805,1356],{"class":1305},[1087,5807,5809,5811,5813,5816,5818,5820,5822,5825],{"class":5808,"line":1336},[1089,1570],[1087,5810,1708],{"class":1291},[1087,5812,1711],{"class":1305},[1087,5814,5815],{"class":1301}," isPartStreaming",[1087,5817,1733],{"class":1305},[1087,5819,1736],{"class":1291},[1087,5821,1392],{"class":1305},[1087,5823,5824],{"class":1097},"@nuxt\u002Fui\u002Futils\u002Fai",[1087,5826,1356],{"class":1305},[1087,5828,5829],{"class":1089,"line":1348},[1087,5830,1370],{"emptyLinePlaceholder":21},[1087,5832,5833,5835,5838,5840,5843],{"class":1089,"line":1359},[1087,5834,3061],{"class":1588},[1087,5836,5837],{"class":1301}," route ",[1087,5839,1592],{"class":1305},[1087,5841,5842],{"class":1110}," useRoute",[1087,5844,2669],{"class":1301},[1087,5846,5847,5849,5852,5854,5857],{"class":1089,"line":1367},[1087,5848,3061],{"class":1588},[1087,5850,5851],{"class":1301}," toast ",[1087,5853,1592],{"class":1305},[1087,5855,5856],{"class":1110}," useToast",[1087,5858,2669],{"class":1301},[1087,5860,5861],{"class":1089,"line":1373},[1087,5862,1370],{"emptyLinePlaceholder":21},[1087,5864,5865],{"class":1089,"line":1384},[1087,5866,5867],{"class":1471},"\u002F\u002F Fetch existing chat data\n",[1087,5869,5870,5872,5874,5877,5879,5882,5884,5886,5888,5891,5893,5895,5898,5900,5903,5905,5908,5910,5912,5914],{"class":1089,"line":1400},[1087,5871,3061],{"class":1588},[1087,5873,1711],{"class":1305},[1087,5875,5876],{"class":1311}," data",[1087,5878,1315],{"class":1305},[1087,5880,5881],{"class":1301}," chatData ",[1087,5883,1489],{"class":1305},[1087,5885,2623],{"class":1305},[1087,5887,2626],{"class":1291},[1087,5889,5890],{"class":1110}," useFetch",[1087,5892,1302],{"class":1301},[1087,5894,3677],{"class":1305},[1087,5896,5897],{"class":1097},"\u002Fapi\u002Fchats\u002F",[1087,5899,5384],{"class":1305},[1087,5901,5902],{"class":1301},"route",[1087,5904,1809],{"class":1305},[1087,5906,5907],{"class":1301},"params",[1087,5909,1809],{"class":1305},[1087,5911,2018],{"class":1301},[1087,5913,5393],{"class":1305},[1087,5915,1492],{"class":1301},[1087,5917,5918],{"class":1089,"line":1406},[1087,5919,1370],{"emptyLinePlaceholder":21},[1087,5921,5922,5925,5927,5929,5932,5934,5937],{"class":1089,"line":1411},[1087,5923,5924],{"class":1291},"if",[1087,5926,1952],{"class":1301},[1087,5928,3533],{"class":1305},[1087,5930,5931],{"class":1301},"chatData",[1087,5933,1809],{"class":1305},[1087,5935,5936],{"class":1301},"value) ",[1087,5938,1306],{"class":1305},[1087,5940,5941,5944,5946,5948,5950,5952,5954,5956,5958,5960,5962,5964,5966,5968,5970,5973,5975,5977,5979],{"class":1089,"line":1434},[1087,5942,5943],{"class":1291},"  throw",[1087,5945,2899],{"class":1110},[1087,5947,1302],{"class":1311},[1087,5949,1866],{"class":1305},[1087,5951,3555],{"class":1311},[1087,5953,1315],{"class":1305},[1087,5955,3561],{"class":3560},[1087,5957,1717],{"class":1305},[1087,5959,3566],{"class":1311},[1087,5961,1315],{"class":1305},[1087,5963,1392],{"class":1305},[1087,5965,3573],{"class":1097},[1087,5967,1330],{"class":1305},[1087,5969,1717],{"class":1305},[1087,5971,5972],{"class":1311}," fatal",[1087,5974,1315],{"class":1305},[1087,5976,4169],{"class":1467},[1087,5978,1733],{"class":1305},[1087,5980,1492],{"class":1311},[1087,5982,5983],{"class":1089,"line":1439},[1087,5984,5400],{"class":1305},[1087,5986,5987],{"class":1089,"line":1449},[1087,5988,1370],{"emptyLinePlaceholder":21},[1087,5990,5991,5993,5995,5997,5999,6001,6003],{"class":1089,"line":1459},[1087,5992,3061],{"class":1588},[1087,5994,5135],{"class":1301},[1087,5996,1592],{"class":1305},[1087,5998,5140],{"class":1110},[1087,6000,1302],{"class":1301},[1087,6002,5145],{"class":1305},[1087,6004,1492],{"class":1301},[1087,6006,6007],{"class":1089,"line":1475},[1087,6008,1370],{"emptyLinePlaceholder":21},[1087,6010,6011],{"class":1089,"line":1481},[1087,6012,6013],{"class":1471},"\u002F\u002F Initialize the Chat class from AI SDK\n",[1087,6015,6017,6019,6022,6024,6026,6028,6030],{"class":6016,"line":1486},[1089,1570],[1087,6018,3061],{"class":1588},[1087,6020,6021],{"class":1301}," chat ",[1087,6023,1592],{"class":1305},[1087,6025,1903],{"class":1305},[1087,6027,5794],{"class":1110},[1087,6029,1302],{"class":1301},[1087,6031,1306],{"class":1305},[1087,6033,6035,6037,6039,6042,6044,6046,6048,6050],{"class":6034,"line":2275},[1089,1570],[1087,6036,1799],{"class":1311},[1087,6038,1315],{"class":1305},[1087,6040,6041],{"class":1301}," chatData",[1087,6043,1809],{"class":1305},[1087,6045,3322],{"class":1301},[1087,6047,1809],{"class":1305},[1087,6049,2018],{"class":1301},[1087,6051,1333],{"class":1305},[1087,6053,6055,6057,6059,6061,6063,6065,6067,6069],{"class":6054,"line":2288},[1089,1570],[1087,6056,1959],{"class":1311},[1087,6058,1315],{"class":1305},[1087,6060,6041],{"class":1301},[1087,6062,1809],{"class":1305},[1087,6064,3322],{"class":1301},[1087,6066,1809],{"class":1305},[1087,6068,1997],{"class":1301},[1087,6070,1333],{"class":1305},[1087,6072,6074,6077,6079,6081,6083,6085],{"class":6073,"line":2318},[1089,1570],[1087,6075,6076],{"class":1311},"  transport",[1087,6078,1315],{"class":1305},[1087,6080,1903],{"class":1305},[1087,6082,5764],{"class":1110},[1087,6084,1302],{"class":1301},[1087,6086,1306],{"class":1305},[1087,6088,6090,6093,6095,6097,6099,6101,6103,6105,6107,6109,6111],{"class":6089,"line":2324},[1089,1570],[1087,6091,6092],{"class":1311},"    api",[1087,6094,1315],{"class":1305},[1087,6096,3671],{"class":1305},[1087,6098,5897],{"class":1097},[1087,6100,5384],{"class":1305},[1087,6102,5931],{"class":1301},[1087,6104,1809],{"class":1305},[1087,6106,3322],{"class":1301},[1087,6108,1809],{"class":1305},[1087,6110,2018],{"class":1301},[1087,6112,6113],{"class":1305},"}`\n",[1087,6115,6117,6119,6121],{"class":6116,"line":2329},[1089,1570],[1087,6118,2414],{"class":1305},[1087,6120,1883],{"class":1301},[1087,6122,1333],{"class":1305},[1087,6124,6126,6129,6131,6134,6136],{"class":6125,"line":2361},[1089,1570],[1087,6127,6128],{"class":1311},"  onData",[1087,6130,1302],{"class":1305},[1087,6132,6133],{"class":1943},"dataPart",[1087,6135,1883],{"class":1305},[1087,6137,1381],{"class":1305},[1087,6139,6141],{"class":6140,"line":2377},[1089,1570],[1087,6142,6143],{"class":1471},"    \u002F\u002F Refresh the chat list when a title is generated\n",[1087,6145,6147,6150,6152,6154,6156,6159,6161,6163,6165,6167,6169],{"class":6146,"line":2395},[1089,1570],[1087,6148,6149],{"class":1291},"    if",[1087,6151,1952],{"class":1311},[1087,6153,6133],{"class":1301},[1087,6155,1809],{"class":1305},[1087,6157,6158],{"class":1301},"type",[1087,6160,3349],{"class":1305},[1087,6162,1392],{"class":1305},[1087,6164,4316],{"class":1097},[1087,6166,1330],{"class":1305},[1087,6168,3538],{"class":1311},[1087,6170,1306],{"class":1305},[1087,6172,6174,6177,6179,6181,6183,6185],{"class":6173,"line":2411},[1089,1570],[1087,6175,6176],{"class":1110},"      refreshNuxtData",[1087,6178,1302],{"class":1311},[1087,6180,1330],{"class":1305},[1087,6182,1788],{"class":1097},[1087,6184,1330],{"class":1305},[1087,6186,1492],{"class":1311},[1087,6188,6190],{"class":6189,"line":2419},[1089,1570],[1087,6191,1478],{"class":1305},[1087,6193,6195],{"class":6194,"line":3414},[1089,1570],[1087,6196,1403],{"class":1305},[1087,6198,6200,6203,6205,6208,6210],{"class":6199,"line":3427},[1089,1570],[1087,6201,6202],{"class":1311},"  onError",[1087,6204,1302],{"class":1305},[1087,6206,6207],{"class":1943},"error",[1087,6209,1883],{"class":1305},[1087,6211,1381],{"class":1305},[1087,6213,6215,6218,6220,6223,6225],{"class":6214,"line":3432},[1089,1570],[1087,6216,6217],{"class":1301},"    toast",[1087,6219,1809],{"class":1305},[1087,6221,6222],{"class":1110},"add",[1087,6224,1302],{"class":1311},[1087,6226,1306],{"class":1305},[1087,6228,6230,6233,6235,6237,6239,6241],{"class":6229,"line":3438},[1089,1570],[1087,6231,6232],{"class":1311},"      title",[1087,6234,1315],{"class":1305},[1087,6236,1392],{"class":1305},[1087,6238,497],{"class":1097},[1087,6240,1330],{"class":1305},[1087,6242,1333],{"class":1305},[1087,6244,6246,6249,6251,6254,6256,6258],{"class":6245,"line":3469},[1089,1570],[1087,6247,6248],{"class":1311},"      description",[1087,6250,1315],{"class":1305},[1087,6252,6253],{"class":1301}," error",[1087,6255,1809],{"class":1305},[1087,6257,4468],{"class":1301},[1087,6259,1333],{"class":1305},[1087,6261,6263,6266,6268,6270,6272],{"class":6262,"line":3513},[1089,1570],[1087,6264,6265],{"class":1311},"      color",[1087,6267,1315],{"class":1305},[1087,6269,1392],{"class":1305},[1087,6271,6207],{"class":1097},[1087,6273,1356],{"class":1305},[1087,6275,6277,6279],{"class":6276,"line":3520},[1089,1570],[1087,6278,3376],{"class":1305},[1087,6280,1492],{"class":1311},[1087,6282,6284],{"class":6283,"line":3525},[1089,1570],[1087,6285,3585],{"class":1305},[1087,6287,6289,6291],{"class":6288,"line":3543},[1089,1570],[1087,6290,1489],{"class":1305},[1087,6292,1492],{"class":1301},[1087,6294,6295],{"class":1089,"line":3582},[1087,6296,1370],{"emptyLinePlaceholder":21},[1087,6298,6299,6302,6305,6307,6310,6312,6315,6317],{"class":1089,"line":3588},[1087,6300,6301],{"class":1588},"function",[1087,6303,6304],{"class":1110}," handleSubmit",[1087,6306,1302],{"class":1305},[1087,6308,6309],{"class":1943},"e",[1087,6311,1315],{"class":1305},[1087,6313,6314],{"class":1093}," Event",[1087,6316,1883],{"class":1305},[1087,6318,1381],{"class":1305},[1087,6320,6321,6324,6326,6329],{"class":1089,"line":3593},[1087,6322,6323],{"class":1301},"  e",[1087,6325,1809],{"class":1305},[1087,6327,6328],{"class":1110},"preventDefault",[1087,6330,2669],{"class":1311},[1087,6332,6333,6335,6337,6339,6341,6343,6345,6347,6349],{"class":1089,"line":3599},[1087,6334,3528],{"class":1291},[1087,6336,1952],{"class":1311},[1087,6338,5194],{"class":1301},[1087,6340,1809],{"class":1305},[1087,6342,3322],{"class":1301},[1087,6344,1809],{"class":1305},[1087,6346,5203],{"class":1110},[1087,6348,5206],{"class":1311},[1087,6350,1306],{"class":1305},[1087,6352,6353,6356,6358,6361,6363,6365,6367,6369,6371,6373,6375,6377],{"class":1089,"line":3619},[1087,6354,6355],{"class":1301},"    chat",[1087,6357,1809],{"class":1305},[1087,6359,6360],{"class":1110},"sendMessage",[1087,6362,1302],{"class":1311},[1087,6364,1866],{"class":1305},[1087,6366,1720],{"class":1311},[1087,6368,1315],{"class":1305},[1087,6370,5338],{"class":1301},[1087,6372,1809],{"class":1305},[1087,6374,3322],{"class":1301},[1087,6376,1733],{"class":1305},[1087,6378,1492],{"class":1311},[1087,6380,6381,6384,6386,6388,6390],{"class":1089,"line":3647},[1087,6382,6383],{"class":1301},"    input",[1087,6385,1809],{"class":1305},[1087,6387,3322],{"class":1301},[1087,6389,2623],{"class":1305},[1087,6391,6392],{"class":1305}," ''\n",[1087,6394,6395],{"class":1089,"line":3663},[1087,6396,3585],{"class":1305},[1087,6398,6399],{"class":1089,"line":3682},[1087,6400,5400],{"class":1305},[1087,6402,6403],{"class":1089,"line":3710},[1087,6404,1370],{"emptyLinePlaceholder":21},[1087,6406,6407],{"class":1089,"line":3717},[1087,6408,6409],{"class":1471},"\u002F\u002F Auto-generate response for first message\n",[1087,6411,6412,6415,6417,6419,6421],{"class":1089,"line":3722},[1087,6413,6414],{"class":1110},"onMounted",[1087,6416,1302],{"class":1301},[1087,6418,1806],{"class":1305},[1087,6420,1826],{"class":1588},[1087,6422,1381],{"class":1305},[1087,6424,6425,6427,6429,6431,6433,6435,6437,6439,6441,6443,6445,6447,6449],{"class":1089,"line":3788},[1087,6426,3528],{"class":1291},[1087,6428,1952],{"class":1311},[1087,6430,5931],{"class":1301},[1087,6432,1809],{"class":1305},[1087,6434,3322],{"class":1301},[1087,6436,3843],{"class":1305},[1087,6438,1997],{"class":1301},[1087,6440,1809],{"class":1305},[1087,6442,3822],{"class":1301},[1087,6444,3349],{"class":1305},[1087,6446,3828],{"class":3560},[1087,6448,3538],{"class":1311},[1087,6450,1306],{"class":1305},[1087,6452,6453,6455,6457,6460],{"class":1089,"line":3793},[1087,6454,6355],{"class":1301},[1087,6456,1809],{"class":1305},[1087,6458,6459],{"class":1110},"regenerate",[1087,6461,2669],{"class":1311},[1087,6463,6464],{"class":1089,"line":3798},[1087,6465,3585],{"class":1305},[1087,6467,6468,6470],{"class":1089,"line":3804},[1087,6469,1489],{"class":1305},[1087,6471,1492],{"class":1301},[1087,6473,6474,6476,6478],{"class":1089,"line":3833},[1087,6475,1636],{"class":1305},[1087,6477,5112],{"class":1311},[1087,6479,1566],{"class":1305},[1087,6481,6482],{"class":1089,"line":3874},[1087,6483,1370],{"emptyLinePlaceholder":21},[1087,6485,6486,6488,6490],{"class":1089,"line":3903},[1087,6487,1560],{"class":1305},[1087,6489,1563],{"class":1311},[1087,6491,1566],{"class":1305},[1087,6493,6494,6496,6498,6500,6502,6504,6506,6508],{"class":1089,"line":3915},[1087,6495,1573],{"class":1305},[1087,6497,5427],{"class":1311},[1087,6499,5430],{"class":1588},[1087,6501,1592],{"class":1305},[1087,6503,1519],{"class":1305},[1087,6505,5437],{"class":1097},[1087,6507,1519],{"class":1305},[1087,6509,1566],{"class":1305},[1087,6511,6512,6514,6516,6518,6520],{"class":1089,"line":3931},[1087,6513,1582],{"class":1305},[1087,6515,1563],{"class":1311},[1087,6517,5450],{"class":1305},[1087,6519,5453],{"class":1588},[1087,6521,1566],{"class":1305},[1087,6523,6524,6526,6528,6530,6532,6534,6537,6539],{"class":1089,"line":3945},[1087,6525,1606],{"class":1305},[1087,6527,5462],{"class":1311},[1087,6529,5465],{"class":1588},[1087,6531,1592],{"class":1305},[1087,6533,1519],{"class":1305},[1087,6535,6536],{"class":1097},"min-h-dvh flex flex-col py-4 sm:py-6",[1087,6538,1519],{"class":1305},[1087,6540,1566],{"class":1305},[1087,6542,6543,6545],{"class":1089,"line":3952},[1087,6544,5481],{"class":1305},[1087,6546,6547],{"class":1311},"UChatMessages\n",[1087,6549,6550,6553,6555,6557,6560],{"class":1089,"line":3957},[1087,6551,6552],{"class":1588},"          :messages",[1087,6554,1592],{"class":1305},[1087,6556,1519],{"class":1305},[1087,6558,6559],{"class":1097},"chat.messages",[1087,6561,5538],{"class":1305},[1087,6563,6564,6566,6568,6570,6573],{"class":1089,"line":3962},[1087,6565,5544],{"class":1588},[1087,6567,1592],{"class":1305},[1087,6569,1519],{"class":1305},[1087,6571,6572],{"class":1097},"chat.status",[1087,6574,5538],{"class":1305},[1087,6576,6577],{"class":1089,"line":3968},[1087,6578,6579],{"class":1588},"          should-auto-scroll\n",[1087,6581,6582,6585,6587,6589,6592],{"class":1089,"line":3985},[1087,6583,6584],{"class":1588},"          class",[1087,6586,1592],{"class":1305},[1087,6588,1519],{"class":1305},[1087,6590,6591],{"class":1097},"flex-1",[1087,6593,5538],{"class":1305},[1087,6595,6596],{"class":1089,"line":4007},[1087,6597,5604],{"class":1305},[1087,6599,6600,6602,6604,6606,6608,6610,6612,6614,6617,6619,6621],{"class":1089,"line":4025},[1087,6601,5610],{"class":1305},[1087,6603,1563],{"class":1311},[1087,6605,5450],{"class":1305},[1087,6607,371],{"class":1588},[1087,6609,1592],{"class":1305},[1087,6611,1519],{"class":1305},[1087,6613,1866],{"class":1305},[1087,6615,6616],{"class":1301}," message ",[1087,6618,1489],{"class":1305},[1087,6620,1519],{"class":1305},[1087,6622,1566],{"class":1305},[1087,6624,6625,6628,6630,6633,6635,6637,6640,6642,6645,6648,6650,6652,6654,6656,6659,6662,6664,6667,6669,6671,6673,6675,6678,6680,6683,6685,6687,6689,6691,6693,6696,6699],{"class":1089,"line":4033},[1087,6626,6627],{"class":1305},"            \u003C",[1087,6629,1563],{"class":1311},[1087,6631,6632],{"class":1291}," v-for",[1087,6634,1592],{"class":1305},[1087,6636,1519],{"class":1305},[1087,6638,6639],{"class":1301},"(part",[1087,6641,1717],{"class":1305},[1087,6643,6644],{"class":1301}," index) ",[1087,6646,6647],{"class":1305},"in",[1087,6649,2618],{"class":1301},[1087,6651,1809],{"class":1305},[1087,6653,2199],{"class":1301},[1087,6655,1519],{"class":1305},[1087,6657,6658],{"class":1305}," :",[1087,6660,6661],{"class":1588},"key",[1087,6663,1592],{"class":1305},[1087,6665,6666],{"class":1305},"\"`${",[1087,6668,4468],{"class":1301},[1087,6670,1809],{"class":1305},[1087,6672,2018],{"class":1301},[1087,6674,1489],{"class":1305},[1087,6676,6677],{"class":1097},"-",[1087,6679,5384],{"class":1305},[1087,6681,6682],{"class":1301},"part",[1087,6684,1809],{"class":1305},[1087,6686,6158],{"class":1301},[1087,6688,1489],{"class":1305},[1087,6690,6677],{"class":1097},[1087,6692,5384],{"class":1305},[1087,6694,6695],{"class":1301},"index",[1087,6697,6698],{"class":1305},"}`\"",[1087,6700,1566],{"class":1305},[1087,6702,6703,6706],{"class":1089,"line":4050},[1087,6704,6705],{"class":1305},"              \u003C",[1087,6707,6708],{"class":1311},"UChatReasoning\n",[1087,6710,6711,6714,6716,6718,6721],{"class":1089,"line":4071},[1087,6712,6713],{"class":1588},"                v-if",[1087,6715,1592],{"class":1305},[1087,6717,1519],{"class":1305},[1087,6719,6720],{"class":1097},"isReasoningUIPart(part)",[1087,6722,5538],{"class":1305},[1087,6724,6725,6728,6730,6732,6735],{"class":1089,"line":4081},[1087,6726,6727],{"class":1588},"                :text",[1087,6729,1592],{"class":1305},[1087,6731,1519],{"class":1305},[1087,6733,6734],{"class":1097},"part.text",[1087,6736,5538],{"class":1305},[1087,6738,6739,6742,6744,6746,6749],{"class":1089,"line":4091},[1087,6740,6741],{"class":1588},"                :streaming",[1087,6743,1592],{"class":1305},[1087,6745,1519],{"class":1305},[1087,6747,6748],{"class":1097},"isPartStreaming(part)",[1087,6750,5538],{"class":1305},[1087,6752,6753],{"class":1089,"line":4101},[1087,6754,6755],{"class":1305},"              >\n",[1087,6757,6758,6761],{"class":1089,"line":4118},[1087,6759,6760],{"class":1305},"                \u003C",[1087,6762,6763],{"class":1311},"MDC\n",[1087,6765,6766,6769,6771,6773,6775],{"class":1089,"line":4129},[1087,6767,6768],{"class":1588},"                  :value",[1087,6770,1592],{"class":1305},[1087,6772,1519],{"class":1305},[1087,6774,6734],{"class":1097},[1087,6776,5538],{"class":1305},[1087,6778,6779,6782,6784,6786,6789],{"class":1089,"line":4135},[1087,6780,6781],{"class":1588},"                  :cache-key",[1087,6783,1592],{"class":1305},[1087,6785,1519],{"class":1305},[1087,6787,6788],{"class":1097},"`reasoning-${message.id}-${index}`",[1087,6790,5538],{"class":1305},[1087,6792,6793,6796,6798,6800,6803],{"class":1089,"line":4141},[1087,6794,6795],{"class":1588},"                  class",[1087,6797,1592],{"class":1305},[1087,6799,1519],{"class":1305},[1087,6801,6802],{"class":1097},"*:first:mt-0 *:last:mb-0",[1087,6804,5538],{"class":1305},[1087,6806,6807],{"class":1089,"line":4151},[1087,6808,6809],{"class":1305},"                \u002F>\n",[1087,6811,6812,6815,6818],{"class":1089,"line":4161},[1087,6813,6814],{"class":1305},"              \u003C\u002F",[1087,6816,6817],{"class":1311},"UChatReasoning",[1087,6819,1566],{"class":1305},[1087,6821,6822],{"class":1089,"line":4174},[1087,6823,1370],{"emptyLinePlaceholder":21},[1087,6825,6826,6828,6830,6833,6835,6837,6840,6843,6845],{"class":1089,"line":4189},[1087,6827,6705],{"class":1305},[1087,6829,1563],{"class":1311},[1087,6831,6832],{"class":1291}," v-else-if",[1087,6834,1592],{"class":1305},[1087,6836,1519],{"class":1305},[1087,6838,6839],{"class":1110},"isTextUIPart",[1087,6841,6842],{"class":1301},"(part)",[1087,6844,1519],{"class":1305},[1087,6846,1566],{"class":1305},[1087,6848,6849,6851],{"class":1089,"line":4194},[1087,6850,6760],{"class":1305},[1087,6852,6763],{"class":1311},[1087,6854,6855,6858,6860,6862,6865],{"class":1089,"line":4199},[1087,6856,6857],{"class":1588},"                  v-if",[1087,6859,1592],{"class":1305},[1087,6861,1519],{"class":1305},[1087,6863,6864],{"class":1097},"message.role === 'assistant'",[1087,6866,5538],{"class":1305},[1087,6868,6869,6871,6873,6875,6877],{"class":1089,"line":4209},[1087,6870,6768],{"class":1588},[1087,6872,1592],{"class":1305},[1087,6874,1519],{"class":1305},[1087,6876,6734],{"class":1097},[1087,6878,5538],{"class":1305},[1087,6880,6881,6883,6885,6887,6890],{"class":1089,"line":4225},[1087,6882,6781],{"class":1588},[1087,6884,1592],{"class":1305},[1087,6886,1519],{"class":1305},[1087,6888,6889],{"class":1097},"`${message.id}-${index}`",[1087,6891,5538],{"class":1305},[1087,6893,6894,6896,6898,6900,6902],{"class":1089,"line":4240},[1087,6895,6795],{"class":1588},[1087,6897,1592],{"class":1305},[1087,6899,1519],{"class":1305},[1087,6901,6802],{"class":1097},[1087,6903,5538],{"class":1305},[1087,6905,6906],{"class":1089,"line":4246},[1087,6907,6809],{"class":1305},[1087,6909,6910,6912,6914,6916,6918,6920,6923,6925,6927,6929,6931,6934,6936],{"class":1089,"line":4252},[1087,6911,6760],{"class":1305},[1087,6913,976],{"class":1311},[1087,6915,6832],{"class":1588},[1087,6917,1592],{"class":1305},[1087,6919,1519],{"class":1305},[1087,6921,6922],{"class":1097},"message.role === 'user'",[1087,6924,1519],{"class":1305},[1087,6926,5465],{"class":1588},[1087,6928,1592],{"class":1305},[1087,6930,1519],{"class":1305},[1087,6932,6933],{"class":1097},"whitespace-pre-wrap",[1087,6935,1519],{"class":1305},[1087,6937,1566],{"class":1305},[1087,6939,6940],{"class":1089,"line":4260},[1087,6941,6942],{"class":1301},"                  {{ part.text }}\n",[1087,6944,6945,6948,6950],{"class":1089,"line":4265},[1087,6946,6947],{"class":1305},"                \u003C\u002F",[1087,6949,976],{"class":1311},[1087,6951,1566],{"class":1305},[1087,6953,6954,6956,6958],{"class":1089,"line":4271},[1087,6955,6814],{"class":1305},[1087,6957,1563],{"class":1311},[1087,6959,1566],{"class":1305},[1087,6961,6962,6965,6967],{"class":1089,"line":4291},[1087,6963,6964],{"class":1305},"            \u003C\u002F",[1087,6966,1563],{"class":1311},[1087,6968,1566],{"class":1305},[1087,6970,6971,6974,6976],{"class":1089,"line":4306},[1087,6972,6973],{"class":1305},"          \u003C\u002F",[1087,6975,1563],{"class":1311},[1087,6977,1566],{"class":1305},[1087,6979,6980,6982,6984],{"class":1089,"line":4323},[1087,6981,5507],{"class":1305},[1087,6983,5083],{"class":1311},[1087,6985,1566],{"class":1305},[1087,6987,6988],{"class":1089,"line":4346},[1087,6989,1370],{"emptyLinePlaceholder":21},[1087,6991,6992,6994],{"class":1089,"line":4357},[1087,6993,5481],{"class":1305},[1087,6995,5523],{"class":1311},[1087,6997,6998,7000,7002,7004,7006],{"class":1089,"line":4365},[1087,6999,5529],{"class":1588},[1087,7001,1592],{"class":1305},[1087,7003,1519],{"class":1305},[1087,7005,5194],{"class":1097},[1087,7007,5538],{"class":1305},[1087,7009,7010,7013,7015,7017,7020],{"class":1089,"line":4371},[1087,7011,7012],{"class":1588},"          :error",[1087,7014,1592],{"class":1305},[1087,7016,1519],{"class":1305},[1087,7018,7019],{"class":1097},"chat.error",[1087,7021,5538],{"class":1305},[1087,7023,7024,7026,7028,7030,7032],{"class":1089,"line":4376},[1087,7025,5559],{"class":1588},[1087,7027,1592],{"class":1305},[1087,7029,1519],{"class":1305},[1087,7031,5566],{"class":1097},[1087,7033,5538],{"class":1305},[1087,7035,7036,7038,7040,7042,7045],{"class":1089,"line":4399},[1087,7037,6584],{"class":1588},[1087,7039,1592],{"class":1305},[1087,7041,1519],{"class":1305},[1087,7043,7044],{"class":1097},"sticky bottom-0",[1087,7046,5538],{"class":1305},[1087,7048,7049,7051,7053,7055,7058],{"class":1089,"line":4405},[1087,7050,5589],{"class":1588},[1087,7052,1592],{"class":1305},[1087,7054,1519],{"class":1305},[1087,7056,7057],{"class":1097},"handleSubmit",[1087,7059,5538],{"class":1305},[1087,7061,7062],{"class":1089,"line":4425},[1087,7063,5604],{"class":1305},[1087,7065,7066,7068],{"class":1089,"line":4431},[1087,7067,5610],{"class":1305},[1087,7069,7070],{"class":1311},"UChatPromptSubmit\n",[1087,7072,7073,7076,7078,7080,7082],{"class":1089,"line":4477},[1087,7074,7075],{"class":1588},"            :status",[1087,7077,1592],{"class":1305},[1087,7079,1519],{"class":1305},[1087,7081,6572],{"class":1097},[1087,7083,5538],{"class":1305},[1087,7085,7086,7089,7091,7093,7095],{"class":1089,"line":4493},[1087,7087,7088],{"class":1588},"            color",[1087,7090,1592],{"class":1305},[1087,7092,1519],{"class":1305},[1087,7094,5623],{"class":1097},[1087,7096,5538],{"class":1305},[1087,7098,7099,7102,7104,7106,7109],{"class":1089,"line":4526},[1087,7100,7101],{"class":1588},"            @stop",[1087,7103,1592],{"class":1305},[1087,7105,1519],{"class":1305},[1087,7107,7108],{"class":1097},"chat.stop()",[1087,7110,5538],{"class":1305},[1087,7112,7113,7116,7118,7120,7123],{"class":1089,"line":4540},[1087,7114,7115],{"class":1588},"            @reload",[1087,7117,1592],{"class":1305},[1087,7119,1519],{"class":1305},[1087,7121,7122],{"class":1097},"chat.regenerate()",[1087,7124,5538],{"class":1305},[1087,7126,7127],{"class":1089,"line":4548},[1087,7128,7129],{"class":1305},"          \u002F>\n",[1087,7131,7132,7134,7136],{"class":1089,"line":4553},[1087,7133,5507],{"class":1305},[1087,7135,5077],{"class":1311},[1087,7137,1566],{"class":1305},[1087,7139,7140,7142,7144],{"class":1089,"line":4560},[1087,7141,5641],{"class":1305},[1087,7143,5462],{"class":1311},[1087,7145,1566],{"class":1305},[1087,7147,7148,7150,7152],{"class":1089,"line":4565},[1087,7149,1617],{"class":1305},[1087,7151,1563],{"class":1311},[1087,7153,1566],{"class":1305},[1087,7155,7156,7158,7160],{"class":1089,"line":4583},[1087,7157,1627],{"class":1305},[1087,7159,5427],{"class":1311},[1087,7161,1566],{"class":1305},[1087,7163,7165,7167,7169],{"class":1089,"line":7164},112,[1087,7166,1636],{"class":1305},[1087,7168,1563],{"class":1311},[1087,7170,1566],{"class":1305},[976,7172,7173],{},"Here's a breakdown of the key parts:",[976,7175,7176],{},[994,7177,7178],{},"The Chat Class",[976,7180,4626,7181,7186,7187,7189],{},[1030,7182,7184],{"href":5711,"rel":7183},[1034],[1037,7185,259],{}," class from ",[1037,7188,5803],{}," manages the entire conversation state. It handles:",[988,7191,7192,7197,7212,7218,7223],{},[991,7193,7194,7195],{},"Message history with ",[1037,7196,6559],{},[991,7198,7199,7200,1952,7202,2864,7205,2864,7208,2864,7210,1883],{},"Connection status with ",[1037,7201,6572],{},[1037,7203,7204],{},"ready",[1037,7206,7207],{},"submitted",[1037,7209,5698],{},[1037,7211,6207],{},[991,7213,7214,7215],{},"Sending messages with ",[1037,7216,7217],{},"chat.sendMessage()",[991,7219,7220,7221],{},"Stopping generation with ",[1037,7222,7108],{},[991,7224,7225,7226],{},"Regenerating responses with ",[1037,7227,7122],{},[976,7229,4626,7230,7233,7234,7239,7240,7242],{},[1037,7231,7232],{},"onData"," callback receives ",[1030,7235,7238],{"href":7236,"rel":7237},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-ui\u002Fstreaming-data",[1034],"custom data events"," from the server (like ",[1037,7241,4316],{},"), allowing you to react to server-side events during streaming.",[976,7244,7245],{},[994,7246,7247],{},"UChatMessages Component",[976,7249,4626,7250,7254],{},[1030,7251,7252],{"href":271},[1037,7253,5083],{}," component is purpose-built for AI chatbots with:",[988,7256,7257,7260,7263,7266],{},[991,7258,7259],{},"Auto-scroll to bottom on load",[991,7261,7262],{},"Continuous scrolling as messages stream in",[991,7264,7265],{},"A loading indicator while the assistant processes",[991,7267,7268],{},"An \"Auto scroll\" button when scrolled up",[976,7270,7271],{},[994,7272,7273],{},"Rendering Markdown with MDC",[976,7275,7276,7277,7279,7280,1040,7282,7285,7286,7293,7294,7300,7301,7305,7306,7309,7310,7312],{},"AI models often respond with Markdown formatting (code blocks, lists, bold text, etc.). We iterate over message ",[1037,7278,2199],{}," using AI SDK helpers like ",[1037,7281,6839],{},[1037,7283,7284],{},"isReasoningUIPart",", rendering text with the ",[1030,7287,7290],{"href":7288,"rel":7289},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc#mdc",[1034],[1037,7291,7292],{},"MDC"," component from ",[1030,7295,7298],{"href":7296,"rel":7297},"https:\u002F\u002Fgithub.com\u002Fnuxt-content\u002Fmdc",[1034],[1037,7299,1341],{}," and reasoning with ",[1030,7302,7303],{"href":291},[1037,7304,6817],{},". The ",[1037,7307,7308],{},"isPartStreaming"," utility from ",[1037,7311,5824],{}," detects if a part is currently being streamed.",[1666,7314,7315],{"to":859},[976,7316,7317],{},"Nuxt UI provides pre-styled prose components, so your markdown content will be automatically styled to match your theme.",[976,7319,7320],{},[994,7321,7322],{},"UChatPromptSubmit Component",[976,7324,4626,7325,7329],{},[1030,7326,7327],{"href":286},[1037,7328,5613],{}," component adapts based on the chat status:",[988,7331,7332,7335,7338],{},[991,7333,7334],{},"Shows a send button when ready",[991,7336,7337],{},"Shows a stop button while streaming",[991,7339,7340],{},"Shows a reload button after an error",[980,7342,7344],{"id":7343},"adding-chat-history","Adding chat history",[976,7346,7347],{},"This section adds a dropdown menu to list previous chats and navigate between them.",[1115,7349,7351],{"id":7350},"listing-chats-api","Listing chats API",[976,7353,7354],{},"First, create an endpoint to fetch all chats:",[1278,7356,7357],{},[1078,7358,7361],{"className":1282,"code":7359,"filename":7360,"language":1284,"meta":1083,"style":1083},"import { defineEventHandler } from 'h3'\nimport { db, schema } from 'hub:db'\nimport { desc } from 'drizzle-orm'\n\nexport default defineEventHandler(async () => {\n  return await db.query.chats.findMany({\n    orderBy: () => desc(schema.chats.createdAt)\n  })\n})\n","server\u002Fapi\u002Fchats.get.ts",[1037,7362,7363,7381,7403,7422,7426,7444,7469,7496,7502],{"__ignoreMap":1083},[1087,7364,7365,7367,7369,7371,7373,7375,7377,7379],{"class":1089,"line":1090},[1087,7366,1708],{"class":1291},[1087,7368,1711],{"class":1305},[1087,7370,2498],{"class":1301},[1087,7372,1733],{"class":1305},[1087,7374,1736],{"class":1291},[1087,7376,1392],{"class":1305},[1087,7378,1115],{"class":1097},[1087,7380,1356],{"class":1305},[1087,7382,7383,7385,7387,7389,7391,7393,7395,7397,7399,7401],{"class":1089,"line":1107},[1087,7384,1708],{"class":1291},[1087,7386,1711],{"class":1305},[1087,7388,2441],{"class":1301},[1087,7390,1717],{"class":1305},[1087,7392,2549],{"class":1301},[1087,7394,1733],{"class":1305},[1087,7396,1736],{"class":1291},[1087,7398,1392],{"class":1305},[1087,7400,2558],{"class":1097},[1087,7402,1356],{"class":1305},[1087,7404,7405,7407,7409,7412,7414,7416,7418,7420],{"class":1089,"line":1321},[1087,7406,1708],{"class":1291},[1087,7408,1711],{"class":1305},[1087,7410,7411],{"class":1301}," desc",[1087,7413,1733],{"class":1305},[1087,7415,1736],{"class":1291},[1087,7417,1392],{"class":1305},[1087,7419,1761],{"class":1097},[1087,7421,1356],{"class":1305},[1087,7423,7424],{"class":1089,"line":1336},[1087,7425,1370],{"emptyLinePlaceholder":21},[1087,7427,7428,7430,7432,7434,7436,7438,7440,7442],{"class":1089,"line":1348},[1087,7429,1292],{"class":1291},[1087,7431,1295],{"class":1291},[1087,7433,2498],{"class":1110},[1087,7435,1302],{"class":1301},[1087,7437,2597],{"class":1588},[1087,7439,4962],{"class":1305},[1087,7441,1826],{"class":1588},[1087,7443,1381],{"class":1305},[1087,7445,7446,7448,7450,7452,7454,7456,7458,7460,7462,7465,7467],{"class":1089,"line":1359},[1087,7447,2840],{"class":1291},[1087,7449,2626],{"class":1291},[1087,7451,2441],{"class":1301},[1087,7453,1809],{"class":1305},[1087,7455,3453],{"class":1301},[1087,7457,1809],{"class":1305},[1087,7459,1788],{"class":1301},[1087,7461,1809],{"class":1305},[1087,7463,7464],{"class":1110},"findMany",[1087,7466,1302],{"class":1311},[1087,7468,1306],{"class":1305},[1087,7470,7471,7474,7476,7478,7480,7482,7484,7486,7488,7490,7492,7494],{"class":1089,"line":1367},[1087,7472,7473],{"class":1110},"    orderBy",[1087,7475,1315],{"class":1305},[1087,7477,4962],{"class":1305},[1087,7479,1826],{"class":1588},[1087,7481,7411],{"class":1110},[1087,7483,1302],{"class":1311},[1087,7485,2717],{"class":1301},[1087,7487,1809],{"class":1305},[1087,7489,1788],{"class":1301},[1087,7491,1809],{"class":1305},[1087,7493,4979],{"class":1301},[1087,7495,1492],{"class":1311},[1087,7497,7498,7500],{"class":1089,"line":1373},[1087,7499,2414],{"class":1305},[1087,7501,1492],{"class":1311},[1087,7503,7504,7506],{"class":1089,"line":1384},[1087,7505,1489],{"class":1305},[1087,7507,1492],{"class":1301},[1115,7509,7511],{"id":7510},"building-the-chats-history-dropdown","Building the chats history dropdown",[976,7513,7514,7515,7520,7521,7526,7527,7520,7534,7536],{},"The component uses ",[1030,7516,7517],{"href":457},[1037,7518,7519],{},"UDropdownMenu"," with a ",[1030,7522,7523],{"href":230},[1037,7524,7525],{},"UButton"," as trigger. Use ",[1030,7528,7531],{"href":7529,"rel":7530},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-fetch",[1034],[1037,7532,7533],{},"useFetch",[1037,7535,6661],{}," to fetch and cache the chat list:",[1278,7538,7539],{},[1078,7540,7543],{"className":1550,"code":7541,"filename":7542,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst route = useRoute()\n\nconst { data: chats } = await useFetch('\u002Fapi\u002Fchats', {\n  key: 'chats',\n  default: () => []\n})\n\nconst items = computed(() => [\n  {\n    label: 'New chat',\n    to: '\u002F',\n    icon: 'i-lucide-plus-square',\n    active: route.name === 'index'\n  },\n  ...chats.value.map(chat => ({\n    label: chat.title || 'Untitled',\n    to: `\u002Fchat\u002F${chat.id}`,\n    active: route.params.id === chat.id\n  }))\n])\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDropdownMenu :items=\"items\" class=\"m-2\">\n    \u003CUButton\n      icon=\"i-lucide-messages-square\"\n      variant=\"ghost\"\n      label=\"Chats History\"\n      color=\"neutral\"\n      class=\"w-fit\"\n    \u002F>\n  \u003C\u002FUDropdownMenu>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002FChatsHistory.vue",[1037,7544,7545,7565,7577,7581,7613,7628,7642,7648,7652,7672,7677,7693,7709,7725,7749,7753,7778,7803,7825,7851,7857,7861,7869,7873,7881,7912,7919,7933,7947,7961,7973,7987,7992,8000],{"__ignoreMap":1083},[1087,7546,7547,7549,7551,7553,7555,7557,7559,7561,7563],{"class":1089,"line":1090},[1087,7548,1560],{"class":1305},[1087,7550,5112],{"class":1311},[1087,7552,5115],{"class":1588},[1087,7554,5118],{"class":1588},[1087,7556,1592],{"class":1305},[1087,7558,1519],{"class":1305},[1087,7560,1284],{"class":1097},[1087,7562,1519],{"class":1305},[1087,7564,1566],{"class":1305},[1087,7566,7567,7569,7571,7573,7575],{"class":1089,"line":1107},[1087,7568,3061],{"class":1588},[1087,7570,5837],{"class":1301},[1087,7572,1592],{"class":1305},[1087,7574,5842],{"class":1110},[1087,7576,2669],{"class":1301},[1087,7578,7579],{"class":1089,"line":1321},[1087,7580,1370],{"emptyLinePlaceholder":21},[1087,7582,7583,7585,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605,7607,7609,7611],{"class":1089,"line":1336},[1087,7584,3061],{"class":1588},[1087,7586,1711],{"class":1305},[1087,7588,5876],{"class":1311},[1087,7590,1315],{"class":1305},[1087,7592,1777],{"class":1301},[1087,7594,1489],{"class":1305},[1087,7596,2623],{"class":1305},[1087,7598,2626],{"class":1291},[1087,7600,5890],{"class":1110},[1087,7602,1302],{"class":1301},[1087,7604,1330],{"class":1305},[1087,7606,5255],{"class":1097},[1087,7608,1330],{"class":1305},[1087,7610,1717],{"class":1305},[1087,7612,1381],{"class":1305},[1087,7614,7615,7618,7620,7622,7624,7626],{"class":1089,"line":1348},[1087,7616,7617],{"class":1311},"  key",[1087,7619,1315],{"class":1305},[1087,7621,1392],{"class":1305},[1087,7623,1788],{"class":1097},[1087,7625,1330],{"class":1305},[1087,7627,1333],{"class":1305},[1087,7629,7630,7633,7635,7637,7639],{"class":1089,"line":1359},[1087,7631,7632],{"class":1110},"  default",[1087,7634,1315],{"class":1305},[1087,7636,4962],{"class":1305},[1087,7638,1826],{"class":1588},[1087,7640,7641],{"class":1301}," []\n",[1087,7643,7644,7646],{"class":1089,"line":1367},[1087,7645,1489],{"class":1305},[1087,7647,1492],{"class":1301},[1087,7649,7650],{"class":1089,"line":1373},[1087,7651,1370],{"emptyLinePlaceholder":21},[1087,7653,7654,7656,7659,7661,7664,7666,7668,7670],{"class":1089,"line":1384},[1087,7655,3061],{"class":1588},[1087,7657,7658],{"class":1301}," items ",[1087,7660,1592],{"class":1305},[1087,7662,7663],{"class":1110}," computed",[1087,7665,1302],{"class":1301},[1087,7667,1806],{"class":1305},[1087,7669,1826],{"class":1588},[1087,7671,1318],{"class":1301},[1087,7673,7674],{"class":1089,"line":1400},[1087,7675,7676],{"class":1305},"  {\n",[1087,7678,7679,7682,7684,7686,7689,7691],{"class":1089,"line":1406},[1087,7680,7681],{"class":1311},"    label",[1087,7683,1315],{"class":1305},[1087,7685,1392],{"class":1305},[1087,7687,7688],{"class":1097},"New chat",[1087,7690,1330],{"class":1305},[1087,7692,1333],{"class":1305},[1087,7694,7695,7698,7700,7702,7705,7707],{"class":1089,"line":1411},[1087,7696,7697],{"class":1311},"    to",[1087,7699,1315],{"class":1305},[1087,7701,1392],{"class":1305},[1087,7703,7704],{"class":1097},"\u002F",[1087,7706,1330],{"class":1305},[1087,7708,1333],{"class":1305},[1087,7710,7711,7714,7716,7718,7721,7723],{"class":1089,"line":1434},[1087,7712,7713],{"class":1311},"    icon",[1087,7715,1315],{"class":1305},[1087,7717,1392],{"class":1305},[1087,7719,7720],{"class":1097},"i-lucide-plus-square",[1087,7722,1330],{"class":1305},[1087,7724,1333],{"class":1305},[1087,7726,7727,7730,7732,7735,7737,7740,7743,7745,7747],{"class":1089,"line":1439},[1087,7728,7729],{"class":1311},"    active",[1087,7731,1315],{"class":1305},[1087,7733,7734],{"class":1301}," route",[1087,7736,1809],{"class":1305},[1087,7738,7739],{"class":1301},"name ",[1087,7741,7742],{"class":1305},"===",[1087,7744,1392],{"class":1305},[1087,7746,6695],{"class":1097},[1087,7748,1356],{"class":1305},[1087,7750,7751],{"class":1089,"line":1449},[1087,7752,1403],{"class":1305},[1087,7754,7755,7758,7760,7762,7764,7766,7768,7770,7772,7774,7776],{"class":1089,"line":1459},[1087,7756,7757],{"class":1305},"  ...",[1087,7759,1788],{"class":1301},[1087,7761,1809],{"class":1305},[1087,7763,3322],{"class":1301},[1087,7765,1809],{"class":1305},[1087,7767,4463],{"class":1110},[1087,7769,1302],{"class":1301},[1087,7771,262],{"class":1943},[1087,7773,1826],{"class":1588},[1087,7775,1952],{"class":1301},[1087,7777,1306],{"class":1305},[1087,7779,7780,7782,7784,7786,7788,7791,7794,7796,7799,7801],{"class":1089,"line":1475},[1087,7781,7681],{"class":1311},[1087,7783,1315],{"class":1305},[1087,7785,2790],{"class":1301},[1087,7787,1809],{"class":1305},[1087,7789,7790],{"class":1301},"title ",[1087,7792,7793],{"class":1305},"||",[1087,7795,1392],{"class":1305},[1087,7797,7798],{"class":1097},"Untitled",[1087,7800,1330],{"class":1305},[1087,7802,1333],{"class":1305},[1087,7804,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823],{"class":1089,"line":1481},[1087,7806,7697],{"class":1311},[1087,7808,1315],{"class":1305},[1087,7810,3671],{"class":1305},[1087,7812,5381],{"class":1097},[1087,7814,5384],{"class":1305},[1087,7816,262],{"class":1301},[1087,7818,1809],{"class":1305},[1087,7820,2018],{"class":1301},[1087,7822,5393],{"class":1305},[1087,7824,1333],{"class":1305},[1087,7826,7827,7829,7831,7833,7835,7837,7839,7842,7844,7846,7848],{"class":1089,"line":1486},[1087,7828,7729],{"class":1311},[1087,7830,1315],{"class":1305},[1087,7832,7734],{"class":1301},[1087,7834,1809],{"class":1305},[1087,7836,5907],{"class":1301},[1087,7838,1809],{"class":1305},[1087,7840,7841],{"class":1301},"id ",[1087,7843,7742],{"class":1305},[1087,7845,2790],{"class":1301},[1087,7847,1809],{"class":1305},[1087,7849,7850],{"class":1301},"id\n",[1087,7852,7853,7855],{"class":1089,"line":2275},[1087,7854,2414],{"class":1305},[1087,7856,1973],{"class":1301},[1087,7858,7859],{"class":1089,"line":2288},[1087,7860,2321],{"class":1301},[1087,7862,7863,7865,7867],{"class":1089,"line":2318},[1087,7864,1636],{"class":1305},[1087,7866,5112],{"class":1311},[1087,7868,1566],{"class":1305},[1087,7870,7871],{"class":1089,"line":2324},[1087,7872,1370],{"emptyLinePlaceholder":21},[1087,7874,7875,7877,7879],{"class":1089,"line":2329},[1087,7876,1560],{"class":1305},[1087,7878,1563],{"class":1311},[1087,7880,1566],{"class":1305},[1087,7882,7883,7885,7887,7890,7892,7894,7897,7899,7901,7903,7905,7908,7910],{"class":1089,"line":2361},[1087,7884,1573],{"class":1305},[1087,7886,7519],{"class":1311},[1087,7888,7889],{"class":1588}," :items",[1087,7891,1592],{"class":1305},[1087,7893,1519],{"class":1305},[1087,7895,7896],{"class":1097},"items",[1087,7898,1519],{"class":1305},[1087,7900,5465],{"class":1588},[1087,7902,1592],{"class":1305},[1087,7904,1519],{"class":1305},[1087,7906,7907],{"class":1097},"m-2",[1087,7909,1519],{"class":1305},[1087,7911,1566],{"class":1305},[1087,7913,7914,7916],{"class":1089,"line":2377},[1087,7915,1582],{"class":1305},[1087,7917,7918],{"class":1311},"UButton\n",[1087,7920,7921,7924,7926,7928,7931],{"class":1089,"line":2395},[1087,7922,7923],{"class":1588},"      icon",[1087,7925,1592],{"class":1305},[1087,7927,1519],{"class":1305},[1087,7929,7930],{"class":1097},"i-lucide-messages-square",[1087,7932,5538],{"class":1305},[1087,7934,7935,7938,7940,7942,7945],{"class":1089,"line":2411},[1087,7936,7937],{"class":1588},"      variant",[1087,7939,1592],{"class":1305},[1087,7941,1519],{"class":1305},[1087,7943,7944],{"class":1097},"ghost",[1087,7946,5538],{"class":1305},[1087,7948,7949,7952,7954,7956,7959],{"class":1089,"line":2419},[1087,7950,7951],{"class":1588},"      label",[1087,7953,1592],{"class":1305},[1087,7955,1519],{"class":1305},[1087,7957,7958],{"class":1097},"Chats History",[1087,7960,5538],{"class":1305},[1087,7962,7963,7965,7967,7969,7971],{"class":1089,"line":3414},[1087,7964,6265],{"class":1588},[1087,7966,1592],{"class":1305},[1087,7968,1519],{"class":1305},[1087,7970,5623],{"class":1097},[1087,7972,5538],{"class":1305},[1087,7974,7975,7978,7980,7982,7985],{"class":1089,"line":3427},[1087,7976,7977],{"class":1588},"      class",[1087,7979,1592],{"class":1305},[1087,7981,1519],{"class":1305},[1087,7983,7984],{"class":1097},"w-fit",[1087,7986,5538],{"class":1305},[1087,7988,7989],{"class":1089,"line":3432},[1087,7990,7991],{"class":1305},"    \u002F>\n",[1087,7993,7994,7996,7998],{"class":1089,"line":3438},[1087,7995,1627],{"class":1305},[1087,7997,7519],{"class":1311},[1087,7999,1566],{"class":1305},[1087,8001,8002,8004,8006],{"class":1089,"line":3469},[1087,8003,1636],{"class":1305},[1087,8005,1563],{"class":1311},[1087,8007,1566],{"class":1305},[980,8009,8011],{"id":8010},"integrating-history-in-the-home-page","Integrating history in the home page",[1278,8013,8014],{},[1696,8015,8016],{},[1078,8017,8020],{"className":1550,"code":8018,"filename":5102,"highlights":8019,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst input = ref('')\nconst loading = ref(false)\n\nasync function createChat() {\n  if (!input.value.trim()) return\n\n  loading.value = true\n\n  \u002F\u002F Create a new chat on the server\n  const chat = await $fetch('\u002Fapi\u002Fchats', {\n    method: 'POST',\n    body: {\n      message: {\n        role: 'user',\n        parts: [{ type: 'text', text: input.value }]\n      }\n    }\n  })\n\n  \u002F\u002F Navigate to the chat page\n  navigateTo(`\u002Fchat\u002F${chat.id}`)\n}\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUDashboardPanel :ui=\"{ body: 'p-0 sm:p-0' }\">\n    \u003Ctemplate #header>\n      \u003CChatsHistory \u002F>\n    \u003C\u002Ftemplate>\n    \u003Ctemplate #body>\n      \u003CUContainer class=\"min-h-dvh flex flex-col justify-center gap-6 py-8\">\n        \u003Ch1 class=\"text-3xl sm:text-4xl text-highlighted font-bold\">\n          How can I help you today?\n        \u003C\u002Fh1>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :status=\"loading ? 'streaming' : 'ready'\"\n          variant=\"subtle\"\n          placeholder=\"Ask me anything...\"\n          @submit=\"createChat\"\n        >\n          \u003CUChatPromptSubmit color=\"neutral\" \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n",[2411,2419,3414],[1037,8021,8022,8042,8058,8074,8078,8090,8112,8116,8128,8132,8136,8160,8174,8182,8190,8204,8240,8244,8248,8254,8258,8262,8284,8288,8296,8300,8308,8326,8340,8350,8359,8371,8389,8407,8411,8419,8423,8429,8441,8453,8465,8477,8489,8493,8511,8519,8527,8535,8543],{"__ignoreMap":1083},[1087,8023,8024,8026,8028,8030,8032,8034,8036,8038,8040],{"class":1089,"line":1090},[1087,8025,1560],{"class":1305},[1087,8027,5112],{"class":1311},[1087,8029,5115],{"class":1588},[1087,8031,5118],{"class":1588},[1087,8033,1592],{"class":1305},[1087,8035,1519],{"class":1305},[1087,8037,1284],{"class":1097},[1087,8039,1519],{"class":1305},[1087,8041,1566],{"class":1305},[1087,8043,8044,8046,8048,8050,8052,8054,8056],{"class":1089,"line":1107},[1087,8045,3061],{"class":1588},[1087,8047,5135],{"class":1301},[1087,8049,1592],{"class":1305},[1087,8051,5140],{"class":1110},[1087,8053,1302],{"class":1301},[1087,8055,5145],{"class":1305},[1087,8057,1492],{"class":1301},[1087,8059,8060,8062,8064,8066,8068,8070,8072],{"class":1089,"line":1321},[1087,8061,3061],{"class":1588},[1087,8063,5154],{"class":1301},[1087,8065,1592],{"class":1305},[1087,8067,5140],{"class":1110},[1087,8069,1302],{"class":1301},[1087,8071,5163],{"class":1467},[1087,8073,1492],{"class":1301},[1087,8075,8076],{"class":1089,"line":1336},[1087,8077,1370],{"emptyLinePlaceholder":21},[1087,8079,8080,8082,8084,8086,8088],{"class":1089,"line":1348},[1087,8081,2597],{"class":1588},[1087,8083,5176],{"class":1588},[1087,8085,5179],{"class":1110},[1087,8087,1806],{"class":1305},[1087,8089,1381],{"class":1305},[1087,8091,8092,8094,8096,8098,8100,8102,8104,8106,8108,8110],{"class":1089,"line":1359},[1087,8093,3528],{"class":1291},[1087,8095,1952],{"class":1311},[1087,8097,3533],{"class":1305},[1087,8099,5194],{"class":1301},[1087,8101,1809],{"class":1305},[1087,8103,3322],{"class":1301},[1087,8105,1809],{"class":1305},[1087,8107,5203],{"class":1110},[1087,8109,5206],{"class":1311},[1087,8111,5209],{"class":1291},[1087,8113,8114],{"class":1089,"line":1367},[1087,8115,1370],{"emptyLinePlaceholder":21},[1087,8117,8118,8120,8122,8124,8126],{"class":1089,"line":1373},[1087,8119,5218],{"class":1301},[1087,8121,1809],{"class":1305},[1087,8123,3322],{"class":1301},[1087,8125,2623],{"class":1305},[1087,8127,4354],{"class":1467},[1087,8129,8130],{"class":1089,"line":1384},[1087,8131,1370],{"emptyLinePlaceholder":21},[1087,8133,8134],{"class":1089,"line":1400},[1087,8135,5235],{"class":1471},[1087,8137,8138,8140,8142,8144,8146,8148,8150,8152,8154,8156,8158],{"class":1089,"line":1406},[1087,8139,2613],{"class":1588},[1087,8141,2790],{"class":1301},[1087,8143,2623],{"class":1305},[1087,8145,2626],{"class":1291},[1087,8147,5248],{"class":1110},[1087,8149,1302],{"class":1311},[1087,8151,1330],{"class":1305},[1087,8153,5255],{"class":1097},[1087,8155,1330],{"class":1305},[1087,8157,1717],{"class":1305},[1087,8159,1381],{"class":1305},[1087,8161,8162,8164,8166,8168,8170,8172],{"class":1089,"line":1411},[1087,8163,5266],{"class":1311},[1087,8165,1315],{"class":1305},[1087,8167,1392],{"class":1305},[1087,8169,5273],{"class":1097},[1087,8171,1330],{"class":1305},[1087,8173,1333],{"class":1305},[1087,8175,8176,8178,8180],{"class":1089,"line":1434},[1087,8177,5282],{"class":1311},[1087,8179,1315],{"class":1305},[1087,8181,1381],{"class":1305},[1087,8183,8184,8186,8188],{"class":1089,"line":1439},[1087,8185,3362],{"class":1311},[1087,8187,1315],{"class":1305},[1087,8189,1381],{"class":1305},[1087,8191,8192,8194,8196,8198,8200,8202],{"class":1089,"line":1449},[1087,8193,4496],{"class":1311},[1087,8195,1315],{"class":1305},[1087,8197,1392],{"class":1305},[1087,8199,2148],{"class":1097},[1087,8201,1330],{"class":1305},[1087,8203,1333],{"class":1305},[1087,8205,8206,8208,8210,8212,8214,8216,8218,8220,8222,8224,8226,8228,8230,8232,8234,8236,8238],{"class":1089,"line":1459},[1087,8207,4529],{"class":1311},[1087,8209,1315],{"class":1305},[1087,8211,1419],{"class":1311},[1087,8213,1866],{"class":1305},[1087,8215,2520],{"class":1311},[1087,8217,1315],{"class":1305},[1087,8219,1392],{"class":1305},[1087,8221,5327],{"class":1097},[1087,8223,1330],{"class":1305},[1087,8225,1717],{"class":1305},[1087,8227,1720],{"class":1311},[1087,8229,1315],{"class":1305},[1087,8231,5338],{"class":1301},[1087,8233,1809],{"class":1305},[1087,8235,3322],{"class":1301},[1087,8237,1733],{"class":1305},[1087,8239,3168],{"class":1311},[1087,8241,8242],{"class":1089,"line":1475},[1087,8243,4368],{"class":1305},[1087,8245,8246],{"class":1089,"line":1481},[1087,8247,1478],{"class":1305},[1087,8249,8250,8252],{"class":1089,"line":1486},[1087,8251,2414],{"class":1305},[1087,8253,1492],{"class":1311},[1087,8255,8256],{"class":1089,"line":2275},[1087,8257,1370],{"emptyLinePlaceholder":21},[1087,8259,8260],{"class":1089,"line":2288},[1087,8261,5369],{"class":1471},[1087,8263,8264,8266,8268,8270,8272,8274,8276,8278,8280,8282],{"class":1089,"line":2318},[1087,8265,5374],{"class":1110},[1087,8267,1302],{"class":1311},[1087,8269,3677],{"class":1305},[1087,8271,5381],{"class":1097},[1087,8273,5384],{"class":1305},[1087,8275,262],{"class":1301},[1087,8277,1809],{"class":1305},[1087,8279,2018],{"class":1301},[1087,8281,5393],{"class":1305},[1087,8283,1492],{"class":1311},[1087,8285,8286],{"class":1089,"line":2324},[1087,8287,5400],{"class":1305},[1087,8289,8290,8292,8294],{"class":1089,"line":2329},[1087,8291,1636],{"class":1305},[1087,8293,5112],{"class":1311},[1087,8295,1566],{"class":1305},[1087,8297,8298],{"class":1089,"line":2361},[1087,8299,1370],{"emptyLinePlaceholder":21},[1087,8301,8302,8304,8306],{"class":1089,"line":2377},[1087,8303,1560],{"class":1305},[1087,8305,1563],{"class":1311},[1087,8307,1566],{"class":1305},[1087,8309,8310,8312,8314,8316,8318,8320,8322,8324],{"class":1089,"line":2395},[1087,8311,1573],{"class":1305},[1087,8313,5427],{"class":1311},[1087,8315,5430],{"class":1588},[1087,8317,1592],{"class":1305},[1087,8319,1519],{"class":1305},[1087,8321,5437],{"class":1097},[1087,8323,1519],{"class":1305},[1087,8325,1566],{"class":1305},[1087,8327,8329,8331,8333,8335,8338],{"class":8328,"line":2411},[1089,1570],[1087,8330,1582],{"class":1305},[1087,8332,1563],{"class":1311},[1087,8334,5450],{"class":1305},[1087,8336,8337],{"class":1588},"header",[1087,8339,1566],{"class":1305},[1087,8341,8343,8345,8348],{"class":8342,"line":2419},[1089,1570],[1087,8344,1606],{"class":1305},[1087,8346,8347],{"class":1311},"ChatsHistory",[1087,8349,1612],{"class":1305},[1087,8351,8353,8355,8357],{"class":8352,"line":3414},[1089,1570],[1087,8354,1617],{"class":1305},[1087,8356,1563],{"class":1311},[1087,8358,1566],{"class":1305},[1087,8360,8361,8363,8365,8367,8369],{"class":1089,"line":3427},[1087,8362,1582],{"class":1305},[1087,8364,1563],{"class":1311},[1087,8366,5450],{"class":1305},[1087,8368,5453],{"class":1588},[1087,8370,1566],{"class":1305},[1087,8372,8373,8375,8377,8379,8381,8383,8385,8387],{"class":1089,"line":3432},[1087,8374,1606],{"class":1305},[1087,8376,5462],{"class":1311},[1087,8378,5465],{"class":1588},[1087,8380,1592],{"class":1305},[1087,8382,1519],{"class":1305},[1087,8384,5472],{"class":1097},[1087,8386,1519],{"class":1305},[1087,8388,1566],{"class":1305},[1087,8390,8391,8393,8395,8397,8399,8401,8403,8405],{"class":1089,"line":3438},[1087,8392,5481],{"class":1305},[1087,8394,5484],{"class":1311},[1087,8396,5465],{"class":1588},[1087,8398,1592],{"class":1305},[1087,8400,1519],{"class":1305},[1087,8402,5493],{"class":1097},[1087,8404,1519],{"class":1305},[1087,8406,1566],{"class":1305},[1087,8408,8409],{"class":1089,"line":3469},[1087,8410,5502],{"class":1301},[1087,8412,8413,8415,8417],{"class":1089,"line":3513},[1087,8414,5507],{"class":1305},[1087,8416,5484],{"class":1311},[1087,8418,1566],{"class":1305},[1087,8420,8421],{"class":1089,"line":3520},[1087,8422,1370],{"emptyLinePlaceholder":21},[1087,8424,8425,8427],{"class":1089,"line":3525},[1087,8426,5481],{"class":1305},[1087,8428,5523],{"class":1311},[1087,8430,8431,8433,8435,8437,8439],{"class":1089,"line":3543},[1087,8432,5529],{"class":1588},[1087,8434,1592],{"class":1305},[1087,8436,1519],{"class":1305},[1087,8438,5194],{"class":1097},[1087,8440,5538],{"class":1305},[1087,8442,8443,8445,8447,8449,8451],{"class":1089,"line":3582},[1087,8444,5544],{"class":1588},[1087,8446,1592],{"class":1305},[1087,8448,1519],{"class":1305},[1087,8450,5551],{"class":1097},[1087,8452,5538],{"class":1305},[1087,8454,8455,8457,8459,8461,8463],{"class":1089,"line":3588},[1087,8456,5559],{"class":1588},[1087,8458,1592],{"class":1305},[1087,8460,1519],{"class":1305},[1087,8462,5566],{"class":1097},[1087,8464,5538],{"class":1305},[1087,8466,8467,8469,8471,8473,8475],{"class":1089,"line":3593},[1087,8468,5574],{"class":1588},[1087,8470,1592],{"class":1305},[1087,8472,1519],{"class":1305},[1087,8474,5581],{"class":1097},[1087,8476,5538],{"class":1305},[1087,8478,8479,8481,8483,8485,8487],{"class":1089,"line":3599},[1087,8480,5589],{"class":1588},[1087,8482,1592],{"class":1305},[1087,8484,1519],{"class":1305},[1087,8486,5596],{"class":1097},[1087,8488,5538],{"class":1305},[1087,8490,8491],{"class":1089,"line":3619},[1087,8492,5604],{"class":1305},[1087,8494,8495,8497,8499,8501,8503,8505,8507,8509],{"class":1089,"line":3647},[1087,8496,5610],{"class":1305},[1087,8498,5613],{"class":1311},[1087,8500,5616],{"class":1588},[1087,8502,1592],{"class":1305},[1087,8504,1519],{"class":1305},[1087,8506,5623],{"class":1097},[1087,8508,1519],{"class":1305},[1087,8510,1612],{"class":1305},[1087,8512,8513,8515,8517],{"class":1089,"line":3663},[1087,8514,5507],{"class":1305},[1087,8516,5077],{"class":1311},[1087,8518,1566],{"class":1305},[1087,8520,8521,8523,8525],{"class":1089,"line":3682},[1087,8522,5641],{"class":1305},[1087,8524,5462],{"class":1311},[1087,8526,1566],{"class":1305},[1087,8528,8529,8531,8533],{"class":1089,"line":3710},[1087,8530,1617],{"class":1305},[1087,8532,1563],{"class":1311},[1087,8534,1566],{"class":1305},[1087,8536,8537,8539,8541],{"class":1089,"line":3717},[1087,8538,1627],{"class":1305},[1087,8540,5427],{"class":1311},[1087,8542,1566],{"class":1305},[1087,8544,8545,8547,8549],{"class":1089,"line":3722},[1087,8546,1636],{"class":1305},[1087,8548,1563],{"class":1311},[1087,8550,1566],{"class":1305},[980,8552,8554],{"id":8553},"integrating-history-in-the-chat-page","Integrating history in the chat page",[1278,8556,8557],{},[1696,8558,8559],{},[1078,8560,8563],{"className":1550,"code":8561,"filename":5731,"highlights":8562,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nimport { DefaultChatTransport, isReasoningUIPart, isTextUIPart } from 'ai'\nimport { Chat } from '@ai-sdk\u002Fvue'\nimport { isPartStreaming } 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=\"isPartStreaming(part)\"\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              \u003Ctemplate v-else-if=\"isTextUIPart(part)\">\n                \u003CMDC\n                  v-if=\"message.role === 'assistant'\"\n                  :value=\"part.text\"\n                  :cache-key=\"`${message.id}-${index}`\"\n                  class=\"*:first:mt-0 *:last:mb-0\"\n                \u002F>\n                \u003Cp v-else-if=\"message.role === 'user'\" class=\"whitespace-pre-wrap\">\n                  {{ part.text }}\n                \u003C\u002Fp>\n              \u003C\u002Ftemplate>\n            \u003C\u002Ftemplate>\n          \u003C\u002Ftemplate>\n        \u003C\u002FUChatMessages>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :error=\"chat.error\"\n          variant=\"subtle\"\n          class=\"sticky bottom-0\"\n          @submit=\"handleSubmit\"\n        >\n          \u003CUChatPromptSubmit\n            :status=\"chat.status\"\n            color=\"neutral\"\n            @stop=\"chat.stop()\"\n            @reload=\"chat.regenerate()\"\n          \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n",[3962,3968,3985],[1037,8564,8565,8585,8611,8629,8647,8651,8663,8675,8679,8683,8725,8729,8745,8785,8789,8793,8809,8813,8817,8833,8851,8869,8883,8907,8915,8927,8931,8955,8969,8973,8977,8989,9001,9015,9029,9041,9047,9051,9057,9061,9079,9089,9109,9135,9147,9151,9155,9159,9163,9175,9203,9213,9217,9223,9231,9235,9243,9261,9273,9281,9289,9301,9320,9327,9340,9352,9356,9368,9372,9396,9462,9468,9480,9492,9504,9508,9514,9526,9538,9550,9554,9562,9566,9586,9592,9604,9616,9628,9640,9644,9672,9676,9684,9692,9700,9708,9716,9720,9726,9738,9750,9762,9774,9786,9790,9796,9808,9820,9832,9844,9848,9856,9864,9873,9882],{"__ignoreMap":1083},[1087,8566,8567,8569,8571,8573,8575,8577,8579,8581,8583],{"class":1089,"line":1090},[1087,8568,1560],{"class":1305},[1087,8570,5112],{"class":1311},[1087,8572,5115],{"class":1588},[1087,8574,5118],{"class":1588},[1087,8576,1592],{"class":1305},[1087,8578,1519],{"class":1305},[1087,8580,1284],{"class":1097},[1087,8582,1519],{"class":1305},[1087,8584,1566],{"class":1305},[1087,8586,8587,8589,8591,8593,8595,8597,8599,8601,8603,8605,8607,8609],{"class":1089,"line":1107},[1087,8588,1708],{"class":1291},[1087,8590,1711],{"class":1305},[1087,8592,5764],{"class":1301},[1087,8594,1717],{"class":1305},[1087,8596,5769],{"class":1301},[1087,8598,1717],{"class":1305},[1087,8600,5774],{"class":1301},[1087,8602,1733],{"class":1305},[1087,8604,1736],{"class":1291},[1087,8606,1392],{"class":1305},[1087,8608,2534],{"class":1097},[1087,8610,1356],{"class":1305},[1087,8612,8613,8615,8617,8619,8621,8623,8625,8627],{"class":1089,"line":1321},[1087,8614,1708],{"class":1291},[1087,8616,1711],{"class":1305},[1087,8618,5794],{"class":1301},[1087,8620,1733],{"class":1305},[1087,8622,1736],{"class":1291},[1087,8624,1392],{"class":1305},[1087,8626,5803],{"class":1097},[1087,8628,1356],{"class":1305},[1087,8630,8631,8633,8635,8637,8639,8641,8643,8645],{"class":1089,"line":1336},[1087,8632,1708],{"class":1291},[1087,8634,1711],{"class":1305},[1087,8636,5815],{"class":1301},[1087,8638,1733],{"class":1305},[1087,8640,1736],{"class":1291},[1087,8642,1392],{"class":1305},[1087,8644,5824],{"class":1097},[1087,8646,1356],{"class":1305},[1087,8648,8649],{"class":1089,"line":1348},[1087,8650,1370],{"emptyLinePlaceholder":21},[1087,8652,8653,8655,8657,8659,8661],{"class":1089,"line":1359},[1087,8654,3061],{"class":1588},[1087,8656,5837],{"class":1301},[1087,8658,1592],{"class":1305},[1087,8660,5842],{"class":1110},[1087,8662,2669],{"class":1301},[1087,8664,8665,8667,8669,8671,8673],{"class":1089,"line":1367},[1087,8666,3061],{"class":1588},[1087,8668,5851],{"class":1301},[1087,8670,1592],{"class":1305},[1087,8672,5856],{"class":1110},[1087,8674,2669],{"class":1301},[1087,8676,8677],{"class":1089,"line":1373},[1087,8678,1370],{"emptyLinePlaceholder":21},[1087,8680,8681],{"class":1089,"line":1384},[1087,8682,5867],{"class":1471},[1087,8684,8685,8687,8689,8691,8693,8695,8697,8699,8701,8703,8705,8707,8709,8711,8713,8715,8717,8719,8721,8723],{"class":1089,"line":1400},[1087,8686,3061],{"class":1588},[1087,8688,1711],{"class":1305},[1087,8690,5876],{"class":1311},[1087,8692,1315],{"class":1305},[1087,8694,5881],{"class":1301},[1087,8696,1489],{"class":1305},[1087,8698,2623],{"class":1305},[1087,8700,2626],{"class":1291},[1087,8702,5890],{"class":1110},[1087,8704,1302],{"class":1301},[1087,8706,3677],{"class":1305},[1087,8708,5897],{"class":1097},[1087,8710,5384],{"class":1305},[1087,8712,5902],{"class":1301},[1087,8714,1809],{"class":1305},[1087,8716,5907],{"class":1301},[1087,8718,1809],{"class":1305},[1087,8720,2018],{"class":1301},[1087,8722,5393],{"class":1305},[1087,8724,1492],{"class":1301},[1087,8726,8727],{"class":1089,"line":1406},[1087,8728,1370],{"emptyLinePlaceholder":21},[1087,8730,8731,8733,8735,8737,8739,8741,8743],{"class":1089,"line":1411},[1087,8732,5924],{"class":1291},[1087,8734,1952],{"class":1301},[1087,8736,3533],{"class":1305},[1087,8738,5931],{"class":1301},[1087,8740,1809],{"class":1305},[1087,8742,5936],{"class":1301},[1087,8744,1306],{"class":1305},[1087,8746,8747,8749,8751,8753,8755,8757,8759,8761,8763,8765,8767,8769,8771,8773,8775,8777,8779,8781,8783],{"class":1089,"line":1434},[1087,8748,5943],{"class":1291},[1087,8750,2899],{"class":1110},[1087,8752,1302],{"class":1311},[1087,8754,1866],{"class":1305},[1087,8756,3555],{"class":1311},[1087,8758,1315],{"class":1305},[1087,8760,3561],{"class":3560},[1087,8762,1717],{"class":1305},[1087,8764,3566],{"class":1311},[1087,8766,1315],{"class":1305},[1087,8768,1392],{"class":1305},[1087,8770,3573],{"class":1097},[1087,8772,1330],{"class":1305},[1087,8774,1717],{"class":1305},[1087,8776,5972],{"class":1311},[1087,8778,1315],{"class":1305},[1087,8780,4169],{"class":1467},[1087,8782,1733],{"class":1305},[1087,8784,1492],{"class":1311},[1087,8786,8787],{"class":1089,"line":1439},[1087,8788,5400],{"class":1305},[1087,8790,8791],{"class":1089,"line":1449},[1087,8792,1370],{"emptyLinePlaceholder":21},[1087,8794,8795,8797,8799,8801,8803,8805,8807],{"class":1089,"line":1459},[1087,8796,3061],{"class":1588},[1087,8798,5135],{"class":1301},[1087,8800,1592],{"class":1305},[1087,8802,5140],{"class":1110},[1087,8804,1302],{"class":1301},[1087,8806,5145],{"class":1305},[1087,8808,1492],{"class":1301},[1087,8810,8811],{"class":1089,"line":1475},[1087,8812,1370],{"emptyLinePlaceholder":21},[1087,8814,8815],{"class":1089,"line":1481},[1087,8816,6013],{"class":1471},[1087,8818,8819,8821,8823,8825,8827,8829,8831],{"class":1089,"line":1486},[1087,8820,3061],{"class":1588},[1087,8822,6021],{"class":1301},[1087,8824,1592],{"class":1305},[1087,8826,1903],{"class":1305},[1087,8828,5794],{"class":1110},[1087,8830,1302],{"class":1301},[1087,8832,1306],{"class":1305},[1087,8834,8835,8837,8839,8841,8843,8845,8847,8849],{"class":1089,"line":2275},[1087,8836,1799],{"class":1311},[1087,8838,1315],{"class":1305},[1087,8840,6041],{"class":1301},[1087,8842,1809],{"class":1305},[1087,8844,3322],{"class":1301},[1087,8846,1809],{"class":1305},[1087,8848,2018],{"class":1301},[1087,8850,1333],{"class":1305},[1087,8852,8853,8855,8857,8859,8861,8863,8865,8867],{"class":1089,"line":2288},[1087,8854,1959],{"class":1311},[1087,8856,1315],{"class":1305},[1087,8858,6041],{"class":1301},[1087,8860,1809],{"class":1305},[1087,8862,3322],{"class":1301},[1087,8864,1809],{"class":1305},[1087,8866,1997],{"class":1301},[1087,8868,1333],{"class":1305},[1087,8870,8871,8873,8875,8877,8879,8881],{"class":1089,"line":2318},[1087,8872,6076],{"class":1311},[1087,8874,1315],{"class":1305},[1087,8876,1903],{"class":1305},[1087,8878,5764],{"class":1110},[1087,8880,1302],{"class":1301},[1087,8882,1306],{"class":1305},[1087,8884,8885,8887,8889,8891,8893,8895,8897,8899,8901,8903,8905],{"class":1089,"line":2324},[1087,8886,6092],{"class":1311},[1087,8888,1315],{"class":1305},[1087,8890,3671],{"class":1305},[1087,8892,5897],{"class":1097},[1087,8894,5384],{"class":1305},[1087,8896,5931],{"class":1301},[1087,8898,1809],{"class":1305},[1087,8900,3322],{"class":1301},[1087,8902,1809],{"class":1305},[1087,8904,2018],{"class":1301},[1087,8906,6113],{"class":1305},[1087,8908,8909,8911,8913],{"class":1089,"line":2329},[1087,8910,2414],{"class":1305},[1087,8912,1883],{"class":1301},[1087,8914,1333],{"class":1305},[1087,8916,8917,8919,8921,8923,8925],{"class":1089,"line":2361},[1087,8918,6128],{"class":1311},[1087,8920,1302],{"class":1305},[1087,8922,6133],{"class":1943},[1087,8924,1883],{"class":1305},[1087,8926,1381],{"class":1305},[1087,8928,8929],{"class":1089,"line":2377},[1087,8930,6143],{"class":1471},[1087,8932,8933,8935,8937,8939,8941,8943,8945,8947,8949,8951,8953],{"class":1089,"line":2395},[1087,8934,6149],{"class":1291},[1087,8936,1952],{"class":1311},[1087,8938,6133],{"class":1301},[1087,8940,1809],{"class":1305},[1087,8942,6158],{"class":1301},[1087,8944,3349],{"class":1305},[1087,8946,1392],{"class":1305},[1087,8948,4316],{"class":1097},[1087,8950,1330],{"class":1305},[1087,8952,3538],{"class":1311},[1087,8954,1306],{"class":1305},[1087,8956,8957,8959,8961,8963,8965,8967],{"class":1089,"line":2411},[1087,8958,6176],{"class":1110},[1087,8960,1302],{"class":1311},[1087,8962,1330],{"class":1305},[1087,8964,1788],{"class":1097},[1087,8966,1330],{"class":1305},[1087,8968,1492],{"class":1311},[1087,8970,8971],{"class":1089,"line":2419},[1087,8972,1478],{"class":1305},[1087,8974,8975],{"class":1089,"line":3414},[1087,8976,1403],{"class":1305},[1087,8978,8979,8981,8983,8985,8987],{"class":1089,"line":3427},[1087,8980,6202],{"class":1311},[1087,8982,1302],{"class":1305},[1087,8984,6207],{"class":1943},[1087,8986,1883],{"class":1305},[1087,8988,1381],{"class":1305},[1087,8990,8991,8993,8995,8997,8999],{"class":1089,"line":3432},[1087,8992,6217],{"class":1301},[1087,8994,1809],{"class":1305},[1087,8996,6222],{"class":1110},[1087,8998,1302],{"class":1311},[1087,9000,1306],{"class":1305},[1087,9002,9003,9005,9007,9009,9011,9013],{"class":1089,"line":3438},[1087,9004,6232],{"class":1311},[1087,9006,1315],{"class":1305},[1087,9008,1392],{"class":1305},[1087,9010,497],{"class":1097},[1087,9012,1330],{"class":1305},[1087,9014,1333],{"class":1305},[1087,9016,9017,9019,9021,9023,9025,9027],{"class":1089,"line":3469},[1087,9018,6248],{"class":1311},[1087,9020,1315],{"class":1305},[1087,9022,6253],{"class":1301},[1087,9024,1809],{"class":1305},[1087,9026,4468],{"class":1301},[1087,9028,1333],{"class":1305},[1087,9030,9031,9033,9035,9037,9039],{"class":1089,"line":3513},[1087,9032,6265],{"class":1311},[1087,9034,1315],{"class":1305},[1087,9036,1392],{"class":1305},[1087,9038,6207],{"class":1097},[1087,9040,1356],{"class":1305},[1087,9042,9043,9045],{"class":1089,"line":3520},[1087,9044,3376],{"class":1305},[1087,9046,1492],{"class":1311},[1087,9048,9049],{"class":1089,"line":3525},[1087,9050,3585],{"class":1305},[1087,9052,9053,9055],{"class":1089,"line":3543},[1087,9054,1489],{"class":1305},[1087,9056,1492],{"class":1301},[1087,9058,9059],{"class":1089,"line":3582},[1087,9060,1370],{"emptyLinePlaceholder":21},[1087,9062,9063,9065,9067,9069,9071,9073,9075,9077],{"class":1089,"line":3588},[1087,9064,6301],{"class":1588},[1087,9066,6304],{"class":1110},[1087,9068,1302],{"class":1305},[1087,9070,6309],{"class":1943},[1087,9072,1315],{"class":1305},[1087,9074,6314],{"class":1093},[1087,9076,1883],{"class":1305},[1087,9078,1381],{"class":1305},[1087,9080,9081,9083,9085,9087],{"class":1089,"line":3593},[1087,9082,6323],{"class":1301},[1087,9084,1809],{"class":1305},[1087,9086,6328],{"class":1110},[1087,9088,2669],{"class":1311},[1087,9090,9091,9093,9095,9097,9099,9101,9103,9105,9107],{"class":1089,"line":3599},[1087,9092,3528],{"class":1291},[1087,9094,1952],{"class":1311},[1087,9096,5194],{"class":1301},[1087,9098,1809],{"class":1305},[1087,9100,3322],{"class":1301},[1087,9102,1809],{"class":1305},[1087,9104,5203],{"class":1110},[1087,9106,5206],{"class":1311},[1087,9108,1306],{"class":1305},[1087,9110,9111,9113,9115,9117,9119,9121,9123,9125,9127,9129,9131,9133],{"class":1089,"line":3619},[1087,9112,6355],{"class":1301},[1087,9114,1809],{"class":1305},[1087,9116,6360],{"class":1110},[1087,9118,1302],{"class":1311},[1087,9120,1866],{"class":1305},[1087,9122,1720],{"class":1311},[1087,9124,1315],{"class":1305},[1087,9126,5338],{"class":1301},[1087,9128,1809],{"class":1305},[1087,9130,3322],{"class":1301},[1087,9132,1733],{"class":1305},[1087,9134,1492],{"class":1311},[1087,9136,9137,9139,9141,9143,9145],{"class":1089,"line":3647},[1087,9138,6383],{"class":1301},[1087,9140,1809],{"class":1305},[1087,9142,3322],{"class":1301},[1087,9144,2623],{"class":1305},[1087,9146,6392],{"class":1305},[1087,9148,9149],{"class":1089,"line":3663},[1087,9150,3585],{"class":1305},[1087,9152,9153],{"class":1089,"line":3682},[1087,9154,5400],{"class":1305},[1087,9156,9157],{"class":1089,"line":3710},[1087,9158,1370],{"emptyLinePlaceholder":21},[1087,9160,9161],{"class":1089,"line":3717},[1087,9162,6409],{"class":1471},[1087,9164,9165,9167,9169,9171,9173],{"class":1089,"line":3722},[1087,9166,6414],{"class":1110},[1087,9168,1302],{"class":1301},[1087,9170,1806],{"class":1305},[1087,9172,1826],{"class":1588},[1087,9174,1381],{"class":1305},[1087,9176,9177,9179,9181,9183,9185,9187,9189,9191,9193,9195,9197,9199,9201],{"class":1089,"line":3788},[1087,9178,3528],{"class":1291},[1087,9180,1952],{"class":1311},[1087,9182,5931],{"class":1301},[1087,9184,1809],{"class":1305},[1087,9186,3322],{"class":1301},[1087,9188,3843],{"class":1305},[1087,9190,1997],{"class":1301},[1087,9192,1809],{"class":1305},[1087,9194,3822],{"class":1301},[1087,9196,3349],{"class":1305},[1087,9198,3828],{"class":3560},[1087,9200,3538],{"class":1311},[1087,9202,1306],{"class":1305},[1087,9204,9205,9207,9209,9211],{"class":1089,"line":3793},[1087,9206,6355],{"class":1301},[1087,9208,1809],{"class":1305},[1087,9210,6459],{"class":1110},[1087,9212,2669],{"class":1311},[1087,9214,9215],{"class":1089,"line":3798},[1087,9216,3585],{"class":1305},[1087,9218,9219,9221],{"class":1089,"line":3804},[1087,9220,1489],{"class":1305},[1087,9222,1492],{"class":1301},[1087,9224,9225,9227,9229],{"class":1089,"line":3833},[1087,9226,1636],{"class":1305},[1087,9228,5112],{"class":1311},[1087,9230,1566],{"class":1305},[1087,9232,9233],{"class":1089,"line":3874},[1087,9234,1370],{"emptyLinePlaceholder":21},[1087,9236,9237,9239,9241],{"class":1089,"line":3903},[1087,9238,1560],{"class":1305},[1087,9240,1563],{"class":1311},[1087,9242,1566],{"class":1305},[1087,9244,9245,9247,9249,9251,9253,9255,9257,9259],{"class":1089,"line":3915},[1087,9246,1573],{"class":1305},[1087,9248,5427],{"class":1311},[1087,9250,5430],{"class":1588},[1087,9252,1592],{"class":1305},[1087,9254,1519],{"class":1305},[1087,9256,5437],{"class":1097},[1087,9258,1519],{"class":1305},[1087,9260,1566],{"class":1305},[1087,9262,9263,9265,9267,9269,9271],{"class":1089,"line":3931},[1087,9264,1582],{"class":1305},[1087,9266,1563],{"class":1311},[1087,9268,5450],{"class":1305},[1087,9270,8337],{"class":1588},[1087,9272,1566],{"class":1305},[1087,9274,9275,9277,9279],{"class":1089,"line":3945},[1087,9276,1606],{"class":1305},[1087,9278,8347],{"class":1311},[1087,9280,1612],{"class":1305},[1087,9282,9283,9285,9287],{"class":1089,"line":3952},[1087,9284,1617],{"class":1305},[1087,9286,1563],{"class":1311},[1087,9288,1566],{"class":1305},[1087,9290,9291,9293,9295,9297,9299],{"class":1089,"line":3957},[1087,9292,1582],{"class":1305},[1087,9294,1563],{"class":1311},[1087,9296,5450],{"class":1305},[1087,9298,5453],{"class":1588},[1087,9300,1566],{"class":1305},[1087,9302,9304,9306,9308,9310,9312,9314,9316,9318],{"class":9303,"line":3962},[1089,1570],[1087,9305,1606],{"class":1305},[1087,9307,5462],{"class":1311},[1087,9309,5465],{"class":1588},[1087,9311,1592],{"class":1305},[1087,9313,1519],{"class":1305},[1087,9315,6536],{"class":1097},[1087,9317,1519],{"class":1305},[1087,9319,1566],{"class":1305},[1087,9321,9323,9325],{"class":9322,"line":3968},[1089,1570],[1087,9324,5481],{"class":1305},[1087,9326,6547],{"class":1311},[1087,9328,9330,9332,9334,9336,9338],{"class":9329,"line":3985},[1089,1570],[1087,9331,6552],{"class":1588},[1087,9333,1592],{"class":1305},[1087,9335,1519],{"class":1305},[1087,9337,6559],{"class":1097},[1087,9339,5538],{"class":1305},[1087,9341,9342,9344,9346,9348,9350],{"class":1089,"line":4007},[1087,9343,5544],{"class":1588},[1087,9345,1592],{"class":1305},[1087,9347,1519],{"class":1305},[1087,9349,6572],{"class":1097},[1087,9351,5538],{"class":1305},[1087,9353,9354],{"class":1089,"line":4025},[1087,9355,6579],{"class":1588},[1087,9357,9358,9360,9362,9364,9366],{"class":1089,"line":4033},[1087,9359,6584],{"class":1588},[1087,9361,1592],{"class":1305},[1087,9363,1519],{"class":1305},[1087,9365,6591],{"class":1097},[1087,9367,5538],{"class":1305},[1087,9369,9370],{"class":1089,"line":4050},[1087,9371,5604],{"class":1305},[1087,9373,9374,9376,9378,9380,9382,9384,9386,9388,9390,9392,9394],{"class":1089,"line":4071},[1087,9375,5610],{"class":1305},[1087,9377,1563],{"class":1311},[1087,9379,5450],{"class":1305},[1087,9381,371],{"class":1588},[1087,9383,1592],{"class":1305},[1087,9385,1519],{"class":1305},[1087,9387,1866],{"class":1305},[1087,9389,6616],{"class":1301},[1087,9391,1489],{"class":1305},[1087,9393,1519],{"class":1305},[1087,9395,1566],{"class":1305},[1087,9397,9398,9400,9402,9404,9406,9408,9410,9412,9414,9416,9418,9420,9422,9424,9426,9428,9430,9432,9434,9436,9438,9440,9442,9444,9446,9448,9450,9452,9454,9456,9458,9460],{"class":1089,"line":4081},[1087,9399,6627],{"class":1305},[1087,9401,1563],{"class":1311},[1087,9403,6632],{"class":1291},[1087,9405,1592],{"class":1305},[1087,9407,1519],{"class":1305},[1087,9409,6639],{"class":1301},[1087,9411,1717],{"class":1305},[1087,9413,6644],{"class":1301},[1087,9415,6647],{"class":1305},[1087,9417,2618],{"class":1301},[1087,9419,1809],{"class":1305},[1087,9421,2199],{"class":1301},[1087,9423,1519],{"class":1305},[1087,9425,6658],{"class":1305},[1087,9427,6661],{"class":1588},[1087,9429,1592],{"class":1305},[1087,9431,6666],{"class":1305},[1087,9433,4468],{"class":1301},[1087,9435,1809],{"class":1305},[1087,9437,2018],{"class":1301},[1087,9439,1489],{"class":1305},[1087,9441,6677],{"class":1097},[1087,9443,5384],{"class":1305},[1087,9445,6682],{"class":1301},[1087,9447,1809],{"class":1305},[1087,9449,6158],{"class":1301},[1087,9451,1489],{"class":1305},[1087,9453,6677],{"class":1097},[1087,9455,5384],{"class":1305},[1087,9457,6695],{"class":1301},[1087,9459,6698],{"class":1305},[1087,9461,1566],{"class":1305},[1087,9463,9464,9466],{"class":1089,"line":4091},[1087,9465,6705],{"class":1305},[1087,9467,6708],{"class":1311},[1087,9469,9470,9472,9474,9476,9478],{"class":1089,"line":4101},[1087,9471,6713],{"class":1588},[1087,9473,1592],{"class":1305},[1087,9475,1519],{"class":1305},[1087,9477,6720],{"class":1097},[1087,9479,5538],{"class":1305},[1087,9481,9482,9484,9486,9488,9490],{"class":1089,"line":4118},[1087,9483,6727],{"class":1588},[1087,9485,1592],{"class":1305},[1087,9487,1519],{"class":1305},[1087,9489,6734],{"class":1097},[1087,9491,5538],{"class":1305},[1087,9493,9494,9496,9498,9500,9502],{"class":1089,"line":4129},[1087,9495,6741],{"class":1588},[1087,9497,1592],{"class":1305},[1087,9499,1519],{"class":1305},[1087,9501,6748],{"class":1097},[1087,9503,5538],{"class":1305},[1087,9505,9506],{"class":1089,"line":4135},[1087,9507,6755],{"class":1305},[1087,9509,9510,9512],{"class":1089,"line":4141},[1087,9511,6760],{"class":1305},[1087,9513,6763],{"class":1311},[1087,9515,9516,9518,9520,9522,9524],{"class":1089,"line":4151},[1087,9517,6768],{"class":1588},[1087,9519,1592],{"class":1305},[1087,9521,1519],{"class":1305},[1087,9523,6734],{"class":1097},[1087,9525,5538],{"class":1305},[1087,9527,9528,9530,9532,9534,9536],{"class":1089,"line":4161},[1087,9529,6781],{"class":1588},[1087,9531,1592],{"class":1305},[1087,9533,1519],{"class":1305},[1087,9535,6788],{"class":1097},[1087,9537,5538],{"class":1305},[1087,9539,9540,9542,9544,9546,9548],{"class":1089,"line":4174},[1087,9541,6795],{"class":1588},[1087,9543,1592],{"class":1305},[1087,9545,1519],{"class":1305},[1087,9547,6802],{"class":1097},[1087,9549,5538],{"class":1305},[1087,9551,9552],{"class":1089,"line":4189},[1087,9553,6809],{"class":1305},[1087,9555,9556,9558,9560],{"class":1089,"line":4194},[1087,9557,6814],{"class":1305},[1087,9559,6817],{"class":1311},[1087,9561,1566],{"class":1305},[1087,9563,9564],{"class":1089,"line":4199},[1087,9565,1370],{"emptyLinePlaceholder":21},[1087,9567,9568,9570,9572,9574,9576,9578,9580,9582,9584],{"class":1089,"line":4209},[1087,9569,6705],{"class":1305},[1087,9571,1563],{"class":1311},[1087,9573,6832],{"class":1291},[1087,9575,1592],{"class":1305},[1087,9577,1519],{"class":1305},[1087,9579,6839],{"class":1110},[1087,9581,6842],{"class":1301},[1087,9583,1519],{"class":1305},[1087,9585,1566],{"class":1305},[1087,9587,9588,9590],{"class":1089,"line":4225},[1087,9589,6760],{"class":1305},[1087,9591,6763],{"class":1311},[1087,9593,9594,9596,9598,9600,9602],{"class":1089,"line":4240},[1087,9595,6857],{"class":1588},[1087,9597,1592],{"class":1305},[1087,9599,1519],{"class":1305},[1087,9601,6864],{"class":1097},[1087,9603,5538],{"class":1305},[1087,9605,9606,9608,9610,9612,9614],{"class":1089,"line":4246},[1087,9607,6768],{"class":1588},[1087,9609,1592],{"class":1305},[1087,9611,1519],{"class":1305},[1087,9613,6734],{"class":1097},[1087,9615,5538],{"class":1305},[1087,9617,9618,9620,9622,9624,9626],{"class":1089,"line":4252},[1087,9619,6781],{"class":1588},[1087,9621,1592],{"class":1305},[1087,9623,1519],{"class":1305},[1087,9625,6889],{"class":1097},[1087,9627,5538],{"class":1305},[1087,9629,9630,9632,9634,9636,9638],{"class":1089,"line":4260},[1087,9631,6795],{"class":1588},[1087,9633,1592],{"class":1305},[1087,9635,1519],{"class":1305},[1087,9637,6802],{"class":1097},[1087,9639,5538],{"class":1305},[1087,9641,9642],{"class":1089,"line":4265},[1087,9643,6809],{"class":1305},[1087,9645,9646,9648,9650,9652,9654,9656,9658,9660,9662,9664,9666,9668,9670],{"class":1089,"line":4271},[1087,9647,6760],{"class":1305},[1087,9649,976],{"class":1311},[1087,9651,6832],{"class":1588},[1087,9653,1592],{"class":1305},[1087,9655,1519],{"class":1305},[1087,9657,6922],{"class":1097},[1087,9659,1519],{"class":1305},[1087,9661,5465],{"class":1588},[1087,9663,1592],{"class":1305},[1087,9665,1519],{"class":1305},[1087,9667,6933],{"class":1097},[1087,9669,1519],{"class":1305},[1087,9671,1566],{"class":1305},[1087,9673,9674],{"class":1089,"line":4291},[1087,9675,6942],{"class":1301},[1087,9677,9678,9680,9682],{"class":1089,"line":4306},[1087,9679,6947],{"class":1305},[1087,9681,976],{"class":1311},[1087,9683,1566],{"class":1305},[1087,9685,9686,9688,9690],{"class":1089,"line":4323},[1087,9687,6814],{"class":1305},[1087,9689,1563],{"class":1311},[1087,9691,1566],{"class":1305},[1087,9693,9694,9696,9698],{"class":1089,"line":4346},[1087,9695,6964],{"class":1305},[1087,9697,1563],{"class":1311},[1087,9699,1566],{"class":1305},[1087,9701,9702,9704,9706],{"class":1089,"line":4357},[1087,9703,6973],{"class":1305},[1087,9705,1563],{"class":1311},[1087,9707,1566],{"class":1305},[1087,9709,9710,9712,9714],{"class":1089,"line":4365},[1087,9711,5507],{"class":1305},[1087,9713,5083],{"class":1311},[1087,9715,1566],{"class":1305},[1087,9717,9718],{"class":1089,"line":4371},[1087,9719,1370],{"emptyLinePlaceholder":21},[1087,9721,9722,9724],{"class":1089,"line":4376},[1087,9723,5481],{"class":1305},[1087,9725,5523],{"class":1311},[1087,9727,9728,9730,9732,9734,9736],{"class":1089,"line":4399},[1087,9729,5529],{"class":1588},[1087,9731,1592],{"class":1305},[1087,9733,1519],{"class":1305},[1087,9735,5194],{"class":1097},[1087,9737,5538],{"class":1305},[1087,9739,9740,9742,9744,9746,9748],{"class":1089,"line":4405},[1087,9741,7012],{"class":1588},[1087,9743,1592],{"class":1305},[1087,9745,1519],{"class":1305},[1087,9747,7019],{"class":1097},[1087,9749,5538],{"class":1305},[1087,9751,9752,9754,9756,9758,9760],{"class":1089,"line":4425},[1087,9753,5559],{"class":1588},[1087,9755,1592],{"class":1305},[1087,9757,1519],{"class":1305},[1087,9759,5566],{"class":1097},[1087,9761,5538],{"class":1305},[1087,9763,9764,9766,9768,9770,9772],{"class":1089,"line":4431},[1087,9765,6584],{"class":1588},[1087,9767,1592],{"class":1305},[1087,9769,1519],{"class":1305},[1087,9771,7044],{"class":1097},[1087,9773,5538],{"class":1305},[1087,9775,9776,9778,9780,9782,9784],{"class":1089,"line":4477},[1087,9777,5589],{"class":1588},[1087,9779,1592],{"class":1305},[1087,9781,1519],{"class":1305},[1087,9783,7057],{"class":1097},[1087,9785,5538],{"class":1305},[1087,9787,9788],{"class":1089,"line":4493},[1087,9789,5604],{"class":1305},[1087,9791,9792,9794],{"class":1089,"line":4526},[1087,9793,5610],{"class":1305},[1087,9795,7070],{"class":1311},[1087,9797,9798,9800,9802,9804,9806],{"class":1089,"line":4540},[1087,9799,7075],{"class":1588},[1087,9801,1592],{"class":1305},[1087,9803,1519],{"class":1305},[1087,9805,6572],{"class":1097},[1087,9807,5538],{"class":1305},[1087,9809,9810,9812,9814,9816,9818],{"class":1089,"line":4548},[1087,9811,7088],{"class":1588},[1087,9813,1592],{"class":1305},[1087,9815,1519],{"class":1305},[1087,9817,5623],{"class":1097},[1087,9819,5538],{"class":1305},[1087,9821,9822,9824,9826,9828,9830],{"class":1089,"line":4553},[1087,9823,7101],{"class":1588},[1087,9825,1592],{"class":1305},[1087,9827,1519],{"class":1305},[1087,9829,7108],{"class":1097},[1087,9831,5538],{"class":1305},[1087,9833,9834,9836,9838,9840,9842],{"class":1089,"line":4560},[1087,9835,7115],{"class":1588},[1087,9837,1592],{"class":1305},[1087,9839,1519],{"class":1305},[1087,9841,7122],{"class":1097},[1087,9843,5538],{"class":1305},[1087,9845,9846],{"class":1089,"line":4565},[1087,9847,7129],{"class":1305},[1087,9849,9850,9852,9854],{"class":1089,"line":4583},[1087,9851,5507],{"class":1305},[1087,9853,5077],{"class":1311},[1087,9855,1566],{"class":1305},[1087,9857,9858,9860,9862],{"class":1089,"line":7164},[1087,9859,5641],{"class":1305},[1087,9861,5462],{"class":1311},[1087,9863,1566],{"class":1305},[1087,9865,9867,9869,9871],{"class":1089,"line":9866},113,[1087,9868,1617],{"class":1305},[1087,9870,1563],{"class":1311},[1087,9872,1566],{"class":1305},[1087,9874,9876,9878,9880],{"class":1089,"line":9875},114,[1087,9877,1627],{"class":1305},[1087,9879,5427],{"class":1311},[1087,9881,1566],{"class":1305},[1087,9883,9885,9887,9889],{"class":1089,"line":9884},115,[1087,9886,1636],{"class":1305},[1087,9888,1563],{"class":1311},[1087,9890,1566],{"class":1305},[976,9892,4626,9893,9896,9897,9899],{},[1037,9894,9895],{},"refreshNuxtData('chats')"," call in the chat page's ",[1037,9898,7232],{}," callback (as shown earlier) ensures the chat list updates automatically when a new title is generated.",[980,9901,9903],{"id":9902},"adding-multi-model-support","Adding multi-model support",[976,9905,9906,9907,9910],{},"One of the benefits of using ",[1030,9908,4595],{"href":1066,"rel":9909},[1034]," is the ability to switch between models seamlessly. This section adds a model selector to the chat.",[1115,9912,9914],{"id":9913},"creating-a-models-composable","Creating a models composable",[976,9916,9917,9918,1315],{},"Define the available models and persist the user's selection using ",[1030,9919,9922],{"href":9920,"rel":9921},"https:\u002F\u002Fnuxt.com\u002Fdocs\u002Fapi\u002Fcomposables\u002Fuse-cookie",[1034],[1037,9923,9924],{},"useCookie",[1278,9926,9927],{},[1078,9928,9931],{"className":1282,"code":9929,"filename":9930,"language":1284,"meta":1083,"style":1083},"export function useModels() {\n  const models = [\n    { label: 'GPT-5 Nano', value: 'openai\u002Fgpt-5-nano', icon: 'i-simple-icons-openai' },\n    { label: 'Claude Haiku 4.5', value: 'anthropic\u002Fclaude-haiku-4.5', icon: 'i-simple-icons-anthropic' },\n    { label: 'Gemini 3 Flash', value: 'google\u002Fgemini-3-flash', icon: 'i-simple-icons-google' }\n  ]\n\n  const model = useCookie\u003Cstring>('ai-model', {\n    default: () => 'anthropic\u002Fclaude-haiku-4.5'\n  })\n\n  return {\n    models,\n    model\n  }\n}\n","app\u002Fcomposables\u002FuseModels.ts",[1037,9932,9933,9946,9957,10000,10041,10082,10087,10091,10121,10138,10144,10148,10154,10161,10166,10170],{"__ignoreMap":1083},[1087,9934,9935,9937,9939,9942,9944],{"class":1089,"line":1090},[1087,9936,1292],{"class":1291},[1087,9938,5176],{"class":1588},[1087,9940,9941],{"class":1110}," useModels",[1087,9943,1806],{"class":1305},[1087,9945,1381],{"class":1305},[1087,9947,9948,9950,9953,9955],{"class":1089,"line":1107},[1087,9949,2613],{"class":1588},[1087,9951,9952],{"class":1301}," models",[1087,9954,2623],{"class":1305},[1087,9956,1318],{"class":1311},[1087,9958,9959,9962,9964,9966,9968,9970,9972,9974,9976,9978,9980,9982,9984,9986,9989,9991,9993,9996,9998],{"class":1089,"line":1321},[1087,9960,9961],{"class":1305},"    {",[1087,9963,3090],{"class":1311},[1087,9965,1315],{"class":1305},[1087,9967,1392],{"class":1305},[1087,9969,3097],{"class":1097},[1087,9971,1330],{"class":1305},[1087,9973,1717],{"class":1305},[1087,9975,3076],{"class":1311},[1087,9977,1315],{"class":1305},[1087,9979,1392],{"class":1305},[1087,9981,3083],{"class":1097},[1087,9983,1330],{"class":1305},[1087,9985,1717],{"class":1305},[1087,9987,9988],{"class":1311}," icon",[1087,9990,1315],{"class":1305},[1087,9992,1392],{"class":1305},[1087,9994,9995],{"class":1097},"i-simple-icons-openai",[1087,9997,1330],{"class":1305},[1087,9999,3102],{"class":1305},[1087,10001,10002,10004,10006,10008,10010,10012,10014,10016,10018,10020,10022,10024,10026,10028,10030,10032,10034,10037,10039],{"class":1089,"line":1336},[1087,10003,9961],{"class":1305},[1087,10005,3090],{"class":1311},[1087,10007,1315],{"class":1305},[1087,10009,1392],{"class":1305},[1087,10011,3128],{"class":1097},[1087,10013,1330],{"class":1305},[1087,10015,1717],{"class":1305},[1087,10017,3076],{"class":1311},[1087,10019,1315],{"class":1305},[1087,10021,1392],{"class":1305},[1087,10023,3115],{"class":1097},[1087,10025,1330],{"class":1305},[1087,10027,1717],{"class":1305},[1087,10029,9988],{"class":1311},[1087,10031,1315],{"class":1305},[1087,10033,1392],{"class":1305},[1087,10035,10036],{"class":1097},"i-simple-icons-anthropic",[1087,10038,1330],{"class":1305},[1087,10040,3102],{"class":1305},[1087,10042,10043,10045,10047,10049,10051,10053,10055,10057,10059,10061,10063,10065,10067,10069,10071,10073,10075,10078,10080],{"class":1089,"line":1348},[1087,10044,9961],{"class":1305},[1087,10046,3090],{"class":1311},[1087,10048,1315],{"class":1305},[1087,10050,1392],{"class":1305},[1087,10052,3158],{"class":1097},[1087,10054,1330],{"class":1305},[1087,10056,1717],{"class":1305},[1087,10058,3076],{"class":1311},[1087,10060,1315],{"class":1305},[1087,10062,1392],{"class":1305},[1087,10064,3145],{"class":1097},[1087,10066,1330],{"class":1305},[1087,10068,1717],{"class":1305},[1087,10070,9988],{"class":1311},[1087,10072,1315],{"class":1305},[1087,10074,1392],{"class":1305},[1087,10076,10077],{"class":1097},"i-simple-icons-google",[1087,10079,1330],{"class":1305},[1087,10081,3163],{"class":1305},[1087,10083,10084],{"class":1089,"line":1359},[1087,10085,10086],{"class":1311},"  ]\n",[1087,10088,10089],{"class":1089,"line":1367},[1087,10090,1370],{"emptyLinePlaceholder":21},[1087,10092,10093,10095,10097,10099,10102,10104,10106,10108,10110,10112,10115,10117,10119],{"class":1089,"line":1373},[1087,10094,2613],{"class":1588},[1087,10096,3268],{"class":1301},[1087,10098,2623],{"class":1305},[1087,10100,10101],{"class":1110}," useCookie",[1087,10103,1560],{"class":1305},[1087,10105,3241],{"class":1093},[1087,10107,2666],{"class":1305},[1087,10109,1302],{"class":1311},[1087,10111,1330],{"class":1305},[1087,10113,10114],{"class":1097},"ai-model",[1087,10116,1330],{"class":1305},[1087,10118,1717],{"class":1305},[1087,10120,1381],{"class":1305},[1087,10122,10123,10126,10128,10130,10132,10134,10136],{"class":1089,"line":1384},[1087,10124,10125],{"class":1110},"    default",[1087,10127,1315],{"class":1305},[1087,10129,4962],{"class":1305},[1087,10131,1826],{"class":1588},[1087,10133,1392],{"class":1305},[1087,10135,3115],{"class":1097},[1087,10137,1356],{"class":1305},[1087,10139,10140,10142],{"class":1089,"line":1400},[1087,10141,2414],{"class":1305},[1087,10143,1492],{"class":1311},[1087,10145,10146],{"class":1089,"line":1406},[1087,10147,1370],{"emptyLinePlaceholder":21},[1087,10149,10150,10152],{"class":1089,"line":1411},[1087,10151,2840],{"class":1291},[1087,10153,1381],{"class":1305},[1087,10155,10156,10159],{"class":1089,"line":1434},[1087,10157,10158],{"class":1301},"    models",[1087,10160,1333],{"class":1305},[1087,10162,10163],{"class":1089,"line":1439},[1087,10164,10165],{"class":1301},"    model\n",[1087,10167,10168],{"class":1089,"line":1449},[1087,10169,3585],{"class":1305},[1087,10171,10172],{"class":1089,"line":1459},[1087,10173,5400],{"class":1305},[1115,10175,10177],{"id":10176},"building-the-model-selector","Building the model selector",[976,10179,1643,10180,10185],{},[1030,10181,10182],{"href":734},[1037,10183,10184],{},"USelectMenu"," component that displays the available models:",[1278,10187,10188],{},[1078,10189,10192],{"className":1550,"code":10190,"filename":10191,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nconst model = defineModel\u003Cstring>({ required: true })\n\nconst { models } = useModels()\n\nconst selectedModel = computed(() =>\n  models.find(m => m.value === model.value)\n)\n\u003C\u002Fscript>\n\n\u003Ctemplate>\n  \u003CUSelectMenu\n    v-model=\"model\"\n    :items=\"models\"\n    :icon=\"selectedModel?.icon\"\n    variant=\"ghost\"\n    value-key=\"value\"\n  \u002F>\n\u003C\u002Ftemplate>\n","app\u002Fcomponents\u002FModelSelect.vue",[1037,10193,10194,10214,10247,10251,10268,10272,10290,10322,10326,10334,10338,10346,10353,10366,10380,10394,10407,10420,10425],{"__ignoreMap":1083},[1087,10195,10196,10198,10200,10202,10204,10206,10208,10210,10212],{"class":1089,"line":1090},[1087,10197,1560],{"class":1305},[1087,10199,5112],{"class":1311},[1087,10201,5115],{"class":1588},[1087,10203,5118],{"class":1588},[1087,10205,1592],{"class":1305},[1087,10207,1519],{"class":1305},[1087,10209,1284],{"class":1097},[1087,10211,1519],{"class":1305},[1087,10213,1566],{"class":1305},[1087,10215,10216,10218,10221,10223,10226,10228,10230,10232,10234,10236,10239,10241,10243,10245],{"class":1089,"line":1107},[1087,10217,3061],{"class":1588},[1087,10219,10220],{"class":1301}," model ",[1087,10222,1592],{"class":1305},[1087,10224,10225],{"class":1110}," defineModel",[1087,10227,1560],{"class":1305},[1087,10229,3241],{"class":1093},[1087,10231,2666],{"class":1305},[1087,10233,1302],{"class":1301},[1087,10235,1866],{"class":1305},[1087,10237,10238],{"class":1311}," required",[1087,10240,1315],{"class":1305},[1087,10242,4169],{"class":1467},[1087,10244,1733],{"class":1305},[1087,10246,1492],{"class":1301},[1087,10248,10249],{"class":1089,"line":1321},[1087,10250,1370],{"emptyLinePlaceholder":21},[1087,10252,10253,10255,10257,10260,10262,10264,10266],{"class":1089,"line":1336},[1087,10254,3061],{"class":1588},[1087,10256,1711],{"class":1305},[1087,10258,10259],{"class":1301}," models ",[1087,10261,1489],{"class":1305},[1087,10263,2623],{"class":1305},[1087,10265,9941],{"class":1110},[1087,10267,2669],{"class":1301},[1087,10269,10270],{"class":1089,"line":1348},[1087,10271,1370],{"emptyLinePlaceholder":21},[1087,10273,10274,10276,10279,10281,10283,10285,10287],{"class":1089,"line":1359},[1087,10275,3061],{"class":1588},[1087,10277,10278],{"class":1301}," selectedModel ",[1087,10280,1592],{"class":1305},[1087,10282,7663],{"class":1110},[1087,10284,1302],{"class":1301},[1087,10286,1806],{"class":1305},[1087,10288,10289],{"class":1588}," =>\n",[1087,10291,10292,10295,10297,10300,10302,10304,10306,10308,10310,10313,10315,10317,10319],{"class":1089,"line":1367},[1087,10293,10294],{"class":1301},"  models",[1087,10296,1809],{"class":1305},[1087,10298,10299],{"class":1110},"find",[1087,10301,1302],{"class":1301},[1087,10303,3337],{"class":1943},[1087,10305,1826],{"class":1588},[1087,10307,3342],{"class":1301},[1087,10309,1809],{"class":1305},[1087,10311,10312],{"class":1301},"value ",[1087,10314,7742],{"class":1305},[1087,10316,3268],{"class":1301},[1087,10318,1809],{"class":1305},[1087,10320,10321],{"class":1301},"value)\n",[1087,10323,10324],{"class":1089,"line":1373},[1087,10325,1492],{"class":1301},[1087,10327,10328,10330,10332],{"class":1089,"line":1384},[1087,10329,1636],{"class":1305},[1087,10331,5112],{"class":1311},[1087,10333,1566],{"class":1305},[1087,10335,10336],{"class":1089,"line":1400},[1087,10337,1370],{"emptyLinePlaceholder":21},[1087,10339,10340,10342,10344],{"class":1089,"line":1406},[1087,10341,1560],{"class":1305},[1087,10343,1563],{"class":1311},[1087,10345,1566],{"class":1305},[1087,10347,10348,10350],{"class":1089,"line":1411},[1087,10349,1573],{"class":1305},[1087,10351,10352],{"class":1311},"USelectMenu\n",[1087,10354,10355,10358,10360,10362,10364],{"class":1089,"line":1434},[1087,10356,10357],{"class":1588},"    v-model",[1087,10359,1592],{"class":1305},[1087,10361,1519],{"class":1305},[1087,10363,4639],{"class":1097},[1087,10365,5538],{"class":1305},[1087,10367,10368,10371,10373,10375,10378],{"class":1089,"line":1439},[1087,10369,10370],{"class":1588},"    :items",[1087,10372,1592],{"class":1305},[1087,10374,1519],{"class":1305},[1087,10376,10377],{"class":1097},"models",[1087,10379,5538],{"class":1305},[1087,10381,10382,10385,10387,10389,10392],{"class":1089,"line":1449},[1087,10383,10384],{"class":1588},"    :icon",[1087,10386,1592],{"class":1305},[1087,10388,1519],{"class":1305},[1087,10390,10391],{"class":1097},"selectedModel?.icon",[1087,10393,5538],{"class":1305},[1087,10395,10396,10399,10401,10403,10405],{"class":1089,"line":1459},[1087,10397,10398],{"class":1588},"    variant",[1087,10400,1592],{"class":1305},[1087,10402,1519],{"class":1305},[1087,10404,7944],{"class":1097},[1087,10406,5538],{"class":1305},[1087,10408,10409,10412,10414,10416,10418],{"class":1089,"line":1475},[1087,10410,10411],{"class":1588},"    value-key",[1087,10413,1592],{"class":1305},[1087,10415,1519],{"class":1305},[1087,10417,3322],{"class":1097},[1087,10419,5538],{"class":1305},[1087,10421,10422],{"class":1089,"line":1481},[1087,10423,10424],{"class":1305},"  \u002F>\n",[1087,10426,10427,10429,10431],{"class":1089,"line":1486},[1087,10428,1636],{"class":1305},[1087,10430,1563],{"class":1311},[1087,10432,1566],{"class":1305},[1115,10434,10436],{"id":10435},"integrating-with-the-chat","Integrating with the chat",[976,10438,10439],{},"Update the chat page to include the model selector and pass the selected model to the server:",[1278,10441,10442],{},[1696,10443,10444],{},[1078,10445,10448],{"className":1550,"code":10446,"filename":5731,"highlights":10447,"language":34,"meta":1083,"style":1083},"\u003Cscript setup lang=\"ts\">\nimport { DefaultChatTransport, isReasoningUIPart, isTextUIPart } from 'ai'\nimport { Chat } from '@ai-sdk\u002Fvue'\nimport { isPartStreaming } 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=\"isPartStreaming(part)\"\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              \u003Ctemplate v-else-if=\"isTextUIPart(part)\">\n                \u003CMDC\n                  v-if=\"message.role === 'assistant'\"\n                  :value=\"part.text\"\n                  :cache-key=\"`${message.id}-${index}`\"\n                  class=\"*:first:mt-0 *:last:mb-0\"\n                \u002F>\n                \u003Cp v-else-if=\"message.role === 'user'\" class=\"whitespace-pre-wrap\">\n                  {{ part.text }}\n                \u003C\u002Fp>\n              \u003C\u002Ftemplate>\n            \u003C\u002Ftemplate>\n          \u003C\u002Ftemplate>\n        \u003C\u002FUChatMessages>\n\n        \u003CUChatPrompt\n          v-model=\"input\"\n          :error=\"chat.error\"\n          variant=\"subtle\"\n          class=\"sticky bottom-0\"\n          @submit=\"handleSubmit\"\n        >\n          \u003Ctemplate #footer>\n            \u003CModelSelect v-model=\"model\" \u002F>\n          \u003C\u002Ftemplate>\n\n          \u003CUChatPromptSubmit\n            :status=\"chat.status\"\n            color=\"neutral\"\n            @stop=\"chat.stop()\"\n            @reload=\"chat.regenerate()\"\n          \u002F>\n        \u003C\u002FUChatPrompt>\n      \u003C\u002FUContainer>\n    \u003C\u002Ftemplate>\n  \u003C\u002FUDashboardPanel>\n\u003C\u002Ftemplate>\n",[1373,2329,2361,2377,4346,4357,4365],[1037,10449,10450,10470,10496,10514,10532,10536,10548,10560,10577,10581,10623,10627,10643,10683,10687,10691,10707,10711,10727,10745,10763,10777,10803,10811,10827,10832,10841,10853,10877,10891,10895,10899,10911,10923,10937,10951,10963,10969,10973,10979,10983,11001,11011,11031,11057,11069,11073,11077,11081,11093,11121,11131,11135,11141,11149,11153,11161,11179,11191,11199,11207,11219,11237,11243,11255,11267,11271,11283,11287,11311,11377,11383,11395,11407,11419,11423,11429,11441,11453,11465,11469,11477,11481,11501,11507,11519,11531,11543,11555,11559,11587,11591,11599,11607,11616,11625,11634,11638,11644,11656,11668,11680,11692,11704,11708,11721,11741,11749,11753,11759,11771,11783,11795,11807,11811,11819,11828,11837,11846],{"__ignoreMap":1083},[1087,10451,10452,10454,10456,10458,10460,10462,10464,10466,10468],{"class":1089,"line":1090},[1087,10453,1560],{"class":1305},[1087,10455,5112],{"class":1311},[1087,10457,5115],{"class":1588},[1087,10459,5118],{"class":1588},[1087,10461,1592],{"class":1305},[1087,10463,1519],{"class":1305},[1087,10465,1284],{"class":1097},[1087,10467,1519],{"class":1305},[1087,10469,1566],{"class":1305},[1087,10471,10472,10474,10476,10478,10480,10482,10484,10486,10488,10490,10492,10494],{"class":1089,"line":1107},[1087,10473,1708],{"class":1291},[1087,10475,1711],{"class":1305},[1087,10477,5764],{"class":1301},[1087,10479,1717],{"class":1305},[1087,10481,5769],{"class":1301},[1087,10483,1717],{"class":1305},[1087,10485,5774],{"class":1301},[1087,10487,1733],{"class":1305},[1087,10489,1736],{"class":1291},[1087,10491,1392],{"class":1305},[1087,10493,2534],{"class":1097},[1087,10495,1356],{"class":1305},[1087,10497,10498,10500,10502,10504,10506,10508,10510,10512],{"class":1089,"line":1321},[1087,10499,1708],{"class":1291},[1087,10501,1711],{"class":1305},[1087,10503,5794],{"class":1301},[1087,10505,1733],{"class":1305},[1087,10507,1736],{"class":1291},[1087,10509,1392],{"class":1305},[1087,10511,5803],{"class":1097},[1087,10513,1356],{"class":1305},[1087,10515,10516,10518,10520,10522,10524,10526,10528,10530],{"class":1089,"line":1336},[1087,10517,1708],{"class":1291},[1087,10519,1711],{"class":1305},[1087,10521,5815],{"class":1301},[1087,10523,1733],{"class":1305},[1087,10525,1736],{"class":1291},[1087,10527,1392],{"class":1305},[1087,10529,5824],{"class":1097},[1087,10531,1356],{"class":1305},[1087,10533,10534],{"class":1089,"line":1348},[1087,10535,1370],{"emptyLinePlaceholder":21},[1087,10537,10538,10540,10542,10544,10546],{"class":1089,"line":1359},[1087,10539,3061],{"class":1588},[1087,10541,5837],{"class":1301},[1087,10543,1592],{"class":1305},[1087,10545,5842],{"class":1110},[1087,10547,2669],{"class":1301},[1087,10549,10550,10552,10554,10556,10558],{"class":1089,"line":1367},[1087,10551,3061],{"class":1588},[1087,10553,5851],{"class":1301},[1087,10555,1592],{"class":1305},[1087,10557,5856],{"class":1110},[1087,10559,2669],{"class":1301},[1087,10561,10563,10565,10567,10569,10571,10573,10575],{"class":10562,"line":1373},[1089,1570],[1087,10564,3061],{"class":1588},[1087,10566,1711],{"class":1305},[1087,10568,10220],{"class":1301},[1087,10570,1489],{"class":1305},[1087,10572,2623],{"class":1305},[1087,10574,9941],{"class":1110},[1087,10576,2669],{"class":1301},[1087,10578,10579],{"class":1089,"line":1384},[1087,10580,1370],{"emptyLinePlaceholder":21},[1087,10582,10583,10585,10587,10589,10591,10593,10595,10597,10599,10601,10603,10605,10607,10609,10611,10613,10615,10617,10619,10621],{"class":1089,"line":1400},[1087,10584,3061],{"class":1588},[1087,10586,1711],{"class":1305},[1087,10588,5876],{"class":1311},[1087,10590,1315],{"class":1305},[1087,10592,5881],{"class":1301},[1087,10594,1489],{"class":1305},[1087,10596,2623],{"class":1305},[1087,10598,2626],{"class":1291},[1087,10600,5890],{"class":1110},[1087,10602,1302],{"class":1301},[1087,10604,3677],{"class":1305},[1087,10606,5897],{"class":1097},[1087,10608,5384],{"class":1305},[1087,10610,5902],{"class":1301},[1087,10612,1809],{"class":1305},[1087,10614,5907],{"class":1301},[1087,10616,1809],{"class":1305},[1087,10618,2018],{"class":1301},[1087,10620,5393],{"class":1305},[1087,10622,1492],{"class":1301},[1087,10624,10625],{"class":1089,"line":1406},[1087,10626,1370],{"emptyLinePlaceholder":21},[1087,10628,10629,10631,10633,10635,10637,10639,10641],{"class":1089,"line":1411},[1087,10630,5924],{"class":1291},[1087,10632,1952],{"class":1301},[1087,10634,3533],{"class":1305},[1087,10636,5931],{"class":1301},[1087,10638,1809],{"class":1305},[1087,10640,5936],{"class":1301},[1087,10642,1306],{"class":1305},[1087,10644,10645,10647,10649,10651,10653,10655,10657,10659,10661,10663,10665,10667,10669,10671,10673,10675,10677,10679,10681],{"class":1089,"line":1434},[1087,10646,5943],{"class":1291},[1087,10648,2899],{"class":1110},[1087,10650,1302],{"class":1311},[1087,10652,1866],{"class":1305},[1087,10654,3555],{"class":1311},[1087,10656,1315],{"class":1305},[1087,10658,3561],{"class":3560},[1087,10660,1717],{"class":1305},[1087,10662,3566],{"class":1311},[1087,10664,1315],{"class":1305},[1087,10666,1392],{"class":1305},[1087,10668,3573],{"class":1097},[1087,10670,1330],{"class":1305},[1087,10672,1717],{"class":1305},[1087,10674,5972],{"class":1311},[1087,10676,1315],{"class":1305},[1087,10678,4169],{"class":1467},[1087,10680,1733],{"class":1305},[1087,10682,1492],{"class":1311},[1087,10684,10685],{"class":1089,"line":1439},[1087,10686,5400],{"class":1305},[1087,10688,10689],{"class":1089,"line":1449},[1087,10690,1370],{"emptyLinePlaceholder":21},[1087,10692,10693,10695,10697,10699,10701,10703,10705],{"class":1089,"line":1459},[1087,10694,3061],{"class":1588},[1087,10696,5135],{"class":1301},[1087,10698,1592],{"class":1305},[1087,10700,5140],{"class":1110},[1087,10702,1302],{"class":1301},[1087,10704,5145],{"class":1305},[1087,10706,1492],{"class":1301},[1087,10708,10709],{"class":1089,"line":1475},[1087,10710,1370],{"emptyLinePlaceholder":21},[1087,10712,10713,10715,10717,10719,10721,10723,10725],{"class":1089,"line":1481},[1087,10714,3061],{"class":1588},[1087,10716,6021],{"class":1301},[1087,10718,1592],{"class":1305},[1087,10720,1903],{"class":1305},[1087,10722,5794],{"class":1110},[1087,10724,1302],{"class":1301},[1087,10726,1306],{"class":1305},[1087,10728,10729,10731,10733,10735,10737,10739,10741,10743],{"class":1089,"line":1486},[1087,10730,1799],{"class":1311},[1087,10732,1315],{"class":1305},[1087,10734,6041],{"class":1301},[1087,10736,1809],{"class":1305},[1087,10738,3322],{"class":1301},[1087,10740,1809],{"class":1305},[1087,10742,2018],{"class":1301},[1087,10744,1333],{"class":1305},[1087,10746,10747,10749,10751,10753,10755,10757,10759,10761],{"class":1089,"line":2275},[1087,10748,1959],{"class":1311},[1087,10750,1315],{"class":1305},[1087,10752,6041],{"class":1301},[1087,10754,1809],{"class":1305},[1087,10756,3322],{"class":1301},[1087,10758,1809],{"class":1305},[1087,10760,1997],{"class":1301},[1087,10762,1333],{"class":1305},[1087,10764,10765,10767,10769,10771,10773,10775],{"class":1089,"line":2288},[1087,10766,6076],{"class":1311},[1087,10768,1315],{"class":1305},[1087,10770,1903],{"class":1305},[1087,10772,5764],{"class":1110},[1087,10774,1302],{"class":1301},[1087,10776,1306],{"class":1305},[1087,10778,10779,10781,10783,10785,10787,10789,10791,10793,10795,10797,10799,10801],{"class":1089,"line":2318},[1087,10780,6092],{"class":1311},[1087,10782,1315],{"class":1305},[1087,10784,3671],{"class":1305},[1087,10786,5897],{"class":1097},[1087,10788,5384],{"class":1305},[1087,10790,5931],{"class":1301},[1087,10792,1809],{"class":1305},[1087,10794,3322],{"class":1301},[1087,10796,1809],{"class":1305},[1087,10798,2018],{"class":1301},[1087,10800,5393],{"class":1305},[1087,10802,1333],{"class":1305},[1087,10804,10805,10807,10809],{"class":1089,"line":2324},[1087,10806,5282],{"class":1311},[1087,10808,1315],{"class":1305},[1087,10810,1381],{"class":1305},[1087,10812,10814,10816,10818,10820,10822,10824],{"class":10813,"line":2329},[1089,1570],[1087,10815,3650],{"class":1311},[1087,10817,1315],{"class":1305},[1087,10819,3268],{"class":1301},[1087,10821,1809],{"class":1305},[1087,10823,10312],{"class":1301},[1087,10825,10826],{"class":1471},"\u002F\u002F Pass the selected model\n",[1087,10828,10830],{"class":10829,"line":2361},[1089,1570],[1087,10831,1478],{"class":1305},[1087,10833,10835,10837,10839],{"class":10834,"line":2377},[1089,1570],[1087,10836,2414],{"class":1305},[1087,10838,1883],{"class":1301},[1087,10840,1333],{"class":1305},[1087,10842,10843,10845,10847,10849,10851],{"class":1089,"line":2395},[1087,10844,6128],{"class":1311},[1087,10846,1302],{"class":1305},[1087,10848,6133],{"class":1943},[1087,10850,1883],{"class":1305},[1087,10852,1381],{"class":1305},[1087,10854,10855,10857,10859,10861,10863,10865,10867,10869,10871,10873,10875],{"class":1089,"line":2411},[1087,10856,6149],{"class":1291},[1087,10858,1952],{"class":1311},[1087,10860,6133],{"class":1301},[1087,10862,1809],{"class":1305},[1087,10864,6158],{"class":1301},[1087,10866,3349],{"class":1305},[1087,10868,1392],{"class":1305},[1087,10870,4316],{"class":1097},[1087,10872,1330],{"class":1305},[1087,10874,3538],{"class":1311},[1087,10876,1306],{"class":1305},[1087,10878,10879,10881,10883,10885,10887,10889],{"class":1089,"line":2419},[1087,10880,6176],{"class":1110},[1087,10882,1302],{"class":1311},[1087,10884,1330],{"class":1305},[1087,10886,1788],{"class":1097},[1087,10888,1330],{"class":1305},[1087,10890,1492],{"class":1311},[1087,10892,10893],{"class":1089,"line":3414},[1087,10894,1478],{"class":1305},[1087,10896,10897],{"class":1089,"line":3427},[1087,10898,1403],{"class":1305},[1087,10900,10901,10903,10905,10907,10909],{"class":1089,"line":3432},[1087,10902,6202],{"class":1311},[1087,10904,1302],{"class":1305},[1087,10906,6207],{"class":1943},[1087,10908,1883],{"class":1305},[1087,10910,1381],{"class":1305},[1087,10912,10913,10915,10917,10919,10921],{"class":1089,"line":3438},[1087,10914,6217],{"class":1301},[1087,10916,1809],{"class":1305},[1087,10918,6222],{"class":1110},[1087,10920,1302],{"class":1311},[1087,10922,1306],{"class":1305},[1087,10924,10925,10927,10929,10931,10933,10935],{"class":1089,"line":3469},[1087,10926,6232],{"class":1311},[1087,10928,1315],{"class":1305},[1087,10930,1392],{"class":1305},[1087,10932,497],{"class":1097},[1087,10934,1330],{"class":1305},[1087,10936,1333],{"class":1305},[1087,10938,10939,10941,10943,10945,10947,10949],{"class":1089,"line":3513},[1087,10940,6248],{"class":1311},[1087,10942,1315],{"class":1305},[1087,10944,6253],{"class":1301},[1087,10946,1809],{"class":1305},[1087,10948,4468],{"class":1301},[1087,10950,1333],{"class":1305},[1087,10952,10953,10955,10957,10959,10961],{"class":1089,"line":3520},[1087,10954,6265],{"class":1311},[1087,10956,1315],{"class":1305},[1087,10958,1392],{"class":1305},[1087,10960,6207],{"class":1097},[1087,10962,1356],{"class":1305},[1087,10964,10965,10967],{"class":1089,"line":3525},[1087,10966,3376],{"class":1305},[1087,10968,1492],{"class":1311},[1087,10970,10971],{"class":1089,"line":3543},[1087,10972,3585],{"class":1305},[1087,10974,10975,10977],{"class":1089,"line":3582},[1087,10976,1489],{"class":1305},[1087,10978,1492],{"class":1301},[1087,10980,10981],{"class":1089,"line":3588},[1087,10982,1370],{"emptyLinePlaceholder":21},[1087,10984,10985,10987,10989,10991,10993,10995,10997,10999],{"class":1089,"line":3593},[1087,10986,6301],{"class":1588},[1087,10988,6304],{"class":1110},[1087,10990,1302],{"class":1305},[1087,10992,6309],{"class":1943},[1087,10994,1315],{"class":1305},[1087,10996,6314],{"class":1093},[1087,10998,1883],{"class":1305},[1087,11000,1381],{"class":1305},[1087,11002,11003,11005,11007,11009],{"class":1089,"line":3599},[1087,11004,6323],{"class":1301},[1087,11006,1809],{"class":1305},[1087,11008,6328],{"class":1110},[1087,11010,2669],{"class":1311},[1087,11012,11013,11015,11017,11019,11021,11023,11025,11027,11029],{"class":1089,"line":3619},[1087,11014,3528],{"class":1291},[1087,11016,1952],{"class":1311},[1087,11018,5194],{"class":1301},[1087,11020,1809],{"class":1305},[1087,11022,3322],{"class":1301},[1087,11024,1809],{"class":1305},[1087,11026,5203],{"class":1110},[1087,11028,5206],{"class":1311},[1087,11030,1306],{"class":1305},[1087,11032,11033,11035,11037,11039,11041,11043,11045,11047,11049,11051,11053,11055],{"class":1089,"line":3647},[1087,11034,6355],{"class":1301},[1087,11036,1809],{"class":1305},[1087,11038,6360],{"class":1110},[1087,11040,1302],{"class":1311},[1087,11042,1866],{"class":1305},[1087,11044,1720],{"class":1311},[1087,11046,1315],{"class":1305},[1087,11048,5338],{"class":1301},[1087,11050,1809],{"class":1305},[1087,11052,3322],{"class":1301},[1087,11054,1733],{"class":1305},[1087,11056,1492],{"class":1311},[1087,11058,11059,11061,11063,11065,11067],{"class":1089,"line":3663},[1087,11060,6383],{"class":1301},[1087,11062,1809],{"class":1305},[1087,11064,3322],{"class":1301},[1087,11066,2623],{"class":1305},[1087,11068,6392],{"class":1305},[1087,11070,11071],{"class":1089,"line":3682},[1087,11072,3585],{"class":1305},[1087,11074,11075],{"class":1089,"line":3710},[1087,11076,5400],{"class":1305},[1087,11078,11079],{"class":1089,"line":3717},[1087,11080,1370],{"emptyLinePlaceholder":21},[1087,11082,11083,11085,11087,11089,11091],{"class":1089,"line":3722},[1087,11084,6414],{"class":1110},[1087,11086,1302],{"class":1301},[1087,11088,1806],{"class":1305},[1087,11090,1826],{"class":1588},[1087,11092,1381],{"class":1305},[1087,11094,11095,11097,11099,11101,11103,11105,11107,11109,11111,11113,11115,11117,11119],{"class":1089,"line":3788},[1087,11096,3528],{"class":1291},[1087,11098,1952],{"class":1311},[1087,11100,5931],{"class":1301},[1087,11102,1809],{"class":1305},[1087,11104,3322],{"class":1301},[1087,11106,3843],{"class":1305},[1087,11108,1997],{"class":1301},[1087,11110,1809],{"class":1305},[1087,11112,3822],{"class":1301},[1087,11114,3349],{"class":1305},[1087,11116,3828],{"class":3560},[1087,11118,3538],{"class":1311},[1087,11120,1306],{"class":1305},[1087,11122,11123,11125,11127,11129],{"class":1089,"line":3793},[1087,11124,6355],{"class":1301},[1087,11126,1809],{"class":1305},[1087,11128,6459],{"class":1110},[1087,11130,2669],{"class":1311},[1087,11132,11133],{"class":1089,"line":3798},[1087,11134,3585],{"class":1305},[1087,11136,11137,11139],{"class":1089,"line":3804},[1087,11138,1489],{"class":1305},[1087,11140,1492],{"class":1301},[1087,11142,11143,11145,11147],{"class":1089,"line":3833},[1087,11144,1636],{"class":1305},[1087,11146,5112],{"class":1311},[1087,11148,1566],{"class":1305},[1087,11150,11151],{"class":1089,"line":3874},[1087,11152,1370],{"emptyLinePlaceholder":21},[1087,11154,11155,11157,11159],{"class":1089,"line":3903},[1087,11156,1560],{"class":1305},[1087,11158,1563],{"class":1311},[1087,11160,1566],{"class":1305},[1087,11162,11163,11165,11167,11169,11171,11173,11175,11177],{"class":1089,"line":3915},[1087,11164,1573],{"class":1305},[1087,11166,5427],{"class":1311},[1087,11168,5430],{"class":1588},[1087,11170,1592],{"class":1305},[1087,11172,1519],{"class":1305},[1087,11174,5437],{"class":1097},[1087,11176,1519],{"class":1305},[1087,11178,1566],{"class":1305},[1087,11180,11181,11183,11185,11187,11189],{"class":1089,"line":3931},[1087,11182,1582],{"class":1305},[1087,11184,1563],{"class":1311},[1087,11186,5450],{"class":1305},[1087,11188,8337],{"class":1588},[1087,11190,1566],{"class":1305},[1087,11192,11193,11195,11197],{"class":1089,"line":3945},[1087,11194,1606],{"class":1305},[1087,11196,8347],{"class":1311},[1087,11198,1612],{"class":1305},[1087,11200,11201,11203,11205],{"class":1089,"line":3952},[1087,11202,1617],{"class":1305},[1087,11204,1563],{"class":1311},[1087,11206,1566],{"class":1305},[1087,11208,11209,11211,11213,11215,11217],{"class":1089,"line":3957},[1087,11210,1582],{"class":1305},[1087,11212,1563],{"class":1311},[1087,11214,5450],{"class":1305},[1087,11216,5453],{"class":1588},[1087,11218,1566],{"class":1305},[1087,11220,11221,11223,11225,11227,11229,11231,11233,11235],{"class":1089,"line":3962},[1087,11222,1606],{"class":1305},[1087,11224,5462],{"class":1311},[1087,11226,5465],{"class":1588},[1087,11228,1592],{"class":1305},[1087,11230,1519],{"class":1305},[1087,11232,6536],{"class":1097},[1087,11234,1519],{"class":1305},[1087,11236,1566],{"class":1305},[1087,11238,11239,11241],{"class":1089,"line":3968},[1087,11240,5481],{"class":1305},[1087,11242,6547],{"class":1311},[1087,11244,11245,11247,11249,11251,11253],{"class":1089,"line":3985},[1087,11246,6552],{"class":1588},[1087,11248,1592],{"class":1305},[1087,11250,1519],{"class":1305},[1087,11252,6559],{"class":1097},[1087,11254,5538],{"class":1305},[1087,11256,11257,11259,11261,11263,11265],{"class":1089,"line":4007},[1087,11258,5544],{"class":1588},[1087,11260,1592],{"class":1305},[1087,11262,1519],{"class":1305},[1087,11264,6572],{"class":1097},[1087,11266,5538],{"class":1305},[1087,11268,11269],{"class":1089,"line":4025},[1087,11270,6579],{"class":1588},[1087,11272,11273,11275,11277,11279,11281],{"class":1089,"line":4033},[1087,11274,6584],{"class":1588},[1087,11276,1592],{"class":1305},[1087,11278,1519],{"class":1305},[1087,11280,6591],{"class":1097},[1087,11282,5538],{"class":1305},[1087,11284,11285],{"class":1089,"line":4050},[1087,11286,5604],{"class":1305},[1087,11288,11289,11291,11293,11295,11297,11299,11301,11303,11305,11307,11309],{"class":1089,"line":4071},[1087,11290,5610],{"class":1305},[1087,11292,1563],{"class":1311},[1087,11294,5450],{"class":1305},[1087,11296,371],{"class":1588},[1087,11298,1592],{"class":1305},[1087,11300,1519],{"class":1305},[1087,11302,1866],{"class":1305},[1087,11304,6616],{"class":1301},[1087,11306,1489],{"class":1305},[1087,11308,1519],{"class":1305},[1087,11310,1566],{"class":1305},[1087,11312,11313,11315,11317,11319,11321,11323,11325,11327,11329,11331,11333,11335,11337,11339,11341,11343,11345,11347,11349,11351,11353,11355,11357,11359,11361,11363,11365,11367,11369,11371,11373,11375],{"class":1089,"line":4081},[1087,11314,6627],{"class":1305},[1087,11316,1563],{"class":1311},[1087,11318,6632],{"class":1291},[1087,11320,1592],{"class":1305},[1087,11322,1519],{"class":1305},[1087,11324,6639],{"class":1301},[1087,11326,1717],{"class":1305},[1087,11328,6644],{"class":1301},[1087,11330,6647],{"class":1305},[1087,11332,2618],{"class":1301},[1087,11334,1809],{"class":1305},[1087,11336,2199],{"class":1301},[1087,11338,1519],{"class":1305},[1087,11340,6658],{"class":1305},[1087,11342,6661],{"class":1588},[1087,11344,1592],{"class":1305},[1087,11346,6666],{"class":1305},[1087,11348,4468],{"class":1301},[1087,11350,1809],{"class":1305},[1087,11352,2018],{"class":1301},[1087,11354,1489],{"class":1305},[1087,11356,6677],{"class":1097},[1087,11358,5384],{"class":1305},[1087,11360,6682],{"class":1301},[1087,11362,1809],{"class":1305},[1087,11364,6158],{"class":1301},[1087,11366,1489],{"class":1305},[1087,11368,6677],{"class":1097},[1087,11370,5384],{"class":1305},[1087,11372,6695],{"class":1301},[1087,11374,6698],{"class":1305},[1087,11376,1566],{"class":1305},[1087,11378,11379,11381],{"class":1089,"line":4091},[1087,11380,6705],{"class":1305},[1087,11382,6708],{"class":1311},[1087,11384,11385,11387,11389,11391,11393],{"class":1089,"line":4101},[1087,11386,6713],{"class":1588},[1087,11388,1592],{"class":1305},[1087,11390,1519],{"class":1305},[1087,11392,6720],{"class":1097},[1087,11394,5538],{"class":1305},[1087,11396,11397,11399,11401,11403,11405],{"class":1089,"line":4118},[1087,11398,6727],{"class":1588},[1087,11400,1592],{"class":1305},[1087,11402,1519],{"class":1305},[1087,11404,6734],{"class":1097},[1087,11406,5538],{"class":1305},[1087,11408,11409,11411,11413,11415,11417],{"class":1089,"line":4129},[1087,11410,6741],{"class":1588},[1087,11412,1592],{"class":1305},[1087,11414,1519],{"class":1305},[1087,11416,6748],{"class":1097},[1087,11418,5538],{"class":1305},[1087,11420,11421],{"class":1089,"line":4135},[1087,11422,6755],{"class":1305},[1087,11424,11425,11427],{"class":1089,"line":4141},[1087,11426,6760],{"class":1305},[1087,11428,6763],{"class":1311},[1087,11430,11431,11433,11435,11437,11439],{"class":1089,"line":4151},[1087,11432,6768],{"class":1588},[1087,11434,1592],{"class":1305},[1087,11436,1519],{"class":1305},[1087,11438,6734],{"class":1097},[1087,11440,5538],{"class":1305},[1087,11442,11443,11445,11447,11449,11451],{"class":1089,"line":4161},[1087,11444,6781],{"class":1588},[1087,11446,1592],{"class":1305},[1087,11448,1519],{"class":1305},[1087,11450,6788],{"class":1097},[1087,11452,5538],{"class":1305},[1087,11454,11455,11457,11459,11461,11463],{"class":1089,"line":4174},[1087,11456,6795],{"class":1588},[1087,11458,1592],{"class":1305},[1087,11460,1519],{"class":1305},[1087,11462,6802],{"class":1097},[1087,11464,5538],{"class":1305},[1087,11466,11467],{"class":1089,"line":4189},[1087,11468,6809],{"class":1305},[1087,11470,11471,11473,11475],{"class":1089,"line":4194},[1087,11472,6814],{"class":1305},[1087,11474,6817],{"class":1311},[1087,11476,1566],{"class":1305},[1087,11478,11479],{"class":1089,"line":4199},[1087,11480,1370],{"emptyLinePlaceholder":21},[1087,11482,11483,11485,11487,11489,11491,11493,11495,11497,11499],{"class":1089,"line":4209},[1087,11484,6705],{"class":1305},[1087,11486,1563],{"class":1311},[1087,11488,6832],{"class":1291},[1087,11490,1592],{"class":1305},[1087,11492,1519],{"class":1305},[1087,11494,6839],{"class":1110},[1087,11496,6842],{"class":1301},[1087,11498,1519],{"class":1305},[1087,11500,1566],{"class":1305},[1087,11502,11503,11505],{"class":1089,"line":4225},[1087,11504,6760],{"class":1305},[1087,11506,6763],{"class":1311},[1087,11508,11509,11511,11513,11515,11517],{"class":1089,"line":4240},[1087,11510,6857],{"class":1588},[1087,11512,1592],{"class":1305},[1087,11514,1519],{"class":1305},[1087,11516,6864],{"class":1097},[1087,11518,5538],{"class":1305},[1087,11520,11521,11523,11525,11527,11529],{"class":1089,"line":4246},[1087,11522,6768],{"class":1588},[1087,11524,1592],{"class":1305},[1087,11526,1519],{"class":1305},[1087,11528,6734],{"class":1097},[1087,11530,5538],{"class":1305},[1087,11532,11533,11535,11537,11539,11541],{"class":1089,"line":4252},[1087,11534,6781],{"class":1588},[1087,11536,1592],{"class":1305},[1087,11538,1519],{"class":1305},[1087,11540,6889],{"class":1097},[1087,11542,5538],{"class":1305},[1087,11544,11545,11547,11549,11551,11553],{"class":1089,"line":4260},[1087,11546,6795],{"class":1588},[1087,11548,1592],{"class":1305},[1087,11550,1519],{"class":1305},[1087,11552,6802],{"class":1097},[1087,11554,5538],{"class":1305},[1087,11556,11557],{"class":1089,"line":4265},[1087,11558,6809],{"class":1305},[1087,11560,11561,11563,11565,11567,11569,11571,11573,11575,11577,11579,11581,11583,11585],{"class":1089,"line":4271},[1087,11562,6760],{"class":1305},[1087,11564,976],{"class":1311},[1087,11566,6832],{"class":1588},[1087,11568,1592],{"class":1305},[1087,11570,1519],{"class":1305},[1087,11572,6922],{"class":1097},[1087,11574,1519],{"class":1305},[1087,11576,5465],{"class":1588},[1087,11578,1592],{"class":1305},[1087,11580,1519],{"class":1305},[1087,11582,6933],{"class":1097},[1087,11584,1519],{"class":1305},[1087,11586,1566],{"class":1305},[1087,11588,11589],{"class":1089,"line":4291},[1087,11590,6942],{"class":1301},[1087,11592,11593,11595,11597],{"class":1089,"line":4306},[1087,11594,6947],{"class":1305},[1087,11596,976],{"class":1311},[1087,11598,1566],{"class":1305},[1087,11600,11601,11603,11605],{"class":1089,"line":4323},[1087,11602,6814],{"class":1305},[1087,11604,1563],{"class":1311},[1087,11606,1566],{"class":1305},[1087,11608,11610,11612,11614],{"class":11609,"line":4346},[1089,1570],[1087,11611,6964],{"class":1305},[1087,11613,1563],{"class":1311},[1087,11615,1566],{"class":1305},[1087,11617,11619,11621,11623],{"class":11618,"line":4357},[1089,1570],[1087,11620,6973],{"class":1305},[1087,11622,1563],{"class":1311},[1087,11624,1566],{"class":1305},[1087,11626,11628,11630,11632],{"class":11627,"line":4365},[1089,1570],[1087,11629,5507],{"class":1305},[1087,11631,5083],{"class":1311},[1087,11633,1566],{"class":1305},[1087,11635,11636],{"class":1089,"line":4371},[1087,11637,1370],{"emptyLinePlaceholder":21},[1087,11639,11640,11642],{"class":1089,"line":4376},[1087,11641,5481],{"class":1305},[1087,11643,5523],{"class":1311},[1087,11645,11646,11648,11650,11652,11654],{"class":1089,"line":4399},[1087,11647,5529],{"class":1588},[1087,11649,1592],{"class":1305},[1087,11651,1519],{"class":1305},[1087,11653,5194],{"class":1097},[1087,11655,5538],{"class":1305},[1087,11657,11658,11660,11662,11664,11666],{"class":1089,"line":4405},[1087,11659,7012],{"class":1588},[1087,11661,1592],{"class":1305},[1087,11663,1519],{"class":1305},[1087,11665,7019],{"class":1097},[1087,11667,5538],{"class":1305},[1087,11669,11670,11672,11674,11676,11678],{"class":1089,"line":4425},[1087,11671,5559],{"class":1588},[1087,11673,1592],{"class":1305},[1087,11675,1519],{"class":1305},[1087,11677,5566],{"class":1097},[1087,11679,5538],{"class":1305},[1087,11681,11682,11684,11686,11688,11690],{"class":1089,"line":4431},[1087,11683,6584],{"class":1588},[1087,11685,1592],{"class":1305},[1087,11687,1519],{"class":1305},[1087,11689,7044],{"class":1097},[1087,11691,5538],{"class":1305},[1087,11693,11694,11696,11698,11700,11702],{"class":1089,"line":4477},[1087,11695,5589],{"class":1588},[1087,11697,1592],{"class":1305},[1087,11699,1519],{"class":1305},[1087,11701,7057],{"class":1097},[1087,11703,5538],{"class":1305},[1087,11705,11706],{"class":1089,"line":4493},[1087,11707,5604],{"class":1305},[1087,11709,11710,11712,11714,11716,11719],{"class":1089,"line":4526},[1087,11711,5610],{"class":1305},[1087,11713,1563],{"class":1311},[1087,11715,5450],{"class":1305},[1087,11717,11718],{"class":1588},"footer",[1087,11720,1566],{"class":1305},[1087,11722,11723,11725,11728,11731,11733,11735,11737,11739],{"class":1089,"line":4540},[1087,11724,6627],{"class":1305},[1087,11726,11727],{"class":1311},"ModelSelect",[1087,11729,11730],{"class":1588}," v-model",[1087,11732,1592],{"class":1305},[1087,11734,1519],{"class":1305},[1087,11736,4639],{"class":1097},[1087,11738,1519],{"class":1305},[1087,11740,1612],{"class":1305},[1087,11742,11743,11745,11747],{"class":1089,"line":4548},[1087,11744,6973],{"class":1305},[1087,11746,1563],{"class":1311},[1087,11748,1566],{"class":1305},[1087,11750,11751],{"class":1089,"line":4553},[1087,11752,1370],{"emptyLinePlaceholder":21},[1087,11754,11755,11757],{"class":1089,"line":4560},[1087,11756,5610],{"class":1305},[1087,11758,7070],{"class":1311},[1087,11760,11761,11763,11765,11767,11769],{"class":1089,"line":4565},[1087,11762,7075],{"class":1588},[1087,11764,1592],{"class":1305},[1087,11766,1519],{"class":1305},[1087,11768,6572],{"class":1097},[1087,11770,5538],{"class":1305},[1087,11772,11773,11775,11777,11779,11781],{"class":1089,"line":4583},[1087,11774,7088],{"class":1588},[1087,11776,1592],{"class":1305},[1087,11778,1519],{"class":1305},[1087,11780,5623],{"class":1097},[1087,11782,5538],{"class":1305},[1087,11784,11785,11787,11789,11791,11793],{"class":1089,"line":7164},[1087,11786,7101],{"class":1588},[1087,11788,1592],{"class":1305},[1087,11790,1519],{"class":1305},[1087,11792,7108],{"class":1097},[1087,11794,5538],{"class":1305},[1087,11796,11797,11799,11801,11803,11805],{"class":1089,"line":9866},[1087,11798,7115],{"class":1588},[1087,11800,1592],{"class":1305},[1087,11802,1519],{"class":1305},[1087,11804,7122],{"class":1097},[1087,11806,5538],{"class":1305},[1087,11808,11809],{"class":1089,"line":9875},[1087,11810,7129],{"class":1305},[1087,11812,11813,11815,11817],{"class":1089,"line":9884},[1087,11814,5507],{"class":1305},[1087,11816,5077],{"class":1311},[1087,11818,1566],{"class":1305},[1087,11820,11822,11824,11826],{"class":1089,"line":11821},116,[1087,11823,5641],{"class":1305},[1087,11825,5462],{"class":1311},[1087,11827,1566],{"class":1305},[1087,11829,11831,11833,11835],{"class":1089,"line":11830},117,[1087,11832,1617],{"class":1305},[1087,11834,1563],{"class":1311},[1087,11836,1566],{"class":1305},[1087,11838,11840,11842,11844],{"class":1089,"line":11839},118,[1087,11841,1627],{"class":1305},[1087,11843,5427],{"class":1311},[1087,11845,1566],{"class":1305},[1087,11847,11849,11851,11853],{"class":1089,"line":11848},119,[1087,11850,1636],{"class":1305},[1087,11852,1563],{"class":1311},[1087,11854,1566],{"class":1305},[980,11856,11858],{"id":11857},"going-further","Going further",[976,11860,11861],{},"You now have a working AI chatbot with database persistence! To take it further, consider adding:",[976,11863,11864],{},[994,11865,11866],{},"User Authentication",[976,11868,11869,11870,11875],{},"Add authentication with ",[1030,11871,11874],{"href":11872,"rel":11873},"https:\u002F\u002Fgithub.com\u002Fatinux\u002Fnuxt-auth-utils",[1034],"nuxt-auth-utils"," to let users access their chat history across devices and keep conversations private.",[976,11877,11878],{},[994,11879,11880],{},"AI Tools",[976,11882,11883,11884,11889],{},"Extend your chatbot with ",[1030,11885,11888],{"href":11886,"rel":11887},"https:\u002F\u002Fai-sdk.dev\u002Fdocs\u002Fai-sdk-core\u002Ftools-and-tool-calling",[1034],"AI SDK tools"," that can fetch real-time data, generate charts, or interact with external APIs:",[1078,11891,11893],{"className":1282,"code":11892,"language":1284,"meta":1083,"style":1083},"import { tool } from 'ai'\nimport { z } from 'zod'\n\nconst weatherTool = tool({\n  description: 'Get the current weather for a location',\n  parameters: z.object({\n    location: z.string().describe('The city name')\n  }),\n  execute: async ({ location }) => {\n    \u002F\u002F Fetch weather data from an API\n    return { location, temperature: 22, condition: 'Sunny' }\n  }\n})\n",[1037,11894,11895,11914,11932,11936,11951,11967,11984,12015,12023,12043,12048,12083,12087],{"__ignoreMap":1083},[1087,11896,11897,11899,11901,11904,11906,11908,11910,11912],{"class":1089,"line":1090},[1087,11898,1708],{"class":1291},[1087,11900,1711],{"class":1305},[1087,11902,11903],{"class":1301}," tool",[1087,11905,1733],{"class":1305},[1087,11907,1736],{"class":1291},[1087,11909,1392],{"class":1305},[1087,11911,2534],{"class":1097},[1087,11913,1356],{"class":1305},[1087,11915,11916,11918,11920,11922,11924,11926,11928,11930],{"class":1089,"line":1107},[1087,11917,1708],{"class":1291},[1087,11919,1711],{"class":1305},[1087,11921,2569],{"class":1301},[1087,11923,1733],{"class":1305},[1087,11925,1736],{"class":1291},[1087,11927,1392],{"class":1305},[1087,11929,2578],{"class":1097},[1087,11931,1356],{"class":1305},[1087,11933,11934],{"class":1089,"line":1321},[1087,11935,1370],{"emptyLinePlaceholder":21},[1087,11937,11938,11940,11943,11945,11947,11949],{"class":1089,"line":1336},[1087,11939,3061],{"class":1588},[1087,11941,11942],{"class":1301}," weatherTool ",[1087,11944,1592],{"class":1305},[1087,11946,11903],{"class":1110},[1087,11948,1302],{"class":1301},[1087,11950,1306],{"class":1305},[1087,11952,11953,11956,11958,11960,11963,11965],{"class":1089,"line":1348},[1087,11954,11955],{"class":1311},"  description",[1087,11957,1315],{"class":1305},[1087,11959,1392],{"class":1305},[1087,11961,11962],{"class":1097},"Get the current weather for a location",[1087,11964,1330],{"class":1305},[1087,11966,1333],{"class":1305},[1087,11968,11969,11972,11974,11976,11978,11980,11982],{"class":1089,"line":1359},[1087,11970,11971],{"class":1311},"  parameters",[1087,11973,1315],{"class":1305},[1087,11975,2569],{"class":1301},[1087,11977,1809],{"class":1305},[1087,11979,2641],{"class":1110},[1087,11981,1302],{"class":1301},[1087,11983,1306],{"class":1305},[1087,11985,11986,11989,11991,11993,11995,11997,11999,12001,12004,12006,12008,12011,12013],{"class":1089,"line":1367},[1087,11987,11988],{"class":1311},"    location",[1087,11990,1315],{"class":1305},[1087,11992,2569],{"class":1301},[1087,11994,1809],{"class":1305},[1087,11996,3241],{"class":1110},[1087,11998,1806],{"class":1301},[1087,12000,1809],{"class":1305},[1087,12002,12003],{"class":1110},"describe",[1087,12005,1302],{"class":1301},[1087,12007,1330],{"class":1305},[1087,12009,12010],{"class":1097},"The city name",[1087,12012,1330],{"class":1305},[1087,12014,1492],{"class":1301},[1087,12016,12017,12019,12021],{"class":1089,"line":1373},[1087,12018,2414],{"class":1305},[1087,12020,1883],{"class":1301},[1087,12022,1333],{"class":1305},[1087,12024,12025,12028,12030,12032,12034,12037,12039,12041],{"class":1089,"line":1384},[1087,12026,12027],{"class":1110},"  execute",[1087,12029,1315],{"class":1305},[1087,12031,3993],{"class":1588},[1087,12033,1940],{"class":1305},[1087,12035,12036],{"class":1943}," location",[1087,12038,1947],{"class":1305},[1087,12040,1826],{"class":1588},[1087,12042,1381],{"class":1305},[1087,12044,12045],{"class":1089,"line":1400},[1087,12046,12047],{"class":1471},"    \u002F\u002F Fetch weather data from an API\n",[1087,12049,12050,12053,12055,12057,12059,12062,12064,12067,12069,12072,12074,12076,12079,12081],{"class":1089,"line":1406},[1087,12051,12052],{"class":1291},"    return",[1087,12054,1711],{"class":1305},[1087,12056,12036],{"class":1301},[1087,12058,1717],{"class":1305},[1087,12060,12061],{"class":1311}," temperature",[1087,12063,1315],{"class":1305},[1087,12065,12066],{"class":3560}," 22",[1087,12068,1717],{"class":1305},[1087,12070,12071],{"class":1311}," condition",[1087,12073,1315],{"class":1305},[1087,12075,1392],{"class":1305},[1087,12077,12078],{"class":1097},"Sunny",[1087,12080,1330],{"class":1305},[1087,12082,3163],{"class":1305},[1087,12084,12085],{"class":1089,"line":1411},[1087,12086,3585],{"class":1305},[1087,12088,12089,12091],{"class":1089,"line":1434},[1087,12090,1489],{"class":1305},[1087,12092,1492],{"class":1301},[980,12094,12096],{"id":12095},"deploying-to-vercel","Deploying to Vercel",[976,12098,12099],{},"Deploy your chatbot to Vercel with zero configuration:",[1078,12101,12103],{"className":1080,"code":12102,"language":1082,"meta":1083,"style":1083},"npx vercel deploy\n",[1037,12104,12105],{"__ignoreMap":1083},[1087,12106,12107,12109,12112],{"class":1089,"line":1090},[1087,12108,1094],{"class":1093},[1087,12110,12111],{"class":1097}," vercel",[1087,12113,12114],{"class":1097}," deploy\n",[976,12116,12117],{},"Then, in the Vercel dashboard:",[988,12119,12120,12126],{},[991,12121,12122,12123,12125],{},"Enable ",[994,12124,4595],{}," and add credits so requests can be processed.",[991,12127,12128,12129,12132],{},"Add a ",[994,12130,12131],{},"Turso"," database from the Vercel Marketplace and connect it to your project (it will provision the database and add the required environment variables automatically).",[12134,12135,12136],"blockquote",{},[976,12137,12138,12139,12144,12145,12147],{},"Note: On Vercel, you ",[994,12140,12141,12142],{},"don’t need to manually add ",[1037,12143,1659],{}," — Vercel handles the gateway configuration for deployments. Keep using ",[1037,12146,1646],{}," locally for development.",[1666,12149,12150],{"to":1066,"target":1035},[976,12151,12152,12153,1809],{},"Learn more about setting up AI Gateway in the ",[994,12154,12155],{},"Vercel AI Gateway documentation",[980,12157,12159],{"id":12158},"conclusion","Conclusion",[976,12161,12162],{},"You've built a complete AI chatbot with:",[988,12164,12165,12171,12177,12182,12187],{},[991,12166,12167,12170],{},[994,12168,12169],{},"A complete chat interface"," using Nuxt UI components",[991,12172,12173,12176],{},[994,12174,12175],{},"Real-time streaming responses"," with the AI SDK",[991,12178,12179,12181],{},[994,12180,1008],{}," with MDC for rich content display",[991,12183,12184,12186],{},[994,12185,1014],{}," via AI Gateway",[991,12188,12189,12192],{},[994,12190,12191],{},"Database persistence"," with SQLite (local) \u002F Turso (production) and Drizzle ORM",[976,12194,12195],{},"The combination of Nuxt's full-stack capabilities, Nuxt UI's purpose-built chat components, a local SQLite dev database with a production Turso database, and the AI SDK's streaming infrastructure makes building AI applications straightforward and enjoyable.",[976,12197,12198],{},[994,12199,12200],{},"Resources:",[988,12202,12203,12210,12217,12224,12230,12236],{},[991,12204,12205],{},[1030,12206,12209],{"href":12207,"rel":12208},"https:\u002F\u002Fui.nuxt.com\u002Fcomponents\u002Fchat",[1034],"Nuxt UI Chat Components",[991,12211,12212],{},[1030,12213,12216],{"href":12214,"rel":12215},"https:\u002F\u002Fhub.nuxt.com\u002Fdocs\u002Ffeatures\u002Fdatabase",[1034],"NuxtHub Database",[991,12218,12219],{},[1030,12220,12223],{"href":12221,"rel":12222},"https:\u002F\u002Fai-sdk.dev",[1034],"AI SDK Documentation",[991,12225,12226],{},[1030,12227,12229],{"href":1066,"rel":12228},[1034],"AI Gateway Documentation",[991,12231,12232],{},[1030,12233,12235],{"href":1032,"rel":12234},[1034],"Nuxt AI Chat Template",[991,12237,12238],{},[1030,12239,12241],{"href":1043,"rel":12240},[1034],"Vue AI Chat Template",[976,12243,12244],{},"We're excited to see what you'll build!",[12246,12247,12248],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":1083,"searchDepth":1107,"depth":1107,"links":12250},[12251,12252,12253,12259,12264,12267,12268,12272,12273,12274,12279,12280,12281],{"id":982,"depth":1107,"text":983},{"id":1051,"depth":1107,"text":1052},{"id":1072,"depth":1107,"text":1073,"children":12254},[12255,12256,12257,12258],{"id":1117,"depth":1321,"text":1118},{"id":1268,"depth":1321,"text":1269},{"id":1537,"depth":1321,"text":1538},{"id":1677,"depth":1321,"text":1678},{"id":2457,"depth":1107,"text":2458,"children":12260},[12261,12262,12263],{"id":2469,"depth":1321,"text":2470},{"id":2852,"depth":1321,"text":2853},{"id":4686,"depth":1321,"text":4687},{"id":5068,"depth":1107,"text":5069,"children":12265},[12266],{"id":5087,"depth":1321,"text":5088},{"id":5704,"depth":1107,"text":5705},{"id":7343,"depth":1107,"text":7344,"children":12269},[12270,12271],{"id":7350,"depth":1321,"text":7351},{"id":7510,"depth":1321,"text":7511},{"id":8010,"depth":1107,"text":8011},{"id":8553,"depth":1107,"text":8554},{"id":9902,"depth":1107,"text":9903,"children":12275},[12276,12277,12278],{"id":9913,"depth":1321,"text":9914},{"id":10176,"depth":1321,"text":10177},{"id":10435,"depth":1321,"text":10436},{"id":11857,"depth":1107,"text":11858},{"id":12095,"depth":1107,"text":12096},{"id":12158,"depth":1107,"text":12159},"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":12287},"Tutorial","\u002Fblog\u002Fhow-to-build-an-ai-chat",{"title":960,"description":12283},"blog\u002Fhow-to-build-an-ai-chat","Eo-DKOJ8Ibs0otIlFIm2ukPhDbdPOcq8jUlcEDGNhis",1775136106086]