DuyTa's picture
Upload folder using huggingface_hub
bc20498 verified
raw
history blame
177 kB
{"version":3,"file":"Messages.js","sources":["../../../../src/lib/components/common/Loader.svelte","../../../../src/lib/components/common/FileItem.svelte","../../../../src/lib/components/icons/Bolt.svelte","../../../../src/lib/components/chat/MessageInput/Suggestions.svelte","../../../../src/lib/components/icons/EyeSlash.svelte","../../../../src/lib/components/chat/Messages/Placeholder.svelte","../../../../src/lib/components/chat/Messages/ProfileImageBase.svelte","../../../../src/lib/components/chat/Messages/ProfileImage.svelte","../../../../src/lib/components/common/ImagePreview.svelte","../../../../src/lib/components/common/Image.svelte","../../../../src/lib/components/chat/Messages/RateComment.svelte","../../../../src/lib/components/icons/ChevronUp.svelte","../../../../src/lib/components/icons/MagnifyingGlass.svelte","../../../../src/lib/components/common/Collapsible.svelte","../../../../src/lib/components/chat/Messages/ResponseMessage/WebSearchResults.svelte","../../../../src/lib/components/icons/Sparkles.svelte","../../../../src/lib/utils/marked/katex-extension.ts","../../../../src/lib/components/chat/Messages/CodeBlock.svelte","../../../../src/lib/components/chat/Messages/Markdown/KatexRenderer.svelte","../../../../src/lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte","../../../../src/lib/components/chat/Messages/Markdown/MarkdownTokens.svelte","../../../../src/lib/components/chat/Messages/Markdown.svelte","../../../../src/lib/components/chat/Messages/Error.svelte","../../../../src/lib/components/chat/Messages/CitationsModal.svelte","../../../../src/lib/components/chat/Messages/Citations.svelte","../../../../src/lib/components/chat/Messages/ResponseMessage.svelte","../../../../src/lib/components/chat/Messages/MultiResponseMessages.svelte","../../../../src/lib/components/chat/Messages/UserMessage.svelte","../../../../src/lib/components/chat/Messages/Message.svelte","../../../../src/lib/components/chat/Messages.svelte"],"sourcesContent":["<script lang=\"ts\">\n\timport { createEventDispatcher, onDestroy, onMount } from 'svelte';\n\tconst dispatch = createEventDispatcher();\n\n\tlet loaderElement: HTMLElement;\n\n\tlet observer;\n\tlet intervalId;\n\n\tonMount(() => {\n\t\tobserver = new IntersectionObserver(\n\t\t\t(entries, observer) => {\n\t\t\t\tentries.forEach((entry) => {\n\t\t\t\t\tif (entry.isIntersecting) {\n\t\t\t\t\t\tintervalId = setInterval(() => {\n\t\t\t\t\t\t\tdispatch('visible');\n\t\t\t\t\t\t}, 100);\n\t\t\t\t\t\t// dispatch('visible');\n\t\t\t\t\t\t// observer.unobserve(loaderElement); // Stop observing until content is loaded\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclearInterval(intervalId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\t{\n\t\t\t\troot: null, // viewport\n\t\t\t\trootMargin: '0px',\n\t\t\t\tthreshold: 0.1 // When 10% of the loader is visible\n\t\t\t}\n\t\t);\n\n\t\tobserver.observe(loaderElement);\n\t});\n\n\tonDestroy(() => {\n\t\tobserver.disconnect();\n\n\t\tif (intervalId) {\n\t\t\tclearInterval(intervalId);\n\t\t}\n\t});\n</script>\n\n<div bind:this={loaderElement}>\n\t<slot />\n</div>\n","<script lang=\"ts\">\n\timport { createEventDispatcher, getContext } from 'svelte';\n\n\tconst i18n = getContext('i18n');\n\tconst dispatch = createEventDispatcher();\n\n\texport let className = 'w-72';\n\texport let colorClassName = 'bg-white dark:bg-gray-800';\n\texport let url: string | null = null;\n\n\texport let clickHandler: Function | null = null;\n\n\texport let dismissible = false;\n\texport let status = 'processed';\n\n\texport let name: string;\n\texport let type: string;\n\texport let size: number;\n\n\tfunction formatSize(size) {\n\t\tif (size == null) return 'Unknown size';\n\t\tif (typeof size !== 'number' || size < 0) return 'Invalid size';\n\t\tif (size === 0) return '0 B';\n\t\tconst units = ['B', 'KB', 'MB', 'GB', 'TB'];\n\t\tlet unitIndex = 0;\n\n\t\twhile (size >= 1024 && unitIndex < units.length - 1) {\n\t\t\tsize /= 1024;\n\t\t\tunitIndex++;\n\t\t}\n\t\treturn `${size.toFixed(1)} ${units[unitIndex]}`;\n\t}\n</script>\n\n<div class=\"relative group\">\n\t<button\n\t\tclass=\"h-14 {className} flex items-center space-x-3 {colorClassName} rounded-xl border border-gray-100 dark:border-gray-800 text-left\"\n\t\ttype=\"button\"\n\t\ton:click={async () => {\n\t\t\tif (clickHandler === null) {\n\t\t\t\tif (url) {\n\t\t\t\t\tif (type === 'file') {\n\t\t\t\t\t\twindow.open(`${url}/content`, '_blank').focus();\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.open(`${url}`, '_blank').focus();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tclickHandler();\n\t\t\t}\n\t\t}}\n\t>\n\t\t<div class=\"p-4 py-[1.1rem] bg-red-400 text-white rounded-l-xl\">\n\t\t\t{#if status === 'processed'}\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclass=\" size-5\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\tfill-rule=\"evenodd\"\n\t\t\t\t\t\td=\"M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0 0 16.5 9h-1.875a1.875 1.875 0 0 1-1.875-1.875V5.25A3.75 3.75 0 0 0 9 1.5H5.625ZM7.5 15a.75.75 0 0 1 .75-.75h7.5a.75.75 0 0 1 0 1.5h-7.5A.75.75 0 0 1 7.5 15Zm.75 2.25a.75.75 0 0 0 0 1.5H12a.75.75 0 0 0 0-1.5H8.25Z\"\n\t\t\t\t\t\tclip-rule=\"evenodd\"\n\t\t\t\t\t/>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M12.971 1.816A5.23 5.23 0 0 1 14.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 0 1 3.434 1.279 9.768 9.768 0 0 0-6.963-6.963Z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t{:else}\n\t\t\t\t<svg\n\t\t\t\t\tclass=\" size-5 translate-y-[0.5px]\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t><style>\n\t\t\t\t\t\t.spinner_qM83 {\n\t\t\t\t\t\t\tanimation: spinner_8HQG 1.05s infinite;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t.spinner_oXPr {\n\t\t\t\t\t\t\tanimation-delay: 0.1s;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t.spinner_ZTLf {\n\t\t\t\t\t\t\tanimation-delay: 0.2s;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t@keyframes spinner_8HQG {\n\t\t\t\t\t\t\t0%,\n\t\t\t\t\t\t\t57.14% {\n\t\t\t\t\t\t\t\tanimation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1);\n\t\t\t\t\t\t\t\ttransform: translate(0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t28.57% {\n\t\t\t\t\t\t\t\tanimation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33);\n\t\t\t\t\t\t\t\ttransform: translateY(-6px);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t100% {\n\t\t\t\t\t\t\t\ttransform: translate(0);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t</style><circle class=\"spinner_qM83\" cx=\"4\" cy=\"12\" r=\"2.5\" /><circle\n\t\t\t\t\t\tclass=\"spinner_qM83 spinner_oXPr\"\n\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\tr=\"2.5\"\n\t\t\t\t\t/><circle class=\"spinner_qM83 spinner_ZTLf\" cx=\"20\" cy=\"12\" r=\"2.5\" /></svg\n\t\t\t\t>\n\t\t\t{/if}\n\t\t</div>\n\n\t\t<div class=\"flex flex-col justify-center -space-y-0.5 pl-1.5 pr-4 w-full\">\n\t\t\t<div class=\" dark:text-gray-100 text-sm font-medium line-clamp-1 mb-1\">\n\t\t\t\t{name}\n\t\t\t</div>\n\n\t\t\t<div class=\" flex justify-between text-gray-500 text-xs\">\n\t\t\t\t{#if type === 'file'}\n\t\t\t\t\t{$i18n.t('File')}\n\t\t\t\t{:else if type === 'doc'}\n\t\t\t\t\t{$i18n.t('Document')}\n\t\t\t\t{:else if type === 'collection'}\n\t\t\t\t\t{$i18n.t('Collection')}\n\t\t\t\t{:else}\n\t\t\t\t\t<span class=\" capitalize\">{type}</span>\n\t\t\t\t{/if}\n\t\t\t\t{#if size}\n\t\t\t\t\t<span class=\"capitalize\">{formatSize(size)}</span>\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t</div>\n\t</button>\n\n\t{#if dismissible}\n\t\t<div class=\" absolute -top-1 -right-1\">\n\t\t\t<button\n\t\t\t\tclass=\" bg-gray-400 text-white border border-white rounded-full group-hover:visible invisible transition\"\n\t\t\t\ttype=\"button\"\n\t\t\t\ton:click={() => {\n\t\t\t\t\tdispatch('dismiss');\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</div>\n\t{/if}\n</div>\n","<script lang=\"ts\">\n\texport let className = 'size-3';\n\texport let strokeWidth = '1.5';\n</script>\n\n<svg\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tfill=\"none\"\n\tviewBox=\"0 0 24 24\"\n\tstroke-width={strokeWidth}\n\tstroke=\"currentColor\"\n\tclass={className}\n>\n\t<path\n\t\tstroke-linecap=\"round\"\n\t\tstroke-linejoin=\"round\"\n\t\td=\"m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z\"\n\t/>\n</svg>\n","<script lang=\"ts\">\n\timport Bolt from '$lib/components/icons/Bolt.svelte';\n\timport { onMount, getContext } from 'svelte';\n\n\tconst i18n = getContext('i18n');\n\n\texport let submitPrompt: Function;\n\texport let suggestionPrompts = [];\n\n\tlet prompts = [];\n\n\t$: prompts = (suggestionPrompts ?? [])\n\t\t.reduce((acc, current) => [...acc, ...[current]], [])\n\t\t.sort(() => Math.random() - 0.5);\n\t// suggestionPrompts.length <= 4\n\t// \t? suggestionPrompts\n\t// \t: suggestionPrompts.sort(() => Math.random() - 0.5).slice(0, 4);\n\n\tonMount(() => {\n\t\tconst containerElement = document.getElementById('suggestions-container');\n\n\t\tif (containerElement) {\n\t\t\tcontainerElement.addEventListener('wheel', function (event) {\n\t\t\t\tif (event.deltaY !== 0) {\n\t\t\t\t\t// If scrolling vertically, prevent default behavior\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t// Adjust horizontal scroll position based on vertical scroll\n\t\t\t\t\tcontainerElement.scrollLeft += event.deltaY;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n</script>\n\n{#if prompts.length > 0}\n\t<div class=\"mb-2 flex gap-1 text-sm font-medium items-center text-gray-400 dark:text-gray-600\">\n\t\t<Bolt />\n\t\t{$i18n.t('Suggested')}\n\t</div>\n{/if}\n\n<div class=\"w-full\">\n\t<div\n\t\tclass=\"relative w-full flex gap-2 snap-x snap-mandatory md:snap-none overflow-x-auto tabs\"\n\t\tid=\"suggestions-container\"\n\t>\n\t\t{#each prompts as prompt, promptIdx}\n\t\t\t<div class=\"snap-center shrink-0\">\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flex flex-col flex-1 shrink-0 w-64 justify-between h-36 p-5 px-6 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 rounded-3xl transition group\"\n\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\tsubmitPrompt(prompt.content);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"flex flex-col text-left\">\n\t\t\t\t\t\t{#if prompt.title && prompt.title[0] !== ''}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\" font-medium dark:text-gray-300 dark:group-hover:text-gray-200 transition\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{prompt.title[0]}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"text-sm text-gray-600 font-normal line-clamp-2\">{prompt.title[1]}</div>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclass=\" text-sm font-medium dark:text-gray-300 dark:group-hover:text-gray-100 transition line-clamp-2\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{prompt.content}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\"w-full flex justify-between\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"text-xs text-gray-400 group-hover:text-gray-500 dark:text-gray-600 dark:group-hover:text-gray-500 transition self-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{$i18n.t('Prompt')}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"self-end p-1 rounded-lg text-gray-300 group-hover:text-gray-800 dark:text-gray-700 dark:group-hover:text-gray-100 transition\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\tviewBox=\"0 0 16 16\"\n\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\tclass=\"size-4\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\tfill-rule=\"evenodd\"\n\t\t\t\t\t\t\t\t\td=\"M8 14a.75.75 0 0 1-.75-.75V4.56L4.03 7.78a.75.75 0 0 1-1.06-1.06l4.5-4.5a.75.75 0 0 1 1.06 0l4.5 4.5a.75.75 0 0 1-1.06 1.06L8.75 4.56v8.69A.75.75 0 0 1 8 14Z\"\n\t\t\t\t\t\t\t\t\tclip-rule=\"evenodd\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t{/each}\n\n\t\t<!-- <div class=\"snap-center shrink-0\">\n\t\t<img\n\t\t\tclass=\"shrink-0 w-80 h-40 rounded-lg shadow-xl bg-white\"\n\t\t\tsrc=\"https://images.unsplash.com/photo-1604999565976-8913ad2ddb7c?ixlib=rb-1.2.1&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=320&amp;h=160&amp;q=80\"\n\t\t/>\n\t</div> -->\n\t</div>\n</div>\n\n<style>\n\t.tabs::-webkit-scrollbar {\n\t\tdisplay: none; /* for Chrome, Safari and Opera */\n\t}\n\n\t.tabs {\n\t\t-ms-overflow-style: none; /* IE and Edge */\n\t\tscrollbar-width: none; /* Firefox */\n\t}\n</style>\n","<script lang=\"ts\">\n\texport let className = 'w-4 h-4';\n\texport let strokeWidth = '1.5';\n</script>\n\n<svg\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tfill=\"none\"\n\tviewBox=\"0 0 24 24\"\n\tstroke-width={strokeWidth}\n\tstroke=\"currentColor\"\n\tclass={className}\n>\n\t<path\n\t\tstroke-linecap=\"round\"\n\t\tstroke-linejoin=\"round\"\n\t\td=\"M3.98 8.223A10.477 10.477 0 0 0 1.934 12C3.226 16.338 7.244 19.5 12 19.5c.993 0 1.953-.138 2.863-.395M6.228 6.228A10.451 10.451 0 0 1 12 4.5c4.756 0 8.773 3.162 10.065 7.498a10.522 10.522 0 0 1-4.293 5.774M6.228 6.228 3 3m3.228 3.228 3.65 3.65m7.894 7.894L21 21m-3.228-3.228-3.65-3.65m0 0a3 3 0 1 0-4.243-4.243m4.242 4.242L9.88 9.88\"\n\t/>\n</svg>\n","<script lang=\"ts\">\n\timport { WEBUI_BASE_URL } from '$lib/constants';\n\timport { marked } from 'marked';\n\n\timport { config, user, models as _models, temporaryChatEnabled } from '$lib/stores';\n\timport { onMount, getContext } from 'svelte';\n\n\timport { blur, fade } from 'svelte/transition';\n\n\timport Suggestions from '../MessageInput/Suggestions.svelte';\n\timport { sanitizeResponseContent } from '$lib/utils';\n\timport Tooltip from '$lib/components/common/Tooltip.svelte';\n\timport EyeSlash from '$lib/components/icons/EyeSlash.svelte';\n\n\tconst i18n = getContext('i18n');\n\n\texport let modelIds = [];\n\texport let models = [];\n\n\texport let submitPrompt;\n\n\tlet mounted = false;\n\tlet selectedModelIdx = 0;\n\n\t$: if (modelIds.length > 0) {\n\t\tselectedModelIdx = models.length - 1;\n\t}\n\n\t$: models = modelIds.map((id) => $_models.find((m) => m.id === id));\n\n\tonMount(() => {\n\t\tmounted = true;\n\t});\n</script>\n\n{#key mounted}\n\t<div class=\"m-auto w-full max-w-6xl px-8 lg:px-20\">\n\t\t<div class=\"flex justify-start\">\n\t\t\t<div class=\"flex -space-x-4 mb-0.5\" in:fade={{ duration: 200 }}>\n\t\t\t\t{#each models as model, modelIdx}\n\t\t\t\t\t<button\n\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\tselectedModelIdx = modelIdx;\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\tcontent={marked.parse(\n\t\t\t\t\t\t\t\tsanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description ?? '')\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\tplacement=\"right\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tcrossorigin=\"anonymous\"\n\t\t\t\t\t\t\t\tsrc={model?.info?.meta?.profile_image_url ??\n\t\t\t\t\t\t\t\t\t($i18n.language === 'dg-DG'\n\t\t\t\t\t\t\t\t\t\t? `/doge.png`\n\t\t\t\t\t\t\t\t\t\t: `${WEBUI_BASE_URL}/static/favicon.png`)}\n\t\t\t\t\t\t\t\tclass=\" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none\"\n\t\t\t\t\t\t\t\talt=\"logo\"\n\t\t\t\t\t\t\t\tdraggable=\"false\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</button>\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t</div>\n\n\t\t{#if $temporaryChatEnabled}\n\t\t\t<Tooltip\n\t\t\t\tcontent=\"This chat won't appear in history and your messages will not be saved.\"\n\t\t\t\tclassName=\"w-fit\"\n\t\t\t\tplacement=\"top-start\"\n\t\t\t>\n\t\t\t\t<div class=\"flex items-center gap-2 text-gray-500 font-medium text-lg my-2 w-fit\">\n\t\t\t\t\t<EyeSlash strokeWidth=\"2.5\" className=\"size-5\" /> Temporary Chat\n\t\t\t\t</div>\n\t\t\t</Tooltip>\n\t\t{/if}\n\n\t\t<div\n\t\t\tclass=\" mt-2 mb-4 text-3xl text-gray-800 dark:text-gray-100 font-medium text-left flex items-center gap-4 font-primary\"\n\t\t>\n\t\t\t<div>\n\t\t\t\t<div class=\" capitalize line-clamp-1\" in:fade={{ duration: 200 }}>\n\t\t\t\t\t{#if models[selectedModelIdx]?.info}\n\t\t\t\t\t\t{models[selectedModelIdx]?.info?.name}\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{$i18n.t('Hello, {{name}}', { name: $user.name })}\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\n\t\t\t\t<div in:fade={{ duration: 200, delay: 200 }}>\n\t\t\t\t\t{#if models[selectedModelIdx]?.info?.meta?.description ?? null}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3 markdown\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{@html marked.parse(\n\t\t\t\t\t\t\t\tsanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{#if models[selectedModelIdx]?.info?.meta?.user}\n\t\t\t\t\t\t\t<div class=\"mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500\">\n\t\t\t\t\t\t\t\tBy\n\t\t\t\t\t\t\t\t{#if models[selectedModelIdx]?.info?.meta?.user.community}\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\thref=\"https://openwebui.com/m/{models[selectedModelIdx]?.info?.meta?.user\n\t\t\t\t\t\t\t\t\t\t\t.username}\"\n\t\t\t\t\t\t\t\t\t\t>{models[selectedModelIdx]?.info?.meta?.user.name\n\t\t\t\t\t\t\t\t\t\t\t? models[selectedModelIdx]?.info?.meta?.user.name\n\t\t\t\t\t\t\t\t\t\t\t: `@${models[selectedModelIdx]?.info?.meta?.user.username}`}</a\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t{models[selectedModelIdx]?.info?.meta?.user.name}\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<div class=\" font-medium text-gray-400 dark:text-gray-500 line-clamp-1 font-p\">\n\t\t\t\t\t\t\t{$i18n.t('How can I help you today?')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<div class=\" w-full font-primary\" in:fade={{ duration: 200, delay: 300 }}>\n\t\t\t<Suggestions\n\t\t\t\tsuggestionPrompts={models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??\n\t\t\t\t\t$config?.default_prompt_suggestions ??\n\t\t\t\t\t[]}\n\t\t\t\t{submitPrompt}\n\t\t\t/>\n\t\t</div>\n\t</div>\n{/key}\n","<script lang=\"ts\">\n\timport { WEBUI_BASE_URL } from '$lib/constants';\n\n\texport let className = 'size-8';\n\texport let src = `${WEBUI_BASE_URL}/static/favicon.png`;\n</script>\n\n<img\n\tcrossorigin=\"anonymous\"\n\tsrc={src === ''\n\t\t? `${WEBUI_BASE_URL}/static/favicon.png`\n\t\t: src.startsWith(WEBUI_BASE_URL) ||\n\t\t\t src.startsWith('https://www.gravatar.com/avatar/') ||\n\t\t\t src.startsWith('data:') ||\n\t\t\t src.startsWith('/')\n\t\t\t? src\n\t\t\t: `/user.png`}\n\tclass=\" {className} object-cover rounded-full -translate-y-[1px]\"\n\talt=\"profile\"\n\tdraggable=\"false\"\n/>\n","<script lang=\"ts\">\n\timport { settings } from '$lib/stores';\n\timport ProfileImageBase from './ProfileImageBase.svelte';\n\n\texport let className = 'size-8';\n\texport let src = '';\n</script>\n\n<div class={`flex-shrink-0 ${($settings?.chatDirection ?? 'LTR') === 'LTR' ? 'mr-3' : 'ml-3'}`}>\n\t<ProfileImageBase {src} {className} />\n</div>\n","<script lang=\"ts\">\n\timport { onDestroy, onMount } from 'svelte';\n\n\texport let show = false;\n\texport let src = '';\n\texport let alt = '';\n\n\tlet mounted = false;\n\n\tlet previewElement = null;\n\n\tconst downloadImage = (url, filename, prefixName = '') => {\n\t\tfetch(url)\n\t\t\t.then((response) => response.blob())\n\t\t\t.then((blob) => {\n\t\t\t\tconst objectUrl = window.URL.createObjectURL(blob);\n\t\t\t\tconst link = document.createElement('a');\n\t\t\t\tlink.href = objectUrl;\n\t\t\t\tlink.download = `${prefixName}${filename}`;\n\t\t\t\tdocument.body.appendChild(link);\n\t\t\t\tlink.click();\n\t\t\t\tdocument.body.removeChild(link);\n\t\t\t\twindow.URL.revokeObjectURL(objectUrl);\n\t\t\t})\n\t\t\t.catch((error) => console.error('Error downloading image:', error));\n\t};\n\n\tconst handleKeyDown = (event: KeyboardEvent) => {\n\t\tif (event.key === 'Escape') {\n\t\t\tconsole.log('Escape');\n\t\t\tshow = false;\n\t\t}\n\t};\n\n\tonMount(() => {\n\t\tmounted = true;\n\t});\n\n\t$: if (show && previewElement) {\n\t\tdocument.body.appendChild(previewElement);\n\t\twindow.addEventListener('keydown', handleKeyDown);\n\t\tdocument.body.style.overflow = 'hidden';\n\t} else if (previewElement) {\n\t\twindow.removeEventListener('keydown', handleKeyDown);\n\t\tdocument.body.removeChild(previewElement);\n\t\tdocument.body.style.overflow = 'unset';\n\t}\n\n\tonDestroy(() => {\n\t\tshow = false;\n\n\t\tif (previewElement) {\n\t\t\tdocument.body.removeChild(previewElement);\n\t\t}\n\t});\n</script>\n\n{#if show}\n\t<!-- svelte-ignore a11y-click-events-have-key-events -->\n\t<!-- svelte-ignore a11y-no-static-element-interactions -->\n\t<div\n\t\tbind:this={previewElement}\n\t\tclass=\"modal fixed top-0 right-0 left-0 bottom-0 bg-black text-white w-full min-h-screen h-screen flex justify-center z-[9999] overflow-hidden overscroll-contain\"\n\t>\n\t\t<div class=\" absolute left-0 w-full flex justify-between select-none\">\n\t\t\t<div>\n\t\t\t\t<button\n\t\t\t\t\tclass=\" p-5\"\n\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\tshow = false;\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\tclass=\"w-6 h-6\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\" />\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div>\n\t\t\t\t<button\n\t\t\t\t\tclass=\" p-5\"\n\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\tdownloadImage(src, src.substring(src.lastIndexOf('/') + 1), alt);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\tclass=\"w-6 h-6\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td=\"M10.75 2.75a.75.75 0 0 0-1.5 0v8.614L6.295 8.235a.75.75 0 1 0-1.09 1.03l4.25 4.5a.75.75 0 0 0 1.09 0l4.25-4.5a.75.75 0 0 0-1.09-1.03l-2.955 3.129V2.75Z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\td=\"M3.5 12.75a.75.75 0 0 0-1.5 0v2.5A2.75 2.75 0 0 0 4.75 18h10.5A2.75 2.75 0 0 0 18 15.25v-2.5a.75.75 0 0 0-1.5 0v2.5c0 .69-.56 1.25-1.25 1.25H4.75c-.69 0-1.25-.56-1.25-1.25v-2.5Z\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t</div>\n\t\t<img {src} {alt} class=\" mx-auto h-full object-scale-down select-none\" draggable=\"false\" />\n\t</div>\n{/if}\n","<script lang=\"ts\">\n\timport { WEBUI_BASE_URL } from '$lib/constants';\n\timport ImagePreview from './ImagePreview.svelte';\n\n\texport let src = '';\n\texport let alt = '';\n\n\texport let className = ' w-full';\n\n\tlet _src = '';\n\t$: _src = src.startsWith('/') ? `${WEBUI_BASE_URL}${src}` : src;\n\n\tlet showImagePreview = false;\n</script>\n\n<button\n\tclass={className}\n\ton:click={() => {\n\t\tshowImagePreview = true;\n\t}}\n>\n\t<img src={_src} {alt} class=\" rounded-lg cursor-pointer\" draggable=\"false\" data-cy=\"image\" />\n</button>\n\n<ImagePreview bind:show={showImagePreview} src={_src} {alt} />\n","<script lang=\"ts\">\n\timport { toast } from 'svelte-sonner';\n\n\timport { createEventDispatcher, onMount, getContext } from 'svelte';\n\n\tconst i18n = getContext('i18n');\n\n\tconst dispatch = createEventDispatcher();\n\n\texport let message;\n\texport let show = false;\n\n\tlet LIKE_REASONS = [];\n\tlet DISLIKE_REASONS = [];\n\n\tfunction loadReasons() {\n\t\tLIKE_REASONS = [\n\t\t\t$i18n.t('Accurate information'),\n\t\t\t$i18n.t('Followed instructions perfectly'),\n\t\t\t$i18n.t('Showcased creativity'),\n\t\t\t$i18n.t('Positive attitude'),\n\t\t\t$i18n.t('Attention to detail'),\n\t\t\t$i18n.t('Thorough explanation'),\n\t\t\t$i18n.t('Other')\n\t\t];\n\n\t\tDISLIKE_REASONS = [\n\t\t\t$i18n.t(\"Don't like the style\"),\n\t\t\t$i18n.t('Not factually correct'),\n\t\t\t$i18n.t(\"Didn't fully follow instructions\"),\n\t\t\t$i18n.t(\"Refused when it shouldn't have\"),\n\t\t\t$i18n.t('Being lazy'),\n\t\t\t$i18n.t('Other')\n\t\t];\n\t}\n\n\tlet reasons = [];\n\tlet selectedReason = null;\n\tlet comment = '';\n\n\t$: if (message?.annotation?.rating === 1) {\n\t\treasons = LIKE_REASONS;\n\t} else if (message?.annotation?.rating === -1) {\n\t\treasons = DISLIKE_REASONS;\n\t}\n\n\tonMount(() => {\n\t\tselectedReason = message?.annotation?.reason ?? '';\n\t\tcomment = message?.annotation?.comment ?? '';\n\t\tloadReasons();\n\t});\n\n\tconst submitHandler = () => {\n\t\tconsole.log('submitHandler');\n\n\t\tif (!selectedReason) {\n\t\t\ttoast.error($i18n.t('Please select a reason'));\n\t\t\treturn;\n\t\t}\n\n\t\tdispatch('submit', {\n\t\t\treason: selectedReason,\n\t\t\tcomment: comment\n\t\t});\n\n\t\ttoast.success($i18n.t('Thanks for your feedback!'));\n\t\tshow = false;\n\t};\n</script>\n\n<div\n\tclass=\" my-2.5 rounded-xl px-4 py-3 border dark:border-gray-850\"\n\tid=\"message-feedback-{message.id}\"\n>\n\t<div class=\"flex justify-between items-center\">\n\t\t<div class=\" text-sm\">{$i18n.t('Tell us more:')}</div>\n\n\t\t<button\n\t\t\ton:click={() => {\n\t\t\t\tshow = false;\n\t\t\t}}\n\t\t>\n\t\t\t<svg\n\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\tfill=\"none\"\n\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\tstroke-width=\"1.5\"\n\t\t\t\tstroke=\"currentColor\"\n\t\t\t\tclass=\"size-4\"\n\t\t\t>\n\t\t\t\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\" />\n\t\t\t</svg>\n\t\t</button>\n\t</div>\n\n\t{#if reasons.length > 0}\n\t\t<div class=\"flex flex-wrap gap-2 text-sm mt-2.5\">\n\t\t\t{#each reasons as reason}\n\t\t\t\t<button\n\t\t\t\t\tclass=\"px-3.5 py-1 border dark:border-gray-850 hover:bg-gray-100 dark:hover:bg-gray-850 {selectedReason ===\n\t\t\t\t\treason\n\t\t\t\t\t\t? 'bg-gray-200 dark:bg-gray-800'\n\t\t\t\t\t\t: ''} transition rounded-lg\"\n\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\tselectedReason = reason;\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{reason}\n\t\t\t\t</button>\n\t\t\t{/each}\n\t\t</div>\n\t{/if}\n\n\t<div class=\"mt-2\">\n\t\t<textarea\n\t\t\tbind:value={comment}\n\t\t\tclass=\"w-full text-sm px-1 py-2 bg-transparent outline-none resize-none rounded-xl\"\n\t\t\tplaceholder={$i18n.t('Feel free to add specific details')}\n\t\t\trows=\"2\"\n\t\t/>\n\t</div>\n\n\t<div class=\"mt-2 flex justify-end\">\n\t\t<button\n\t\t\tclass=\" bg-emerald-700 text-white text-sm font-medium rounded-lg px-3.5 py-1.5\"\n\t\t\ton:click={() => {\n\t\t\t\tsubmitHandler();\n\t\t\t}}\n\t\t>\n\t\t\t{$i18n.t('Submit')}\n\t\t</button>\n\t</div>\n</div>\n","<script lang=\"ts\">\n\texport let className = 'w-4 h-4';\n\texport let strokeWidth = '1.5';\n</script>\n\n<svg\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tfill=\"none\"\n\tviewBox=\"0 0 24 24\"\n\tstroke-width={strokeWidth}\n\tstroke=\"currentColor\"\n\tclass={className}\n>\n\t<path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m4.5 15.75 7.5-7.5 7.5 7.5\" />\n</svg>\n","<script lang=\"ts\">\n\texport let className = 'size-4';\n\texport let strokeWidth = '2';\n</script>\n\n<svg\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tfill=\"none\"\n\tviewBox=\"0 0 24 24\"\n\tstroke-width={strokeWidth}\n\tstroke=\"currentColor\"\n\tclass={className}\n>\n\t<path\n\t\tstroke-linecap=\"round\"\n\t\tstroke-linejoin=\"round\"\n\t\td=\"m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z\"\n\t/>\n</svg>\n","<script lang=\"ts\">\n\timport { slide } from 'svelte/transition';\n\timport { quintOut } from 'svelte/easing';\n\n\timport ChevronUp from '../icons/ChevronUp.svelte';\n\timport ChevronDown from '../icons/ChevronDown.svelte';\n\n\texport let open = false;\n\texport let className = '';\n\texport let title = null;\n</script>\n\n<div class={className}>\n\t{#if title !== null}\n\t\t<button class=\"w-full\" on:click={() => (open = !open)}>\n\t\t\t<div class=\" w-full font-medium transition flex items-center justify-between gap-2\">\n\t\t\t\t<div>\n\t\t\t\t\t{title}\n\t\t\t\t</div>\n\n\t\t\t\t<div>\n\t\t\t\t\t{#if open}\n\t\t\t\t\t\t<ChevronUp strokeWidth=\"3.5\" className=\"size-3.5 \" />\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<ChevronDown strokeWidth=\"3.5\" className=\"size-3.5 \" />\n\t\t\t\t\t{/if}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</button>\n\t{:else}\n\t\t<button on:click={() => (open = !open)}>\n\t\t\t<div\n\t\t\t\tclass=\"flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition\"\n\t\t\t>\n\t\t\t\t<slot />\n\t\t\t</div>\n\t\t</button>\n\t{/if}\n\n\t{#if open}\n\t\t<div transition:slide={{ duration: 300, easing: quintOut, axis: 'y' }}>\n\t\t\t<slot name=\"content\" />\n\t\t</div>\n\t{/if}\n</div>\n","<script lang=\"ts\">\n\timport ChevronDown from '$lib/components/icons/ChevronDown.svelte';\n\timport ChevronUp from '$lib/components/icons/ChevronUp.svelte';\n\timport MagnifyingGlass from '$lib/components/icons/MagnifyingGlass.svelte';\n\timport Collapsible from '$lib/components/common/Collapsible.svelte';\n\n\texport let status = { urls: [], query: '' };\n\tlet state = false;\n</script>\n\n<Collapsible bind:open={state} className=\"w-full space-y-1\">\n\t<div\n\t\tclass=\"flex items-center gap-2 text-gray-500 hover:text-gray-700 dark:hover:text-gray-300 transition\"\n\t>\n\t\t<slot />\n\n\t\t{#if state}\n\t\t\t<ChevronUp strokeWidth=\"3.5\" className=\"size-3.5 \" />\n\t\t{:else}\n\t\t\t<ChevronDown strokeWidth=\"3.5\" className=\"size-3.5 \" />\n\t\t{/if}\n\t</div>\n\t<div\n\t\tclass=\"text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl mb-1.5\"\n\t\tslot=\"content\"\n\t>\n\t\t{#if status?.query}\n\t\t\t<a\n\t\t\t\thref=\"https://www.google.com/search?q={status.query}\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\tclass=\"flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 dark:text-gray-300 no-underline\"\n\t\t\t>\n\t\t\t\t<div class=\"flex gap-2 items-center\">\n\t\t\t\t\t<MagnifyingGlass />\n\n\t\t\t\t\t<div class=\" line-clamp-1\">\n\t\t\t\t\t\t{status.query}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tclass=\" ml-1 text-white dark:text-gray-900 group-hover/item:text-gray-600 dark:group-hover/item:text-white transition\"\n\t\t\t\t>\n\t\t\t\t\t<!-- -->\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\tviewBox=\"0 0 16 16\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\tclass=\"size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tfill-rule=\"evenodd\"\n\t\t\t\t\t\t\td=\"M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z\"\n\t\t\t\t\t\t\tclip-rule=\"evenodd\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</a>\n\t\t{/if}\n\n\t\t{#each status.urls as url, urlIdx}\n\t\t\t<a\n\t\t\t\thref={url}\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\tclass=\"flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1\n\t\t\t\t\t? ''\n\t\t\t\t\t: 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 dark:text-gray-300\"\n\t\t\t>\n\t\t\t\t<div class=\" line-clamp-1\">\n\t\t\t\t\t{url}\n\t\t\t\t</div>\n\n\t\t\t\t<div\n\t\t\t\t\tclass=\" ml-1 text-white dark:text-gray-900 group-hover/item:text-gray-600 dark:group-hover/item:text-white transition\"\n\t\t\t\t>\n\t\t\t\t\t<!-- -->\n\t\t\t\t\t<svg\n\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\tviewBox=\"0 0 16 16\"\n\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\tclass=\"size-4\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<path\n\t\t\t\t\t\t\tfill-rule=\"evenodd\"\n\t\t\t\t\t\t\td=\"M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z\"\n\t\t\t\t\t\t\tclip-rule=\"evenodd\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</a>\n\t\t{/each}\n\t</div>\n</Collapsible>\n","<script lang=\"ts\">\n\texport let className = 'w-4 h-4';\n\texport let strokeWidth = '1.5';\n</script>\n\n<svg\n\txmlns=\"http://www.w3.org/2000/svg\"\n\tfill=\"none\"\n\tviewBox=\"0 0 24 24\"\n\tstroke-width={strokeWidth}\n\tstroke=\"currentColor\"\n\tclass={className}\n>\n\t<path\n\t\tstroke-linecap=\"round\"\n\t\tstroke-linejoin=\"round\"\n\t\td=\"M9.813 15.904 9 18.75l-.813-2.846a4.5 4.5 0 0 0-3.09-3.09L2.25 12l2.846-.813a4.5 4.5 0 0 0 3.09-3.09L9 5.25l.813 2.846a4.5 4.5 0 0 0 3.09 3.09L15.75 12l-2.846.813a4.5 4.5 0 0 0-3.09 3.09ZM18.259 8.715 18 9.75l-.259-1.035a3.375 3.375 0 0 0-2.455-2.456L14.25 6l1.036-.259a3.375 3.375 0 0 0 2.455-2.456L18 2.25l.259 1.035a3.375 3.375 0 0 0 2.456 2.456L21.75 6l-1.035.259a3.375 3.375 0 0 0-2.456 2.456ZM16.894 20.567 16.5 21.75l-.394-1.183a2.25 2.25 0 0 0-1.423-1.423L13.5 18.75l1.183-.394a2.25 2.25 0 0 0 1.423-1.423l.394-1.183.394 1.183a2.25 2.25 0 0 0 1.423 1.423l1.183.394-1.183.394a2.25 2.25 0 0 0-1.423 1.423Z\"\n\t/>\n</svg>\n","import katex from 'katex';\n\nconst DELIMITER_LIST = [\n\t{ left: '$$', right: '$$', display: true },\n\t{ left: '$', right: '$', display: false },\n\t{ left: '\\\\pu{', right: '}', display: false },\n\t{ left: '\\\\ce{', right: '}', display: false },\n\t{ left: '\\\\(', right: '\\\\)', display: false },\n\t{ left: '\\\\[', right: '\\\\]', display: true },\n\t{ left: '\\\\begin{equation}', right: '\\\\end{equation}', display: true }\n];\n\n// const DELIMITER_LIST = [\n// { left: '$$', right: '$$', display: false },\n// { left: '$', right: '$', display: false },\n// ];\n\n// const inlineRule = /^(\\${1,2})(?!\\$)((?:\\\\.|[^\\\\\\n])*?(?:\\\\.|[^\\\\\\n\\$]))\\1(?=[\\s?!\\.,:?!。,:]|$)/;\n// const blockRule = /^(\\${1,2})\\n((?:\\\\[^]|[^\\\\])+?)\\n\\1(?:\\n|$)/;\n\nlet inlinePatterns = [];\nlet blockPatterns = [];\n\nfunction escapeRegex(string) {\n\treturn string.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n}\n\nfunction generateRegexRules(delimiters) {\n\tdelimiters.forEach((delimiter) => {\n\t\tconst { left, right, display } = delimiter;\n\t\t// Ensure regex-safe delimiters\n\t\tconst escapedLeft = escapeRegex(left);\n\t\tconst escapedRight = escapeRegex(right);\n\n\t\tif (!display) {\n\t\t\t// For inline delimiters, we match everyting\n\t\t\tinlinePatterns.push(`${escapedLeft}((?:\\\\\\\\[^]|[^\\\\\\\\])+?)${escapedRight}`);\n\t\t} else {\n\t\t\t// Block delimiters doubles as inline delimiters when not followed by a newline\n\t\t\tinlinePatterns.push(`${escapedLeft}(?!\\\\n)((?:\\\\\\\\[^]|[^\\\\\\\\])+?)(?!\\\\n)${escapedRight}`);\n\t\t\tblockPatterns.push(`${escapedLeft}\\\\n((?:\\\\\\\\[^]|[^\\\\\\\\])+?)\\\\n${escapedRight}`);\n\t\t}\n\t});\n\n\t// Math formulas can end in special characters\n\tconst inlineRule = new RegExp(\n\t\t`^(${inlinePatterns.join('|')})(?=[\\\\s?。,!-\\/:-@[-\\`{-~]|$)`,\n\t\t'u'\n\t);\n\tconst blockRule = new RegExp(`^(${blockPatterns.join('|')})(?=[\\\\s?。,!-\\/:-@[-\\`{-~]|$)`, 'u');\n\n\treturn { inlineRule, blockRule };\n}\n\nconst { inlineRule, blockRule } = generateRegexRules(DELIMITER_LIST);\n\nexport default function (options = {}) {\n\treturn {\n\t\textensions: [inlineKatex(options), blockKatex(options)]\n\t};\n}\n\nfunction katexStart(src, displayMode: boolean) {\n\tlet ruleReg = displayMode ? blockRule : inlineRule;\n\n\tlet indexSrc = src;\n\n\twhile (indexSrc) {\n\t\tlet index = -1;\n\t\tlet startIndex = -1;\n\t\tlet startDelimiter = '';\n\t\tlet endDelimiter = '';\n\t\tfor (let delimiter of DELIMITER_LIST) {\n\t\t\tif (delimiter.display !== displayMode) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tstartIndex = indexSrc.indexOf(delimiter.left);\n\t\t\tif (startIndex === -1) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tindex = startIndex;\n\t\t\tstartDelimiter = delimiter.left;\n\t\t\tendDelimiter = delimiter.right;\n\t\t}\n\n\t\tif (index === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Check if the delimiter is preceded by a special character.\n\t\t// If it does, then it's potentially a math formula.\n\t\tconst f = index === 0 || indexSrc.charAt(index - 1).match(/[\\s?。,!-\\/:-@[-`{-~]/);\n\t\tif (f) {\n\t\t\tconst possibleKatex = indexSrc.substring(index);\n\n\t\t\tif (possibleKatex.match(ruleReg)) {\n\t\t\t\treturn index;\n\t\t\t}\n\t\t}\n\n\t\tindexSrc = indexSrc.substring(index + startDelimiter.length).replace(endDelimiter, '');\n\t}\n}\n\nfunction katexTokenizer(src, tokens, displayMode: boolean) {\n\tlet ruleReg = displayMode ? blockRule : inlineRule;\n\tlet type = displayMode ? 'blockKatex' : 'inlineKatex';\n\n\tconst match = src.match(ruleReg);\n\n\tif (match) {\n\t\tconst text = match\n\t\t\t.slice(2)\n\t\t\t.filter((item) => item)\n\t\t\t.find((item) => item.trim());\n\n\t\treturn {\n\t\t\ttype,\n\t\t\traw: match[0],\n\t\t\ttext: text,\n\t\t\tdisplayMode\n\t\t};\n\t}\n}\n\nfunction inlineKatex(options) {\n\treturn {\n\t\tname: 'inlineKatex',\n\t\tlevel: 'inline',\n\t\tstart(src) {\n\t\t\treturn katexStart(src, false);\n\t\t},\n\t\ttokenizer(src, tokens) {\n\t\t\treturn katexTokenizer(src, tokens, false);\n\t\t}\n\t};\n}\n\nfunction blockKatex(options) {\n\treturn {\n\t\tname: 'blockKatex',\n\t\tlevel: 'block',\n\t\tstart(src) {\n\t\t\treturn katexStart(src, true);\n\t\t},\n\t\ttokenizer(src, tokens) {\n\t\t\treturn katexTokenizer(src, tokens, true);\n\t\t}\n\t};\n}\n","<script lang=\"ts\">\n\timport hljs from 'highlight.js';\n\timport { loadPyodide } from 'pyodide';\n\timport mermaid from 'mermaid';\n\n\timport { v4 as uuidv4 } from 'uuid';\n\n\timport { getContext, getAllContexts, onMount } from 'svelte';\n\timport { copyToClipboard } from '$lib/utils';\n\n\timport 'highlight.js/styles/github-dark.min.css';\n\n\timport PyodideWorker from '$lib/workers/pyodide.worker?worker';\n\n\tconst i18n = getContext('i18n');\n\n\texport let id = '';\n\n\texport let token;\n\texport let lang = '';\n\texport let code = '';\n\n\tlet _token = null;\n\n\tlet mermaidHtml = null;\n\n\tlet highlightedCode = null;\n\tlet executing = false;\n\n\tlet stdout = null;\n\tlet stderr = null;\n\tlet result = null;\n\n\tlet copied = false;\n\n\tconst copyCode = async () => {\n\t\tcopied = true;\n\t\tawait copyToClipboard(code);\n\n\t\tsetTimeout(() => {\n\t\t\tcopied = false;\n\t\t}, 1000);\n\t};\n\n\tconst checkPythonCode = (str) => {\n\t\t// Check if the string contains typical Python syntax characters\n\t\tconst pythonSyntax = [\n\t\t\t'def ',\n\t\t\t'else:',\n\t\t\t'elif ',\n\t\t\t'try:',\n\t\t\t'except:',\n\t\t\t'finally:',\n\t\t\t'yield ',\n\t\t\t'lambda ',\n\t\t\t'assert ',\n\t\t\t'nonlocal ',\n\t\t\t'del ',\n\t\t\t'True',\n\t\t\t'False',\n\t\t\t'None',\n\t\t\t' and ',\n\t\t\t' or ',\n\t\t\t' not ',\n\t\t\t' in ',\n\t\t\t' is ',\n\t\t\t' with '\n\t\t];\n\n\t\tfor (let syntax of pythonSyntax) {\n\t\t\tif (str.includes(syntax)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\t// If none of the above conditions met, it's probably not Python code\n\t\treturn false;\n\t};\n\n\tconst executePython = async (code) => {\n\t\tif (!code.includes('input') && !code.includes('matplotlib')) {\n\t\t\texecutePythonAsWorker(code);\n\t\t} else {\n\t\t\tresult = null;\n\t\t\tstdout = null;\n\t\t\tstderr = null;\n\n\t\t\texecuting = true;\n\n\t\t\tdocument.pyodideMplTarget = document.getElementById(`plt-canvas-${id}`);\n\n\t\t\tlet pyodide = await loadPyodide({\n\t\t\t\tindexURL: '/pyodide/',\n\t\t\t\tstdout: (text) => {\n\t\t\t\t\tconsole.log('Python output:', text);\n\n\t\t\t\t\tif (stdout) {\n\t\t\t\t\t\tstdout += `${text}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstdout = `${text}\\n`;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tstderr: (text) => {\n\t\t\t\t\tconsole.log('An error occured:', text);\n\t\t\t\t\tif (stderr) {\n\t\t\t\t\t\tstderr += `${text}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstderr = `${text}\\n`;\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tpackages: ['micropip']\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst micropip = pyodide.pyimport('micropip');\n\n\t\t\t\t// await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');\n\n\t\t\t\tlet packages = [\n\t\t\t\t\tcode.includes('requests') ? 'requests' : null,\n\t\t\t\t\tcode.includes('bs4') ? 'beautifulsoup4' : null,\n\t\t\t\t\tcode.includes('numpy') ? 'numpy' : null,\n\t\t\t\t\tcode.includes('pandas') ? 'pandas' : null,\n\t\t\t\t\tcode.includes('matplotlib') ? 'matplotlib' : null,\n\t\t\t\t\tcode.includes('sklearn') ? 'scikit-learn' : null,\n\t\t\t\t\tcode.includes('scipy') ? 'scipy' : null,\n\t\t\t\t\tcode.includes('re') ? 'regex' : null,\n\t\t\t\t\tcode.includes('seaborn') ? 'seaborn' : null\n\t\t\t\t].filter(Boolean);\n\n\t\t\t\tconsole.log(packages);\n\t\t\t\tawait micropip.install(packages);\n\n\t\t\t\tresult = await pyodide.runPythonAsync(`from js import prompt\ndef input(p):\n return prompt(p)\n__builtins__.input = input`);\n\n\t\t\t\tresult = await pyodide.runPython(code);\n\n\t\t\t\tif (!result) {\n\t\t\t\t\tresult = '[NO OUTPUT]';\n\t\t\t\t}\n\n\t\t\t\tconsole.log(result);\n\t\t\t\tconsole.log(stdout);\n\t\t\t\tconsole.log(stderr);\n\n\t\t\t\tconst pltCanvasElement = document.getElementById(`plt-canvas-${id}`);\n\n\t\t\t\tif (pltCanvasElement?.innerHTML !== '') {\n\t\t\t\t\tpltCanvasElement.classList.add('pt-4');\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('Error:', error);\n\t\t\t\tstderr = error;\n\t\t\t}\n\n\t\t\texecuting = false;\n\t\t}\n\t};\n\n\tconst executePythonAsWorker = async (code) => {\n\t\tresult = null;\n\t\tstdout = null;\n\t\tstderr = null;\n\n\t\texecuting = true;\n\n\t\tlet packages = [\n\t\t\tcode.includes('requests') ? 'requests' : null,\n\t\t\tcode.includes('bs4') ? 'beautifulsoup4' : null,\n\t\t\tcode.includes('numpy') ? 'numpy' : null,\n\t\t\tcode.includes('pandas') ? 'pandas' : null,\n\t\t\tcode.includes('sklearn') ? 'scikit-learn' : null,\n\t\t\tcode.includes('scipy') ? 'scipy' : null,\n\t\t\tcode.includes('re') ? 'regex' : null,\n\t\t\tcode.includes('seaborn') ? 'seaborn' : null\n\t\t].filter(Boolean);\n\n\t\tconsole.log(packages);\n\n\t\tconst pyodideWorker = new PyodideWorker();\n\n\t\tpyodideWorker.postMessage({\n\t\t\tid: id,\n\t\t\tcode: code,\n\t\t\tpackages: packages\n\t\t});\n\n\t\tsetTimeout(() => {\n\t\t\tif (executing) {\n\t\t\t\texecuting = false;\n\t\t\t\tstderr = 'Execution Time Limit Exceeded';\n\t\t\t\tpyodideWorker.terminate();\n\t\t\t}\n\t\t}, 60000);\n\n\t\tpyodideWorker.onmessage = (event) => {\n\t\t\tconsole.log('pyodideWorker.onmessage', event);\n\t\t\tconst { id, ...data } = event.data;\n\n\t\t\tconsole.log(id, data);\n\n\t\t\tdata['stdout'] && (stdout = data['stdout']);\n\t\t\tdata['stderr'] && (stderr = data['stderr']);\n\t\t\tdata['result'] && (result = data['result']);\n\n\t\t\texecuting = false;\n\t\t};\n\n\t\tpyodideWorker.onerror = (event) => {\n\t\t\tconsole.log('pyodideWorker.onerror', event);\n\t\t\texecuting = false;\n\t\t};\n\t};\n\n\tlet debounceTimeout;\n\n\tconst drawMermaidDiagram = async () => {\n\t\ttry {\n\t\t\tif (await mermaid.parse(code)) {\n\t\t\t\tconst { svg } = await mermaid.render(`mermaid-${uuidv4()}`, code);\n\t\t\t\tmermaidHtml = svg;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.log('Error:', error);\n\t\t}\n\t};\n\n\tconst render = async () => {\n\t\tif (lang === 'mermaid' && (token?.raw ?? '').slice(-4).includes('```')) {\n\t\t\t(async () => {\n\t\t\t\tawait drawMermaidDiagram();\n\t\t\t})();\n\t\t} else {\n\t\t\t// Function to perform the code highlighting\n\t\t\tconst highlightCode = () => {\n\t\t\t\thighlightedCode = hljs.highlightAuto(code, hljs.getLanguage(lang)?.aliases).value || code;\n\t\t\t};\n\n\t\t\t// Clear the previous timeout if it exists\n\t\t\tclearTimeout(debounceTimeout);\n\t\t\t// Set a new timeout to debounce the code highlighting\n\t\t\tdebounceTimeout = setTimeout(highlightCode, 10);\n\t\t}\n\t};\n\n\t$: if (token) {\n\t\tif (JSON.stringify(token) !== JSON.stringify(_token)) {\n\t\t\tconsole.log('hi');\n\t\t\t_token = token;\n\t\t}\n\t}\n\n\t$: if (_token) {\n\t\trender();\n\t}\n\n\tonMount(async () => {\n\t\tconsole.log('codeblock', lang, code);\n\t\tif (document.documentElement.classList.contains('dark')) {\n\t\t\tmermaid.initialize({\n\t\t\t\tstartOnLoad: true,\n\t\t\t\ttheme: 'dark',\n\t\t\t\tsecurityLevel: 'loose'\n\t\t\t});\n\t\t} else {\n\t\t\tmermaid.initialize({\n\t\t\t\tstartOnLoad: true,\n\t\t\t\ttheme: 'default',\n\t\t\t\tsecurityLevel: 'loose'\n\t\t\t});\n\t\t}\n\t});\n</script>\n\n<div class=\"my-2\" dir=\"ltr\">\n\t{#if lang === 'mermaid'}\n\t\t{#if mermaidHtml}\n\t\t\t{@html `${mermaidHtml}`}\n\t\t{:else}\n\t\t\t<pre class=\"mermaid\">{code}</pre>\n\t\t{/if}\n\t{:else}\n\t\t<div\n\t\t\tclass=\"flex justify-between bg-[#202123] text-white text-xs px-4 pt-1 pb-0.5 rounded-t-lg overflow-x-auto\"\n\t\t>\n\t\t\t<div class=\"p-1\">{lang}</div>\n\n\t\t\t<div class=\"flex items-center\">\n\t\t\t\t{#if lang.toLowerCase() === 'python' || lang.toLowerCase() === 'py' || (lang === '' && checkPythonCode(code))}\n\t\t\t\t\t{#if executing}\n\t\t\t\t\t\t<div class=\"copy-code-button bg-none border-none p-1 cursor-not-allowed\">Running</div>\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t<button\n\t\t\t\t\t\t\tclass=\"copy-code-button bg-none border-none p-1\"\n\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\texecutePython(code);\n\t\t\t\t\t\t\t}}>{$i18n.t('Run')}</button\n\t\t\t\t\t\t>\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t\t<button class=\"copy-code-button bg-none border-none p-1\" on:click={copyCode}\n\t\t\t\t\t>{copied ? $i18n.t('Copied') : $i18n.t('Copy Code')}</button\n\t\t\t\t>\n\t\t\t</div>\n\t\t</div>\n\n\t\t<pre\n\t\t\tclass=\" hljs p-4 px-5 overflow-x-auto\"\n\t\t\tstyle=\"border-top-left-radius: 0px; border-top-right-radius: 0px; {(executing ||\n\t\t\t\tstdout ||\n\t\t\t\tstderr ||\n\t\t\t\tresult) &&\n\t\t\t\t'border-bottom-left-radius: 0px; border-bottom-right-radius: 0px;'}\"><code\n\t\t\t\tclass=\"language-{lang} rounded-t-none whitespace-pre\"\n\t\t\t\t>{#if highlightedCode}{@html highlightedCode}{:else}{code}{/if}</code\n\t\t\t></pre>\n\n\t\t<div\n\t\t\tid=\"plt-canvas-{id}\"\n\t\t\tclass=\"bg-[#202123] text-white max-w-full overflow-x-auto scrollbar-hidden\"\n\t\t/>\n\n\t\t{#if executing}\n\t\t\t<div class=\"bg-[#202123] text-white px-4 py-4 rounded-b-lg\">\n\t\t\t\t<div class=\" text-gray-500 text-xs mb-1\">STDOUT/STDERR</div>\n\t\t\t\t<div class=\"text-sm\">Running...</div>\n\t\t\t</div>\n\t\t{:else if stdout || stderr || result}\n\t\t\t<div class=\"bg-[#202123] text-white px-4 py-4 rounded-b-lg\">\n\t\t\t\t<div class=\" text-gray-500 text-xs mb-1\">STDOUT/STDERR</div>\n\t\t\t\t<div class=\"text-sm\">{stdout || stderr || result}</div>\n\t\t\t</div>\n\t\t{/if}\n\t{/if}\n</div>\n","<script lang=\"ts\">\n\timport katex from 'katex';\n\timport 'katex/contrib/mhchem';\n\timport 'katex/dist/katex.min.css';\n\n\texport let content: string;\n\texport let displayMode: boolean = false;\n</script>\n\n{@html katex.renderToString(content, { displayMode, throwOnError: false })}\n","<script lang=\"ts\">\n\timport DOMPurify from 'dompurify';\n\timport { toast } from 'svelte-sonner';\n\n\timport type { Token } from 'marked';\n\timport { getContext } from 'svelte';\n\n\tconst i18n = getContext('i18n');\n\n\timport { WEBUI_BASE_URL } from '$lib/constants';\n\timport { copyToClipboard, revertSanitizedResponseContent, unescapeHtml } from '$lib/utils';\n\n\timport Image from '$lib/components/common/Image.svelte';\n\timport KatexRenderer from './KatexRenderer.svelte';\n\n\texport let id: string;\n\texport let tokens: Token[];\n</script>\n\n{#each tokens as token}\n\t{#if token.type === 'escape'}\n\t\t{unescapeHtml(token.text)}\n\t{:else if token.type === 'html'}\n\t\t{@const html = DOMPurify.sanitize(token.text)}\n\t\t{#if html && html.includes('<video')}\n\t\t\t{@html html}\n\t\t{:else if token.text.includes(`<iframe src=\"${WEBUI_BASE_URL}/api/v1/files/`)}\n\t\t\t{@html `${token.text}`}\n\t\t{:else}\n\t\t\t{token.text}\n\t\t{/if}\n\t{:else if token.type === 'link'}\n\t\t{#if token.tokens}\n\t\t\t<a href={token.href} target=\"_blank\" rel=\"nofollow\" title={token.title}>\n\t\t\t\t<svelte:self id={`${id}-a`} tokens={token.tokens} />\n\t\t\t</a>\n\t\t{:else}\n\t\t\t<a href={token.href} target=\"_blank\" rel=\"nofollow\" title={token.title}>{token.text}</a>\n\t\t{/if}\n\t{:else if token.type === 'image'}\n\t\t<Image src={token.href} alt={token.text} />\n\t{:else if token.type === 'strong'}\n\t\t<strong>\n\t\t\t<svelte:self id={`${id}-strong`} tokens={token.tokens} />\n\t\t</strong>\n\t{:else if token.type === 'em'}\n\t\t<em>\n\t\t\t<svelte:self id={`${id}-em`} tokens={token.tokens} />\n\t\t</em>\n\t{:else if token.type === 'codespan'}\n\t\t<!-- svelte-ignore a11y-click-events-have-key-events -->\n\t\t<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->\n\t\t<code\n\t\t\tclass=\"codespan cursor-pointer\"\n\t\t\ton:click={() => {\n\t\t\t\tcopyToClipboard(unescapeHtml(token.text));\n\t\t\t\ttoast.success($i18n.t('Copied to clipboard'));\n\t\t\t}}>{unescapeHtml(token.text)}</code\n\t\t>\n\t{:else if token.type === 'br'}\n\t\t<br />\n\t{:else if token.type === 'del'}\n\t\t<del>\n\t\t\t<svelte:self id={`${id}-del`} tokens={token.tokens} />\n\t\t</del>\n\t{:else if token.type === 'inlineKatex'}\n\t\t{#if token.text}\n\t\t\t<KatexRenderer content={revertSanitizedResponseContent(token.text)} displayMode={false} />\n\t\t{/if}\n\t{:else if token.type === 'iframe'}\n\t\t<iframe\n\t\t\tsrc=\"{WEBUI_BASE_URL}/api/v1/files/{token.fileId}/content\"\n\t\t\ttitle={token.fileId}\n\t\t\twidth=\"100%\"\n\t\t\tframeborder=\"0\"\n\t\t\tonload=\"this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';\"\n\t\t></iframe>\n\t{:else if token.type === 'text'}\n\t\t{token.raw}\n\t{/if}\n{/each}\n","<script lang=\"ts\">\n\timport DOMPurify from 'dompurify';\n\timport { onMount } from 'svelte';\n\timport { marked, type Token } from 'marked';\n\timport { revertSanitizedResponseContent, unescapeHtml } from '$lib/utils';\n\n\timport CodeBlock from '$lib/components/chat/Messages/CodeBlock.svelte';\n\timport MarkdownInlineTokens from '$lib/components/chat/Messages/Markdown/MarkdownInlineTokens.svelte';\n\timport KatexRenderer from './KatexRenderer.svelte';\n\timport { WEBUI_BASE_URL } from '$lib/constants';\n\n\texport let id: string;\n\texport let tokens: Token[];\n\texport let top = true;\n\n\tconst headerComponent = (depth: number) => {\n\t\treturn 'h' + depth;\n\t};\n</script>\n\n<!-- {JSON.stringify(tokens)} -->\n{#each tokens as token, tokenIdx (tokenIdx)}\n\t{#if token.type === 'hr'}\n\t\t<hr />\n\t{:else if token.type === 'heading'}\n\t\t<svelte:element this={headerComponent(token.depth)}>\n\t\t\t<MarkdownInlineTokens id={`${id}-${tokenIdx}-h`} tokens={token.tokens} />\n\t\t</svelte:element>\n\t{:else if token.type === 'code'}\n\t\t<CodeBlock\n\t\t\tid={`${id}-${tokenIdx}`}\n\t\t\t{token}\n\t\t\tlang={token?.lang ?? ''}\n\t\t\tcode={revertSanitizedResponseContent(token?.text ?? '')}\n\t\t/>\n\t{:else if token.type === 'table'}\n\t\t<div class=\"scrollbar-hidden relative whitespace-nowrap overflow-x-auto max-w-full\">\n\t\t\t<table class=\"w-full\">\n\t\t\t\t<thead>\n\t\t\t\t\t<tr>\n\t\t\t\t\t\t{#each token.header as header, headerIdx}\n\t\t\t\t\t\t\t<th style={token.align[headerIdx] ? '' : `text-align: ${token.align[headerIdx]}`}>\n\t\t\t\t\t\t\t\t<MarkdownInlineTokens\n\t\t\t\t\t\t\t\t\tid={`${id}-${tokenIdx}-header-${headerIdx}`}\n\t\t\t\t\t\t\t\t\ttokens={header.tokens}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</tr>\n\t\t\t\t</thead>\n\t\t\t\t<tbody>\n\t\t\t\t\t{#each token.rows as row, rowIdx}\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t{#each row ?? [] as cell, cellIdx}\n\t\t\t\t\t\t\t\t<td style={token.align[cellIdx] ? '' : `text-align: ${token.align[cellIdx]}`}>\n\t\t\t\t\t\t\t\t\t<MarkdownInlineTokens\n\t\t\t\t\t\t\t\t\t\tid={`${id}-${tokenIdx}-row-${rowIdx}-${cellIdx}`}\n\t\t\t\t\t\t\t\t\t\ttokens={cell.tokens}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t{/each}\n\t\t\t\t</tbody>\n\t\t\t</table>\n\t\t</div>\n\t{:else if token.type === 'blockquote'}\n\t\t<blockquote>\n\t\t\t<svelte:self id={`${id}-${tokenIdx}`} tokens={token.tokens} />\n\t\t</blockquote>\n\t{:else if token.type === 'list'}\n\t\t{#if token.ordered}\n\t\t\t<ol start={token.start || 1}>\n\t\t\t\t{#each token.items as item, itemIdx}\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<svelte:self\n\t\t\t\t\t\t\tid={`${id}-${tokenIdx}-${itemIdx}`}\n\t\t\t\t\t\t\ttokens={item.tokens}\n\t\t\t\t\t\t\ttop={token.loose}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ol>\n\t\t{:else}\n\t\t\t<ul>\n\t\t\t\t{#each token.items as item, itemIdx}\n\t\t\t\t\t<li>\n\t\t\t\t\t\t<svelte:self\n\t\t\t\t\t\t\tid={`${id}-${tokenIdx}-${itemIdx}`}\n\t\t\t\t\t\t\ttokens={item.tokens}\n\t\t\t\t\t\t\ttop={token.loose}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</li>\n\t\t\t\t{/each}\n\t\t\t</ul>\n\t\t{/if}\n\t{:else if token.type === 'html'}\n\t\t{@const html = DOMPurify.sanitize(token.text)}\n\t\t{#if html && html.includes('<video')}\n\t\t\t{@html html}\n\t\t{:else if token.text.includes(`<iframe src=\"${WEBUI_BASE_URL}/api/v1/files/`)}\n\t\t\t{@html `${token.text}`}\n\t\t{:else}\n\t\t\t{token.text}\n\t\t{/if}\n\t{:else if token.type === 'iframe'}\n\t\t<iframe\n\t\t\tsrc=\"{WEBUI_BASE_URL}/api/v1/files/{token.fileId}/content\"\n\t\t\ttitle={token.fileId}\n\t\t\twidth=\"100%\"\n\t\t\tframeborder=\"0\"\n\t\t\tonload=\"this.style.height=(this.contentWindow.document.body.scrollHeight+20)+'px';\"\n\t\t></iframe>\n\t{:else if token.type === 'paragraph'}\n\t\t<p>\n\t\t\t<MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} />\n\t\t</p>\n\t{:else if token.type === 'text'}\n\t\t{#if top}\n\t\t\t<p>\n\t\t\t\t{#if token.tokens}\n\t\t\t\t\t<MarkdownInlineTokens id={`${id}-${tokenIdx}-t`} tokens={token.tokens} />\n\t\t\t\t{:else}\n\t\t\t\t\t{unescapeHtml(token.text)}\n\t\t\t\t{/if}\n\t\t\t</p>\n\t\t{:else if token.tokens}\n\t\t\t<MarkdownInlineTokens id={`${id}-${tokenIdx}-p`} tokens={token.tokens ?? []} />\n\t\t{:else}\n\t\t\t{unescapeHtml(token.text)}\n\t\t{/if}\n\t{:else if token.type === 'inlineKatex'}\n\t\t{#if token.text}\n\t\t\t<KatexRenderer\n\t\t\t\tcontent={revertSanitizedResponseContent(token.text)}\n\t\t\t\tdisplayMode={token?.displayMode ?? false}\n\t\t\t/>\n\t\t{/if}\n\t{:else if token.type === 'blockKatex'}\n\t\t{#if token.text}\n\t\t\t<KatexRenderer\n\t\t\t\tcontent={revertSanitizedResponseContent(token.text)}\n\t\t\t\tdisplayMode={token?.displayMode ?? false}\n\t\t\t/>\n\t\t{/if}\n\t{:else if token.type === 'space'}\n\t\t<div class=\"my-2\" />\n\t{:else}\n\t\t{console.log('Unknown token', token)}\n\t{/if}\n{/each}\n","<script>\n\timport { marked } from 'marked';\n\timport markedKatex from '$lib/utils/marked/katex-extension';\n\timport { replaceTokens, processResponseContent } from '$lib/utils';\n\timport { user } from '$lib/stores';\n\n\timport MarkdownTokens from './Markdown/MarkdownTokens.svelte';\n\n\texport let id;\n\texport let content;\n\texport let model = null;\n\n\tlet tokens = [];\n\n\tconst options = {\n\t\tthrowOnError: false\n\t};\n\n\tmarked.use(markedKatex(options));\n\n\t$: (async () => {\n\t\tif (content) {\n\t\t\ttokens = marked.lexer(\n\t\t\t\treplaceTokens(processResponseContent(content), model?.name, $user?.name)\n\t\t\t);\n\t\t}\n\t})();\n</script>\n\n{#key id}\n\t<MarkdownTokens {tokens} {id} />\n{/key}\n","<script lang=\"ts\">\n\texport let content = '';\n</script>\n\n<div\n\tclass=\"flex mt-2 mb-4 space-x-2 border px-4 py-3 border-red-800 bg-red-800/30 font-medium rounded-lg\"\n>\n\t<svg\n\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\tfill=\"none\"\n\t\tviewBox=\"0 0 24 24\"\n\t\tstroke-width=\"1.5\"\n\t\tstroke=\"currentColor\"\n\t\tclass=\"w-5 h-5 self-center\"\n\t>\n\t\t<path\n\t\t\tstroke-linecap=\"round\"\n\t\t\tstroke-linejoin=\"round\"\n\t\t\td=\"M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z\"\n\t\t/>\n\t</svg>\n\n\t<div class=\" self-center\">\n\t\t{content}\n\t</div>\n</div>\n","<script lang=\"ts\">\n\timport { getContext, onMount, tick } from 'svelte';\n\timport Modal from '$lib/components/common/Modal.svelte';\n\timport Tooltip from '$lib/components/common/Tooltip.svelte';\n\tconst i18n = getContext('i18n');\n\n\texport let show = false;\n\texport let citation;\n\n\tlet mergedDocuments = [];\n\n\t$: if (citation) {\n\t\tmergedDocuments = citation.document?.map((c, i) => {\n\t\t\treturn {\n\t\t\t\tsource: citation.source,\n\t\t\t\tdocument: c,\n\t\t\t\tmetadata: citation.metadata?.[i]\n\t\t\t};\n\t\t});\n\t}\n</script>\n\n<Modal size=\"lg\" bind:show>\n\t<div>\n\t\t<div class=\" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2\">\n\t\t\t<div class=\" text-lg font-medium self-center capitalize\">\n\t\t\t\t{$i18n.t('Citation')}\n\t\t\t</div>\n\t\t\t<button\n\t\t\t\tclass=\"self-center\"\n\t\t\t\ton:click={() => {\n\t\t\t\t\tshow = false;\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\tviewBox=\"0 0 20 20\"\n\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\tclass=\"w-5 h-5\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\"\n\t\t\t\t\t/>\n\t\t\t\t</svg>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"flex flex-col md:flex-row w-full px-6 pb-5 md:space-x-4\">\n\t\t\t<div\n\t\t\t\tclass=\"flex flex-col w-full dark:text-gray-200 overflow-y-scroll max-h-[22rem] scrollbar-hidden\"\n\t\t\t>\n\t\t\t\t{#each mergedDocuments as document, documentIdx}\n\t\t\t\t\t<div class=\"flex flex-col w-full\">\n\t\t\t\t\t\t<div class=\"text-sm font-medium dark:text-gray-300\">\n\t\t\t\t\t\t\t{$i18n.t('Source')}\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t{#if document.source?.name}\n\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\tcontent={$i18n.t('Open file')}\n\t\t\t\t\t\t\t\tplacement=\"left\"\n\t\t\t\t\t\t\t\ttippyOptions={{ duration: [500, 0], animation: 'perspective' }}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<div class=\"text-sm dark:text-gray-400\">\n\t\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\t\tclass=\"hover:text-gray-500 hover:dark:text-gray-100 underline\"\n\t\t\t\t\t\t\t\t\t\thref={document?.metadata?.file_id\n\t\t\t\t\t\t\t\t\t\t\t? `/api/v1/files/${document?.metadata?.file_id}/content${document?.metadata?.page !== undefined ? `#page=${document.metadata.page + 1}` : ''}`\n\t\t\t\t\t\t\t\t\t\t\t: document.source.name.includes('http')\n\t\t\t\t\t\t\t\t\t\t\t\t? document.source.name\n\t\t\t\t\t\t\t\t\t\t\t\t: `#`}\n\t\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{document?.metadata?.name ?? document.source.name}\n\t\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t\t\t{document?.metadata?.page\n\t\t\t\t\t\t\t\t\t\t? `(${$i18n.t('page')} ${document.metadata.page + 1})`\n\t\t\t\t\t\t\t\t\t\t: ''}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"text-sm dark:text-gray-400\">\n\t\t\t\t\t\t\t\t{$i18n.t('No source available')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"flex flex-col w-full\">\n\t\t\t\t\t\t<div class=\" text-sm font-medium dark:text-gray-300\">\n\t\t\t\t\t\t\t{$i18n.t('Content')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<pre class=\"text-sm dark:text-gray-400 whitespace-pre-line\">\n\t\t\t\t\t\t\t{document.document}\n\t\t\t\t\t\t</pre>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t{#if documentIdx !== mergedDocuments.length - 1}\n\t\t\t\t\t\t<hr class=\" dark:border-gray-850 my-3\" />\n\t\t\t\t\t{/if}\n\t\t\t\t{/each}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</Modal>\n","<script lang=\"ts\">\n\timport CitationsModal from './CitationsModal.svelte';\n\n\texport let citations = [];\n\n\tlet _citations = [];\n\n\t$: _citations = citations.reduce((acc, citation) => {\n\t\tcitation.document.forEach((document, index) => {\n\t\t\tconst metadata = citation.metadata?.[index];\n\t\t\tconst id = metadata?.source ?? 'N/A';\n\t\t\tlet source = citation?.source;\n\n\t\t\tif (metadata?.name) {\n\t\t\t\tsource = { ...source, name: metadata.name };\n\t\t\t}\n\n\t\t\t// Check if ID looks like a URL\n\t\t\tif (id.startsWith('http://') || id.startsWith('https://')) {\n\t\t\t\tsource = { name: id };\n\t\t\t}\n\n\t\t\tconst existingSource = acc.find((item) => item.id === id);\n\n\t\t\tif (existingSource) {\n\t\t\t\texistingSource.document.push(document);\n\t\t\t\texistingSource.metadata.push(metadata);\n\t\t\t} else {\n\t\t\t\tacc.push({\n\t\t\t\t\tid: id,\n\t\t\t\t\tsource: source,\n\t\t\t\t\tdocument: [document],\n\t\t\t\t\tmetadata: metadata ? [metadata] : []\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn acc;\n\t}, []);\n\n\tlet showCitationModal = false;\n\tlet selectedCitation = null;\n</script>\n\n<CitationsModal bind:show={showCitationModal} citation={selectedCitation} />\n\n{#if _citations.length > 0}\n\t<div class=\"mt-1 mb-2 w-full flex gap-1 items-center flex-wrap\">\n\t\t{#each _citations as citation, idx}\n\t\t\t<div class=\"flex gap-1 text-xs font-semibold\">\n\t\t\t\t<button\n\t\t\t\t\tclass=\"flex dark:text-gray-300 py-1 px-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-xl max-w-96\"\n\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\tshowCitationModal = true;\n\t\t\t\t\t\tselectedCitation = citation;\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<div class=\"bg-white dark:bg-gray-700 rounded-full size-4\">\n\t\t\t\t\t\t{idx + 1}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"flex-1 mx-2 line-clamp-1\">\n\t\t\t\t\t\t{citation.source.name}\n\t\t\t\t\t</div>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t{/each}\n\t</div>\n{/if}\n","<script lang=\"ts\">\n\timport { toast } from 'svelte-sonner';\n\timport dayjs from 'dayjs';\n\n\timport { createEventDispatcher } from 'svelte';\n\timport { onMount, tick, getContext } from 'svelte';\n\n\tconst i18n = getContext<Writable<i18nType>>('i18n');\n\n\tconst dispatch = createEventDispatcher();\n\n\timport { config, models, settings, user } from '$lib/stores';\n\timport { synthesizeOpenAISpeech } from '$lib/apis/audio';\n\timport { imageGenerations } from '$lib/apis/images';\n\timport {\n\t\tcopyToClipboard as _copyToClipboard,\n\t\tapproximateToHumanReadable,\n\t\textractParagraphsForAudio,\n\t\textractSentencesForAudio,\n\t\tcleanText,\n\t\tgetMessageContentParts\n\t} from '$lib/utils';\n\timport { WEBUI_BASE_URL } from '$lib/constants';\n\n\timport Name from './Name.svelte';\n\timport ProfileImage from './ProfileImage.svelte';\n\timport Skeleton from './Skeleton.svelte';\n\timport Image from '$lib/components/common/Image.svelte';\n\timport Tooltip from '$lib/components/common/Tooltip.svelte';\n\timport RateComment from './RateComment.svelte';\n\timport Spinner from '$lib/components/common/Spinner.svelte';\n\timport WebSearchResults from './ResponseMessage/WebSearchResults.svelte';\n\timport Sparkles from '$lib/components/icons/Sparkles.svelte';\n\timport Markdown from './Markdown.svelte';\n\timport Error from './Error.svelte';\n\timport Citations from './Citations.svelte';\n\n\timport type { Writable } from 'svelte/store';\n\timport type { i18n as i18nType } from 'i18next';\n\n\tinterface MessageType {\n\t\tid: string;\n\t\tmodel: string;\n\t\tcontent: string;\n\t\tfiles?: { type: string; url: string }[];\n\t\ttimestamp: number;\n\t\trole: string;\n\t\tstatusHistory?: {\n\t\t\tdone: boolean;\n\t\t\taction: string;\n\t\t\tdescription: string;\n\t\t\turls?: string[];\n\t\t\tquery?: string;\n\t\t}[];\n\t\tstatus?: {\n\t\t\tdone: boolean;\n\t\t\taction: string;\n\t\t\tdescription: string;\n\t\t\turls?: string[];\n\t\t\tquery?: string;\n\t\t};\n\t\tdone: boolean;\n\t\terror?: boolean | { content: string };\n\t\tcitations?: string[];\n\t\tinfo?: {\n\t\t\topenai?: boolean;\n\t\t\tprompt_tokens?: number;\n\t\t\tcompletion_tokens?: number;\n\t\t\ttotal_tokens?: number;\n\t\t\teval_count?: number;\n\t\t\teval_duration?: number;\n\t\t\tprompt_eval_count?: number;\n\t\t\tprompt_eval_duration?: number;\n\t\t\ttotal_duration?: number;\n\t\t\tload_duration?: number;\n\t\t};\n\t\tannotation?: { type: string; rating: number };\n\t}\n\n\texport let history;\n\texport let messageId;\n\n\tlet message: MessageType = JSON.parse(JSON.stringify(history.messages[messageId]));\n\t$: if (history.messages) {\n\t\tif (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {\n\t\t\tmessage = JSON.parse(JSON.stringify(history.messages[messageId]));\n\t\t}\n\t}\n\n\texport let siblings;\n\n\texport let showPreviousMessage: Function;\n\texport let showNextMessage: Function;\n\n\texport let editMessage: Function;\n\texport let rateMessage: Function;\n\n\texport let continueResponse: Function;\n\texport let regenerateResponse: Function;\n\n\texport let isLastMessage = true;\n\texport let readOnly = false;\n\n\tlet model = null;\n\t$: model = $models.find((m) => m.id === message.model);\n\n\tlet edit = false;\n\tlet editedContent = '';\n\tlet editTextAreaElement: HTMLTextAreaElement;\n\n\tlet audioParts: Record<number, HTMLAudioElement | null> = {};\n\tlet speaking = false;\n\tlet speakingIdx: number | undefined;\n\n\tlet loadingSpeech = false;\n\tlet generatingImage = false;\n\n\tlet showRateComment = false;\n\n\tconst copyToClipboard = async (text) => {\n\t\tconst res = await _copyToClipboard(text);\n\t\tif (res) {\n\t\t\ttoast.success($i18n.t('Copying to clipboard was successful!'));\n\t\t}\n\t};\n\n\tconst playAudio = (idx: number) => {\n\t\treturn new Promise<void>((res) => {\n\t\t\tspeakingIdx = idx;\n\t\t\tconst audio = audioParts[idx];\n\n\t\t\tif (!audio) {\n\t\t\t\treturn res();\n\t\t\t}\n\n\t\t\taudio.play();\n\t\t\taudio.onended = async () => {\n\t\t\t\tawait new Promise((r) => setTimeout(r, 300));\n\n\t\t\t\tif (Object.keys(audioParts).length - 1 === idx) {\n\t\t\t\t\tspeaking = false;\n\t\t\t\t}\n\n\t\t\t\tres();\n\t\t\t};\n\t\t});\n\t};\n\n\tconst toggleSpeakMessage = async () => {\n\t\tif (speaking) {\n\t\t\ttry {\n\t\t\t\tspeechSynthesis.cancel();\n\n\t\t\t\tif (speakingIdx !== undefined && audioParts[speakingIdx]) {\n\t\t\t\t\taudioParts[speakingIdx]!.pause();\n\t\t\t\t\taudioParts[speakingIdx]!.currentTime = 0;\n\t\t\t\t}\n\t\t\t} catch {}\n\n\t\t\tspeaking = false;\n\t\t\tspeakingIdx = undefined;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!(message?.content ?? '').trim().length) {\n\t\t\ttoast.info($i18n.t('No content to speak'));\n\t\t\treturn;\n\t\t}\n\n\t\tspeaking = true;\n\n\t\tif ($config.audio.tts.engine !== '') {\n\t\t\tloadingSpeech = true;\n\n\t\t\tconst messageContentParts: string[] = getMessageContentParts(\n\t\t\t\tmessage.content,\n\t\t\t\t$config?.audio?.tts?.split_on ?? 'punctuation'\n\t\t\t);\n\n\t\t\tif (!messageContentParts.length) {\n\t\t\t\tconsole.log('No content to speak');\n\t\t\t\ttoast.info($i18n.t('No content to speak'));\n\n\t\t\t\tspeaking = false;\n\t\t\t\tloadingSpeech = false;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconsole.debug('Prepared message content for TTS', messageContentParts);\n\n\t\t\taudioParts = messageContentParts.reduce(\n\t\t\t\t(acc, _sentence, idx) => {\n\t\t\t\t\tacc[idx] = null;\n\t\t\t\t\treturn acc;\n\t\t\t\t},\n\t\t\t\t{} as typeof audioParts\n\t\t\t);\n\n\t\t\tlet lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately\n\n\t\t\tfor (const [idx, sentence] of messageContentParts.entries()) {\n\t\t\t\tconst res = await synthesizeOpenAISpeech(\n\t\t\t\t\tlocalStorage.token,\n\t\t\t\t\t$settings?.audio?.tts?.defaultVoice === $config.audio.tts.voice\n\t\t\t\t\t\t? ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)\n\t\t\t\t\t\t: $config?.audio?.tts?.voice,\n\t\t\t\t\tsentence\n\t\t\t\t).catch((error) => {\n\t\t\t\t\tconsole.error(error);\n\t\t\t\t\ttoast.error(error);\n\n\t\t\t\t\tspeaking = false;\n\t\t\t\t\tloadingSpeech = false;\n\t\t\t\t});\n\n\t\t\t\tif (res) {\n\t\t\t\t\tconst blob = await res.blob();\n\t\t\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\t\t\tconst audio = new Audio(blobUrl);\n\t\t\t\t\taudio.playbackRate = $settings.audio?.tts?.playbackRate ?? 1;\n\n\t\t\t\t\taudioParts[idx] = audio;\n\t\t\t\t\tloadingSpeech = false;\n\t\t\t\t\tlastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tlet voices = [];\n\t\t\tconst getVoicesLoop = setInterval(() => {\n\t\t\t\tvoices = speechSynthesis.getVoices();\n\t\t\t\tif (voices.length > 0) {\n\t\t\t\t\tclearInterval(getVoicesLoop);\n\n\t\t\t\t\tconst voice =\n\t\t\t\t\t\tvoices\n\t\t\t\t\t\t\t?.filter(\n\t\t\t\t\t\t\t\t(v) => v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t?.at(0) ?? undefined;\n\n\t\t\t\t\tconsole.log(voice);\n\n\t\t\t\t\tconst speak = new SpeechSynthesisUtterance(message.content);\n\t\t\t\t\tspeak.rate = $settings.audio?.tts?.playbackRate ?? 1;\n\n\t\t\t\t\tconsole.log(speak);\n\n\t\t\t\t\tspeak.onend = () => {\n\t\t\t\t\t\tspeaking = false;\n\t\t\t\t\t\tif ($settings.conversationMode) {\n\t\t\t\t\t\t\tdocument.getElementById('voice-input-button')?.click();\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tif (voice) {\n\t\t\t\t\t\tspeak.voice = voice;\n\t\t\t\t\t}\n\n\t\t\t\t\tspeechSynthesis.speak(speak);\n\t\t\t\t}\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst editMessageHandler = async () => {\n\t\tedit = true;\n\t\teditedContent = message.content;\n\n\t\tawait tick();\n\n\t\teditTextAreaElement.style.height = '';\n\t\teditTextAreaElement.style.height = `${editTextAreaElement.scrollHeight}px`;\n\t};\n\n\tconst editMessageConfirmHandler = async () => {\n\t\teditMessage(message.id, editedContent ? editedContent : '', false);\n\n\t\tedit = false;\n\t\teditedContent = '';\n\n\t\tawait tick();\n\t};\n\n\tconst saveAsCopyHandler = async () => {\n\t\teditMessage(message.id, editedContent ? editedContent : '');\n\n\t\tedit = false;\n\t\teditedContent = '';\n\n\t\tawait tick();\n\t};\n\n\tconst cancelEditMessage = async () => {\n\t\tedit = false;\n\t\teditedContent = '';\n\t\tawait tick();\n\t};\n\n\tconst generateImage = async (message: MessageType) => {\n\t\tgeneratingImage = true;\n\t\tconst res = await imageGenerations(localStorage.token, message.content).catch((error) => {\n\t\t\ttoast.error(error);\n\t\t});\n\t\tconsole.log(res);\n\n\t\tif (res) {\n\t\t\tconst files = res.map((image) => ({\n\t\t\t\ttype: 'image',\n\t\t\t\turl: `${image.url}`\n\t\t\t}));\n\n\t\t\tdispatch('save', { ...message, files: files });\n\t\t}\n\n\t\tgeneratingImage = false;\n\t};\n\n\t$: if (!edit) {\n\t\t(async () => {\n\t\t\tawait tick();\n\t\t})();\n\t}\n\n\tonMount(async () => {\n\t\tconsole.log('ResponseMessage mounted');\n\n\t\tawait tick();\n\t});\n</script>\n\n{#key message.id}\n\t<div\n\t\tclass=\" flex w-full message-{message.id}\"\n\t\tid=\"message-{message.id}\"\n\t\tdir={$settings.chatDirection}\n\t>\n\t\t<ProfileImage\n\t\t\tsrc={model?.info?.meta?.profile_image_url ??\n\t\t\t\t($i18n.language === 'dg-DG' ? `/doge.png` : `${WEBUI_BASE_URL}/static/favicon.png`)}\n\t\t/>\n\n\t\t<div class=\"w-full overflow-hidden pl-1\">\n\t\t\t<Name>\n\t\t\t\t{model?.name ?? message.model}\n\n\t\t\t\t{#if message.timestamp}\n\t\t\t\t\t<span\n\t\t\t\t\t\tclass=\" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}\n\t\t\t\t\t</span>\n\t\t\t\t{/if}\n\t\t\t</Name>\n\n\t\t\t<div>\n\t\t\t\t{#if message?.files && message.files?.filter((f) => f.type === 'image').length > 0}\n\t\t\t\t\t<div class=\"my-2.5 w-full flex overflow-x-auto gap-2 flex-wrap\">\n\t\t\t\t\t\t{#each message.files as file}\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t{#if file.type === 'image'}\n\t\t\t\t\t\t\t\t\t<Image src={file.url} alt={message.content} />\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/each}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\n\t\t\t\t<div class=\"chat-{message.role} w-full min-w-full markdown-prose\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}\n\t\t\t\t\t\t\t{@const status = (\n\t\t\t\t\t\t\t\tmessage?.statusHistory ?? [...(message?.status ? [message?.status] : [])]\n\t\t\t\t\t\t\t).at(-1)}\n\t\t\t\t\t\t\t<div class=\"status-description flex items-center gap-2 pt-0.5 pb-1\">\n\t\t\t\t\t\t\t\t{#if status?.done === false}\n\t\t\t\t\t\t\t\t\t<div class=\"\">\n\t\t\t\t\t\t\t\t\t\t<Spinner className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t{#if status?.action === 'web_search' && status?.urls}\n\t\t\t\t\t\t\t\t\t<WebSearchResults {status}>\n\t\t\t\t\t\t\t\t\t\t<div class=\"flex flex-col justify-center -space-y-0.5\">\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{status?.done === false\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'shimmer'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''} text-base line-clamp-1 text-wrap\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{status?.description}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</WebSearchResults>\n\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t<div class=\"flex flex-col justify-center -space-y-0.5\">\n\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\tclass=\"{status?.done === false\n\t\t\t\t\t\t\t\t\t\t\t\t? 'shimmer'\n\t\t\t\t\t\t\t\t\t\t\t\t: ''} text-gray-500 dark:text-gray-500 text-base line-clamp-1 text-wrap\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{status?.description}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t{#if edit === true}\n\t\t\t\t\t\t\t<div class=\"w-full bg-gray-50 dark:bg-gray-800 rounded-3xl px-5 py-3 my-2\">\n\t\t\t\t\t\t\t\t<textarea\n\t\t\t\t\t\t\t\t\tid=\"message-edit-{message.id}\"\n\t\t\t\t\t\t\t\t\tbind:this={editTextAreaElement}\n\t\t\t\t\t\t\t\t\tclass=\" bg-transparent outline-none w-full resize-none\"\n\t\t\t\t\t\t\t\t\tbind:value={editedContent}\n\t\t\t\t\t\t\t\t\ton:input={(e) => {\n\t\t\t\t\t\t\t\t\t\te.target.style.height = '';\n\t\t\t\t\t\t\t\t\t\te.target.style.height = `${e.target.scrollHeight}px`;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ton:keydown={(e) => {\n\t\t\t\t\t\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\t\t\t\t\t\tdocument.getElementById('close-edit-message-button')?.click();\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconst isCmdOrCtrlPressed = e.metaKey || e.ctrlKey;\n\t\t\t\t\t\t\t\t\t\tconst isEnterPressed = e.key === 'Enter';\n\n\t\t\t\t\t\t\t\t\t\tif (isCmdOrCtrlPressed && isEnterPressed) {\n\t\t\t\t\t\t\t\t\t\t\tdocument.getElementById('confirm-edit-message-button')?.click();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t<div class=\" mt-2 mb-1 flex justify-between text-sm font-medium\">\n\t\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tid=\"save-new-message-button\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl\"\n\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tsaveAsCopyHandler();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{$i18n.t('Save As Copy')}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<div class=\"flex space-x-1.5\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tid=\"close-edit-message-button\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl\"\n\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tcancelEditMessage();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{$i18n.t('Cancel')}\n\t\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tid=\"confirm-edit-message-button\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl\"\n\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\teditMessageConfirmHandler();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{$i18n.t('Save')}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t<div class=\"w-full flex flex-col\">\n\t\t\t\t\t\t\t\t{#if message.content === '' && !message.error}\n\t\t\t\t\t\t\t\t\t<Skeleton />\n\t\t\t\t\t\t\t\t{:else if message.content && message.error !== true}\n\t\t\t\t\t\t\t\t\t<!-- always show message contents even if there's an error -->\n\t\t\t\t\t\t\t\t\t<!-- unless message.error === true which is legacy error handling, where the error message is stored in message.content -->\n\t\t\t\t\t\t\t\t\t<Markdown id={message.id} content={message.content} {model} />\n\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t{#if message.error}\n\t\t\t\t\t\t\t\t\t<Error content={message?.error?.content ?? message.content} />\n\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t{#if message.citations}\n\t\t\t\t\t\t\t\t\t<Citations citations={message.citations} />\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{#if !edit}\n\t\t\t\t\t{#if message.done || siblings.length > 1}\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\" flex justify-start overflow-x-auto buttons text-gray-600 dark:text-gray-500 mt-0.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#if siblings.length > 1}\n\t\t\t\t\t\t\t\t<div class=\"flex self-center min-w-fit\" dir=\"ltr\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tshowPreviousMessage(message);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"size-3.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M15.75 19.5 8.25 12l7.5-7.5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclass=\"text-sm tracking-widest font-semibold self-center dark:text-gray-100 min-w-fit\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{siblings.indexOf(message.id) + 1}/{siblings.length}\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tshowNextMessage(message);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"size-3.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"m8.25 4.5 7.5 7.5-7.5 7.5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t{#if message.done}\n\t\t\t\t\t\t\t\t{#if !readOnly}\n\t\t\t\t\t\t\t\t\t{#if $user.role === 'user' ? ($config?.permissions?.chat?.editing ?? true) : true}\n\t\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Edit')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\teditMessageHandler();\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Copy')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition copy-response-button\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tcopyToClipboard(message.content);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Read Aloud')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tid=\"speak-button-{message.id}\"\n\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tif (!loadingSpeech) {\n\t\t\t\t\t\t\t\t\t\t\t\ttoggleSpeakMessage();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{#if loadingSpeech}\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\" w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t><style>\n\t\t\t\t\t\t\t\t\t\t\t\t\t.spinner_S1WN {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation: spinner_MGfb 0.8s linear infinite;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation-delay: -0.8s;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t.spinner_Km9P {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation-delay: -0.65s;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t.spinner_JApP {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation-delay: -0.5s;\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t@keyframes spinner_MGfb {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t93.75%,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t100% {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\topacity: 0.2;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t</style><circle class=\"spinner_S1WN\" cx=\"4\" cy=\"12\" r=\"3\" /><circle\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"spinner_S1WN spinner_Km9P\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tr=\"3\"\n\t\t\t\t\t\t\t\t\t\t\t\t/><circle class=\"spinner_S1WN spinner_JApP\" cx=\"20\" cy=\"12\" r=\"3\" /></svg\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{:else if speaking}\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M17.25 9.75 19.5 12m0 0 2.25 2.25M19.5 12l2.25-2.25M19.5 12l-2.25 2.25m-10.5-6 4.72-4.72a.75.75 0 0 1 1.28.53v15.88a.75.75 0 0 1-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.009 9.009 0 0 1 2.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75Z\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M19.114 5.636a9 9 0 010 12.728M16.463 8.288a5.25 5.25 0 010 7.424M6.75 8.25l4.72-4.72a.75.75 0 011.28.53v15.88a.75.75 0 01-1.28.53l-4.72-4.72H4.51c-.88 0-1.704-.507-1.938-1.354A9.01 9.01 0 012.25 12c0-.83.112-1.633.322-2.396C2.806 8.756 3.63 8.25 4.51 8.25H6.75z\"\n\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t\t\t\t{#if $config?.features.enable_image_generation && !readOnly}\n\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Generate Image')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!generatingImage) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tgenerateImage(message);\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{#if generatingImage}\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\" w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t><style>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.spinner_S1WN {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation: spinner_MGfb 0.8s linear infinite;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation-delay: -0.8s;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.spinner_Km9P {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation-delay: -0.65s;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.spinner_JApP {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tanimation-delay: -0.5s;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t@keyframes spinner_MGfb {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t93.75%,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t100% {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\topacity: 0.2;\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</style><circle class=\"spinner_S1WN\" cx=\"4\" cy=\"12\" r=\"3\" /><circle\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"spinner_S1WN spinner_Km9P\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcx=\"12\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcy=\"12\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tr=\"3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/><circle class=\"spinner_S1WN spinner_JApP\" cx=\"20\" cy=\"12\" r=\"3\" /></svg\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t{#if message.info}\n\t\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\t\tcontent={message.info.openai\n\t\t\t\t\t\t\t\t\t\t\t? `prompt_tokens: ${message.info.prompt_tokens ?? 'N/A'}<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\tcompletion_tokens: ${message.info.completion_tokens ?? 'N/A'}<br/>\n\t\t\t\t\t\t\t\t\t\t\t\t\ttotal_tokens: ${message.info.total_tokens ?? 'N/A'}`\n\t\t\t\t\t\t\t\t\t\t\t: `response_token/s: ${\n\t\t\t\t\t\t\t\t\t\t\t\t\t`${\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tMath.round(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t((message.info.eval_count ?? 0) /\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t((message.info.eval_duration ?? 0) / 1000000000)) *\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) / 100\n\t\t\t\t\t\t\t\t\t\t\t\t\t} tokens` ?? 'N/A'\n\t\t\t\t\t\t\t\t\t\t\t\t}<br/>\n\t\t\t\t\tprompt_token/s: ${\n\t\t\t\t\t\tMath.round(\n\t\t\t\t\t\t\t((message.info.prompt_eval_count ?? 0) /\n\t\t\t\t\t\t\t\t((message.info.prompt_eval_duration ?? 0) / 1000000000)) *\n\t\t\t\t\t\t\t\t100\n\t\t\t\t\t\t) / 100 ?? 'N/A'\n\t\t\t\t\t} tokens<br/>\n\t\t total_duration: ${\n\t\t\t\t\t\t\t\t\tMath.round(((message.info.total_duration ?? 0) / 1000000) * 100) / 100 ?? 'N/A'\n\t\t\t\t\t\t\t\t}ms<br/>\n\t\t load_duration: ${\n\t\t\t\t\t\t\t\t\tMath.round(((message.info.load_duration ?? 0) / 1000000) * 100) / 100 ?? 'N/A'\n\t\t\t\t\t\t\t\t}ms<br/>\n\t\t prompt_eval_count: ${message.info.prompt_eval_count ?? 'N/A'}<br/>\n\t\t prompt_eval_duration: ${\n\t\t\t\t\t\t\t\t\tMath.round(((message.info.prompt_eval_duration ?? 0) / 1000000) * 100) / 100 ??\n\t\t\t\t\t\t\t\t\t'N/A'\n\t\t\t\t\t\t\t\t}ms<br/>\n\t\t eval_count: ${message.info.eval_count ?? 'N/A'}<br/>\n\t\t eval_duration: ${\n\t\t\t\t\t\t\t\t\tMath.round(((message.info.eval_duration ?? 0) / 1000000) * 100) / 100 ?? 'N/A'\n\t\t\t\t\t\t\t\t}ms<br/>\n\t\t approximate_total: ${approximateToHumanReadable(message.info.total_duration ?? 0)}`}\n\t\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Generation Info')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\" {isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition whitespace-pre-wrap\"\n\t\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.log(message);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"info-{message.id}\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t{#if !readOnly}\n\t\t\t\t\t\t\t\t\t{#if $config?.features.enable_message_rating ?? true}\n\t\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Good Response')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message\n\t\t\t\t\t\t\t\t\t\t\t\t\t?.annotation?.rating ?? null) === 1\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-gray-100 dark:bg-gray-800'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''} dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\t\t\t\t\ton:click={async () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tawait rateMessage(message.id, 1);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t(model?.actions ?? [])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((action) => action?.__webui__ ?? false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.forEach((action) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdispatch('action', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: 'good-response',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmessageId: message.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowRateComment = true;\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdocument\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.getElementById(`message-feedback-${message.id}`)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?.scrollIntoView();\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t><path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/></svg\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Bad Response')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message\n\t\t\t\t\t\t\t\t\t\t\t\t\t?.annotation?.rating ?? null) === -1\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'bg-gray-100 dark:bg-gray-800'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: ''} dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\t\t\t\t\ton:click={async () => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tawait rateMessage(message.id, -1);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t(model?.actions ?? [])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((action) => action?.__webui__ ?? false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.forEach((action) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdispatch('action', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: 'bad-response',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmessageId: message.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowRateComment = true;\n\t\t\t\t\t\t\t\t\t\t\t\t\twindow.setTimeout(() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdocument\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t.getElementById(`message-feedback-${message.id}`)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t?.scrollIntoView();\n\t\t\t\t\t\t\t\t\t\t\t\t\t}, 0);\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t><path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/></svg\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t\t\t\t{#if isLastMessage}\n\t\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Continue Response')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tid=\"continue-response-button\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button\"\n\t\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcontinueResponse();\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t(model?.actions ?? [])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((action) => action?.__webui__ ?? false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.forEach((action) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdispatch('action', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: 'continue-response',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmessageId: message.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0Z\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M15.91 11.672a.375.375 0 0 1 0 .656l-5.603 3.113a.375.375 0 0 1-.557-.328V8.887c0-.286.307-.466.557-.327l5.603 3.112Z\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Regenerate')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button\"\n\t\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tshowRateComment = false;\n\t\t\t\t\t\t\t\t\t\t\t\t\tregenerateResponse(message);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t(model?.actions ?? [])\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.filter((action) => action?.__webui__ ?? false)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t.forEach((action) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdispatch('action', {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tid: 'regenerate-response',\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tmessageId: message.id\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\td=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t\t\t\t\t\t{#each (model?.actions ?? []).filter((action) => !(action?.__webui__ ?? false)) as action}\n\t\t\t\t\t\t\t\t\t\t\t<Tooltip content={action.name} placement=\"bottom\">\n\t\t\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"{isLastMessage\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tdispatch('action', action.id);\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{#if action.icon_url}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsrc={action.icon_url}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4 {action.icon_url.includes('svg')\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? 'dark:invert-[80%]'\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ''}\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle=\"fill: currentColor;\"\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\talt={action.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Sparkles strokeWidth=\"2.1\" className=\"size-4\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t\t\t{/each}\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/if}\n\n\t\t\t\t\t{#if message.done && showRateComment}\n\t\t\t\t\t\t<RateComment\n\t\t\t\t\t\t\tbind:message\n\t\t\t\t\t\t\tbind:show={showRateComment}\n\t\t\t\t\t\t\ton:submit={(e) => {\n\t\t\t\t\t\t\t\tdispatch('save', {\n\t\t\t\t\t\t\t\t\t...message,\n\t\t\t\t\t\t\t\t\tannotation: {\n\t\t\t\t\t\t\t\t\t\t...message.annotation,\n\t\t\t\t\t\t\t\t\t\tcomment: e.detail.comment,\n\t\t\t\t\t\t\t\t\t\treason: e.detail.reason\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t(model?.actions ?? [])\n\t\t\t\t\t\t\t\t\t.filter((action) => action?.__webui__ ?? false)\n\t\t\t\t\t\t\t\t\t.forEach((action) => {\n\t\t\t\t\t\t\t\t\t\tdispatch('action', {\n\t\t\t\t\t\t\t\t\t\t\tid: action.id,\n\t\t\t\t\t\t\t\t\t\t\tevent: {\n\t\t\t\t\t\t\t\t\t\t\t\tid: 'rate-comment',\n\t\t\t\t\t\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\t\t\t\t\t\tmessageId: message.id,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcomment: e.detail.comment,\n\t\t\t\t\t\t\t\t\t\t\t\t\treason: e.detail.reason\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t{/if}\n\t\t\t\t{/if}\n\t\t\t</div>\n\t\t</div>\n\t</div>\n{/key}\n\n<style>\n\t.buttons::-webkit-scrollbar {\n\t\tdisplay: none; /* for Chrome, Safari and Opera */\n\t}\n\n\t.buttons {\n\t\t-ms-overflow-style: none; /* IE and Edge */\n\t\tscrollbar-width: none; /* Firefox */\n\t}\n\t@keyframes shimmer {\n\t\t0% {\n\t\t\tbackground-position: 200% 0;\n\t\t}\n\t\t100% {\n\t\t\tbackground-position: -200% 0;\n\t\t}\n\t}\n\n\t.shimmer {\n\t\tbackground: linear-gradient(90deg, #9a9b9e 25%, #2a2929 50%, #9a9b9e 75%);\n\t\tbackground-size: 200% 100%;\n\t\tbackground-clip: text;\n\t\t-webkit-background-clip: text;\n\t\t-webkit-text-fill-color: transparent;\n\t\tanimation: shimmer 4s linear infinite;\n\t\tcolor: #818286; /* Fallback color */\n\t}\n\n\t:global(.dark) .shimmer {\n\t\tbackground: linear-gradient(90deg, #818286 25%, #eae5e5 50%, #818286 75%);\n\t\tbackground-size: 200% 100%;\n\t\tbackground-clip: text;\n\t\t-webkit-background-clip: text;\n\t\t-webkit-text-fill-color: transparent;\n\t\tanimation: shimmer 4s linear infinite;\n\t\tcolor: #a1a3a7; /* Darker fallback color for dark mode */\n\t}\n\n\t@keyframes smoothFadeIn {\n\t\t0% {\n\t\t\topacity: 0;\n\t\t\ttransform: translateY(-10px);\n\t\t}\n\t\t100% {\n\t\t\topacity: 1;\n\t\t\ttransform: translateY(0);\n\t\t}\n\t}\n\n\t.status-description {\n\t\tanimation: smoothFadeIn 0.2s forwards;\n\t}\n</style>\n","<script lang=\"ts\">\n\timport dayjs from 'dayjs';\n\timport { onMount, tick, getContext } from 'svelte';\n\timport { createEventDispatcher } from 'svelte';\n\n\timport { mobile, settings } from '$lib/stores';\n\n\timport { generateMoACompletion } from '$lib/apis';\n\timport { updateChatById } from '$lib/apis/chats';\n\timport { createOpenAITextStream } from '$lib/apis/streaming';\n\n\timport ResponseMessage from './ResponseMessage.svelte';\n\timport Tooltip from '$lib/components/common/Tooltip.svelte';\n\timport Merge from '$lib/components/icons/Merge.svelte';\n\n\timport Markdown from './Markdown.svelte';\n\timport Name from './Name.svelte';\n\timport Skeleton from './Skeleton.svelte';\n\n\tconst i18n = getContext('i18n');\n\n\texport let chatId;\n\texport let history;\n\texport let messageId;\n\n\texport let isLastMessage;\n\texport let readOnly = false;\n\n\texport let editMessage: Function;\n\texport let rateMessage: Function;\n\n\texport let continueResponse: Function;\n\texport let regenerateResponse: Function;\n\texport let mergeResponses: Function;\n\n\tconst dispatch = createEventDispatcher();\n\n\tlet currentMessageId;\n\tlet parentMessage;\n\tlet groupedMessageIds = {};\n\tlet groupedMessageIdsIdx = {};\n\n\tlet message = JSON.parse(JSON.stringify(history.messages[messageId]));\n\t$: if (history.messages) {\n\t\tif (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {\n\t\t\tmessage = JSON.parse(JSON.stringify(history.messages[messageId]));\n\t\t}\n\t}\n\n\tconst showPreviousMessage = (modelIdx) => {\n\t\tgroupedMessageIdsIdx[modelIdx] = Math.max(0, groupedMessageIdsIdx[modelIdx] - 1);\n\n\t\tlet messageId = groupedMessageIds[modelIdx].messageIds[groupedMessageIdsIdx[modelIdx]];\n\t\tconsole.log(messageId);\n\n\t\tlet messageChildrenIds = history.messages[messageId].childrenIds;\n\n\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\tmessageChildrenIds = history.messages[messageId].childrenIds;\n\t\t}\n\n\t\thistory.currentId = messageId;\n\t\tdispatch('change');\n\t};\n\n\tconst showNextMessage = (modelIdx) => {\n\t\tgroupedMessageIdsIdx[modelIdx] = Math.min(\n\t\t\tgroupedMessageIds[modelIdx].messageIds.length - 1,\n\t\t\tgroupedMessageIdsIdx[modelIdx] + 1\n\t\t);\n\n\t\tlet messageId = groupedMessageIds[modelIdx].messageIds[groupedMessageIdsIdx[modelIdx]];\n\t\tconsole.log(messageId);\n\n\t\tlet messageChildrenIds = history.messages[messageId].childrenIds;\n\n\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\tmessageChildrenIds = history.messages[messageId].childrenIds;\n\t\t}\n\n\t\thistory.currentId = messageId;\n\t\tdispatch('change');\n\t};\n\n\tconst initHandler = async () => {\n\t\tconsole.log('multiresponse:initHandler');\n\t\tawait tick();\n\n\t\tcurrentMessageId = messageId;\n\t\tparentMessage = history.messages[messageId].parentId\n\t\t\t? history.messages[history.messages[messageId].parentId]\n\t\t\t: null;\n\n\t\tgroupedMessageIds = parentMessage?.models.reduce((a, model, modelIdx) => {\n\t\t\t// Find all messages that are children of the parent message and have the same model\n\t\t\tlet modelMessageIds = parentMessage?.childrenIds\n\t\t\t\t.map((id) => history.messages[id])\n\t\t\t\t.filter((m) => m?.modelIdx === modelIdx)\n\t\t\t\t.map((m) => m.id);\n\n\t\t\t// Legacy support for messages that don't have a modelIdx\n\t\t\t// Find all messages that are children of the parent message and have the same model\n\t\t\tif (modelMessageIds.length === 0) {\n\t\t\t\tlet modelMessages = parentMessage?.childrenIds\n\t\t\t\t\t.map((id) => history.messages[id])\n\t\t\t\t\t.filter((m) => m?.model === model);\n\n\t\t\t\tmodelMessages.forEach((m) => {\n\t\t\t\t\tm.modelIdx = modelIdx;\n\t\t\t\t});\n\n\t\t\t\tmodelMessageIds = modelMessages.map((m) => m.id);\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\t...a,\n\t\t\t\t[modelIdx]: { messageIds: modelMessageIds }\n\t\t\t};\n\t\t}, {});\n\n\t\tgroupedMessageIdsIdx = parentMessage?.models.reduce((a, model, modelIdx) => {\n\t\t\tconst idx = groupedMessageIds[modelIdx].messageIds.findIndex((id) => id === messageId);\n\t\t\tif (idx !== -1) {\n\t\t\t\treturn {\n\t\t\t\t\t...a,\n\t\t\t\t\t[modelIdx]: idx\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\treturn {\n\t\t\t\t\t...a,\n\t\t\t\t\t[modelIdx]: groupedMessageIds[modelIdx].messageIds.length - 1\n\t\t\t\t};\n\t\t\t}\n\t\t}, {});\n\n\t\tconsole.log(groupedMessageIds, groupedMessageIdsIdx);\n\n\t\tawait tick();\n\t};\n\n\tconst mergeResponsesHandler = async () => {\n\t\tconst responses = Object.keys(groupedMessageIds).map((modelIdx) => {\n\t\t\tconst { messageIds } = groupedMessageIds[modelIdx];\n\t\t\tconst messageId = messageIds[groupedMessageIdsIdx[modelIdx]];\n\n\t\t\treturn history.messages[messageId].content;\n\t\t});\n\t\tmergeResponses(messageId, responses, chatId);\n\t};\n\n\tonMount(async () => {\n\t\tawait initHandler();\n\t\tawait tick();\n\n\t\tconst messageElement = document.getElementById(`message-${messageId}`);\n\t\tconsole.log(messageElement);\n\t\tif (messageElement) {\n\t\t\tmessageElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\n\t\t}\n\t});\n</script>\n\n{#if parentMessage}\n\t<div>\n\t\t<div\n\t\t\tclass=\"flex snap-x snap-mandatory overflow-x-auto scrollbar-hidden\"\n\t\t\tid=\"responses-container-{chatId}-{parentMessage.id}\"\n\t\t>\n\t\t\t{#each Object.keys(groupedMessageIds) as modelIdx}\n\t\t\t\t{#if groupedMessageIdsIdx[modelIdx] !== undefined && groupedMessageIds[modelIdx].messageIds.length > 0}\n\t\t\t\t\t<!-- svelte-ignore a11y-no-static-element-interactions -->\n\t\t\t\t\t<!-- svelte-ignore a11y-click-events-have-key-events -->\n\t\t\t\t\t{@const _messageId =\n\t\t\t\t\t\tgroupedMessageIds[modelIdx].messageIds[groupedMessageIdsIdx[modelIdx]]}\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\" snap-center w-full max-w-full m-1 border {history.messages[messageId]\n\t\t\t\t\t\t\t?.modelIdx == modelIdx\n\t\t\t\t\t\t\t? `border-gray-100 dark:border-gray-800 border-[1.5px] ${\n\t\t\t\t\t\t\t\t\t$mobile ? 'min-w-full' : 'min-w-[32rem]'\n\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t: `border-gray-50 dark:border-gray-850 border-dashed ${\n\t\t\t\t\t\t\t\t\t$mobile ? 'min-w-full' : 'min-w-80'\n\t\t\t\t\t\t\t\t}`} transition-all p-5 rounded-2xl\"\n\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\tif (messageId != _messageId) {\n\t\t\t\t\t\t\t\tlet messageChildrenIds = history.messages[_messageId].childrenIds;\n\t\t\t\t\t\t\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\t\t\t\t\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\t\t\t\t\t\t\tmessageChildrenIds = history.messages[_messageId].childrenIds;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\thistory.currentId = _messageId;\n\t\t\t\t\t\t\t\tdispatch('change');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t{#key history.currentId}\n\t\t\t\t\t\t\t{#if message}\n\t\t\t\t\t\t\t\t<ResponseMessage\n\t\t\t\t\t\t\t\t\t{history}\n\t\t\t\t\t\t\t\t\tmessageId={_messageId}\n\t\t\t\t\t\t\t\t\tisLastMessage={true}\n\t\t\t\t\t\t\t\t\tsiblings={groupedMessageIds[modelIdx].messageIds}\n\t\t\t\t\t\t\t\t\tshowPreviousMessage={() => showPreviousMessage(modelIdx)}\n\t\t\t\t\t\t\t\t\tshowNextMessage={() => showNextMessage(modelIdx)}\n\t\t\t\t\t\t\t\t\t{rateMessage}\n\t\t\t\t\t\t\t\t\t{editMessage}\n\t\t\t\t\t\t\t\t\t{continueResponse}\n\t\t\t\t\t\t\t\t\tregenerateResponse={async (message) => {\n\t\t\t\t\t\t\t\t\t\tregenerateResponse(message);\n\t\t\t\t\t\t\t\t\t\tawait tick();\n\t\t\t\t\t\t\t\t\t\tgroupedMessageIdsIdx[modelIdx] =\n\t\t\t\t\t\t\t\t\t\t\tgroupedMessageIds[modelIdx].messageIds.length - 1;\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ton:action={async (e) => {\n\t\t\t\t\t\t\t\t\t\tdispatch('action', e.detail);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ton:update={async (e) => {\n\t\t\t\t\t\t\t\t\t\tdispatch('update', e.detail);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\ton:save={async (e) => {\n\t\t\t\t\t\t\t\t\t\tdispatch('save', e.detail);\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t{readOnly}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/key}\n\t\t\t\t\t</div>\n\t\t\t\t{/if}\n\t\t\t{/each}\n\t\t</div>\n\n\t\t{#if !readOnly && isLastMessage}\n\t\t\t{#if !Object.keys(groupedMessageIds).find((modelIdx) => {\n\t\t\t\tconst { messageIds } = groupedMessageIds[modelIdx];\n\t\t\t\tconst _messageId = messageIds[groupedMessageIdsIdx[modelIdx]];\n\t\t\t\treturn !history.messages[_messageId]?.done ?? false;\n\t\t\t})}\n\t\t\t\t<div class=\"flex justify-end\">\n\t\t\t\t\t<div class=\"w-full\">\n\t\t\t\t\t\t{#if history.messages[messageId]?.merged?.status}\n\t\t\t\t\t\t\t{@const message = history.messages[messageId]?.merged}\n\n\t\t\t\t\t\t\t<div class=\"w-full rounded-xl pl-5 pr-2 py-2\">\n\t\t\t\t\t\t\t\t<Name>\n\t\t\t\t\t\t\t\t\tMerged Response\n\n\t\t\t\t\t\t\t\t\t{#if message.timestamp}\n\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\tclass=\" self-center invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t</Name>\n\n\t\t\t\t\t\t\t\t<div class=\"mt-1 markdown-prose w-full min-w-full\">\n\t\t\t\t\t\t\t\t\t{#if (message?.content ?? '') === ''}\n\t\t\t\t\t\t\t\t\t\t<Skeleton />\n\t\t\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t\t\t<Markdown id={`merged`} content={message.content ?? ''} />\n\t\t\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div class=\" flex-shrink-0 text-gray-600 dark:text-gray-500 mt-1\">\n\t\t\t\t\t\t<Tooltip content={$i18n.t('Merge Responses')} placement=\"bottom\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tid=\"merge-response-button\"\n\t\t\t\t\t\t\t\tclass=\"{true\n\t\t\t\t\t\t\t\t\t? 'visible'\n\t\t\t\t\t\t\t\t\t: 'invisible group-hover:visible'} p-1 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button\"\n\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\tmergeResponsesHandler();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Merge className=\" size-5 \" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t{/if}\n\t</div>\n{/if}\n","<script lang=\"ts\">\n\timport dayjs from 'dayjs';\n\timport { toast } from 'svelte-sonner';\n\timport { tick, createEventDispatcher, getContext, onMount } from 'svelte';\n\n\timport { models, settings } from '$lib/stores';\n\timport { user as _user } from '$lib/stores';\n\timport {\n\t\tcopyToClipboard as _copyToClipboard,\n\t\tprocessResponseContent,\n\t\treplaceTokens\n\t} from '$lib/utils';\n\n\timport Name from './Name.svelte';\n\timport ProfileImage from './ProfileImage.svelte';\n\timport Tooltip from '$lib/components/common/Tooltip.svelte';\n\timport FileItem from '$lib/components/common/FileItem.svelte';\n\timport Markdown from './Markdown.svelte';\n\n\tconst i18n = getContext('i18n');\n\n\tconst dispatch = createEventDispatcher();\n\texport let user;\n\n\texport let history;\n\texport let messageId;\n\n\texport let siblings;\n\n\texport let showPreviousMessage: Function;\n\texport let showNextMessage: Function;\n\n\texport let editMessage: Function;\n\n\texport let isFirstMessage: boolean;\n\texport let readOnly: boolean;\n\n\tlet edit = false;\n\tlet editedContent = '';\n\tlet messageEditTextAreaElement: HTMLTextAreaElement;\n\n\tlet message = JSON.parse(JSON.stringify(history.messages[messageId]));\n\t$: if (history.messages) {\n\t\tif (JSON.stringify(message) !== JSON.stringify(history.messages[messageId])) {\n\t\t\tmessage = JSON.parse(JSON.stringify(history.messages[messageId]));\n\t\t}\n\t}\n\n\tconst copyToClipboard = async (text) => {\n\t\tconst res = await _copyToClipboard(text);\n\t\tif (res) {\n\t\t\ttoast.success($i18n.t('Copying to clipboard was successful!'));\n\t\t}\n\t};\n\n\tconst editMessageHandler = async () => {\n\t\tedit = true;\n\t\teditedContent = message.content;\n\n\t\tawait tick();\n\n\t\tmessageEditTextAreaElement.style.height = '';\n\t\tmessageEditTextAreaElement.style.height = `${messageEditTextAreaElement.scrollHeight}px`;\n\n\t\tmessageEditTextAreaElement?.focus();\n\t};\n\n\tconst editMessageConfirmHandler = async (submit = true) => {\n\t\teditMessage(message.id, editedContent, submit);\n\n\t\tedit = false;\n\t\teditedContent = '';\n\t};\n\n\tconst cancelEditMessage = () => {\n\t\tedit = false;\n\t\teditedContent = '';\n\t};\n\n\tconst deleteMessageHandler = async () => {\n\t\tdispatch('delete', message.id);\n\t};\n\n\tonMount(() => {\n\t\tconsole.log('UserMessage mounted');\n\t});\n</script>\n\n<div class=\" flex w-full user-message\" dir={$settings.chatDirection} id=\"message-{message.id}\">\n\t{#if !($settings?.chatBubble ?? true)}\n\t\t<ProfileImage\n\t\t\tsrc={message.user\n\t\t\t\t? ($models.find((m) => m.id === message.user)?.info?.meta?.profile_image_url ?? '/user.png')\n\t\t\t\t: (user?.profile_image_url ?? '/user.png')}\n\t\t/>\n\t{/if}\n\t<div class=\"w-full overflow-hidden pl-1\">\n\t\t{#if !($settings?.chatBubble ?? true)}\n\t\t\t<div>\n\t\t\t\t<Name>\n\t\t\t\t\t{#if message.user}\n\t\t\t\t\t\t{$i18n.t('You')}\n\t\t\t\t\t\t<span class=\" text-gray-500 text-sm font-medium\">{message?.user ?? ''}</span>\n\t\t\t\t\t{:else if $settings.showUsername || $_user.name !== user.name}\n\t\t\t\t\t\t{user.name}\n\t\t\t\t\t{:else}\n\t\t\t\t\t\t{$i18n.t('You')}\n\t\t\t\t\t{/if}\n\n\t\t\t\t\t{#if message.timestamp}\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclass=\" invisible group-hover:visible text-gray-400 text-xs font-medium uppercase ml-0.5 -mt-0.5\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{dayjs(message.timestamp * 1000).format($i18n.t('h:mm a'))}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t{/if}\n\t\t\t\t</Name>\n\t\t\t</div>\n\t\t{/if}\n\n\t\t<div class=\"chat-{message.role} w-full min-w-full markdown-prose\">\n\t\t\t{#if message.files}\n\t\t\t\t<div class=\"mt-2.5 mb-1 w-full flex flex-col justify-end overflow-x-auto gap-1 flex-wrap\">\n\t\t\t\t\t{#each message.files as file}\n\t\t\t\t\t\t<div class={($settings?.chatBubble ?? true) ? 'self-end' : ''}>\n\t\t\t\t\t\t\t{#if file.type === 'image'}\n\t\t\t\t\t\t\t\t<img src={file.url} alt=\"input\" class=\" max-h-96 rounded-lg\" draggable=\"false\" />\n\t\t\t\t\t\t\t{:else}\n\t\t\t\t\t\t\t\t<FileItem\n\t\t\t\t\t\t\t\t\turl={file.url}\n\t\t\t\t\t\t\t\t\tname={file.name}\n\t\t\t\t\t\t\t\t\ttype={file.type}\n\t\t\t\t\t\t\t\t\tsize={file?.size}\n\t\t\t\t\t\t\t\t\tcolorClassName=\"bg-white dark:bg-gray-850 \"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t{/if}\n\n\t\t\t{#if edit === true}\n\t\t\t\t<div class=\" w-full bg-gray-50 dark:bg-gray-800 rounded-3xl px-5 py-3 mb-2\">\n\t\t\t\t\t<textarea\n\t\t\t\t\t\tid=\"message-edit-{message.id}\"\n\t\t\t\t\t\tbind:this={messageEditTextAreaElement}\n\t\t\t\t\t\tclass=\" bg-transparent outline-none w-full resize-none\"\n\t\t\t\t\t\tbind:value={editedContent}\n\t\t\t\t\t\ton:input={(e) => {\n\t\t\t\t\t\t\te.target.style.height = '';\n\t\t\t\t\t\t\te.target.style.height = `${e.target.scrollHeight}px`;\n\t\t\t\t\t\t}}\n\t\t\t\t\t\ton:keydown={(e) => {\n\t\t\t\t\t\t\tif (e.key === 'Escape') {\n\t\t\t\t\t\t\t\tdocument.getElementById('close-edit-message-button')?.click();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst isCmdOrCtrlPressed = e.metaKey || e.ctrlKey;\n\t\t\t\t\t\t\tconst isEnterPressed = e.key === 'Enter';\n\n\t\t\t\t\t\t\tif (isCmdOrCtrlPressed && isEnterPressed) {\n\t\t\t\t\t\t\t\tdocument.getElementById('confirm-edit-message-button')?.click();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<div class=\" mt-2 mb-1 flex justify-between text-sm font-medium\">\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tid=\"save-edit-message-button\"\n\t\t\t\t\t\t\t\tclass=\" px-4 py-2 bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 border dark:border-gray-700 text-gray-700 dark:text-gray-200 transition rounded-3xl\"\n\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\teditMessageConfirmHandler(false);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{$i18n.t('Save')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t<div class=\"flex space-x-1.5\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tid=\"close-edit-message-button\"\n\t\t\t\t\t\t\t\tclass=\"px-4 py-2 bg-white dark:bg-gray-900 hover:bg-gray-100 text-gray-800 dark:text-gray-100 transition rounded-3xl\"\n\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\tcancelEditMessage();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{$i18n.t('Cancel')}\n\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tid=\"confirm-edit-message-button\"\n\t\t\t\t\t\t\t\tclass=\" px-4 py-2 bg-gray-900 dark:bg-white hover:bg-gray-850 text-gray-100 dark:text-gray-800 transition rounded-3xl\"\n\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\teditMessageConfirmHandler();\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{$i18n.t('Send')}\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{:else}\n\t\t\t\t<div class=\"w-full\">\n\t\t\t\t\t<div class=\"flex {($settings?.chatBubble ?? true) ? 'justify-end pb-1' : 'w-full'}\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclass=\"rounded-3xl {($settings?.chatBubble ?? true)\n\t\t\t\t\t\t\t\t? `max-w-[90%] px-5 py-2 bg-gray-50 dark:bg-gray-850 ${\n\t\t\t\t\t\t\t\t\t\tmessage.files ? 'rounded-tr-lg' : ''\n\t\t\t\t\t\t\t\t\t}`\n\t\t\t\t\t\t\t\t: ' w-full'}\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{#if message.content}\n\t\t\t\t\t\t\t\t<Markdown id={message.id} content={message.content} />\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div\n\t\t\t\t\t\tclass=\" flex {($settings?.chatBubble ?? true)\n\t\t\t\t\t\t\t? 'justify-end'\n\t\t\t\t\t\t\t: ''} text-gray-600 dark:text-gray-500\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{#if !($settings?.chatBubble ?? true)}\n\t\t\t\t\t\t\t{#if siblings.length > 1}\n\t\t\t\t\t\t\t\t<div class=\"flex self-center\" dir=\"ltr\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tshowPreviousMessage(message);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"size-3.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M15.75 19.5 8.25 12l7.5-7.5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t<div class=\"text-sm tracking-widest font-semibold self-center dark:text-gray-100\">\n\t\t\t\t\t\t\t\t\t\t{siblings.indexOf(message.id) + 1}/{siblings.length}\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tshowNextMessage(message);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"size-3.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"m8.25 4.5 7.5 7.5-7.5 7.5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{#if !readOnly}\n\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Edit')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"invisible group-hover:visible p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition edit-user-message-button\"\n\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\teditMessageHandler();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\td=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t<Tooltip content={$i18n.t('Copy')} placement=\"bottom\">\n\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\tclass=\"invisible group-hover:visible p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\tcopyToClipboard(message.content);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\tstroke-width=\"2.3\"\n\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\td=\"M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</Tooltip>\n\n\t\t\t\t\t\t{#if !isFirstMessage && !readOnly}\n\t\t\t\t\t\t\t<Tooltip content={$i18n.t('Delete')} placement=\"bottom\">\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tclass=\"invisible group-hover:visible p-1 rounded dark:hover:text-white hover:text-black transition\"\n\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\tdeleteMessageHandler();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\tclass=\"w-4 h-4\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\td=\"m14.74 9-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 0 1-2.244 2.077H8.084a2.25 2.25 0 0 1-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 0 0-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 0 1 3.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 0 0-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 0 0-7.5 0\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t{/if}\n\n\t\t\t\t\t\t{#if $settings?.chatBubble ?? true}\n\t\t\t\t\t\t\t{#if siblings.length > 1}\n\t\t\t\t\t\t\t\t<div class=\"flex self-center\" dir=\"ltr\">\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tshowPreviousMessage(message);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"size-3.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"M15.75 19.5 8.25 12l7.5-7.5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\n\t\t\t\t\t\t\t\t\t<div class=\"text-sm tracking-widest font-semibold self-center dark:text-gray-100\">\n\t\t\t\t\t\t\t\t\t\t{siblings.indexOf(message.id) + 1}/{siblings.length}\n\t\t\t\t\t\t\t\t\t</div>\n\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tclass=\"self-center p-1 hover:bg-black/5 dark:hover:bg-white/5 dark:hover:text-white hover:text-black rounded-md transition\"\n\t\t\t\t\t\t\t\t\t\ton:click={() => {\n\t\t\t\t\t\t\t\t\t\t\tshowNextMessage(message);\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<svg\n\t\t\t\t\t\t\t\t\t\t\txmlns=\"http://www.w3.org/2000/svg\"\n\t\t\t\t\t\t\t\t\t\t\tfill=\"none\"\n\t\t\t\t\t\t\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\t\t\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\t\t\t\t\t\t\tstroke-width=\"2.5\"\n\t\t\t\t\t\t\t\t\t\t\tclass=\"size-3.5\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<path\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\t\t\t\t\t\t\t\td=\"m8.25 4.5 7.5 7.5-7.5 7.5\"\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t{/if}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t{/if}\n\t\t</div>\n\t</div>\n</div>\n","<script lang=\"ts\">\n\timport { toast } from 'svelte-sonner';\n\n\timport { tick, getContext, onMount, createEventDispatcher } from 'svelte';\n\tconst dispatch = createEventDispatcher();\n\tconst i18n = getContext('i18n');\n\n\timport { settings } from '$lib/stores';\n\timport { copyToClipboard } from '$lib/utils';\n\n\timport MultiResponseMessages from './MultiResponseMessages.svelte';\n\timport ResponseMessage from './ResponseMessage.svelte';\n\timport UserMessage from './UserMessage.svelte';\n\n\texport let chatId;\n\texport let idx = 0;\n\n\texport let history;\n\texport let messageId;\n\n\texport let user;\n\n\texport let showPreviousMessage;\n\texport let showNextMessage;\n\n\texport let editMessage;\n\texport let deleteMessage;\n\texport let rateMessage;\n\n\texport let regenerateResponse;\n\texport let continueResponse;\n\n\t// MultiResponseMessages\n\texport let mergeResponses;\n\n\texport let autoScroll = false;\n\texport let readOnly = false;\n\n\tonMount(() => {\n\t\t// console.log('message', idx);\n\t});\n</script>\n\n<div\n\tclass=\"flex flex-col justify-between px-5 mb-3 w-full {($settings?.widescreenMode ?? null)\n\t\t? 'max-w-full'\n\t\t: 'max-w-5xl'} mx-auto rounded-lg group\"\n>\n\t{#if history.messages[messageId]}\n\t\t{#if history.messages[messageId].role === 'user'}\n\t\t\t<UserMessage\n\t\t\t\t{user}\n\t\t\t\t{history}\n\t\t\t\t{messageId}\n\t\t\t\tisFirstMessage={idx === 0}\n\t\t\t\tsiblings={history.messages[messageId].parentId !== null\n\t\t\t\t\t? (history.messages[history.messages[messageId].parentId]?.childrenIds ?? [])\n\t\t\t\t\t: (Object.values(history.messages)\n\t\t\t\t\t\t\t.filter((message) => message.parentId === null)\n\t\t\t\t\t\t\t.map((message) => message.id) ?? [])}\n\t\t\t\t{showPreviousMessage}\n\t\t\t\t{showNextMessage}\n\t\t\t\t{editMessage}\n\t\t\t\ton:delete={() => deleteMessage(messageId)}\n\t\t\t\t{readOnly}\n\t\t\t/>\n\t\t{:else if (history.messages[history.messages[messageId].parentId]?.models?.length ?? 1) === 1}\n\t\t\t<ResponseMessage\n\t\t\t\t{history}\n\t\t\t\t{messageId}\n\t\t\t\tisLastMessage={messageId === history.currentId}\n\t\t\t\tsiblings={history.messages[history.messages[messageId].parentId]?.childrenIds ?? []}\n\t\t\t\t{showPreviousMessage}\n\t\t\t\t{showNextMessage}\n\t\t\t\t{editMessage}\n\t\t\t\t{rateMessage}\n\t\t\t\t{continueResponse}\n\t\t\t\t{regenerateResponse}\n\t\t\t\ton:action={async (e) => {\n\t\t\t\t\tdispatch('action', e.detail);\n\t\t\t\t}}\n\t\t\t\ton:update={async (e) => {\n\t\t\t\t\tdispatch('update');\n\t\t\t\t}}\n\t\t\t\ton:save={async (e) => {\n\t\t\t\t\tconsole.log('save', e);\n\n\t\t\t\t\tconst message = e.detail;\n\t\t\t\t\tif (message) {\n\t\t\t\t\t\thistory.messages[message.id] = message;\n\t\t\t\t\t\tdispatch('update');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdispatch('update');\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\t{readOnly}\n\t\t\t/>\n\t\t{:else}\n\t\t\t<MultiResponseMessages\n\t\t\t\tbind:history\n\t\t\t\t{chatId}\n\t\t\t\t{messageId}\n\t\t\t\tisLastMessage={messageId === history?.currentId}\n\t\t\t\t{rateMessage}\n\t\t\t\t{editMessage}\n\t\t\t\t{continueResponse}\n\t\t\t\t{regenerateResponse}\n\t\t\t\t{mergeResponses}\n\t\t\t\ton:action={async (e) => {\n\t\t\t\t\tdispatch('action', e.detail);\n\t\t\t\t}}\n\t\t\t\ton:update={async (e) => {\n\t\t\t\t\tdispatch('update');\n\t\t\t\t}}\n\t\t\t\ton:save={async (e) => {\n\t\t\t\t\tconsole.log('save', e);\n\t\t\t\t\tconst message = e.detail;\n\t\t\t\t\tif (message) {\n\t\t\t\t\t\thistory.messages[message.id] = message;\n\t\t\t\t\t\tdispatch('update');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdispatch('update');\n\t\t\t\t\t}\n\t\t\t\t}}\n\t\t\t\ton:change={async () => {\n\t\t\t\t\tawait tick();\n\t\t\t\t\tdispatch('update');\n\t\t\t\t\tdispatch('scroll');\n\t\t\t\t}}\n\t\t\t\t{readOnly}\n\t\t\t/>\n\t\t{/if}\n\t{/if}\n</div>\n","<script lang=\"ts\">\n\timport { v4 as uuidv4 } from 'uuid';\n\timport { chats, config, settings, user as _user, mobile, currentChatPage } from '$lib/stores';\n\timport { tick, getContext, onMount } from 'svelte';\n\n\timport { toast } from 'svelte-sonner';\n\timport { getChatList, updateChatById } from '$lib/apis/chats';\n\timport { copyToClipboard, findWordIndices } from '$lib/utils';\n\n\timport Placeholder from './Messages/Placeholder.svelte';\n\timport Message from './Messages/Message.svelte';\n\timport Loader from '../common/Loader.svelte';\n\timport Spinner from '../common/Spinner.svelte';\n\n\tconst i18n = getContext('i18n');\n\n\texport let chatId = '';\n\texport let user = $_user;\n\n\texport let prompt;\n\texport let history = {};\n\texport let selectedModels;\n\n\tlet messages = [];\n\n\texport let sendPrompt: Function;\n\texport let continueResponse: Function;\n\texport let regenerateResponse: Function;\n\texport let mergeResponses: Function;\n\texport let chatActionHandler: Function;\n\texport let showMessage: Function = () => {};\n\n\texport let readOnly = false;\n\n\texport let bottomPadding = false;\n\texport let autoScroll;\n\n\tlet messagesCount = 20;\n\tlet messagesLoading = false;\n\n\tconst loadMoreMessages = async () => {\n\t\t// scroll slightly down to disable continuous loading\n\t\tconst element = document.getElementById('messages-container');\n\t\telement.scrollTop = element.scrollTop + 100;\n\n\t\tmessagesLoading = true;\n\t\tmessagesCount += 20;\n\n\t\tawait tick();\n\n\t\tmessagesLoading = false;\n\t};\n\n\t$: if (history.currentId) {\n\t\tlet _messages = [];\n\n\t\tlet message = history.messages[history.currentId];\n\t\twhile (message && _messages.length <= messagesCount) {\n\t\t\t_messages.unshift({ ...message });\n\t\t\tmessage = message.parentId !== null ? history.messages[message.parentId] : null;\n\t\t}\n\n\t\tmessages = _messages;\n\t} else {\n\t\tmessages = [];\n\t}\n\n\t$: if (autoScroll && bottomPadding) {\n\t\t(async () => {\n\t\t\tawait tick();\n\t\t\tscrollToBottom();\n\t\t})();\n\t}\n\n\tconst scrollToBottom = () => {\n\t\tconst element = document.getElementById('messages-container');\n\t\telement.scrollTop = element.scrollHeight;\n\t};\n\n\tconst updateChatHistory = async () => {\n\t\tawait tick();\n\t\tawait updateChatById(localStorage.token, chatId, {\n\t\t\thistory: history,\n\t\t\tmessages: messages\n\t\t});\n\n\t\tcurrentChatPage.set(1);\n\t\tawait chats.set(await getChatList(localStorage.token, $currentChatPage));\n\t};\n\n\tconst showPreviousMessage = async (message) => {\n\t\tif (message.parentId !== null) {\n\t\t\tlet messageId =\n\t\t\t\thistory.messages[message.parentId].childrenIds[\n\t\t\t\t\tMath.max(history.messages[message.parentId].childrenIds.indexOf(message.id) - 1, 0)\n\t\t\t\t];\n\n\t\t\tif (message.id !== messageId) {\n\t\t\t\tlet messageChildrenIds = history.messages[messageId].childrenIds;\n\n\t\t\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\t\t\tmessageChildrenIds = history.messages[messageId].childrenIds;\n\t\t\t\t}\n\n\t\t\t\thistory.currentId = messageId;\n\t\t\t}\n\t\t} else {\n\t\t\tlet childrenIds = Object.values(history.messages)\n\t\t\t\t.filter((message) => message.parentId === null)\n\t\t\t\t.map((message) => message.id);\n\t\t\tlet messageId = childrenIds[Math.max(childrenIds.indexOf(message.id) - 1, 0)];\n\n\t\t\tif (message.id !== messageId) {\n\t\t\t\tlet messageChildrenIds = history.messages[messageId].childrenIds;\n\n\t\t\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\t\t\tmessageChildrenIds = history.messages[messageId].childrenIds;\n\t\t\t\t}\n\n\t\t\t\thistory.currentId = messageId;\n\t\t\t}\n\t\t}\n\n\t\tawait tick();\n\n\t\tif ($settings?.scrollOnBranchChange ?? true) {\n\t\t\tconst element = document.getElementById('messages-container');\n\t\t\tautoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tscrollToBottom();\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst showNextMessage = async (message) => {\n\t\tif (message.parentId !== null) {\n\t\t\tlet messageId =\n\t\t\t\thistory.messages[message.parentId].childrenIds[\n\t\t\t\t\tMath.min(\n\t\t\t\t\t\thistory.messages[message.parentId].childrenIds.indexOf(message.id) + 1,\n\t\t\t\t\t\thistory.messages[message.parentId].childrenIds.length - 1\n\t\t\t\t\t)\n\t\t\t\t];\n\n\t\t\tif (message.id !== messageId) {\n\t\t\t\tlet messageChildrenIds = history.messages[messageId].childrenIds;\n\n\t\t\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\t\t\tmessageChildrenIds = history.messages[messageId].childrenIds;\n\t\t\t\t}\n\n\t\t\t\thistory.currentId = messageId;\n\t\t\t}\n\t\t} else {\n\t\t\tlet childrenIds = Object.values(history.messages)\n\t\t\t\t.filter((message) => message.parentId === null)\n\t\t\t\t.map((message) => message.id);\n\t\t\tlet messageId =\n\t\t\t\tchildrenIds[Math.min(childrenIds.indexOf(message.id) + 1, childrenIds.length - 1)];\n\n\t\t\tif (message.id !== messageId) {\n\t\t\t\tlet messageChildrenIds = history.messages[messageId].childrenIds;\n\n\t\t\t\twhile (messageChildrenIds.length !== 0) {\n\t\t\t\t\tmessageId = messageChildrenIds.at(-1);\n\t\t\t\t\tmessageChildrenIds = history.messages[messageId].childrenIds;\n\t\t\t\t}\n\n\t\t\t\thistory.currentId = messageId;\n\t\t\t}\n\t\t}\n\n\t\tawait tick();\n\n\t\tif ($settings?.scrollOnBranchChange ?? true) {\n\t\t\tconst element = document.getElementById('messages-container');\n\t\t\tautoScroll = element.scrollHeight - element.scrollTop <= element.clientHeight + 50;\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tscrollToBottom();\n\t\t\t}, 100);\n\t\t}\n\t};\n\n\tconst rateMessage = async (messageId, rating) => {\n\t\thistory.messages[messageId].annotation = {\n\t\t\t...history.messages[messageId].annotation,\n\t\t\trating: rating\n\t\t};\n\n\t\tawait updateChatHistory();\n\t};\n\n\tconst editMessage = async (messageId, content, submit = true) => {\n\t\tif (history.messages[messageId].role === 'user') {\n\t\t\tif (submit) {\n\t\t\t\t// New user message\n\t\t\t\tlet userPrompt = content;\n\t\t\t\tlet userMessageId = uuidv4();\n\n\t\t\t\tlet userMessage = {\n\t\t\t\t\tid: userMessageId,\n\t\t\t\t\tparentId: history.messages[messageId].parentId,\n\t\t\t\t\tchildrenIds: [],\n\t\t\t\t\trole: 'user',\n\t\t\t\t\tcontent: userPrompt,\n\t\t\t\t\t...(history.messages[messageId].files && { files: history.messages[messageId].files }),\n\t\t\t\t\tmodels: selectedModels\n\t\t\t\t};\n\n\t\t\t\tlet messageParentId = history.messages[messageId].parentId;\n\n\t\t\t\tif (messageParentId !== null) {\n\t\t\t\t\thistory.messages[messageParentId].childrenIds = [\n\t\t\t\t\t\t...history.messages[messageParentId].childrenIds,\n\t\t\t\t\t\tuserMessageId\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\thistory.messages[userMessageId] = userMessage;\n\t\t\t\thistory.currentId = userMessageId;\n\n\t\t\t\tawait tick();\n\t\t\t\tawait sendPrompt(userPrompt, userMessageId);\n\t\t\t} else {\n\t\t\t\t// Edit user message\n\t\t\t\thistory.messages[messageId].content = content;\n\t\t\t\tawait updateChatHistory();\n\t\t\t}\n\t\t} else {\n\t\t\tif (submit) {\n\t\t\t\t// New response message\n\t\t\t\tconst responseMessageId = uuidv4();\n\t\t\t\tconst message = history.messages[messageId];\n\t\t\t\tconst parentId = message.parentId;\n\n\t\t\t\tconst responseMessage = {\n\t\t\t\t\t...message,\n\t\t\t\t\tid: responseMessageId,\n\t\t\t\t\tparentId: parentId,\n\t\t\t\t\tchildrenIds: [],\n\t\t\t\t\tcontent: content,\n\t\t\t\t\ttimestamp: Math.floor(Date.now() / 1000) // Unix epoch\n\t\t\t\t};\n\n\t\t\t\thistory.messages[responseMessageId] = responseMessage;\n\t\t\t\thistory.currentId = responseMessageId;\n\n\t\t\t\t// Append messageId to childrenIds of parent message\n\t\t\t\tif (parentId !== null) {\n\t\t\t\t\thistory.messages[parentId].childrenIds = [\n\t\t\t\t\t\t...history.messages[parentId].childrenIds,\n\t\t\t\t\t\tresponseMessageId\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tawait updateChatHistory();\n\t\t\t} else {\n\t\t\t\t// Edit response message\n\t\t\t\thistory.messages[messageId].originalContent = history.messages[messageId].content;\n\t\t\t\thistory.messages[messageId].content = content;\n\t\t\t\tawait updateChatHistory();\n\t\t\t}\n\t\t}\n\t};\n\n\tconst deleteMessage = async (messageId) => {\n\t\tconst messageToDelete = history.messages[messageId];\n\t\tconst parentMessageId = messageToDelete.parentId;\n\t\tconst childMessageIds = messageToDelete.childrenIds ?? [];\n\n\t\t// Collect all grandchildren\n\t\tconst grandchildrenIds = childMessageIds.flatMap(\n\t\t\t(childId) => history.messages[childId]?.childrenIds ?? []\n\t\t);\n\n\t\t// Update parent's children\n\t\tif (parentMessageId && history.messages[parentMessageId]) {\n\t\t\thistory.messages[parentMessageId].childrenIds = [\n\t\t\t\t...history.messages[parentMessageId].childrenIds.filter((id) => id !== messageId),\n\t\t\t\t...grandchildrenIds\n\t\t\t];\n\t\t}\n\n\t\t// Update grandchildren's parent\n\t\tgrandchildrenIds.forEach((grandchildId) => {\n\t\t\tif (history.messages[grandchildId]) {\n\t\t\t\thistory.messages[grandchildId].parentId = parentMessageId;\n\t\t\t}\n\t\t});\n\n\t\t// Delete the message and its children\n\t\t[messageId, ...childMessageIds].forEach((id) => {\n\t\t\tdelete history.messages[id];\n\t\t});\n\n\t\tawait tick();\n\n\t\tshowMessage({ id: parentMessageId });\n\n\t\t// Update the chat\n\t\tawait updateChatHistory();\n\t};\n</script>\n\n<div class=\"h-full flex\">\n\t{#if Object.keys(history?.messages ?? {}).length == 0}\n\t\t<Placeholder\n\t\t\tmodelIds={selectedModels}\n\t\t\tsubmitPrompt={async (p) => {\n\t\t\t\tlet text = p;\n\n\t\t\t\tif (p.includes('{{CLIPBOARD}}')) {\n\t\t\t\t\tconst clipboardText = await navigator.clipboard.readText().catch((err) => {\n\t\t\t\t\t\ttoast.error($i18n.t('Failed to read clipboard contents'));\n\t\t\t\t\t\treturn '{{CLIPBOARD}}';\n\t\t\t\t\t});\n\n\t\t\t\t\ttext = p.replaceAll('{{CLIPBOARD}}', clipboardText);\n\t\t\t\t}\n\n\t\t\t\tprompt = text;\n\n\t\t\t\tawait tick();\n\n\t\t\t\tconst chatInputElement = document.getElementById('chat-textarea');\n\t\t\t\tif (chatInputElement) {\n\t\t\t\t\tprompt = p;\n\n\t\t\t\t\tchatInputElement.style.height = '';\n\t\t\t\t\tchatInputElement.style.height = Math.min(chatInputElement.scrollHeight, 200) + 'px';\n\t\t\t\t\tchatInputElement.focus();\n\n\t\t\t\t\tconst words = findWordIndices(prompt);\n\n\t\t\t\t\tif (words.length > 0) {\n\t\t\t\t\t\tconst word = words.at(0);\n\t\t\t\t\t\tchatInputElement.setSelectionRange(word?.startIndex, word.endIndex + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tawait tick();\n\t\t\t}}\n\t\t/>\n\t{:else}\n\t\t<div class=\"w-full pt-2\">\n\t\t\t{#key chatId}\n\t\t\t\t<div class=\"w-full\">\n\t\t\t\t\t{#if messages.at(0)?.parentId !== null}\n\t\t\t\t\t\t<Loader\n\t\t\t\t\t\t\ton:visible={(e) => {\n\t\t\t\t\t\t\t\tconsole.log('visible');\n\t\t\t\t\t\t\t\tif (!messagesLoading) {\n\t\t\t\t\t\t\t\t\tloadMoreMessages();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"w-full flex justify-center py-1 text-xs animate-pulse items-center gap-2\">\n\t\t\t\t\t\t\t\t<Spinner className=\" size-4\" />\n\t\t\t\t\t\t\t\t<div class=\" \">Loading...</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</Loader>\n\t\t\t\t\t{/if}\n\n\t\t\t\t\t{#each messages as message, messageIdx (message.id)}\n\t\t\t\t\t\t<Message\n\t\t\t\t\t\t\t{chatId}\n\t\t\t\t\t\t\tbind:history\n\t\t\t\t\t\t\tmessageId={message.id}\n\t\t\t\t\t\t\tidx={messageIdx}\n\t\t\t\t\t\t\t{user}\n\t\t\t\t\t\t\t{showPreviousMessage}\n\t\t\t\t\t\t\t{showNextMessage}\n\t\t\t\t\t\t\t{editMessage}\n\t\t\t\t\t\t\t{deleteMessage}\n\t\t\t\t\t\t\t{rateMessage}\n\t\t\t\t\t\t\t{regenerateResponse}\n\t\t\t\t\t\t\t{continueResponse}\n\t\t\t\t\t\t\t{mergeResponses}\n\t\t\t\t\t\t\t{readOnly}\n\t\t\t\t\t\t\ton:action={async (e) => {\n\t\t\t\t\t\t\t\tconst message = history.messages[message.id];\n\t\t\t\t\t\t\t\tif (typeof e.detail === 'string') {\n\t\t\t\t\t\t\t\t\tawait chatActionHandler(chatId, e.detail, message.model, message.id);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst { id, event } = e.detail;\n\t\t\t\t\t\t\t\t\tawait chatActionHandler(chatId, id, message.model, message.id, event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ton:update={() => {\n\t\t\t\t\t\t\t\tupdateChatHistory();\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\ton:scroll={() => {\n\t\t\t\t\t\t\t\tif (autoScroll) {\n\t\t\t\t\t\t\t\t\tconst element = document.getElementById('messages-container');\n\t\t\t\t\t\t\t\t\tautoScroll =\n\t\t\t\t\t\t\t\t\t\telement.scrollHeight - element.scrollTop <= element.clientHeight + 50;\n\t\t\t\t\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\t\t\t\t\tscrollToBottom();\n\t\t\t\t\t\t\t\t\t}, 100);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pb-12\" />\n\t\t\t\t{#if bottomPadding}\n\t\t\t\t\t<div class=\" pb-6\" />\n\t\t\t\t{/if}\n\t\t\t{/key}\n\t\t</div>\n\t{/if}\n</div>\n"],"names":["size","models","inlineRule","blockRule","uuidv4","document","user","message"],"mappings":"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"}