123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- <script lang="ts">
- import { WEBUI_BASE_URL } from '$lib/constants';
- import { marked } from 'marked';
- import { config, user, models as _models, temporaryChatEnabled } from '$lib/stores';
- import { onMount, getContext } from 'svelte';
- import { blur, fade } from 'svelte/transition';
- import Suggestions from './Suggestions.svelte';
- import { sanitizeResponseContent } from '$lib/utils';
- import Tooltip from '$lib/components/common/Tooltip.svelte';
- import EyeSlash from '$lib/components/icons/EyeSlash.svelte';
- const i18n = getContext('i18n');
- export let modelIds = [];
- export let models = [];
- export let atSelectedModel;
- export let submitPrompt;
- let mounted = false;
- let selectedModelIdx = 0;
- $: if (modelIds.length > 0) {
- selectedModelIdx = models.length - 1;
- }
- $: models = modelIds.map((id) => $_models.find((m) => m.id === id));
- onMount(() => {
- mounted = true;
- });
- </script>
- {#key mounted}
- <div class="m-auto w-full max-w-6xl px-8 lg:px-20">
- <div class="flex justify-start">
- <div class="flex -space-x-4 mb-0.5" in:fade={{ duration: 200 }}>
- {#each models as model, modelIdx}
- <button
- on:click={() => {
- selectedModelIdx = modelIdx;
- }}
- >
- <Tooltip
- content={marked.parse(
- sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description ?? '')
- )}
- placement="right"
- >
- <img
- crossorigin="anonymous"
- src={model?.info?.meta?.profile_image_url ??
- ($i18n.language === 'dg-DG'
- ? `/doge.png`
- : `${WEBUI_BASE_URL}/static/favicon.png`)}
- class=" size-[2.7rem] rounded-full border-[1px] border-gray-200 dark:border-none"
- alt="logo"
- draggable="false"
- />
- </Tooltip>
- </button>
- {/each}
- </div>
- </div>
- {#if $temporaryChatEnabled}
- <Tooltip
- content="This chat won't appear in history and your messages will not be saved."
- className="w-fit"
- placement="top-start"
- >
- <div class="flex items-center gap-2 text-gray-500 font-medium text-lg my-2 w-fit">
- <EyeSlash strokeWidth="2.5" className="size-5" /> Temporary Chat
- </div>
- </Tooltip>
- {/if}
- <div
- class=" mt-2 mb-4 text-3xl text-gray-800 dark:text-gray-100 font-medium text-left flex items-center gap-4 font-primary"
- >
- <div>
- <div class=" capitalize line-clamp-1" in:fade={{ duration: 200 }}>
- {#if models[selectedModelIdx]?.name}
- {models[selectedModelIdx]?.name}
- {:else}
- {$i18n.t('Hello, {{name}}', { name: $user.name })}
- {/if}
- </div>
- <div in:fade={{ duration: 200, delay: 200 }}>
- {#if models[selectedModelIdx]?.info?.meta?.description ?? null}
- <div
- class="mt-0.5 text-base font-normal text-gray-500 dark:text-gray-400 line-clamp-3 markdown"
- >
- {@html marked.parse(
- sanitizeResponseContent(models[selectedModelIdx]?.info?.meta?.description)
- )}
- </div>
- {#if models[selectedModelIdx]?.info?.meta?.user}
- <div class="mt-0.5 text-sm font-normal text-gray-400 dark:text-gray-500">
- By
- {#if models[selectedModelIdx]?.info?.meta?.user.community}
- <a
- href="https://openwebui.com/m/{models[selectedModelIdx]?.info?.meta?.user
- .username}"
- >{models[selectedModelIdx]?.info?.meta?.user.name
- ? models[selectedModelIdx]?.info?.meta?.user.name
- : `@${models[selectedModelIdx]?.info?.meta?.user.username}`}</a
- >
- {:else}
- {models[selectedModelIdx]?.info?.meta?.user.name}
- {/if}
- </div>
- {/if}
- {:else}
- <div class=" font-medium text-gray-400 dark:text-gray-500 line-clamp-1 font-p">
- {$i18n.t('How can I help you today?')}
- </div>
- {/if}
- </div>
- </div>
- </div>
- <div class=" w-full font-primary" in:fade={{ duration: 200, delay: 300 }}>
- <Suggestions
- className="grid grid-cols-2"
- suggestionPrompts={atSelectedModel?.info?.meta?.suggestion_prompts ??
- models[selectedModelIdx]?.info?.meta?.suggestion_prompts ??
- $config?.default_prompt_suggestions ??
- []}
- on:select={(e) => {
- submitPrompt(e.detail);
- }}
- />
- </div>
- </div>
- {/key}
|