diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 6c98ed7df..e4ec9cf81 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -537,7 +537,7 @@ class OAuthManager: ) # Redirect back to the frontend with the JWT token - redirect_base_url = request.app.state.config.WEBUI_URL or request.base_url + redirect_base_url = str(request.app.state.config.WEBUI_URL or request.base_url) if isinstance(redirect_base_url, str) and redirect_base_url.endswith("/"): redirect_base_url = redirect_base_url[:-1] redirect_url = f"{redirect_base_url}/auth#token={jwt_token}" diff --git a/src/app.html b/src/app.html index d19f3d227..6fa5b79ce 100644 --- a/src/app.html +++ b/src/app.html @@ -24,6 +24,7 @@ href="/opensearch.xml" /> + + + + {#if selectedFeedback} +
+
+
+ {$i18n.t('Feedback Details')} +
+ +
+ +
+
+
+
{$i18n.t('Rating')}
+ +
+ {selectedFeedback?.data?.details?.rating ?? '-'} +
+
+
+
{$i18n.t('Reason')}
+ +
+ {selectedFeedback?.data?.reason || '-'} +
+
+ +
+ {#if selectedFeedback?.data?.tags && selectedFeedback?.data?.tags.length} +
+ {#each selectedFeedback?.data?.tags as tag} + {tag} + {/each} +
+ {:else} + - + {/if} +
+
+ +
+
+
+
+ {/if} +
diff --git a/src/lib/components/admin/Evaluations/Feedbacks.svelte b/src/lib/components/admin/Evaluations/Feedbacks.svelte index 418e8d6d3..21848c5ca 100644 --- a/src/lib/components/admin/Evaluations/Feedbacks.svelte +++ b/src/lib/components/admin/Evaluations/Feedbacks.svelte @@ -18,6 +18,7 @@ import CloudArrowUp from '$lib/components/icons/CloudArrowUp.svelte'; import Pagination from '$lib/components/common/Pagination.svelte'; import FeedbackMenu from './FeedbackMenu.svelte'; + import FeedbackModal from './FeedbackModal.svelte'; import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte'; import ChevronUp from '$lib/components/icons/ChevronUp.svelte'; @@ -92,6 +93,19 @@ return 0; } }); + + let showFeedbackModal = false; + let selectedFeedback = null; + + const openFeedbackModal = (feedback) => { + showFeedbackModal = true; + selectedFeedback = feedback; + }; + + const closeFeedbackModal = () => { + showFeedbackModal = false; + selectedFeedback = null; + }; ////////////////////// // @@ -151,6 +165,8 @@ }; + +
{$i18n.t('Feedback History')} @@ -288,7 +304,10 @@ {#each paginatedFeedbacks as feedback (feedback.id)} - + openFeedbackModal(feedback)} + >
diff --git a/src/lib/components/admin/Evaluations/Leaderboard.svelte b/src/lib/components/admin/Evaluations/Leaderboard.svelte index de99a6752..46daf2127 100644 --- a/src/lib/components/admin/Evaluations/Leaderboard.svelte +++ b/src/lib/components/admin/Evaluations/Leaderboard.svelte @@ -7,6 +7,8 @@ import { onMount, getContext } from 'svelte'; import { models } from '$lib/stores'; + import ModelModal from './LeaderboardModal.svelte'; + import Spinner from '$lib/components/common/Spinner.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; import MagnifyingGlass from '$lib/components/icons/MagnifyingGlass.svelte'; @@ -66,6 +68,25 @@ } } + ////////////////////// + // + // Aggregate Level Modal + // + ////////////////////// + + let showLeaderboardModal = false; + let selectedModel = null; + + const openFeedbackModal = (model) => { + showLeaderboardModal = true; + selectedModel = model; + }; + + const closeLeaderboardModal = () => { + showLeaderboardModal = false; + selectedModel = null; + }; + ////////////////////// // // Rank models by Elo rating @@ -305,6 +326,13 @@ }); + +
@@ -475,7 +503,10 @@ {#each sortedModels as model, modelIdx (model.id)} - + openFeedbackModal(model)} + >
{model?.rating !== '-' ? modelIdx + 1 : '-'} diff --git a/src/lib/components/admin/Evaluations/LeaderboardModal.svelte b/src/lib/components/admin/Evaluations/LeaderboardModal.svelte new file mode 100644 index 000000000..e90405630 --- /dev/null +++ b/src/lib/components/admin/Evaluations/LeaderboardModal.svelte @@ -0,0 +1,77 @@ + + + + {#if model} +
+
+ {model.name} +
+ +
+
+
+ {#if topTags.length} +
+ {#each topTags as tagInfo} + + {tagInfo.tag} ({tagInfo.count}) + + {/each} +
+ {:else} + - + {/if} +
+
+ +
+
+ {/if} +
diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index 48d77b0b7..bd21fe196 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -109,7 +109,7 @@ > {decodeString(document?.metadata?.name ?? document.source.name)} - {#if document?.metadata?.page} + {#if Number.isInteger(document?.metadata?.page)} ({$i18n.t('page')} {document.metadata.page + 1}) diff --git a/src/lib/components/chat/Messages/MultiResponseMessages.svelte b/src/lib/components/chat/Messages/MultiResponseMessages.svelte index 47a86438f..ee736f820 100644 --- a/src/lib/components/chat/Messages/MultiResponseMessages.svelte +++ b/src/lib/components/chat/Messages/MultiResponseMessages.svelte @@ -225,7 +225,7 @@
+
{#if !($settings?.chatBubble ?? true)}
+ {:else if message.timestamp} +
+ +
{/if}
diff --git a/src/lib/components/chat/Settings/Connections/Connection.svelte b/src/lib/components/chat/Settings/Connections/Connection.svelte index b81ce4d15..ce905e181 100644 --- a/src/lib/components/chat/Settings/Connections/Connection.svelte +++ b/src/lib/components/chat/Settings/Connections/Connection.svelte @@ -83,6 +83,7 @@