Spaces:
Paused
Paused
| <script lang="ts"> | |
| import { models, showSettings, settings, user, mobile, config } from '$lib/stores'; | |
| import { onMount, tick, getContext } from 'svelte'; | |
| import { toast } from 'svelte-sonner'; | |
| import Selector from './ModelSelector/Selector.svelte'; | |
| import Tooltip from '../common/Tooltip.svelte'; | |
| import { setDefaultModels } from '$lib/apis/configs'; | |
| import { updateUserSettings } from '$lib/apis/users'; | |
| const i18n = getContext('i18n'); | |
| export let selectedModels = ['']; | |
| export let disabled = false; | |
| export let showSetDefault = true; | |
| const saveDefaultModel = async () => { | |
| const hasEmptyModel = selectedModels.filter((it) => it === ''); | |
| if (hasEmptyModel.length) { | |
| toast.error($i18n.t('Choose a model before saving...')); | |
| return; | |
| } | |
| settings.set({ ...$settings, models: selectedModels }); | |
| await updateUserSettings(localStorage.token, { ui: $settings }); | |
| toast.success($i18n.t('Default model updated')); | |
| }; | |
| $: if (selectedModels.length > 0 && $models.length > 0) { | |
| selectedModels = selectedModels.map((model) => | |
| $models.map((m) => m.id).includes(model) ? model : '' | |
| ); | |
| } | |
| </script> | |
| <div class="flex flex-col w-full items-start"> | |
| {#each selectedModels as selectedModel, selectedModelIdx} | |
| <div class="flex w-full max-w-fit"> | |
| <div class="overflow-hidden w-full"> | |
| <div class="mr-1 max-w-full"> | |
| <Selector | |
| id={`${selectedModelIdx}`} | |
| placeholder={$i18n.t('Select a model')} | |
| items={$models.map((model) => ({ | |
| value: model.id, | |
| label: model.name, | |
| model: model | |
| }))} | |
| showTemporaryChatControl={$user.role === 'user' | |
| ? ($config?.permissions?.chat?.temporary ?? true) | |
| : true} | |
| bind:value={selectedModel} | |
| /> | |
| </div> | |
| </div> | |
| {#if selectedModelIdx === 0} | |
| <div | |
| class=" self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]" | |
| > | |
| <Tooltip content={$i18n.t('Add Model')}> | |
| <button | |
| class=" " | |
| {disabled} | |
| on:click={() => { | |
| selectedModels = [...selectedModels, '']; | |
| }} | |
| aria-label="Add Model" | |
| > | |
| <svg | |
| xmlns="http://www.w3.org/2000/svg" | |
| fill="none" | |
| viewBox="0 0 24 24" | |
| stroke-width="2" | |
| stroke="currentColor" | |
| class="size-3.5" | |
| > | |
| <path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" /> | |
| </svg> | |
| </button> | |
| </Tooltip> | |
| </div> | |
| {:else} | |
| <div | |
| class=" self-center mx-1 disabled:text-gray-600 disabled:hover:text-gray-600 -translate-y-[0.5px]" | |
| > | |
| <Tooltip content={$i18n.t('Remove Model')}> | |
| <button | |
| {disabled} | |
| on:click={() => { | |
| selectedModels.splice(selectedModelIdx, 1); | |
| selectedModels = selectedModels; | |
| }} | |
| aria-label="Remove Model" | |
| > | |
| <svg | |
| xmlns="http://www.w3.org/2000/svg" | |
| fill="none" | |
| viewBox="0 0 24 24" | |
| stroke-width="2" | |
| stroke="currentColor" | |
| class="size-3" | |
| > | |
| <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" /> | |
| </svg> | |
| </button> | |
| </Tooltip> | |
| </div> | |
| {/if} | |
| </div> | |
| {/each} | |
| </div> | |
| {#if showSetDefault} | |
| <div class=" absolute text-left mt-[1px] ml-1 text-[0.7rem] text-gray-500 font-primary"> | |
| <button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button> | |
| </div> | |
| {/if} | |