refac
This commit is contained in:
@@ -288,7 +288,11 @@
|
||||
required
|
||||
/>
|
||||
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={STT_OPENAI_API_KEY} />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={STT_OPENAI_API_KEY}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -326,7 +330,11 @@
|
||||
{:else if STT_ENGINE === 'deepgram'}
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={STT_DEEPGRAM_API_KEY} />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={STT_DEEPGRAM_API_KEY}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -358,6 +366,7 @@
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={STT_AZURE_API_KEY}
|
||||
required
|
||||
@@ -434,7 +443,11 @@
|
||||
required
|
||||
/>
|
||||
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={STT_MISTRAL_API_KEY} />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={STT_MISTRAL_API_KEY}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -596,19 +609,33 @@
|
||||
required
|
||||
/>
|
||||
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_OPENAI_API_KEY} />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={TTS_OPENAI_API_KEY}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{:else if TTS_ENGINE === 'elevenlabs'}
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_API_KEY} required />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={TTS_API_KEY}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{:else if TTS_ENGINE === 'azure'}
|
||||
<div>
|
||||
<div class="mt-1 flex gap-2 mb-1">
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_API_KEY} required />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={TTS_API_KEY}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
@@ -651,7 +678,11 @@
|
||||
required
|
||||
/>
|
||||
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={TTS_MISTRAL_API_KEY} />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={TTS_MISTRAL_API_KEY}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -137,7 +137,6 @@
|
||||
|
||||
<AdminSettingRow label={$i18n.t('Default Group')}>
|
||||
<SettingsSelect
|
||||
className="w-fit max-w-48"
|
||||
bind:value={adminConfig.DEFAULT_GROUP_ID}
|
||||
placeholder={$i18n.t('Select a group')}
|
||||
>
|
||||
@@ -302,10 +301,9 @@
|
||||
|
||||
<AdminSettingField label={$i18n.t('Application DN Password')}>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Application DN Password')}
|
||||
required={false}
|
||||
outerClassName="flex flex-1"
|
||||
inputClassName={inputClass}
|
||||
bind:value={LDAP_SERVER.app_dn_password}
|
||||
/>
|
||||
</AdminSettingField>
|
||||
@@ -432,10 +430,9 @@
|
||||
|
||||
<AdminSettingField label={$i18n.t('Client Secret')}>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Client Secret')}
|
||||
required={false}
|
||||
outerClassName="flex flex-1"
|
||||
inputClassName={inputClass}
|
||||
bind:value={oauthConfig.OAUTH_CLIENT_SECRET}
|
||||
/>
|
||||
</AdminSettingField>
|
||||
|
||||
@@ -108,21 +108,19 @@
|
||||
>
|
||||
{#if config.CODE_EXECUTION_JUPYTER_AUTH === 'password'}
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Jupyter Password')}
|
||||
bind:value={config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD}
|
||||
autocomplete="off"
|
||||
outerClassName="flex flex-1"
|
||||
inputClassName={inputClass}
|
||||
/>
|
||||
{:else}
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Jupyter Token')}
|
||||
bind:value={config.CODE_EXECUTION_JUPYTER_AUTH_TOKEN}
|
||||
autocomplete="off"
|
||||
outerClassName="flex flex-1"
|
||||
inputClassName={inputClass}
|
||||
/>
|
||||
{/if}
|
||||
</AdminSettingField>
|
||||
@@ -199,21 +197,19 @@
|
||||
>
|
||||
{#if config.CODE_INTERPRETER_JUPYTER_AUTH === 'password'}
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Jupyter Password')}
|
||||
bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD}
|
||||
autocomplete="off"
|
||||
outerClassName="flex flex-1"
|
||||
inputClassName={inputClass}
|
||||
/>
|
||||
{:else}
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Jupyter Token')}
|
||||
bind:value={config.CODE_INTERPRETER_JUPYTER_AUTH_TOKEN}
|
||||
autocomplete="off"
|
||||
outerClassName="flex flex-1"
|
||||
inputClassName={inputClass}
|
||||
/>
|
||||
{/if}
|
||||
</AdminSettingField>
|
||||
|
||||
@@ -451,6 +451,7 @@
|
||||
</div>
|
||||
<div class="my-0.5 flex gap-2 pr-2">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Datalab Marker API Key')}
|
||||
required={false}
|
||||
bind:value={RAGConfig.DATALAB_MARKER_API_KEY}
|
||||
@@ -611,6 +612,7 @@
|
||||
bind:value={RAGConfig.EXTERNAL_DOCUMENT_LOADER_URL}
|
||||
/>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter External Document Loader API Key')}
|
||||
required={false}
|
||||
bind:value={RAGConfig.EXTERNAL_DOCUMENT_LOADER_API_KEY}
|
||||
@@ -694,6 +696,7 @@
|
||||
bind:value={RAGConfig.DOCLING_SERVER_URL}
|
||||
/>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Docling API Key')}
|
||||
bind:value={RAGConfig.DOCLING_API_KEY}
|
||||
required={false}
|
||||
@@ -723,6 +726,7 @@
|
||||
bind:value={RAGConfig.DOCUMENT_INTELLIGENCE_ENDPOINT}
|
||||
/>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Document Intelligence Key')}
|
||||
bind:value={RAGConfig.DOCUMENT_INTELLIGENCE_KEY}
|
||||
required={false}
|
||||
@@ -750,6 +754,7 @@
|
||||
bind:value={RAGConfig.MISTRAL_OCR_API_BASE_URL}
|
||||
/>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Mistral API Key')}
|
||||
bind:value={RAGConfig.MISTRAL_OCR_API_KEY}
|
||||
/>
|
||||
@@ -777,6 +782,7 @@
|
||||
bind:value={RAGConfig.PADDLEOCR_VL_BASE_URL}
|
||||
/>
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter PaddleOCR-vl API Token')}
|
||||
bind:value={RAGConfig.PADDLEOCR_VL_TOKEN}
|
||||
required={false}
|
||||
@@ -826,6 +832,7 @@
|
||||
|
||||
<div class="flex w-full mt-2">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter MinerU API Key')}
|
||||
bind:value={RAGConfig.MINERU_API_KEY}
|
||||
/>
|
||||
@@ -1076,6 +1083,7 @@
|
||||
/>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={OpenAIKey}
|
||||
required={false}
|
||||
@@ -1091,6 +1099,7 @@
|
||||
/>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={OllamaKey}
|
||||
required={false}
|
||||
@@ -1105,7 +1114,11 @@
|
||||
bind:value={AzureOpenAIUrl}
|
||||
required
|
||||
/>
|
||||
<SensitiveInput placeholder={$i18n.t('API Key')} bind:value={AzureOpenAIKey} />
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={AzureOpenAIKey}
|
||||
/>
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<input
|
||||
@@ -1331,6 +1344,7 @@
|
||||
/>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={RAGConfig.RAG_EXTERNAL_RERANKER_API_KEY}
|
||||
required={false}
|
||||
|
||||
@@ -686,16 +686,25 @@
|
||||
}}
|
||||
/>
|
||||
|
||||
<div class="mb-3">
|
||||
<div class="mt-0.5 mb-2.5 text-xs text-gray-400 dark:text-gray-600">{$i18n.t('Events')}</div>
|
||||
<hr class="border-gray-100/10 dark:border-white/[0.015] my-2" />
|
||||
|
||||
<div class="mb-2.5 flex flex-col w-full justify-between">
|
||||
<div class="flex justify-between items-center mb-1">
|
||||
<div class="font-normal text-xs">{$i18n.t('Webhooks')}</div>
|
||||
<div class="mt-5">
|
||||
<div class="mb-2 text-xs text-gray-400 dark:text-gray-600">{$i18n.t('Events')}</div>
|
||||
|
||||
<div class="flex flex-col w-full justify-between gap-2.5">
|
||||
<div class="flex w-full items-start justify-between gap-4">
|
||||
<div class="min-w-0">
|
||||
<div class="text-xs text-gray-600 dark:text-gray-400">{$i18n.t('Webhooks')}</div>
|
||||
<div class="mt-1.5 text-[0.6875rem] text-gray-400 dark:text-gray-600">
|
||||
{$i18n.t(
|
||||
'Send product events as JSON to external services. Chat destinations receive readable messages.'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
<Tooltip content={$i18n.t('Add webhook')}>
|
||||
<button class="px-1" on:click={newWebhook} type="button">
|
||||
<button
|
||||
class="flex size-6 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-black/5 hover:text-gray-900 dark:text-gray-600 dark:hover:bg-white/5 dark:hover:text-white"
|
||||
on:click={newWebhook}
|
||||
type="button"
|
||||
>
|
||||
<Plus />
|
||||
</button>
|
||||
</Tooltip>
|
||||
@@ -746,13 +755,5 @@
|
||||
{$i18n.t('No event webhooks configured.')}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<div class="mt-1.5">
|
||||
<div class="text-xs text-gray-500">
|
||||
{$i18n.t(
|
||||
'Send product events as JSON to external services. Chat destinations receive readable messages.'
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -462,8 +462,8 @@
|
||||
<SettingsSelect
|
||||
id="external-source-provider"
|
||||
bind:value={sourceForm.provider}
|
||||
on:change={updateProvider}
|
||||
className="w-full"
|
||||
on:change={updateProvider}
|
||||
selectClassName="text-sm"
|
||||
>
|
||||
<option value="qdrant">Qdrant</option>
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
import AdminSettingField from './AdminSettingField.svelte';
|
||||
import AdminSettingRow from './AdminSettingRow.svelte';
|
||||
import AdminSettingSection from './AdminSettingSection.svelte';
|
||||
import Plus from '$lib/components/icons/Plus.svelte';
|
||||
|
||||
const i18n: any = getContext('i18n');
|
||||
|
||||
@@ -212,13 +213,22 @@
|
||||
</AdminSettingSection>
|
||||
|
||||
<AdminSettingSection title={$i18n.t('Features')}>
|
||||
<AdminSettingRow label={$i18n.t('Enable Community Sharing')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Community Sharing')}
|
||||
description={$i18n.t('Allow users to share chats with the Open WebUI community.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_COMMUNITY_SHARING} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('Enable Message Rating')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Message Rating')}
|
||||
description={$i18n.t('Let users rate assistant responses.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_MESSAGE_RATING} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('Folders')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Folders')}
|
||||
description={$i18n.t('Allow users to organize chats into folders.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_FOLDERS} />
|
||||
</AdminSettingRow>
|
||||
|
||||
@@ -237,37 +247,62 @@
|
||||
</AdminSettingField>
|
||||
{/if}
|
||||
|
||||
<AdminSettingRow label={$i18n.t('Memories')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Memories')}
|
||||
description={$i18n.t('Allow users to save memories for more personalized responses.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_MEMORIES} />
|
||||
</AdminSettingRow>
|
||||
{#if adminConfig.ENABLE_MEMORIES}
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Memory System Context')}
|
||||
labelClassName="pl-4 text-gray-500 dark:text-gray-500"
|
||||
description={$i18n.t('Include saved memories in the system context.')}
|
||||
labelClassName="text-gray-500 dark:text-gray-500"
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_MEMORY_SYSTEM_CONTEXT} />
|
||||
</AdminSettingRow>
|
||||
{/if}
|
||||
<AdminSettingRow label={$i18n.t('Notes')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Notes')}
|
||||
description={$i18n.t('Allow users to create and manage notes.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_NOTES} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('Channels')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Channels')}
|
||||
description={$i18n.t('Allow users to use channels for shared conversations.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_CHANNELS} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('Calendar')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Calendar')}
|
||||
description={$i18n.t('Allow users to access calendar features.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_CALENDAR} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('Automations')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('Automations')}
|
||||
description={$i18n.t('Allow users to create and run automations.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_AUTOMATIONS} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('User Webhooks')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('User Webhooks')}
|
||||
description={$i18n.t('Allow users to configure webhooks from their account.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_USER_WEBHOOKS} />
|
||||
</AdminSettingRow>
|
||||
<AdminSettingRow label={$i18n.t('User Status')}>
|
||||
<AdminSettingRow
|
||||
label={$i18n.t('User Status')}
|
||||
description={$i18n.t('Show user status information in the app.')}
|
||||
>
|
||||
<Switch bind:state={adminConfig.ENABLE_USER_STATUS} />
|
||||
</AdminSettingRow>
|
||||
|
||||
<AdminSettingField label={$i18n.t('Response Watermark')}>
|
||||
<AdminSettingField
|
||||
label={$i18n.t('Response Watermark')}
|
||||
description={$i18n.t('Append a watermark to assistant responses when configured.')}
|
||||
>
|
||||
<Textarea
|
||||
className={textareaClass}
|
||||
placeholder={$i18n.t('Enter a watermark for the response. Leave empty for none.')}
|
||||
@@ -294,11 +329,16 @@
|
||||
|
||||
<AdminSettingSection title={$i18n.t('UI')}>
|
||||
<div>
|
||||
<div class="mb-2 flex w-full items-center justify-between">
|
||||
<div class="text-xs text-gray-600 dark:text-gray-400">{$i18n.t('Banners')}</div>
|
||||
<div class="mb-2 flex w-full items-start justify-between gap-4">
|
||||
<div class="min-w-0">
|
||||
<div class="text-xs text-gray-600 dark:text-gray-400">{$i18n.t('Banners')}</div>
|
||||
<div class="mt-1.5 text-[0.6875rem] text-gray-400 dark:text-gray-600">
|
||||
{$i18n.t('Create announcements shown to users in the app.')}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="flex size-6 items-center justify-center rounded-lg text-gray-400 transition-colors hover:text-gray-700 dark:text-gray-600 dark:hover:text-gray-300"
|
||||
class="flex size-6 items-center justify-center rounded-lg text-gray-400 transition-colors hover:bg-black/5 hover:text-gray-900 dark:text-gray-600 dark:hover:bg-white/5 dark:hover:text-white"
|
||||
type="button"
|
||||
aria-label={$i18n.t('Add banner')}
|
||||
on:click={() => {
|
||||
@@ -317,16 +357,7 @@
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
|
||||
/>
|
||||
</svg>
|
||||
<Plus />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -448,6 +448,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={config.IMAGES_OPENAI_API_KEY}
|
||||
@@ -569,6 +570,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('Enter api auth string (e.g. username:password)')}
|
||||
bind:value={config.AUTOMATIC1111_API_AUTH}
|
||||
@@ -672,6 +674,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('sk-1234')}
|
||||
bind:value={config.COMFYUI_API_KEY}
|
||||
@@ -850,6 +853,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={config.IMAGES_GEMINI_API_KEY}
|
||||
@@ -993,6 +997,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={config.IMAGES_EDIT_OPENAI_API_KEY}
|
||||
@@ -1083,6 +1088,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('sk-1234')}
|
||||
bind:value={config.IMAGES_EDIT_COMFYUI_API_KEY}
|
||||
@@ -1253,6 +1259,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
inputClassName="text-right w-full"
|
||||
placeholder={$i18n.t('API Key')}
|
||||
bind:value={config.IMAGES_EDIT_GEMINI_API_KEY}
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
<div class="flex-1">
|
||||
<div class=" text-xs mb-1">{$i18n.t('Local Task Model')}</div>
|
||||
<SettingsSelect
|
||||
className="w-full"
|
||||
bind:value={taskConfig.TASK_MODEL}
|
||||
className="w-full"
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
on:change={() => {
|
||||
if (taskConfig.TASK_MODEL) {
|
||||
@@ -190,8 +190,8 @@
|
||||
<div class="flex-1">
|
||||
<div class=" text-xs mb-1">{$i18n.t('External Task Model')}</div>
|
||||
<SettingsSelect
|
||||
className="w-full"
|
||||
bind:value={taskConfig.TASK_MODEL_EXTERNAL}
|
||||
className="w-full"
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
on:change={() => {
|
||||
if (taskConfig.TASK_MODEL_EXTERNAL) {
|
||||
|
||||
@@ -39,6 +39,10 @@
|
||||
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
|
||||
import CheckCircle from '$lib/components/icons/CheckCircle.svelte';
|
||||
import Minus from '$lib/components/icons/Minus.svelte';
|
||||
import DocumentArrowUp from '$lib/components/icons/DocumentArrowUp.svelte';
|
||||
import Download from '$lib/components/icons/Download.svelte';
|
||||
import Wrench from '$lib/components/icons/Wrench.svelte';
|
||||
import SettingsIcon from '$lib/components/icons/Settings.svelte';
|
||||
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||
import { goto } from '$app/navigation';
|
||||
|
||||
@@ -440,7 +444,7 @@
|
||||
{#if models !== null}
|
||||
{#if selectedModelId === null}
|
||||
<div class="flex h-full min-h-0 flex-col text-sm">
|
||||
<div class="flex items-center justify-between mb-2">
|
||||
<div class="mb-2 flex items-center justify-between">
|
||||
<h2 class="text-sm font-medium text-gray-900 dark:text-white">
|
||||
{$i18n.t('Models')}
|
||||
<span class="ml-2 font-normal text-gray-500 dark:text-gray-500">
|
||||
@@ -448,47 +452,17 @@
|
||||
</span>
|
||||
</h2>
|
||||
|
||||
<div class="flex items-center gap-2">
|
||||
{#if $user?.role === 'admin'}
|
||||
<button
|
||||
type="button"
|
||||
class="text-[0.625rem] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors duration-100 disabled:opacity-30 disabled:pointer-events-none"
|
||||
disabled={modelsImportInProgress}
|
||||
on:click={() => {
|
||||
modelsImportInputElement?.click();
|
||||
}}
|
||||
>
|
||||
{$i18n.t('Import')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="text-[0.625rem] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors duration-100"
|
||||
on:click={() => {
|
||||
downloadModels(models ?? []);
|
||||
}}
|
||||
>
|
||||
{$i18n.t('Export')}
|
||||
</button>
|
||||
{/if}
|
||||
<Tooltip content={$i18n.t('Settings')}>
|
||||
<button
|
||||
type="button"
|
||||
class="text-[0.625rem] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors duration-100"
|
||||
on:click={() => {
|
||||
showManageModal = true;
|
||||
}}
|
||||
>
|
||||
{$i18n.t('Manage')}
|
||||
</button>
|
||||
<button
|
||||
type="button"
|
||||
class="text-[0.625rem] text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 transition-colors duration-100"
|
||||
class="flex h-6 w-6 items-center justify-center rounded-lg text-gray-400 transition-colors duration-75 hover:text-gray-700 dark:text-gray-600 dark:hover:text-gray-300"
|
||||
on:click={() => {
|
||||
showConfigModal = true;
|
||||
}}
|
||||
>
|
||||
{$i18n.t('Settings')}
|
||||
<SettingsIcon className="size-3.5" />
|
||||
</button>
|
||||
</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
{#if $user?.role === 'admin'}
|
||||
@@ -598,6 +572,44 @@
|
||||
|
||||
<div slot="content">
|
||||
<DropdownMenu className="w-[170px] shadow-sm">
|
||||
{#if $user?.role === 'admin'}
|
||||
<button
|
||||
class="flex h-[1.6875rem] w-full cursor-pointer select-none items-center gap-2 rounded-xl bg-transparent px-2 text-[13px] disabled:pointer-events-none disabled:opacity-40 hover:text-gray-900 dark:hover:text-gray-100"
|
||||
type="button"
|
||||
disabled={modelsImportInProgress}
|
||||
on:click={() => {
|
||||
modelsImportInputElement?.click();
|
||||
}}
|
||||
>
|
||||
<DocumentArrowUp className="size-3.5" />
|
||||
<div class="flex items-center">{$i18n.t('Import')}</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="flex h-[1.6875rem] w-full cursor-pointer select-none items-center gap-2 rounded-xl bg-transparent px-2 text-[13px] hover:text-gray-900 dark:hover:text-gray-100"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
downloadModels(models ?? []);
|
||||
}}
|
||||
>
|
||||
<Download className="size-3.5" />
|
||||
<div class="flex items-center">{$i18n.t('Export')}</div>
|
||||
</button>
|
||||
{/if}
|
||||
|
||||
<button
|
||||
class="flex h-[1.6875rem] w-full cursor-pointer select-none items-center gap-2 rounded-xl bg-transparent px-2 text-[13px] hover:text-gray-900 dark:hover:text-gray-100"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
showManageModal = true;
|
||||
}}
|
||||
>
|
||||
<Wrench className="size-3.5" />
|
||||
<div class="flex items-center">{$i18n.t('Manage')}</div>
|
||||
</button>
|
||||
|
||||
<hr class="mx-1 my-0.5 border-gray-100 dark:border-gray-800" />
|
||||
|
||||
<button
|
||||
class="flex h-[1.6875rem] w-full cursor-pointer select-none items-center gap-2 rounded-xl bg-transparent px-2 text-[13px] hover:text-gray-900 dark:hover:text-gray-100"
|
||||
type="button"
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
<div class="flex-1 mb-2.5 pr-1.5 rounded-lg bg-gray-50 dark:text-gray-300 dark:bg-gray-850">
|
||||
<SettingsSelect
|
||||
bind:value={selectedUrlIdx}
|
||||
placeholder={$i18n.t('Select an Ollama instance')}
|
||||
className="w-full"
|
||||
placeholder={$i18n.t('Select an Ollama instance')}
|
||||
selectClassName="text-sm"
|
||||
>
|
||||
{#each ollamaConfig.OLLAMA_BASE_URLS as url, idx}
|
||||
|
||||
@@ -814,8 +814,8 @@
|
||||
>
|
||||
<SettingsSelect
|
||||
bind:value={deleteModelTag}
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
className="w-full"
|
||||
placeholder={$i18n.t('Select a model')}
|
||||
selectClassName="text-sm"
|
||||
>
|
||||
<option value="" disabled selected>{$i18n.t('Select a model')}</option>
|
||||
|
||||
@@ -253,8 +253,8 @@
|
||||
<div class="flex flex-col gap-2.5">
|
||||
<AdminSettingField label={$i18n.t('Pipeline URL')}>
|
||||
<SettingsSelect
|
||||
className="w-full"
|
||||
bind:value={selectedPipelinesUrlIdx}
|
||||
className="w-full"
|
||||
placeholder={$i18n.t('Select a pipeline url')}
|
||||
on:change={async () => {
|
||||
await tick();
|
||||
@@ -330,8 +330,8 @@
|
||||
<AdminSettingField label={$i18n.t('Pipeline')}>
|
||||
<div class="flex gap-2">
|
||||
<SettingsSelect
|
||||
className="w-full"
|
||||
bind:value={selectedPipelineIdx}
|
||||
className="w-full"
|
||||
placeholder={$i18n.t('Select a pipeline')}
|
||||
on:change={async () => {
|
||||
await tick();
|
||||
|
||||
@@ -229,6 +229,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Ollama Cloud API Key')}
|
||||
bind:value={webConfig.OLLAMA_CLOUD_WEB_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -266,6 +267,7 @@
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Perplexity API Key')}
|
||||
bind:value={webConfig.PERPLEXITY_API_KEY}
|
||||
/>
|
||||
@@ -353,6 +355,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Yacy Password')}
|
||||
bind:value={webConfig.YACY_PASSWORD}
|
||||
/>
|
||||
@@ -367,6 +370,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Google PSE API Key')}
|
||||
bind:value={webConfig.GOOGLE_PSE_API_KEY}
|
||||
/>
|
||||
@@ -397,6 +401,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Brave Search API Key')}
|
||||
bind:value={webConfig.BRAVE_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -410,6 +415,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Brave Search API Key')}
|
||||
bind:value={webConfig.BRAVE_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -443,6 +449,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Kagi Search API Key')}
|
||||
bind:value={webConfig.KAGI_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -456,6 +463,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Mojeek Search API Key')}
|
||||
bind:value={webConfig.MOJEEK_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -469,6 +477,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Bocha Search API Key')}
|
||||
bind:value={webConfig.BOCHA_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -482,6 +491,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Serpstack API Key')}
|
||||
bind:value={webConfig.SERPSTACK_API_KEY}
|
||||
/>
|
||||
@@ -495,6 +505,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Serper API Key')}
|
||||
bind:value={webConfig.SERPER_API_KEY}
|
||||
/>
|
||||
@@ -508,6 +519,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter SERPHouse API Key')}
|
||||
bind:value={webConfig.SERPHOUSE_API_KEY}
|
||||
/>
|
||||
@@ -538,6 +550,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Serply API Key')}
|
||||
bind:value={webConfig.SERPLY_API_KEY}
|
||||
/>
|
||||
@@ -551,6 +564,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Tavily API Key')}
|
||||
bind:value={webConfig.TAVILY_API_KEY}
|
||||
/>
|
||||
@@ -564,6 +578,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter SearchApi API Key')}
|
||||
bind:value={webConfig.SEARCHAPI_API_KEY}
|
||||
/>
|
||||
@@ -594,6 +609,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter SerpApi API Key')}
|
||||
bind:value={webConfig.SERPAPI_API_KEY}
|
||||
/>
|
||||
@@ -642,6 +658,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Jina API Key')}
|
||||
bind:value={webConfig.JINA_API_KEY}
|
||||
/>
|
||||
@@ -673,6 +690,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Bing Search V7 Subscription Key')}
|
||||
bind:value={webConfig.BING_SEARCH_V7_SUBSCRIPTION_KEY}
|
||||
/>
|
||||
@@ -686,6 +704,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Exa API Key')}
|
||||
bind:value={webConfig.EXA_API_KEY}
|
||||
/>
|
||||
@@ -699,6 +718,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Perplexity API Key')}
|
||||
bind:value={webConfig.PERPLEXITY_API_KEY}
|
||||
/>
|
||||
@@ -767,6 +787,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Microsoft Web IQ API Key')}
|
||||
bind:value={webConfig.MICROSOFT_WEB_IQ_API_KEY}
|
||||
/>
|
||||
@@ -794,6 +815,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Sougou Search API sID')}
|
||||
bind:value={webConfig.SOUGOU_API_SID}
|
||||
/>
|
||||
@@ -806,6 +828,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Sougou Search API SK')}
|
||||
bind:value={webConfig.SOUGOU_API_SK}
|
||||
/>
|
||||
@@ -837,6 +860,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Firecrawl API Key')}
|
||||
bind:value={webConfig.FIRECRAWL_API_KEY}
|
||||
/>
|
||||
@@ -886,6 +910,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter External Web Search API Key')}
|
||||
bind:value={webConfig.EXTERNAL_WEB_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -917,6 +942,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Yandex Web Search API Key')}
|
||||
bind:value={webConfig.YANDEX_WEB_SEARCH_API_KEY}
|
||||
/>
|
||||
@@ -951,6 +977,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter You.com API Key')}
|
||||
bind:value={webConfig.YOUCOM_API_KEY}
|
||||
/>
|
||||
@@ -964,6 +991,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Linkup API Key')}
|
||||
bind:value={webConfig.LINKUP_API_KEY}
|
||||
/>
|
||||
@@ -1245,6 +1273,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Firecrawl API Key')}
|
||||
bind:value={webConfig.FIRECRAWL_API_KEY}
|
||||
/>
|
||||
@@ -1277,6 +1306,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Tavily API Key')}
|
||||
bind:value={webConfig.TAVILY_API_KEY}
|
||||
/>
|
||||
@@ -1310,6 +1340,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter Microsoft Web IQ API Key')}
|
||||
bind:value={webConfig.MICROSOFT_WEB_IQ_API_KEY}
|
||||
/>
|
||||
@@ -1356,6 +1387,7 @@
|
||||
</div>
|
||||
|
||||
<SensitiveInput
|
||||
variant="settings"
|
||||
placeholder={$i18n.t('Enter External Web Loader API Key')}
|
||||
bind:value={webConfig.EXTERNAL_WEB_LOADER_API_KEY}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user