ModelSelector.svelte 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. <script lang="ts">
  2. import { Collapsible } from 'bits-ui';
  3. import { setDefaultModels } from '$lib/apis/configs';
  4. import { models, showSettings, settings, user } from '$lib/stores';
  5. import { onMount, tick, getContext } from 'svelte';
  6. import { toast } from 'svelte-sonner';
  7. import Selector from './ModelSelector/Selector.svelte';
  8. import Tooltip from '../common/Tooltip.svelte';
  9. const i18n = getContext('i18n');
  10. export let selectedModels = [''];
  11. export let disabled = false;
  12. const saveDefaultModel = async () => {
  13. const hasEmptyModel = selectedModels.filter((it) => it === '');
  14. if (hasEmptyModel.length) {
  15. toast.error($i18n.t('Choose a model before saving...'));
  16. return;
  17. }
  18. settings.set({ ...$settings, models: selectedModels });
  19. localStorage.setItem('settings', JSON.stringify($settings));
  20. if ($user.role === 'admin') {
  21. console.log('setting default models globally');
  22. await setDefaultModels(localStorage.token, selectedModels.join(','));
  23. }
  24. toast.success($i18n.t('Default model updated'));
  25. };
  26. $: if (selectedModels.length > 0 && $models.length > 0) {
  27. selectedModels = selectedModels.map((model) =>
  28. $models.map((m) => m.id).includes(model) ? model : ''
  29. );
  30. }
  31. </script>
  32. <div class="flex flex-col mt-0.5 w-full">
  33. {#each selectedModels as selectedModel, selectedModelIdx}
  34. <div class="flex w-full">
  35. <div class="overflow-hidden w-full">
  36. <div class="mr-0.5 max-w-full">
  37. <Selector
  38. placeholder={$i18n.t('Select a model')}
  39. items={$models
  40. .filter((model) => model.name !== 'hr')
  41. .map((model) => ({
  42. value: model.id,
  43. label: model.name,
  44. info: model
  45. }))}
  46. bind:value={selectedModel}
  47. />
  48. </div>
  49. </div>
  50. {#if selectedModelIdx === 0}
  51. <div class=" self-center mr-2 disabled:text-gray-600 disabled:hover:text-gray-600">
  52. <Tooltip content={$i18n.t('Add Model')}>
  53. <button
  54. class=" "
  55. {disabled}
  56. on:click={() => {
  57. selectedModels = [...selectedModels, ''];
  58. }}
  59. >
  60. <svg
  61. xmlns="http://www.w3.org/2000/svg"
  62. fill="none"
  63. viewBox="0 0 24 24"
  64. stroke-width="1.5"
  65. stroke="currentColor"
  66. class="w-4 h-4"
  67. >
  68. <path stroke-linecap="round" stroke-linejoin="round" d="M12 6v12m6-6H6" />
  69. </svg>
  70. </button>
  71. </Tooltip>
  72. </div>
  73. {:else}
  74. <div class=" self-center disabled:text-gray-600 disabled:hover:text-gray-600 mr-2">
  75. <Tooltip content="Remove Model">
  76. <button
  77. {disabled}
  78. on:click={() => {
  79. selectedModels.splice(selectedModelIdx, 1);
  80. selectedModels = selectedModels;
  81. }}
  82. >
  83. <svg
  84. xmlns="http://www.w3.org/2000/svg"
  85. fill="none"
  86. viewBox="0 0 24 24"
  87. stroke-width="1.5"
  88. stroke="currentColor"
  89. class="w-4 h-4"
  90. >
  91. <path stroke-linecap="round" stroke-linejoin="round" d="M19.5 12h-15" />
  92. </svg>
  93. </button>
  94. </Tooltip>
  95. </div>
  96. {/if}
  97. </div>
  98. {/each}
  99. </div>
  100. <div class="text-left mt-0.5 ml-1 text-[0.7rem] text-gray-500">
  101. <button on:click={saveDefaultModel}> {$i18n.t('Set as default')}</button>
  102. </div>