Controls.svelte 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <script lang="ts">
  2. import { createEventDispatcher, getContext } from 'svelte';
  3. const dispatch = createEventDispatcher();
  4. const i18n = getContext('i18n');
  5. import XMark from '$lib/components/icons/XMark.svelte';
  6. import AdvancedParams from '../Settings/Advanced/AdvancedParams.svelte';
  7. import Valves from '$lib/components/chat/Controls/Valves.svelte';
  8. import FileItem from '$lib/components/common/FileItem.svelte';
  9. import Collapsible from '$lib/components/common/Collapsible.svelte';
  10. import { user, settings } from '$lib/stores';
  11. export let models = [];
  12. export let chatFiles = [];
  13. export let params = {};
  14. let showValves = false;
  15. </script>
  16. <div class=" dark:text-white">
  17. <div class=" flex items-center justify-between dark:text-gray-100 mb-2">
  18. <div class=" text-lg font-medium self-center font-primary">{$i18n.t('Chat Controls')}</div>
  19. <button
  20. class="self-center"
  21. on:click={() => {
  22. dispatch('close');
  23. }}
  24. >
  25. <XMark className="size-3.5" />
  26. </button>
  27. </div>
  28. {#if $user?.role === 'admin' || ($user?.permissions.chat?.controls ?? true)}
  29. <div class=" dark:text-gray-200 text-sm font-primary py-0.5 px-0.5">
  30. {#if chatFiles.length > 0}
  31. <Collapsible title={$i18n.t('Files')} open={true} buttonClassName="w-full">
  32. <div class="flex flex-col gap-1 mt-1.5" slot="content">
  33. {#each chatFiles as file, fileIdx}
  34. <FileItem
  35. className="w-full"
  36. item={file}
  37. edit={true}
  38. url={file?.url ? file.url : null}
  39. name={file.name}
  40. type={file.type}
  41. size={file?.size}
  42. dismissible={true}
  43. on:dismiss={() => {
  44. // Remove the file from the chatFiles array
  45. chatFiles.splice(fileIdx, 1);
  46. chatFiles = chatFiles;
  47. }}
  48. on:click={() => {
  49. console.log(file);
  50. }}
  51. />
  52. {/each}
  53. </div>
  54. </Collapsible>
  55. <hr class="my-2 border-gray-50 dark:border-gray-700/10" />
  56. {/if}
  57. {#if $user?.role === 'admin' || ($user?.permissions.chat?.valves ?? true)}
  58. <Collapsible bind:open={showValves} title={$i18n.t('Valves')} buttonClassName="w-full">
  59. <div class="text-sm" slot="content">
  60. <Valves show={showValves} />
  61. </div>
  62. </Collapsible>
  63. <hr class="my-2 border-gray-50 dark:border-gray-700/10" />
  64. {/if}
  65. {#if $user?.role === 'admin' || ($user?.permissions.chat?.system_prompt ?? true)}
  66. <Collapsible title={$i18n.t('System Prompt')} open={true} buttonClassName="w-full">
  67. <div class="" slot="content">
  68. <textarea
  69. bind:value={params.system}
  70. class="w-full text-xs outline-hidden resize-vertical {$settings.highContrastMode
  71. ? 'border-2 border-gray-300 dark:border-gray-700 rounded-lg bg-gray-50 dark:bg-gray-800 p-2.5'
  72. : 'py-1.5 bg-transparent'}"
  73. rows="4"
  74. placeholder={$i18n.t('Enter system prompt')}
  75. />
  76. </div>
  77. </Collapsible>
  78. <hr class="my-2 border-gray-50 dark:border-gray-700/10" />
  79. {/if}
  80. {#if $user?.role === 'admin' || ($user?.permissions.chat?.params ?? true)}
  81. <Collapsible title={$i18n.t('Advanced Params')} open={true} buttonClassName="w-full">
  82. <div class="text-sm mt-1.5" slot="content">
  83. <div>
  84. <AdvancedParams admin={$user?.role === 'admin'} custom={true} bind:params />
  85. </div>
  86. </div>
  87. </Collapsible>
  88. {/if}
  89. </div>
  90. {/if}
  91. </div>