From 5844d0525ae48fc46e9af6daec908193634fbddb Mon Sep 17 00:00:00 2001 From: rdavis Date: Thu, 13 Jun 2024 19:01:13 +0000 Subject: [PATCH 01/30] Added the ability to sort users in the admin panel --- src/routes/(app)/admin/+page.svelte | 61 ++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte index 00a2c5fb5..858f5f82d 100644 --- a/src/routes/(app)/admin/+page.svelte +++ b/src/routes/(app)/admin/+page.svelte @@ -75,6 +75,17 @@ } loaded = true; }); + let sortKey = 'created_at'; // default sort key + let sortOrder = 'asc'; // default sort order + + function setSortKey(key) { + if (sortKey === key) { + sortOrder = sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + sortKey = key; + sortOrder = 'asc'; + } + } {#key selectedUser} @@ -139,12 +150,46 @@ - - - - - - + + + + + @@ -159,6 +204,10 @@ const query = search.toLowerCase(); return name.includes(query); } + }).sort((a, b) => { + if (a[sortKey] < b[sortKey]) return sortOrder === 'asc' ? -1 : 1; + if (a[sortKey] > b[sortKey]) return sortOrder === 'asc' ? 1 : -1; + return 0; }) .slice((page - 1) * 20, page * 20) as user} From c07e7221e58582c2dfadddc72b14d33cd00099e2 Mon Sep 17 00:00:00 2001 From: rdavis Date: Thu, 13 Jun 2024 19:01:13 +0000 Subject: [PATCH 02/30] Added the ability to sort users in the admin panel --- src/routes/(app)/admin/+page.svelte | 61 ++++++++++++++++++++++++++--- 1 file changed, 55 insertions(+), 6 deletions(-) diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte index 00a2c5fb5..858f5f82d 100644 --- a/src/routes/(app)/admin/+page.svelte +++ b/src/routes/(app)/admin/+page.svelte @@ -75,6 +75,17 @@ } loaded = true; }); + let sortKey = 'created_at'; // default sort key + let sortOrder = 'asc'; // default sort order + + function setSortKey(key) { + if (sortKey === key) { + sortOrder = sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + sortKey = key; + sortOrder = 'asc'; + } + } {#key selectedUser} @@ -139,12 +150,46 @@
{$i18n.t('Role')} {$i18n.t('Name')} {$i18n.t('Email')} {$i18n.t('Last Active')} {$i18n.t('Created at')} setSortKey('role')}> + {$i18n.t('Role')} + {#if sortKey === 'role'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('name')}> + {$i18n.t('Name')} + {#if sortKey === 'name'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('email')}> + {$i18n.t('Email')} + {#if sortKey === 'email'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('last_active_at')}> + {$i18n.t('Last Active')} + {#if sortKey === 'last_active_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('created_at')}> + {$i18n.t('Created at')} + {#if sortKey === 'created_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} +
- - - - - - + + + + + @@ -159,6 +204,10 @@ const query = search.toLowerCase(); return name.includes(query); } + }).sort((a, b) => { + if (a[sortKey] < b[sortKey]) return sortOrder === 'asc' ? -1 : 1; + if (a[sortKey] > b[sortKey]) return sortOrder === 'asc' ? 1 : -1; + return 0; }) .slice((page - 1) * 20, page * 20) as user} From 91d53530e6e9dd3e5ed410cbd4839a38de04361d Mon Sep 17 00:00:00 2001 From: rdavis Date: Thu, 13 Jun 2024 23:24:52 +0000 Subject: [PATCH 03/30] Added the ability to sort chats in the admin panel chats modal Added "Updated at" column to the admin panel chats modal. --- .../components/admin/UserChatsModal.svelte | 56 +++++++++++++++++-- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/src/lib/components/admin/UserChatsModal.svelte b/src/lib/components/admin/UserChatsModal.svelte index 67fa367cd..a36b0af69 100644 --- a/src/lib/components/admin/UserChatsModal.svelte +++ b/src/lib/components/admin/UserChatsModal.svelte @@ -31,6 +31,20 @@ } })(); } + + let sortKey = 'updated_at'; // default sort key + let sortOrder = 'desc'; // default sort order + function setSortKey(key) { + if (sortKey === key) { + sortOrder = sortOrder === 'asc' ? 'desc' : 'asc'; + } else { + sortKey = key; + sortOrder = 'asc'; + } + } + $: { + console.log(chats); + } @@ -69,18 +83,45 @@ class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800" > - - + + + - {#each chats as chat, idx} + {#each chats + .sort((a, b) => { + if (a[sortKey] < b[sortKey]) return sortOrder === 'asc' ? -1 : 1; + if (a[sortKey] > b[sortKey]) return sortOrder === 'asc' ? 1 : -1; + return 0; + }) as chat, idx} - - + From dbfb6d5993736721ae0557bab9e5a148cc4b4a13 Mon Sep 17 00:00:00 2001 From: John Karabudak Date: Sat, 15 Jun 2024 22:18:18 -0230 Subject: [PATCH 07/30] fixed GitHub actions on usernames with uppercase characters --- .github/workflows/docker-build.yaml | 56 +++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docker-build.yaml b/.github/workflows/docker-build.yaml index da40f56ff..60575cebe 100644 --- a/.github/workflows/docker-build.yaml +++ b/.github/workflows/docker-build.yaml @@ -11,8 +11,6 @@ on: env: REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} - FULL_IMAGE_NAME: ghcr.io/${{ github.repository }} jobs: build-main-image: @@ -28,6 +26,15 @@ jobs: - linux/arm64 steps: + # GitHub Packages requires the entire repository name to be in lowercase + # although the repository owner has a lowercase username, this prevents some people from running actions after forking + - name: Set repository and image name to lowercase + run: | + echo "IMAGE_NAME=${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + env: + IMAGE_NAME_MIXED_CASE: '${{ github.repository }}' + - name: Prepare run: | platform=${{ matrix.platform }} @@ -116,6 +123,15 @@ jobs: - linux/arm64 steps: + # GitHub Packages requires the entire repository name to be in lowercase + # although the repository owner has a lowercase username, this prevents some people from running actions after forking + - name: Set repository and image name to lowercase + run: | + echo "IMAGE_NAME=${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + env: + IMAGE_NAME_MIXED_CASE: '${{ github.repository }}' + - name: Prepare run: | platform=${{ matrix.platform }} @@ -207,6 +223,15 @@ jobs: - linux/arm64 steps: + # GitHub Packages requires the entire repository name to be in lowercase + # although the repository owner has a lowercase username, this prevents some people from running actions after forking + - name: Set repository and image name to lowercase + run: | + echo "IMAGE_NAME=${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + env: + IMAGE_NAME_MIXED_CASE: '${{ github.repository }}' + - name: Prepare run: | platform=${{ matrix.platform }} @@ -289,6 +314,15 @@ jobs: runs-on: ubuntu-latest needs: [ build-main-image ] steps: + # GitHub Packages requires the entire repository name to be in lowercase + # although the repository owner has a lowercase username, this prevents some people from running actions after forking + - name: Set repository and image name to lowercase + run: | + echo "IMAGE_NAME=${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + env: + IMAGE_NAME_MIXED_CASE: '${{ github.repository }}' + - name: Download digests uses: actions/download-artifact@v4 with: @@ -335,6 +369,15 @@ jobs: runs-on: ubuntu-latest needs: [ build-cuda-image ] steps: + # GitHub Packages requires the entire repository name to be in lowercase + # although the repository owner has a lowercase username, this prevents some people from running actions after forking + - name: Set repository and image name to lowercase + run: | + echo "IMAGE_NAME=${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + env: + IMAGE_NAME_MIXED_CASE: '${{ github.repository }}' + - name: Download digests uses: actions/download-artifact@v4 with: @@ -382,6 +425,15 @@ jobs: runs-on: ubuntu-latest needs: [ build-ollama-image ] steps: + # GitHub Packages requires the entire repository name to be in lowercase + # although the repository owner has a lowercase username, this prevents some people from running actions after forking + - name: Set repository and image name to lowercase + run: | + echo "IMAGE_NAME=${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + echo "FULL_IMAGE_NAME=ghcr.io/${IMAGE_NAME_MIXED_CASE,,}" >>${GITHUB_ENV} + env: + IMAGE_NAME_MIXED_CASE: '${{ github.repository }}' + - name: Download digests uses: actions/download-artifact@v4 with: From ee279b79760e78c5929795ca10e332a990b5c8aa Mon Sep 17 00:00:00 2001 From: Peter De-Ath Date: Sun, 16 Jun 2024 02:55:27 +0100 Subject: [PATCH 08/30] enh: update dark mode colors on chat selectors --- .../components/chat/MessageInput/Documents.svelte | 12 ++++++------ .../chat/MessageInput/PromptCommands.svelte | 10 +++++----- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib/components/chat/MessageInput/Documents.svelte b/src/lib/components/chat/MessageInput/Documents.svelte index 5004594ee..fed9b8257 100644 --- a/src/lib/components/chat/MessageInput/Documents.svelte +++ b/src/lib/components/chat/MessageInput/Documents.svelte @@ -107,12 +107,12 @@
#
-
+
{#each filteredItems as doc, docIdx} @@ -122,7 +122,7 @@
Date: Sun, 16 Jun 2024 03:18:15 +0100 Subject: [PATCH 09/30] enh: update dark mode colors on chat selectors - models --- src/lib/components/chat/MessageInput/Models.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/chat/MessageInput/Models.svelte b/src/lib/components/chat/MessageInput/Models.svelte index b04a31ef7..b4bf97df9 100644 --- a/src/lib/components/chat/MessageInput/Models.svelte +++ b/src/lib/components/chat/MessageInput/Models.svelte @@ -139,12 +139,12 @@
@
-
+
{#each filteredModels as model, modelIdx}
-
{$i18n.t('Collection')}
+
+ {$i18n.t('Collection')} +
{:else}
#{doc.name} ({doc.filename}) diff --git a/src/lib/components/chat/MessageInput/Models.svelte b/src/lib/components/chat/MessageInput/Models.svelte index b4bf97df9..831212382 100644 --- a/src/lib/components/chat/MessageInput/Models.svelte +++ b/src/lib/components/chat/MessageInput/Models.svelte @@ -134,17 +134,19 @@ {#if prompt.charAt(0) === '@'} {#if filteredModels.length > 0}
-
-
+
+
@
-
-
+
+
{#each filteredModels as model, modelIdx}
Date: Sun, 16 Jun 2024 10:27:34 -0600 Subject: [PATCH 15/30] fix: shift delete --- src/lib/components/layout/Sidebar.svelte | 10 +++++++--- src/lib/components/layout/Sidebar/ChatItem.svelte | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index e844d4f39..8b4c5664e 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -464,9 +464,13 @@ on:select={() => { selectedChatId = chat.id; }} - on:delete={() => { - deleteChat = chat; - showDeleteConfirm = true; + on:delete={(e) => { + if ((e?.detail ?? '') === 'shift') { + deleteChatHandler(chat.id); + } else { + deleteChat = chat; + showDeleteConfirm = true; + } }} /> {/each} diff --git a/src/lib/components/layout/Sidebar/ChatItem.svelte b/src/lib/components/layout/Sidebar/ChatItem.svelte index 150490690..8ed0d674f 100644 --- a/src/lib/components/layout/Sidebar/ChatItem.svelte +++ b/src/lib/components/layout/Sidebar/ChatItem.svelte @@ -201,7 +201,7 @@
+
+
+
{$i18n.t('Widescreen Mode')}
+ + +
+
+
{$i18n.t('Title Auto-Generation')}
@@ -186,16 +230,16 @@
-
{$i18n.t('Widescreen Mode')}
+
{$i18n.t('Allow User Location')}
{/if}
{#if !camera} - {#if emoji} -
- {emoji} -
- {:else if loading} -
+ {emoji} +
+ {:else if loading} + - {:else} -
- {/if} + @keyframes spinner_8HQG { + 0%, + 57.14% { + animation-timing-function: cubic-bezier(0.33, 0.66, 0.66, 1); + transform: translate(0); + } + 28.57% { + animation-timing-function: cubic-bezier(0.33, 0, 0.66, 0.33); + transform: translateY(-6px); + } + 100% { + transform: translate(0); + } + } + + {:else} +
+ {/if} + {:else}
-
- {:else if loading} + {:else if loading || assistantSpeaking} Date: Sun, 16 Jun 2024 21:55:08 -0700 Subject: [PATCH 28/30] chore: format --- backend/apps/webui/routers/auths.py | 10 +- backend/config.py | 4 +- .../components/admin/UserChatsModal.svelte | 29 ++++-- src/lib/i18n/locales/ar-BH/translation.json | 2 + src/lib/i18n/locales/bg-BG/translation.json | 2 + src/lib/i18n/locales/bn-BD/translation.json | 2 + src/lib/i18n/locales/ca-ES/translation.json | 2 + src/lib/i18n/locales/ceb-PH/translation.json | 2 + src/lib/i18n/locales/de-DE/translation.json | 2 + src/lib/i18n/locales/dg-DG/translation.json | 2 + src/lib/i18n/locales/en-GB/translation.json | 2 + src/lib/i18n/locales/en-US/translation.json | 2 + src/lib/i18n/locales/es-ES/translation.json | 2 + src/lib/i18n/locales/fa-IR/translation.json | 2 + src/lib/i18n/locales/fi-FI/translation.json | 2 + src/lib/i18n/locales/fr-CA/translation.json | 2 + src/lib/i18n/locales/fr-FR/translation.json | 2 + src/lib/i18n/locales/he-IL/translation.json | 2 + src/lib/i18n/locales/hi-IN/translation.json | 2 + src/lib/i18n/locales/hr-HR/translation.json | 2 + src/lib/i18n/locales/it-IT/translation.json | 2 + src/lib/i18n/locales/ja-JP/translation.json | 2 + src/lib/i18n/locales/ka-GE/translation.json | 2 + src/lib/i18n/locales/ko-KR/translation.json | 2 + src/lib/i18n/locales/lt-LT/translation.json | 2 + src/lib/i18n/locales/nb-NO/translation.json | 2 + src/lib/i18n/locales/nl-NL/translation.json | 2 + src/lib/i18n/locales/pa-IN/translation.json | 2 + src/lib/i18n/locales/pl-PL/translation.json | 2 + src/lib/i18n/locales/pt-BR/translation.json | 2 + src/lib/i18n/locales/pt-PT/translation.json | 2 + src/lib/i18n/locales/ru-RU/translation.json | 2 + src/lib/i18n/locales/sr-RS/translation.json | 2 + src/lib/i18n/locales/sv-SE/translation.json | 2 + src/lib/i18n/locales/tk-TW/translation.json | 2 + src/lib/i18n/locales/tr-TR/translation.json | 2 + src/lib/i18n/locales/uk-UA/translation.json | 2 + src/lib/i18n/locales/vi-VN/translation.json | 2 + src/lib/i18n/locales/zh-CN/translation.json | 2 + src/lib/i18n/locales/zh-TW/translation.json | 2 + src/routes/(app)/admin/+page.svelte | 93 ++++++++++++------- 41 files changed, 160 insertions(+), 50 deletions(-) diff --git a/backend/apps/webui/routers/auths.py b/backend/apps/webui/routers/auths.py index 6c4941475..16e395737 100644 --- a/backend/apps/webui/routers/auths.py +++ b/backend/apps/webui/routers/auths.py @@ -33,7 +33,11 @@ from utils.utils import ( from utils.misc import parse_duration, validate_email_format from utils.webhook import post_webhook from constants import ERROR_MESSAGES, WEBHOOK_MESSAGES -from config import WEBUI_AUTH, WEBUI_AUTH_TRUSTED_EMAIL_HEADER, WEBUI_AUTH_TRUSTED_NAME_HEADER +from config import ( + WEBUI_AUTH, + WEBUI_AUTH_TRUSTED_EMAIL_HEADER, + WEBUI_AUTH_TRUSTED_NAME_HEADER, +) router = APIRouter() @@ -112,7 +116,9 @@ async def signin(request: Request, form_data: SigninForm): trusted_email = request.headers[WEBUI_AUTH_TRUSTED_EMAIL_HEADER].lower() trusted_name = trusted_email if WEBUI_AUTH_TRUSTED_NAME_HEADER: - trusted_name = request.headers.get(WEBUI_AUTH_TRUSTED_NAME_HEADER, trusted_email) + trusted_name = request.headers.get( + WEBUI_AUTH_TRUSTED_NAME_HEADER, trusted_email + ) if not Users.get_user_by_email(trusted_email.lower()): await signup( request, diff --git a/backend/config.py b/backend/config.py index f3f85202c..1a38a450d 100644 --- a/backend/config.py +++ b/backend/config.py @@ -294,9 +294,7 @@ WEBUI_AUTH = os.environ.get("WEBUI_AUTH", "True").lower() == "true" WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os.environ.get( "WEBUI_AUTH_TRUSTED_EMAIL_HEADER", None ) -WEBUI_AUTH_TRUSTED_NAME_HEADER = os.environ.get( - "WEBUI_AUTH_TRUSTED_NAME_HEADER", None -) +WEBUI_AUTH_TRUSTED_NAME_HEADER = os.environ.get("WEBUI_AUTH_TRUSTED_NAME_HEADER", None) JWT_EXPIRES_IN = PersistentConfig( "JWT_EXPIRES_IN", "auth.jwt_expiry", os.environ.get("JWT_EXPIRES_IN", "-1") ) diff --git a/src/lib/components/admin/UserChatsModal.svelte b/src/lib/components/admin/UserChatsModal.svelte index e1590f268..535dee074 100644 --- a/src/lib/components/admin/UserChatsModal.svelte +++ b/src/lib/components/admin/UserChatsModal.svelte @@ -80,7 +80,11 @@ class="text-xs text-gray-700 uppercase bg-transparent dark:text-gray-200 border-b-2 dark:border-gray-800" >
- setSortKey('title')}> + setSortKey('title')} + > {$i18n.t('Title')} {#if sortKey === 'title'} {sortOrder === 'asc' ? '▲' : '▼'} @@ -88,7 +92,11 @@
{/if} -
- - {#each chats - .sort((a, b) => { - if (a[sortKey] < b[sortKey]) return sortOrder === 'asc' ? -1 : 1; - if (a[sortKey] > b[sortKey]) return sortOrder === 'asc' ? 1 : -1; - return 0; - }) as chat, idx} + {#each chats.sort((a, b) => { + if (a[sortKey] < b[sortKey]) return sortOrder === 'asc' ? -1 : 1; + if (a[sortKey] > b[sortKey]) return sortOrder === 'asc' ? 1 : -1; + return 0; + }) as chat, idx} - - - - -
{$i18n.t('Role')} {$i18n.t('Name')} {$i18n.t('Email')} {$i18n.t('Last Active')} {$i18n.t('Created at')} setSortKey('role')}> + {$i18n.t('Role')} + {#if sortKey === 'role'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('name')}> + {$i18n.t('Name')} + {#if sortKey === 'name'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('email')}> + {$i18n.t('Email')} + {#if sortKey === 'email'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('last_active_at')}> + {$i18n.t('Last Active')} + {#if sortKey === 'last_active_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('created_at')}> + {$i18n.t('Created at')} + {#if sortKey === 'created_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} +
{$i18n.t('Name')} setSortKey('title')}> + {$i18n.t('Name')} + {#if sortKey === 'title'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} + setSortKey('created_at')}> + {$i18n.t('Created at')} + {#if sortKey === 'created_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} +
+
{dayjs(chat.created_at * 1000).format($i18n.t('MMMM DD, YYYY HH:mm'))}
From 26575c508669489d1515a67e7370e4f22de10afb Mon Sep 17 00:00:00 2001 From: rdavis Date: Thu, 13 Jun 2024 23:59:15 +0000 Subject: [PATCH 04/30] Changed column header text to match property. Removed debugging code. --- src/lib/components/admin/UserChatsModal.svelte | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/lib/components/admin/UserChatsModal.svelte b/src/lib/components/admin/UserChatsModal.svelte index a36b0af69..7a2dea048 100644 --- a/src/lib/components/admin/UserChatsModal.svelte +++ b/src/lib/components/admin/UserChatsModal.svelte @@ -42,9 +42,6 @@ sortOrder = 'asc'; } } - $: { - console.log(chats); - } @@ -84,7 +81,7 @@ >
setSortKey('title')}> - {$i18n.t('Name')} + {$i18n.t('Title')} {#if sortKey === 'title'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} From b0d9aa38d2fb0c76790bd72081e969357d29f49b Mon Sep 17 00:00:00 2001 From: rdavis Date: Fri, 14 Jun 2024 00:07:21 +0000 Subject: [PATCH 05/30] Swapped from inline style to using tailwind class. --- src/lib/components/admin/UserChatsModal.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/admin/UserChatsModal.svelte b/src/lib/components/admin/UserChatsModal.svelte index 7a2dea048..e1590f268 100644 --- a/src/lib/components/admin/UserChatsModal.svelte +++ b/src/lib/components/admin/UserChatsModal.svelte @@ -85,7 +85,7 @@ {#if sortKey === 'title'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} setSortKey('created_at')}> @@ -93,7 +93,7 @@ {#if sortKey === 'created_at'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} From 385fcfe8d0a607ff3be69d6a07ea04f43555a575 Mon Sep 17 00:00:00 2001 From: rdavis Date: Fri, 14 Jun 2024 00:29:31 +0000 Subject: [PATCH 06/30] Swapped from inline style to using tailwind class. --- src/routes/(app)/admin/+page.svelte | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/(app)/admin/+page.svelte b/src/routes/(app)/admin/+page.svelte index 858f5f82d..3ea36c689 100644 --- a/src/routes/(app)/admin/+page.svelte +++ b/src/routes/(app)/admin/+page.svelte @@ -155,7 +155,7 @@ {#if sortKey === 'role'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} setSortKey('name')}> @@ -163,7 +163,7 @@ {#if sortKey === 'name'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} setSortKey('email')}> @@ -171,7 +171,7 @@ {#if sortKey === 'email'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} setSortKey('last_active_at')}> @@ -179,7 +179,7 @@ {#if sortKey === 'last_active_at'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} setSortKey('created_at')}> @@ -187,7 +187,7 @@ {#if sortKey === 'created_at'} {sortOrder === 'asc' ? '▲' : '▼'} {:else} - + {/if} setSortKey('created_at')}> + setSortKey('created_at')} + > {$i18n.t('Created at')} {#if sortKey === 'created_at'} {sortOrder === 'asc' ? '▲' : '▼'} @@ -96,7 +104,11 @@ {/if}
setSortKey('role')}> - {$i18n.t('Role')} - {#if sortKey === 'role'} - {sortOrder === 'asc' ? '▲' : '▼'} - {:else} - - {/if} + setSortKey('role')} + > + {$i18n.t('Role')} + {#if sortKey === 'role'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} setSortKey('name')}> - {$i18n.t('Name')} - {#if sortKey === 'name'} - {sortOrder === 'asc' ? '▲' : '▼'} - {:else} - - {/if} + setSortKey('name')} + > + {$i18n.t('Name')} + {#if sortKey === 'name'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} setSortKey('email')}> - {$i18n.t('Email')} - {#if sortKey === 'email'} - {sortOrder === 'asc' ? '▲' : '▼'} - {:else} - - {/if} + setSortKey('email')} + > + {$i18n.t('Email')} + {#if sortKey === 'email'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} setSortKey('last_active_at')}> - {$i18n.t('Last Active')} - {#if sortKey === 'last_active_at'} - {sortOrder === 'asc' ? '▲' : '▼'} - {:else} - - {/if} + setSortKey('last_active_at')} + > + {$i18n.t('Last Active')} + {#if sortKey === 'last_active_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} setSortKey('created_at')}> - {$i18n.t('Created at')} - {#if sortKey === 'created_at'} - {sortOrder === 'asc' ? '▲' : '▼'} - {:else} - - {/if} + setSortKey('created_at')} + > + {$i18n.t('Created at')} + {#if sortKey === 'created_at'} + {sortOrder === 'asc' ? '▲' : '▼'} + {:else} + + {/if} @@ -213,7 +233,8 @@ const query = search.toLowerCase(); return name.includes(query); } - }).sort((a, b) => { + }) + .sort((a, b) => { if (a[sortKey] < b[sortKey]) return sortOrder === 'asc' ? -1 : 1; if (a[sortKey] > b[sortKey]) return sortOrder === 'asc' ? 1 : -1; return 0; From 4a67ae119502f61b933ff14eade9f9743808c119 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 16 Jun 2024 22:28:26 -0700 Subject: [PATCH 29/30] fix: message delete issue --- src/lib/components/chat/Messages.svelte | 59 +++++---- .../chat/Messages/ResponseMessage.svelte | 116 +++++++++--------- 2 files changed, 94 insertions(+), 81 deletions(-) diff --git a/src/lib/components/chat/Messages.svelte b/src/lib/components/chat/Messages.svelte index f633b5774..3cab9a584 100644 --- a/src/lib/components/chat/Messages.svelte +++ b/src/lib/components/chat/Messages.svelte @@ -202,38 +202,51 @@ }, 100); }; - const messageDeleteHandler = async (messageId) => { + const deleteMessageHandler = async (messageId) => { const messageToDelete = history.messages[messageId]; - const messageParentId = messageToDelete.parentId; - const messageChildrenIds = messageToDelete.childrenIds ?? []; - const hasSibling = messageChildrenIds.some( + + const parentMessageId = messageToDelete.parentId; + const childMessageIds = messageToDelete.childrenIds ?? []; + + const hasDescendantMessages = childMessageIds.some( (childId) => history.messages[childId]?.childrenIds?.length > 0 ); - messageChildrenIds.forEach((childId) => { - const child = history.messages[childId]; - if (child && child.childrenIds) { - if (child.childrenIds.length === 0 && !hasSibling) { - // if last prompt/response pair - history.messages[messageParentId].childrenIds = []; - history.currentId = messageParentId; + + history.currentId = parentMessageId; + await tick(); + + // Remove the message itself from the parent message's children array + history.messages[parentMessageId].childrenIds = history.messages[ + parentMessageId + ].childrenIds.filter((id) => id !== messageId); + + await tick(); + + childMessageIds.forEach((childId) => { + const childMessage = history.messages[childId]; + + if (childMessage && childMessage.childrenIds) { + if (childMessage.childrenIds.length === 0 && !hasDescendantMessages) { + // If there are no other responses/prompts + history.messages[parentMessageId].childrenIds = []; } else { - child.childrenIds.forEach((grandChildId) => { + childMessage.childrenIds.forEach((grandChildId) => { if (history.messages[grandChildId]) { - history.messages[grandChildId].parentId = messageParentId; - history.messages[messageParentId].childrenIds.push(grandChildId); + history.messages[grandChildId].parentId = parentMessageId; + history.messages[parentMessageId].childrenIds.push(grandChildId); } }); } } - // remove response - history.messages[messageParentId].childrenIds = history.messages[ - messageParentId + + // Remove child message id from the parent message's children array + history.messages[parentMessageId].childrenIds = history.messages[ + parentMessageId ].childrenIds.filter((id) => id !== childId); }); - // remove prompt - history.messages[messageParentId].childrenIds = history.messages[ - messageParentId - ].childrenIds.filter((id) => id !== messageId); + + await tick(); + await updateChatById(localStorage.token, chatId, { messages: messages, history: history @@ -292,7 +305,7 @@ > {#if message.role === 'user'} messageDeleteHandler(message.id)} + on:delete={() => deleteMessageHandler(message.id)} {user} {readOnly} {message} @@ -308,7 +321,7 @@ copyToClipboard={copyToClipboardWithToast} /> {:else if $mobile || (history.messages[message.parentId]?.models?.length ?? 1) === 1} - {#key message.id} + {#key message.id && history.currentId} - {/if} - {#if isLastMessage && !readOnly} - - - + + + + + + - - - + + + + + + {/if} {/if} {/if} From 4559c8af74cea3b3136a58ca645fdb2e5078caf3 Mon Sep 17 00:00:00 2001 From: "Timothy J. Baek" Date: Sun, 16 Jun 2024 22:52:27 -0700 Subject: [PATCH 30/30] doc: changelog --- CHANGELOG.md | 24 ++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bfff72eed..6756d105b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.5] - 2024-06-16 + +### Added + +- **📞 Enhanced Voice Call**: Text-to-speech (TTS) callback now operates in real-time for each sentence, reducing latency by not waiting for full completion. +- **👆 Tap to Interrupt**: During a call, you can now stop the assistant from speaking by simply tapping, instead of using voice. This resolves the issue of the speaker's voice being mistakenly registered as input. +- **😊 Emoji Call**: Toggle this feature on from the Settings > Interface, allowing LLMs to express emotions using emojis during voice calls for a more dynamic interaction. +- **🖱️ Quick Archive/Delete**: Use the Shift key + mouseover on the chat list to swiftly archive or delete items. +- **📝 Markdown Support in Model Descriptions**: You can now format model descriptions with markdown, enabling bold text, links, etc. +- **🧠 Editable Memories**: Adds the capability to modify memories. +- **📋 Admin Panel Sorting**: Introduces the ability to sort users/chats within the admin panel. +- **🌑 Dark Mode for Quick Selectors**: Dark mode now available for chat quick selectors (prompts, models, documents). +- **🔧 Advanced Parameters**: Adds 'num_keep' and 'num_batch' to advanced parameters for customization. +- **📅 Dynamic System Prompts**: New variables '{{CURRENT_DATETIME}}', '{{CURRENT_TIME}}', '{{USER_LOCATION}}' added for system prompts. Ensure '{{USER_LOCATION}}' is toggled on from Settings > Interface. +- **🌐 Tavily Web Search**: Includes Tavily as a web search provider option. +- **🖊️ Federated Auth Usernames**: Ability to set user names for federated authentication. +- **🔗 Auto Clean URLs**: When adding connection URLs, trailing slashes are now automatically removed. +- **🌐 Enhanced Translations**: Improved Chinese and Swedish translations. + +### Fixed + +- **⏳ AIOHTTP_CLIENT_TIMEOUT**: Introduced a new environment variable 'AIOHTTP_CLIENT_TIMEOUT' for requests to Ollama lasting longer than 5 minutes. Default is 300 seconds; set to blank ('') for no timeout. +- **❌ Message Delete Freeze**: Resolved an issue where message deletion would sometimes cause the web UI to freeze. + ## [0.3.4] - 2024-06-12 ### Fixed diff --git a/package-lock.json b/package-lock.json index f5b9d6a78..513993c74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "open-webui", - "version": "0.3.4", + "version": "0.3.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "open-webui", - "version": "0.3.4", + "version": "0.3.5", "dependencies": { "@codemirror/lang-javascript": "^6.2.2", "@codemirror/lang-python": "^6.1.6", diff --git a/package.json b/package.json index bf353ef7f..46aeb14f7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "open-webui", - "version": "0.3.4", + "version": "0.3.5", "private": true, "scripts": { "dev": "npm run pyodide:fetch && vite dev --host",