From 86caca495bd698e7d96d8f1bf7b142875903d068 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Mon, 7 Oct 2024 21:04:06 +0200 Subject: [PATCH 01/11] enh: show source documents vector distance + cleaner source view --- .../components/chat/Messages/Citations.svelte | 124 +++++++++++++++--- .../chat/Messages/CitationsModal.svelte | 48 ++++++- src/lib/i18n/locales/de-DE/translation.json | 4 +- 3 files changed, 151 insertions(+), 25 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index 2c23e87a4..5f1b655f4 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -1,13 +1,24 @@ {#if _citations.length > 0}
- {#each _citations as citation, idx} -
- +
+ {/each} + {:else} + +
-
- {idx + 1} + {$i18n.t('References from')} + {#each _citations.slice(0, 2) as citation, idx} +
+ +
+ {#if idx === 0} + , + {/if} + {/each} + {$i18n.t('and')} +
+ {_citations.length - 2}
-
- {citation.source.name} + {$i18n.t('more')} + {#if isCollapsibleOpen} + + {:else} + + {/if} +
+
+
+ {#each _citations as citation, idx} +
+ +
+ {/each}
- -
- {/each} +
+ + {/if}
{/if} diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index 923fdea54..d2510d924 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -2,6 +2,7 @@ import { getContext, onMount, tick } from 'svelte'; import Modal from '$lib/components/common/Modal.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; + const i18n = getContext('i18n'); export let show = false; @@ -9,14 +10,32 @@ let mergedDocuments = []; + function calculatePercentage(distance) { + return Math.max(0, Math.min(100, (1 - distance / 2) * 100)); + } + + function getRelevanceColor(percentage) { + if (percentage >= 80) + return 'bg-green-200 dark:bg-green-800 text-green-800 dark:text-green-200'; + if (percentage >= 60) + return 'bg-yellow-200 dark:bg-yellow-800 text-yellow-800 dark:text-yellow-200'; + if (percentage >= 40) + return 'bg-orange-200 dark:bg-orange-800 text-orange-800 dark:text-orange-200'; + return 'bg-red-200 dark:bg-red-800 text-red-800 dark:text-red-200'; + } + $: if (citation) { mergedDocuments = citation.document?.map((c, i) => { return { source: citation.source, document: c, - metadata: citation.metadata?.[i] + metadata: citation.metadata?.[i], + distance: citation.distances?.[i] }; }); + if (mergedDocuments.every((doc) => doc.distance !== undefined)) { + mergedDocuments.sort((a, b) => (a.distance ?? Infinity) - (b.distance ?? Infinity)); + } } @@ -61,9 +80,9 @@ placement="left" tippyOptions={{ duration: [500, 0], animation: 'perspective' }} > -
+
{document?.metadata?.name ?? document.source.name} - {document?.metadata?.page - ? `(${$i18n.t('page')} ${document.metadata.page + 1})` - : ''} + {#if document?.metadata?.page} + + ({$i18n.t('page')} + {document.metadata.page + 1}) + + {/if}
+ {#if document.distance !== undefined} +
+ {$i18n.t('Relevance')} +
+ {@const percentage = calculatePercentage(document.distance)} +
+ + {percentage.toFixed(0)}% + + ({document.distance.toFixed(4)}) +
+ {/if} {:else}
{$i18n.t('No source available')} diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index c1ccdae6d..7640a17a6 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -443,6 +443,7 @@ "Modelfile Content": "Modelfile-Inhalt", "Models": "Modelle", "More": "Mehr", + "more": "mehr", "Move to Top": "", "Name": "Name", "Name Tag": "Namens-Tag", @@ -784,5 +785,6 @@ "Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "", "Youtube": "YouTube", - "Youtube Loader Settings": "YouTube-Ladeeinstellungen" + "Youtube Loader Settings": "YouTube-Ladeeinstellungen", + "References from": "Referenzen aus" } From b105efa05f05f6bf6cd79ae80cb3b30e473e9a3b Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Mon, 7 Oct 2024 21:11:04 +0200 Subject: [PATCH 02/11] enh: append citations with distance scores --- backend/open_webui/apps/retrieval/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/open_webui/apps/retrieval/utils.py b/backend/open_webui/apps/retrieval/utils.py index 0fe206c96..d9e82f362 100644 --- a/backend/open_webui/apps/retrieval/utils.py +++ b/backend/open_webui/apps/retrieval/utils.py @@ -398,6 +398,7 @@ def get_rag_context( "source": context["file"], "document": context["documents"][0], "metadata": context["metadatas"][0], + "distances": context["distances"][0] } ) except Exception as e: From 9fc813cfa6e1967afc1ee758725b60b6539679b2 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Mon, 7 Oct 2024 21:13:13 +0200 Subject: [PATCH 03/11] fix: only append if distances are available --- backend/open_webui/apps/retrieval/utils.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/apps/retrieval/utils.py b/backend/open_webui/apps/retrieval/utils.py index d9e82f362..53961be2c 100644 --- a/backend/open_webui/apps/retrieval/utils.py +++ b/backend/open_webui/apps/retrieval/utils.py @@ -393,14 +393,14 @@ def get_rag_context( ) if "metadatas" in context: - citations.append( - { - "source": context["file"], - "document": context["documents"][0], - "metadata": context["metadatas"][0], - "distances": context["distances"][0] - } - ) + citation = { + "source": context["file"], + "document": context["documents"][0], + "metadata": context["metadatas"][0], + } + if "distances" in context and context["distances"]: + citation["distances"] = context["distances"][0] + citations.append(citation) except Exception as e: log.exception(e) From 209948af6fd4bd2f0b0790fb1a6cbea0c6d5ef0e Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Mon, 7 Oct 2024 21:15:10 +0200 Subject: [PATCH 04/11] styling --- src/lib/components/common/Collapsible.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/common/Collapsible.svelte b/src/lib/components/common/Collapsible.svelte index 1f6faf48b..df032b7ef 100644 --- a/src/lib/components/common/Collapsible.svelte +++ b/src/lib/components/common/Collapsible.svelte @@ -12,8 +12,8 @@
{#if title !== null} - {:else} - {/if} From 89c77f05a8d4f6aef320c37983fe051d41c94c97 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Thu, 10 Oct 2024 16:46:14 +0200 Subject: [PATCH 06/11] chromadb switch to cosine similarity --- backend/open_webui/apps/retrieval/vector/dbs/chroma.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/apps/retrieval/vector/dbs/chroma.py b/backend/open_webui/apps/retrieval/vector/dbs/chroma.py index 84f80b253..da5382c32 100644 --- a/backend/open_webui/apps/retrieval/vector/dbs/chroma.py +++ b/backend/open_webui/apps/retrieval/vector/dbs/chroma.py @@ -109,7 +109,10 @@ class ChromaClient: def insert(self, collection_name: str, items: list[VectorItem]): # Insert the items into the collection, if the collection does not exist, it will be created. - collection = self.client.get_or_create_collection(name=collection_name) + collection = self.client.get_or_create_collection( + name=collection_name, + metadata={"hnsw:space": "cosine"} + ) ids = [item["id"] for item in items] documents = [item["text"] for item in items] From 741230bcdbf8ea6cc8d673e61cc712efd96e6bb8 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Thu, 10 Oct 2024 17:20:50 +0200 Subject: [PATCH 07/11] fix --- backend/open_webui/apps/retrieval/vector/dbs/chroma.py | 5 ++++- src/lib/components/chat/Messages/Citations.svelte | 9 --------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/backend/open_webui/apps/retrieval/vector/dbs/chroma.py b/backend/open_webui/apps/retrieval/vector/dbs/chroma.py index da5382c32..c6d95bd52 100644 --- a/backend/open_webui/apps/retrieval/vector/dbs/chroma.py +++ b/backend/open_webui/apps/retrieval/vector/dbs/chroma.py @@ -130,7 +130,10 @@ class ChromaClient: def upsert(self, collection_name: str, items: list[VectorItem]): # Update the items in the collection, if the items are not present, insert them. If the collection does not exist, it will be created. - collection = self.client.get_or_create_collection(name=collection_name) + collection = self.client.get_or_create_collection( + name=collection_name, + metadata={"hnsw:space": "cosine"} + ) ids = [item["id"] for item in items] documents = [item["text"] for item in items] diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index 162ad6683..9ab3b31ae 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -49,15 +49,6 @@ }); return acc; }, []); - - $: if (_citations.every((citation) => citation.distances !== undefined)) { - // Sort citations by distance (relevance) - _citations = _citations.sort((a, b) => { - const aMinDistance = Math.min(...(a.distances ?? [])); - const bMinDistance = Math.min(...(b.distances ?? [])); - return aMinDistance - bMinDistance; - }); - } From 9d4d96429f22ad943115df5c04907ee84e76c468 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Sat, 12 Oct 2024 13:51:27 +0200 Subject: [PATCH 08/11] only show relevance pertentage score if distances are in cosinus silimarity range --- .../chat/Messages/CitationsModal.svelte | 45 +++++++++++-------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index d2510d924..c7a68d6fb 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -11,19 +11,20 @@ let mergedDocuments = []; function calculatePercentage(distance) { - return Math.max(0, Math.min(100, (1 - distance / 2) * 100)); + if (distance < 0) return 100; + if (distance > 1) return 0; + return Math.round((1 - distance) * 100); } - function getRelevanceColor(percentage) { - if (percentage >= 80) - return 'bg-green-200 dark:bg-green-800 text-green-800 dark:text-green-200'; - if (percentage >= 60) - return 'bg-yellow-200 dark:bg-yellow-800 text-yellow-800 dark:text-yellow-200'; - if (percentage >= 40) - return 'bg-orange-200 dark:bg-orange-800 text-orange-800 dark:text-orange-200'; - return 'bg-red-200 dark:bg-red-800 text-red-800 dark:text-red-200'; + function shouldShowPercentage(documents) { + const validDistances = documents.filter( + (d) => d.distance !== undefined && d.distance >= 0 && d.distance <= 1 + ); + return validDistances.length >= 2; } + $: showPercentage = shouldShowPercentage(mergedDocuments); + $: if (citation) { mergedDocuments = citation.document?.map((c, i) => { return { @@ -104,15 +105,23 @@
{$i18n.t('Relevance')}
- {@const percentage = calculatePercentage(document.distance)} -
- - {percentage.toFixed(0)}% - - ({document.distance.toFixed(4)}) -
+ {#if showPercentage} + {@const percentage = calculatePercentage(document.distance)} +
+ + {percentage}% + + ({document.distance.toFixed(4)}) +
+ {:else} +
+ + {document.distance.toFixed(4)} + +
+ {/if} {/if} {:else}
From 0bebc898c84c95d00d9dc5873f56448f544e975a Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Sat, 12 Oct 2024 15:18:56 +0200 Subject: [PATCH 09/11] finalizing fixes & additions --- .../components/chat/Messages/Citations.svelte | 149 ++++++++++-------- .../chat/Messages/CitationsModal.svelte | 60 ++++--- src/lib/components/common/Collapsible.svelte | 17 +- 3 files changed, 134 insertions(+), 92 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index 9ab3b31ae..a991e248b 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -10,48 +10,61 @@ export let citations = []; let _citations = []; + let showPercentage = false; let showCitationModal = false; - let selectedCitation = null; + let selectedCitation: any = null; let isCollapsibleOpen = false; - $: _citations = citations.reduce((acc, citation) => { - citation.document.forEach((document, index) => { - const metadata = citation.metadata?.[index]; - const distance = citation.distances?.[index]; - const id = metadata?.source ?? 'N/A'; - let source = citation?.source; + function shouldShowPercentage(citations: any[]) { + return citations.every( + (citation) => + citation.distances && + citation.distances.length > 0 && + citation.distances.every((d: number) => d !== undefined && d >= -1 && d <= 1) + ); + } - if (metadata?.name) { - source = { ...source, name: metadata.name }; - } + $: { + _citations = citations.reduce((acc, citation) => { + citation.document.forEach((document, index) => { + const metadata = citation.metadata?.[index]; + const distance = citation.distances?.[index]; + const id = metadata?.source ?? 'N/A'; + let source = citation?.source; - // Check if ID looks like a URL - if (id.startsWith('http://') || id.startsWith('https://')) { - source = { name: id }; - } + if (metadata?.name) { + source = { ...source, name: metadata.name }; + } - const existingSource = acc.find((item) => item.id === id); + if (id.startsWith('http://') || id.startsWith('https://')) { + source = { name: id }; + } - if (existingSource) { - existingSource.document.push(document); - existingSource.metadata.push(metadata); - if (distance !== undefined) existingSource.distances.push(distance); - } else { - acc.push({ - id: id, - source: source, - document: [document], - metadata: metadata ? [metadata] : [], - distances: distance !== undefined ? [distance] : undefined - }); - } - }); - return acc; - }, []); + const existingSource = acc.find((item) => item.id === id); + + if (existingSource) { + existingSource.document.push(document); + existingSource.metadata.push(metadata); + if (distance !== undefined) existingSource.distances.push(distance); + } else { + acc.push({ + id: id, + source: source, + document: [document], + metadata: metadata ? [metadata] : [], + distances: distance !== undefined ? [distance] : undefined + }); + } + }); + return acc; + }, []); + + showPercentage = shouldShowPercentage(_citations); + } - + {#if _citations.length > 0}
@@ -79,42 +92,50 @@ {:else}
- {$i18n.t('References from')} - {#each _citations.slice(0, 2) as citation, idx} -
- + {#if idx === 0} + , + {/if}
- + {/each} +
+
+ + + {_citations.length - 2} + + {$i18n.t('more')}
- {#if idx === 0} - , - {/if} - {/each} - {$i18n.t('and')} -
- {_citations.length - 2}
- {$i18n.t('more')} - {#if isCollapsibleOpen} - - {:else} - - {/if} +
+ {#if isCollapsibleOpen} + + {:else} + + {/if} +
diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index c7a68d6fb..4f4d6a420 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -7,24 +7,26 @@ export let show = false; export let citation; + export let showPercentage = false; let mergedDocuments = []; - function calculatePercentage(distance) { + function calculatePercentage(distance: number) { if (distance < 0) return 100; if (distance > 1) return 0; - return Math.round((1 - distance) * 100); + return Math.round((1 - distance) * 10000) / 100; } - function shouldShowPercentage(documents) { - const validDistances = documents.filter( - (d) => d.distance !== undefined && d.distance >= 0 && d.distance <= 1 - ); - return validDistances.length >= 2; + function getRelevanceColor(percentage: number) { + if (percentage >= 80) + return 'bg-green-200 dark:bg-green-800 text-green-800 dark:text-green-200'; + if (percentage >= 60) + return 'bg-yellow-200 dark:bg-yellow-800 text-yellow-800 dark:text-yellow-200'; + if (percentage >= 40) + return 'bg-orange-200 dark:bg-orange-800 text-orange-800 dark:text-orange-200'; + return 'bg-red-200 dark:bg-red-800 text-red-800 dark:text-red-200'; } - $: showPercentage = shouldShowPercentage(mergedDocuments); - $: if (citation) { mergedDocuments = citation.document?.map((c, i) => { return { @@ -79,7 +81,7 @@ - {#if showPercentage} - {@const percentage = calculatePercentage(document.distance)} +
- - {percentage}% - - ({document.distance.toFixed(4)}) + {#if showPercentage} + {@const percentage = calculatePercentage(document.distance)} + + {percentage.toFixed(2)}% + + + ({document.distance.toFixed(4)}) + + {:else} + + {document.distance.toFixed(4)} + + {/if}
- {:else} -
- - {document.distance.toFixed(4)} - -
- {/if} +
+ {:else} +
+ {$i18n.t('No source available')} +
{/if} {:else}
diff --git a/src/lib/components/common/Collapsible.svelte b/src/lib/components/common/Collapsible.svelte index d62e26c37..47f4ae44b 100644 --- a/src/lib/components/common/Collapsible.svelte +++ b/src/lib/components/common/Collapsible.svelte @@ -9,11 +9,18 @@ export let className = ''; export let title = null; + let contentHeight = 0; + let contentElement: HTMLElement; + function handleClick(event) { if (!event.target.closest('.no-toggle')) { open = !open; } } + + $: if (contentElement) { + contentHeight = open ? contentElement.scrollHeight : 0; + }
@@ -43,9 +50,13 @@ {/if} - {#if open} -
+
+
- {/if} +
From 33c3dbd9fa144e9985b55485087f824cd77616a6 Mon Sep 17 00:00:00 2001 From: Jannik Streidl Date: Mon, 14 Oct 2024 10:37:54 +0200 Subject: [PATCH 10/11] fix --- .../components/chat/Messages/Citations.svelte | 80 +++++++++++++------ .../chat/Messages/CitationsModal.svelte | 10 +-- 2 files changed, 60 insertions(+), 30 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index a991e248b..b9a8198aa 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -83,7 +83,7 @@ {idx + 1}
{/if} -
+
{citation.source.name}
@@ -94,37 +94,67 @@
-
+
-
- {#each _citations.slice(0, 2) as citation, idx} -
- + {#if idx === 0}, {/if} -
- {citation.source.name} -
- - {#if idx === 0} - , - {/if} -
- {/each} +
+ {/each} + {:else} + {#each _citations.slice(0, 1) as citation, idx} +
+ +
+ {/each} + {/if}
- {_citations.length - 2} + {_citations.length - + (_citations.length > 1 && + _citations + .slice(0, 2) + .reduce((acc, citation) => acc + citation.source.name.length, 0) <= 50 + ? 2 + : 1)} {$i18n.t('more')}
diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index 4f4d6a420..6c9c96d9a 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -103,10 +103,10 @@ {/if}
+
+ {$i18n.t('Relevance')} +
{#if document.distance !== undefined} -
- {$i18n.t('Relevance')} -
{:else}
- {$i18n.t('No source available')} + {$i18n.t('No distance available')}
{/if} {:else} @@ -140,7 +140,7 @@ {/if}
-
+
{$i18n.t('Content')}

From 79c834d0e427f7d1ebe4c622105d3c6c9006fa68 Mon Sep 17 00:00:00 2001
From: Jannik Streidl 
Date: Mon, 14 Oct 2024 11:18:13 +0200
Subject: [PATCH 11/11] fix: do not show relevances it you have mixed
 collections (cosine + l2)

---
 .../components/chat/Messages/Citations.svelte | 36 ++++++++---
 .../chat/Messages/CitationsModal.svelte       | 59 ++++++++++---------
 2 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte
index b9a8198aa..0a09b3b55 100644
--- a/src/lib/components/chat/Messages/Citations.svelte
+++ b/src/lib/components/chat/Messages/Citations.svelte
@@ -11,18 +11,34 @@
 
 	let _citations = [];
 	let showPercentage = false;
+	let showRelevance = true;
 
 	let showCitationModal = false;
 	let selectedCitation: any = null;
 	let isCollapsibleOpen = false;
 
+	function calculateShowRelevance(citations: any[]) {
+		const distances = citations.flatMap((citation) => citation.distances ?? []);
+		const inRange = distances.filter((d) => d !== undefined && d >= -1 && d <= 1).length;
+		const outOfRange = distances.filter((d) => d !== undefined && (d < -1 || d > 1)).length;
+
+		if (distances.length === 0) {
+			return false;
+		}
+
+		if (
+			(inRange === distances.length - 1 && outOfRange === 1) ||
+			(outOfRange === distances.length - 1 && inRange === 1)
+		) {
+			return false;
+		}
+
+		return true;
+	}
+
 	function shouldShowPercentage(citations: any[]) {
-		return citations.every(
-			(citation) =>
-				citation.distances &&
-				citation.distances.length > 0 &&
-				citation.distances.every((d: number) => d !== undefined && d >= -1 && d <= 1)
-		);
+		const distances = citations.flatMap((citation) => citation.distances ?? []);
+		return distances.every((d) => d !== undefined && d >= -1 && d <= 1);
 	}
 
 	$: {
@@ -60,11 +76,17 @@
 			return acc;
 		}, []);
 
+		showRelevance = calculateShowRelevance(_citations);
 		showPercentage = shouldShowPercentage(_citations);
 	}
 
 
-
+
 
 {#if _citations.length > 0}
 	
diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index 6c9c96d9a..ad965e350 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -8,6 +8,7 @@ export let show = false; export let citation; export let showPercentage = false; + export let showRelevance = true; let mergedDocuments = []; @@ -103,35 +104,37 @@ {/if}
-
- {$i18n.t('Relevance')} -
- {#if document.distance !== undefined} - -
- {#if showPercentage} - {@const percentage = calculatePercentage(document.distance)} - - {percentage.toFixed(2)}% - - - ({document.distance.toFixed(4)}) - - {:else} - - {document.distance.toFixed(4)} - - {/if} -
-
- {:else} -
- {$i18n.t('No distance available')} + {#if showRelevance} +
+ {$i18n.t('Relevance')}
+ {#if document.distance !== undefined} + +
+ {#if showPercentage} + {@const percentage = calculatePercentage(document.distance)} + + {percentage.toFixed(2)}% + + + ({document.distance.toFixed(4)}) + + {:else} + + {document.distance.toFixed(4)} + + {/if} +
+
+ {:else} +
+ {$i18n.t('No distance available')} +
+ {/if} {/if} {:else}