diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 171a82ca8..feecd16c7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -27,6 +27,8 @@ body: options: - label: I have searched the existing issues and discussions. required: true + - label: I am using the latest version of Open WebUI. + required: true - type: dropdown id: installation-method @@ -83,9 +85,9 @@ body: required: true - label: I am using the latest version of **both** Open WebUI and Ollama. required: true - - label: I have checked the browser console logs. + - label: I have included the browser console logs. required: true - - label: I have checked the Docker container logs. + - label: I have included the Docker container logs. required: true - label: I have listed steps to reproduce the bug in detail. required: true @@ -110,7 +112,7 @@ body: id: reproduction-steps attributes: label: Steps to Reproduce - description: Provide step-by-step instructions to reproduce the issue. + description: Providing clear, step-by-step instructions helps us reproduce and fix the issue faster. If we can't reproduce it, we can't fix it. placeholder: | 1. Go to '...' 2. Click on '...' diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..3ba13e0ce --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/src/lib/components/admin/Settings/Connections/OllamaConnection.svelte b/src/lib/components/admin/Settings/Connections/OllamaConnection.svelte index a3e693105..48976f076 100644 --- a/src/lib/components/admin/Settings/Connections/OllamaConnection.svelte +++ b/src/lib/components/admin/Settings/Connections/OllamaConnection.svelte @@ -5,6 +5,7 @@ import Tooltip from '$lib/components/common/Tooltip.svelte'; import SensitiveInput from '$lib/components/common/SensitiveInput.svelte'; import AddConnectionModal from '$lib/components/AddConnectionModal.svelte'; + import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; import Cog6 from '$lib/components/icons/Cog6.svelte'; import Wrench from '$lib/components/icons/Wrench.svelte'; @@ -20,6 +21,7 @@ let showManageModal = false; let showConfigModal = false; + let showDeleteConfirmDialog = false; { + showDeleteConfirmDialog = true; + }} onSubmit={(connection) => { url = connection.url; config = { ...connection.config, key: connection.key }; @@ -39,6 +43,14 @@ }} /> + { + onDelete(); + showConfigModal = false; + }} +/> +
diff --git a/src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte b/src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte index 6be4a0c90..04769e6f6 100644 --- a/src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte +++ b/src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte @@ -6,6 +6,7 @@ import SensitiveInput from '$lib/components/common/SensitiveInput.svelte'; import Cog6 from '$lib/components/icons/Cog6.svelte'; import AddConnectionModal from '$lib/components/AddConnectionModal.svelte'; + import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; import { connect } from 'socket.io-client'; @@ -19,8 +20,16 @@ export let config = {}; let showConfigModal = false; + let showDeleteConfirmDialog = false; + { + onDelete(); + }} +/> + { + showDeleteConfirmDialog = true; + }} onSubmit={(connection) => { url = connection.url; key = connection.key; diff --git a/src/lib/components/admin/Settings/Evaluations/ArenaModelModal.svelte b/src/lib/components/admin/Settings/Evaluations/ArenaModelModal.svelte index 8dd898b1a..08bc0c2a1 100644 --- a/src/lib/components/admin/Settings/Evaluations/ArenaModelModal.svelte +++ b/src/lib/components/admin/Settings/Evaluations/ArenaModelModal.svelte @@ -10,6 +10,7 @@ import PencilSolid from '$lib/components/icons/PencilSolid.svelte'; import { toast } from 'svelte-sonner'; import AccessControl from '$lib/components/workspace/common/AccessControl.svelte'; + import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; export let show = false; export let edit = false; @@ -44,6 +45,7 @@ let imageInputElement; let loading = false; + let showDeleteConfirmDialog = false; const addModelHandler = () => { if (selectedModelId) { @@ -115,6 +117,14 @@ }); + { + dispatch('delete', model); + show = false; + }} +/> +
@@ -378,8 +388,7 @@ class="px-3.5 py-1.5 text-sm font-medium dark:bg-black dark:hover:bg-gray-950 dark:text-white bg-white text-black hover:bg-gray-100 transition rounded-full flex flex-row space-x-1 items-center" type="button" on:click={() => { - dispatch('delete', model); - show = false; + showDeleteConfirmDialog = true; }} > {$i18n.t('Delete')} diff --git a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte index 35334200f..e492cc9b6 100644 --- a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte +++ b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte @@ -284,6 +284,8 @@ > {$i18n.t('Delete')} + {:else} +
{/if}
- {#if $user.role === 'admin' || $user?.permissions.chat?.controls} -
- {#if chatFiles.length > 0} - -
- {#each chatFiles as file, fileIdx} - { - // Remove the file from the chatFiles array +
+ {#if chatFiles.length > 0} + +
+ {#each chatFiles as file, fileIdx} + { + // Remove the file from the chatFiles array - chatFiles.splice(fileIdx, 1); - chatFiles = chatFiles; - }} - on:click={() => { - console.log(file); - }} - /> - {/each} -
-
- -
- {/if} - - -
- + chatFiles.splice(fileIdx, 1); + chatFiles = chatFiles; + }} + on:click={() => { + console.log(file); + }} + /> + {/each}

+ {/if} + + +
+ +
+
+ + {#if $user.role === 'admin' || $user?.permissions.chat?.controls} +
@@ -90,10 +90,6 @@
-
- {:else} -
- {$i18n.t('You do not have permission to access this feature.')} -
- {/if} + {/if} +
diff --git a/src/lib/components/chat/ModelSelector/Selector.svelte b/src/lib/components/chat/ModelSelector/Selector.svelte index 7f5302975..ffc2935a3 100644 --- a/src/lib/components/chat/ModelSelector/Selector.svelte +++ b/src/lib/components/chat/ModelSelector/Selector.svelte @@ -61,7 +61,9 @@ $: selectedModel = items.find((item) => item.value === value) ?? ''; let searchValue = ''; + let selectedTag = ''; + let selectedConnectionType = ''; let ollamaVersion = null; @@ -95,12 +97,35 @@ } return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag); }) - : items.filter((item) => { - if (selectedTag === '') { - return true; - } - return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag); - }); + .filter((item) => { + if (selectedConnectionType === '') { + return true; + } else if (selectedConnectionType === 'ollama') { + return item.model?.owned_by === 'ollama'; + } else if (selectedConnectionType === 'openai') { + return item.model?.owned_by === 'openai'; + } else if (selectedConnectionType === 'direct') { + return item.model?.direct; + } + }) + : items + .filter((item) => { + if (selectedTag === '') { + return true; + } + return item.model?.info?.meta?.tags?.map((tag) => tag.name).includes(selectedTag); + }) + .filter((item) => { + if (selectedConnectionType === '') { + return true; + } else if (selectedConnectionType === 'ollama') { + return item.model?.owned_by === 'ollama'; + } else if (selectedConnectionType === 'openai') { + return item.model?.owned_by === 'openai'; + } else if (selectedConnectionType === 'direct') { + return item.model?.direct; + } + }); const pullModelHandler = async () => { const sanitizedModelTag = searchValue.trim().replace(/^ollama\s+(run|pull)\s+/, ''); @@ -326,43 +351,62 @@
{#if tags} -
+
- + {#if items.find((item) => item.model?.owned_by === 'ollama') && items.find((item) => item.model?.owned_by === 'openai')} + + + {/if} - + {#if items.find((item) => item.model?.direct)} + + {/if} {#each tags as tag}
- {:else if $mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)} - - - {/if} - {#if !$mobile && ($user.role === 'admin' || $user?.permissions?.chat?.controls)} - - - - {/if} + + +
- +
+ +
{/if}