Unverified Commit e98cb452 authored by Timothy Jaeryang Baek's avatar Timothy Jaeryang Baek Committed by GitHub
Browse files

Merge pull request #2011 from cheahjs/feat/rag-citations

feat: show RAG query results as citations
parents ba09fcd5 c84e0aa2
...@@ -271,14 +271,14 @@ def rag_messages( ...@@ -271,14 +271,14 @@ def rag_messages(
for doc in docs: for doc in docs:
context = None context = None
collection = doc.get("collection_name") collection_names = (
if collection: doc["collection_names"]
collection = [collection] if doc["type"] == "collection"
else: else [doc["collection_name"]]
collection = doc.get("collection_names", []) )
collection = set(collection).difference(extracted_collections) collection_names = set(collection_names).difference(extracted_collections)
if not collection: if not collection_names:
log.debug(f"skipping {doc} as it has already been extracted") log.debug(f"skipping {doc} as it has already been extracted")
continue continue
...@@ -288,11 +288,7 @@ def rag_messages( ...@@ -288,11 +288,7 @@ def rag_messages(
else: else:
if hybrid_search: if hybrid_search:
context = query_collection_with_hybrid_search( context = query_collection_with_hybrid_search(
collection_names=( collection_names=collection_names,
doc["collection_names"]
if doc["type"] == "collection"
else [doc["collection_name"]]
),
query=query, query=query,
embedding_function=embedding_function, embedding_function=embedding_function,
k=k, k=k,
...@@ -301,11 +297,7 @@ def rag_messages( ...@@ -301,11 +297,7 @@ def rag_messages(
) )
else: else:
context = query_collection( context = query_collection(
collection_names=( collection_names=collection_names,
doc["collection_names"]
if doc["type"] == "collection"
else [doc["collection_name"]]
),
query=query, query=query,
embedding_function=embedding_function, embedding_function=embedding_function,
k=k, k=k,
...@@ -315,18 +307,31 @@ def rag_messages( ...@@ -315,18 +307,31 @@ def rag_messages(
context = None context = None
if context: if context:
relevant_contexts.append(context) relevant_contexts.append({**context, "source": doc})
extracted_collections.extend(collection) extracted_collections.extend(collection_names)
context_string = "" context_string = ""
citations = []
for context in relevant_contexts: for context in relevant_contexts:
try: try:
if "documents" in context: if "documents" in context:
items = [item for item in context["documents"][0] if item is not None] context_string += "\n\n".join(
context_string += "\n\n".join(items) [text for text in context["documents"][0] if text is not None]
)
if "metadatas" in context:
citations.append(
{
"source": context["source"],
"document": context["documents"][0],
"metadata": context["metadatas"][0],
}
)
except Exception as e: except Exception as e:
log.exception(e) log.exception(e)
context_string = context_string.strip() context_string = context_string.strip()
ra_content = rag_template( ra_content = rag_template(
...@@ -355,7 +360,7 @@ def rag_messages( ...@@ -355,7 +360,7 @@ def rag_messages(
messages[last_user_message_idx] = new_user_message messages[last_user_message_idx] = new_user_message
return messages return messages, citations
def get_model_path(model: str, update_model: bool = False): def get_model_path(model: str, update_model: bool = False):
......
...@@ -18,6 +18,18 @@ from secrets import token_bytes ...@@ -18,6 +18,18 @@ from secrets import token_bytes
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
####################################
# Load .env file
####################################
try:
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv("../.env"))
except ImportError:
print("dotenv not installed, skipping...")
#################################### ####################################
# LOGGING # LOGGING
#################################### ####################################
...@@ -59,16 +71,6 @@ for source in log_sources: ...@@ -59,16 +71,6 @@ for source in log_sources:
log.setLevel(SRC_LOG_LEVELS["CONFIG"]) log.setLevel(SRC_LOG_LEVELS["CONFIG"])
####################################
# Load .env file
####################################
try:
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv("../.env"))
except ImportError:
log.warning("dotenv not installed, skipping...")
WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI") WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
if WEBUI_NAME != "Open WebUI": if WEBUI_NAME != "Open WebUI":
......
...@@ -15,7 +15,7 @@ from fastapi.middleware.wsgi import WSGIMiddleware ...@@ -15,7 +15,7 @@ from fastapi.middleware.wsgi import WSGIMiddleware
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from starlette.exceptions import HTTPException as StarletteHTTPException from starlette.exceptions import HTTPException as StarletteHTTPException
from starlette.middleware.base import BaseHTTPMiddleware from starlette.middleware.base import BaseHTTPMiddleware
from starlette.responses import StreamingResponse
from apps.ollama.main import app as ollama_app from apps.ollama.main import app as ollama_app
from apps.openai.main import app as openai_app from apps.openai.main import app as openai_app
...@@ -102,6 +102,8 @@ origins = ["*"] ...@@ -102,6 +102,8 @@ origins = ["*"]
class RAGMiddleware(BaseHTTPMiddleware): class RAGMiddleware(BaseHTTPMiddleware):
async def dispatch(self, request: Request, call_next): async def dispatch(self, request: Request, call_next):
return_citations = False
if request.method == "POST" and ( if request.method == "POST" and (
"/api/chat" in request.url.path or "/chat/completions" in request.url.path "/api/chat" in request.url.path or "/chat/completions" in request.url.path
): ):
...@@ -114,11 +116,15 @@ class RAGMiddleware(BaseHTTPMiddleware): ...@@ -114,11 +116,15 @@ class RAGMiddleware(BaseHTTPMiddleware):
# Parse string to JSON # Parse string to JSON
data = json.loads(body_str) if body_str else {} data = json.loads(body_str) if body_str else {}
return_citations = data.get("citations", False)
if "citations" in data:
del data["citations"]
# Example: Add a new key-value pair or modify existing ones # Example: Add a new key-value pair or modify existing ones
# data["modified"] = True # Example modification # data["modified"] = True # Example modification
if "docs" in data: if "docs" in data:
data = {**data} data = {**data}
data["messages"] = rag_messages( data["messages"], citations = rag_messages(
docs=data["docs"], docs=data["docs"],
messages=data["messages"], messages=data["messages"],
template=rag_app.state.RAG_TEMPLATE, template=rag_app.state.RAG_TEMPLATE,
...@@ -130,7 +136,9 @@ class RAGMiddleware(BaseHTTPMiddleware): ...@@ -130,7 +136,9 @@ class RAGMiddleware(BaseHTTPMiddleware):
) )
del data["docs"] del data["docs"]
log.debug(f"data['messages']: {data['messages']}") log.debug(
f"data['messages']: {data['messages']}, citations: {citations}"
)
modified_body_bytes = json.dumps(data).encode("utf-8") modified_body_bytes = json.dumps(data).encode("utf-8")
...@@ -148,11 +156,36 @@ class RAGMiddleware(BaseHTTPMiddleware): ...@@ -148,11 +156,36 @@ class RAGMiddleware(BaseHTTPMiddleware):
] ]
response = await call_next(request) response = await call_next(request)
if return_citations:
# Inject the citations into the response
if isinstance(response, StreamingResponse):
# If it's a streaming response, inject it as SSE event or NDJSON line
content_type = response.headers.get("Content-Type")
if "text/event-stream" in content_type:
return StreamingResponse(
self.openai_stream_wrapper(response.body_iterator, citations),
)
if "application/x-ndjson" in content_type:
return StreamingResponse(
self.ollama_stream_wrapper(response.body_iterator, citations),
)
return response return response
async def _receive(self, body: bytes): async def _receive(self, body: bytes):
return {"type": "http.request", "body": body, "more_body": False} return {"type": "http.request", "body": body, "more_body": False}
async def openai_stream_wrapper(self, original_generator, citations):
yield f"data: {json.dumps({'citations': citations})}\n\n"
async for data in original_generator:
yield data
async def ollama_stream_wrapper(self, original_generator, citations):
yield f"{json.dumps({'citations': citations})}\n"
async for data in original_generator:
yield data
app.add_middleware(RAGMiddleware) app.add_middleware(RAGMiddleware)
......
...@@ -4,6 +4,8 @@ import type { ParsedEvent } from 'eventsource-parser'; ...@@ -4,6 +4,8 @@ import type { ParsedEvent } from 'eventsource-parser';
type TextStreamUpdate = { type TextStreamUpdate = {
done: boolean; done: boolean;
value: string; value: string;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
citations?: any;
}; };
// createOpenAITextStream takes a responseBody with a SSE response, // createOpenAITextStream takes a responseBody with a SSE response,
...@@ -45,6 +47,11 @@ async function* openAIStreamToIterator( ...@@ -45,6 +47,11 @@ async function* openAIStreamToIterator(
const parsedData = JSON.parse(data); const parsedData = JSON.parse(data);
console.log(parsedData); console.log(parsedData);
if (parsedData.citations) {
yield { done: false, value: '', citations: parsedData.citations };
continue;
}
yield { done: false, value: parsedData.choices?.[0]?.delta?.content ?? '' }; yield { done: false, value: parsedData.choices?.[0]?.delta?.content ?? '' };
} catch (e) { } catch (e) {
console.error('Error extracting delta from SSE event:', e); console.error('Error extracting delta from SSE event:', e);
...@@ -62,6 +69,10 @@ async function* streamLargeDeltasAsRandomChunks( ...@@ -62,6 +69,10 @@ async function* streamLargeDeltasAsRandomChunks(
yield textStreamUpdate; yield textStreamUpdate;
return; return;
} }
if (textStreamUpdate.citations) {
yield textStreamUpdate;
continue;
}
let content = textStreamUpdate.value; let content = textStreamUpdate.value;
if (content.length < 5) { if (content.length < 5) {
yield { done: false, value: content }; yield { done: false, value: content };
......
<script lang="ts">
import { getContext, onMount, tick } from 'svelte';
import Modal from '$lib/components/common/Modal.svelte';
const i18n = getContext('i18n');
export let show = false;
export let citation;
let mergedDocuments = [];
$: if (citation) {
mergedDocuments = citation.document?.map((c, i) => {
return {
source: citation.source,
document: c,
metadata: citation.metadata?.[i]
};
});
}
</script>
<Modal size="lg" bind:show>
<div>
<div class=" flex justify-between dark:text-gray-300 px-5 pt-4 pb-2">
<div class=" text-lg font-medium self-center capitalize">
{$i18n.t('Citation')}
</div>
<button
class="self-center"
on:click={() => {
show = false;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-5 h-5"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
<div class="flex flex-col md:flex-row w-full px-5 pb-5 md:space-x-4">
<div class="flex flex-col w-full dark:text-gray-200 overflow-y-scroll max-h-[22rem]">
{#each mergedDocuments as document, documentIdx}
<div class="flex flex-col w-full">
<div class="text-sm font-medium dark:text-gray-300">
{$i18n.t('Source')}
</div>
<div class="text-sm dark:text-gray-400">
{document.source?.name ?? $i18n.t('No source available')}
</div>
</div>
<div class="flex flex-col w-full">
<div class=" text-sm font-medium dark:text-gray-300">
{$i18n.t('Content')}
</div>
<pre class="text-sm dark:text-gray-400 whitespace-pre-line">
{document.document}
</pre>
</div>
{#if documentIdx !== mergedDocuments.length - 1}
<hr class=" dark:border-gray-850 my-3" />
{/if}
{/each}
</div>
</div>
</div>
</Modal>
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Chunk تداخل", "Chunk Overlap": "Chunk تداخل",
"Chunk Params": "Chunk المتغيرات", "Chunk Params": "Chunk المتغيرات",
"Chunk Size": "Chunk حجم", "Chunk Size": "Chunk حجم",
"Citation": "",
"Click here for help.": "أضغط هنا للمساعدة", "Click here for help.": "أضغط هنا للمساعدة",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "انقر هنا للتحقق من ملفات الموديلات الأخرى.", "Click here to check other modelfiles.": "انقر هنا للتحقق من ملفات الموديلات الأخرى.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "دردشة جديدة", "New Chat": "دردشة جديدة",
"New Password": "كلمة المرور الجديدة", "New Password": "كلمة المرور الجديدة",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "ليس صحيحا من حيث الواقع", "Not factually correct": "ليس صحيحا من حيث الواقع",
"Not sure what to add?": "لست متأكدا ما يجب إضافته؟", "Not sure what to add?": "لست متأكدا ما يجب إضافته؟",
"Not sure what to write? Switch to": "لست متأكدا ماذا أكتب؟ التبديل إلى", "Not sure what to write? Switch to": "لست متأكدا ماذا أكتب؟ التبديل إلى",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "تسجيل الخروج", "Sign Out": "تسجيل الخروج",
"Sign up": "تسجيل", "Sign up": "تسجيل",
"Signing in": "جاري الدخول", "Signing in": "جاري الدخول",
"Source": "",
"Speech recognition error: {{error}}": "خطأ في التعرف على الكلام: {{error}}", "Speech recognition error: {{error}}": "خطأ في التعرف على الكلام: {{error}}",
"Speech-to-Text Engine": "محرك تحويل الكلام إلى نص", "Speech-to-Text Engine": "محرك تحويل الكلام إلى نص",
"SpeechRecognition API is not supported in this browser.": "API SpeechRecognition غير مدعومة في هذا المتصفح.", "SpeechRecognition API is not supported in this browser.": "API SpeechRecognition غير مدعومة في هذا المتصفح.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "مساعدك المفيد هنا", "You're a helpful assistant.": "مساعدك المفيد هنا",
"You're now logged in.": "لقد قمت الآن بتسجيل الدخول.", "You're now logged in.": "لقد قمت الآن بتسجيل الدخول.",
"Youtube": "Youtube" "Youtube": "Youtube"
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Chunk Overlap", "Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk Params", "Chunk Params": "Chunk Params",
"Chunk Size": "Chunk Size", "Chunk Size": "Chunk Size",
"Citation": "",
"Click here for help.": "Натиснете тук за помощ.", "Click here for help.": "Натиснете тук за помощ.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Натиснете тук за проверка на други моделфайлове.", "Click here to check other modelfiles.": "Натиснете тук за проверка на други моделфайлове.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Нов чат", "New Chat": "Нов чат",
"New Password": "Нова парола", "New Password": "Нова парола",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "Не сте сигурни, какво да добавите?", "Not sure what to add?": "Не сте сигурни, какво да добавите?",
"Not sure what to write? Switch to": "Не сте сигурни, какво да напишете? Превключете към", "Not sure what to write? Switch to": "Не сте сигурни, какво да напишете? Превключете към",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Изход", "Sign Out": "Изход",
"Sign up": "Регистрация", "Sign up": "Регистрация",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Speech recognition error: {{error}}", "Speech recognition error: {{error}}": "Speech recognition error: {{error}}",
"Speech-to-Text Engine": "Speech-to-Text Engine", "Speech-to-Text Engine": "Speech-to-Text Engine",
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser.", "SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Вие сте полезен асистент.", "You're a helpful assistant.": "Вие сте полезен асистент.",
"You're now logged in.": "Сега, вие влязохте в системата.", "You're now logged in.": "Сега, вие влязохте в системата.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "চাঙ্ক ওভারল্যাপ", "Chunk Overlap": "চাঙ্ক ওভারল্যাপ",
"Chunk Params": "চাঙ্ক প্যারামিটার্স", "Chunk Params": "চাঙ্ক প্যারামিটার্স",
"Chunk Size": "চাঙ্ক সাইজ", "Chunk Size": "চাঙ্ক সাইজ",
"Citation": "",
"Click here for help.": "সাহায্যের জন্য এখানে ক্লিক করুন", "Click here for help.": "সাহায্যের জন্য এখানে ক্লিক করুন",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "অন্যান্য মডেলফাইল চেক করার জন্য এখানে ক্লিক করুন", "Click here to check other modelfiles.": "অন্যান্য মডেলফাইল চেক করার জন্য এখানে ক্লিক করুন",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "নতুন চ্যাট", "New Chat": "নতুন চ্যাট",
"New Password": "নতুন পাসওয়ার্ড", "New Password": "নতুন পাসওয়ার্ড",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "কী যুক্ত করতে হবে নিশ্চিত না?", "Not sure what to add?": "কী যুক্ত করতে হবে নিশ্চিত না?",
"Not sure what to write? Switch to": "কী লিখতে হবে নিশ্চিত না? পরিবর্তন করুন:", "Not sure what to write? Switch to": "কী লিখতে হবে নিশ্চিত না? পরিবর্তন করুন:",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "সাইন আউট", "Sign Out": "সাইন আউট",
"Sign up": "সাইন আপ", "Sign up": "সাইন আপ",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}", "Speech recognition error: {{error}}": "স্পিচ রিকগনিশনে সমস্যা: {{error}}",
"Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন", "Speech-to-Text Engine": "স্পিচ-টু-টেক্সট ইঞ্জিন",
"SpeechRecognition API is not supported in this browser.": "এই ব্রাউজার স্পিচরিকগনিশন এপিআই সাপোর্ট করে না।", "SpeechRecognition API is not supported in this browser.": "এই ব্রাউজার স্পিচরিকগনিশন এপিআই সাপোর্ট করে না।",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট", "You're a helpful assistant.": "আপনি একজন উপকারী এসিস্ট্যান্ট",
"You're now logged in.": "আপনি এখন লগইন করা অবস্থায় আছেন", "You're now logged in.": "আপনি এখন লগইন করা অবস্থায় আছেন",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Solapament de Blocs", "Chunk Overlap": "Solapament de Blocs",
"Chunk Params": "Paràmetres de Blocs", "Chunk Params": "Paràmetres de Blocs",
"Chunk Size": "Mida del Bloc", "Chunk Size": "Mida del Bloc",
"Citation": "",
"Click here for help.": "Fes clic aquí per ajuda.", "Click here for help.": "Fes clic aquí per ajuda.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Fes clic aquí per comprovar altres fitxers de model.", "Click here to check other modelfiles.": "Fes clic aquí per comprovar altres fitxers de model.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Xat Nou", "New Chat": "Xat Nou",
"New Password": "Nova Contrasenya", "New Password": "Nova Contrasenya",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "No estàs segur del que afegir?", "Not sure what to add?": "No estàs segur del que afegir?",
"Not sure what to write? Switch to": "No estàs segur del que escriure? Canvia a", "Not sure what to write? Switch to": "No estàs segur del que escriure? Canvia a",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Tanca sessió", "Sign Out": "Tanca sessió",
"Sign up": "Registra't", "Sign up": "Registra't",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}", "Speech recognition error: {{error}}": "Error de reconeixement de veu: {{error}}",
"Speech-to-Text Engine": "Motor de Veu a Text", "Speech-to-Text Engine": "Motor de Veu a Text",
"SpeechRecognition API is not supported in this browser.": "L'API de Reconèixer Veu no és compatible amb aquest navegador.", "SpeechRecognition API is not supported in this browser.": "L'API de Reconèixer Veu no és compatible amb aquest navegador.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Ets un assistent útil.", "You're a helpful assistant.": "Ets un assistent útil.",
"You're now logged in.": "Ara estàs connectat.", "You're now logged in.": "Ara estàs connectat.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Chunk Overlap", "Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk Parameter", "Chunk Params": "Chunk Parameter",
"Chunk Size": "Chunk Size", "Chunk Size": "Chunk Size",
"Citation": "",
"Click here for help.": "Klicke hier für Hilfe.", "Click here for help.": "Klicke hier für Hilfe.",
"Click here to": "Klicke hier, um", "Click here to": "Klicke hier, um",
"Click here to check other modelfiles.": "Klicke hier, um andere Modelfiles zu überprüfen.", "Click here to check other modelfiles.": "Klicke hier, um andere Modelfiles zu überprüfen.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Neuer Chat", "New Chat": "Neuer Chat",
"New Password": "Neues Passwort", "New Password": "Neues Passwort",
"No results found": "Keine Ergebnisse gefunden", "No results found": "Keine Ergebnisse gefunden",
"No source available": "",
"Not factually correct": "Nicht sachlich korrekt.", "Not factually correct": "Nicht sachlich korrekt.",
"Not sure what to add?": "Nicht sicher, was hinzugefügt werden soll?", "Not sure what to add?": "Nicht sicher, was hinzugefügt werden soll?",
"Not sure what to write? Switch to": "Nicht sicher, was Du schreiben sollst? Wechsel zu", "Not sure what to write? Switch to": "Nicht sicher, was Du schreiben sollst? Wechsel zu",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Abmelden", "Sign Out": "Abmelden",
"Sign up": "Registrieren", "Sign up": "Registrieren",
"Signing in": "Anmeldung", "Signing in": "Anmeldung",
"Source": "",
"Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}", "Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}",
"Speech-to-Text Engine": "Sprache-zu-Text-Engine", "Speech-to-Text Engine": "Sprache-zu-Text-Engine",
"SpeechRecognition API is not supported in this browser.": "Die Spracherkennungs-API wird in diesem Browser nicht unterstützt.", "SpeechRecognition API is not supported in this browser.": "Die Spracherkennungs-API wird in diesem Browser nicht unterstützt.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Du bist ein hilfreicher Assistent.", "You're a helpful assistant.": "Du bist ein hilfreicher Assistent.",
"You're now logged in.": "Du bist nun eingeloggt.", "You're now logged in.": "Du bist nun eingeloggt.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Chunk Overlap", "Chunk Overlap": "Chunk Overlap",
"Chunk Params": "Chunk Params", "Chunk Params": "Chunk Params",
"Chunk Size": "Chunk Size", "Chunk Size": "Chunk Size",
"Citation": "",
"Click here for help.": "Click for help. Much assist.", "Click here for help.": "Click for help. Much assist.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Click to check other modelfiles.", "Click here to check other modelfiles.": "Click to check other modelfiles.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "New Bark", "New Chat": "New Bark",
"New Password": "New Barkword", "New Password": "New Barkword",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "Not sure what to add?", "Not sure what to add?": "Not sure what to add?",
"Not sure what to write? Switch to": "Not sure what to write? Switch to", "Not sure what to write? Switch to": "Not sure what to write? Switch to",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Sign Out much logout", "Sign Out": "Sign Out much logout",
"Sign up": "Sign up much join", "Sign up": "Sign up much join",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error", "Speech recognition error: {{error}}": "Speech recognition error: {{error}} so error",
"Speech-to-Text Engine": "Speech-to-Text Engine much speak", "Speech-to-Text Engine": "Speech-to-Text Engine much speak",
"SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser. Much sad.", "SpeechRecognition API is not supported in this browser.": "SpeechRecognition API is not supported in this browser. Much sad.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "You're a helpful assistant. Much helpful.", "You're a helpful assistant.": "You're a helpful assistant. Much helpful.",
"You're now logged in.": "You're now logged in. Much logged.", "You're now logged in.": "You're now logged in. Much logged.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "", "Chunk Overlap": "",
"Chunk Params": "", "Chunk Params": "",
"Chunk Size": "", "Chunk Size": "",
"Citation": "",
"Click here for help.": "", "Click here for help.": "",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "", "Click here to check other modelfiles.": "",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "", "New Chat": "",
"New Password": "", "New Password": "",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "", "Not sure what to add?": "",
"Not sure what to write? Switch to": "", "Not sure what to write? Switch to": "",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "", "Sign Out": "",
"Sign up": "", "Sign up": "",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "", "Speech recognition error: {{error}}": "",
"Speech-to-Text Engine": "", "Speech-to-Text Engine": "",
"SpeechRecognition API is not supported in this browser.": "", "SpeechRecognition API is not supported in this browser.": "",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "", "You're a helpful assistant.": "",
"You're now logged in.": "", "You're now logged in.": "",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "", "Chunk Overlap": "",
"Chunk Params": "", "Chunk Params": "",
"Chunk Size": "", "Chunk Size": "",
"Citation": "",
"Click here for help.": "", "Click here for help.": "",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "", "Click here to check other modelfiles.": "",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "", "New Chat": "",
"New Password": "", "New Password": "",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "", "Not sure what to add?": "",
"Not sure what to write? Switch to": "", "Not sure what to write? Switch to": "",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "", "Sign Out": "",
"Sign up": "", "Sign up": "",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "", "Speech recognition error: {{error}}": "",
"Speech-to-Text Engine": "", "Speech-to-Text Engine": "",
"SpeechRecognition API is not supported in this browser.": "", "SpeechRecognition API is not supported in this browser.": "",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "", "You're a helpful assistant.": "",
"You're now logged in.": "", "You're now logged in.": "",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Superposición de fragmentos", "Chunk Overlap": "Superposición de fragmentos",
"Chunk Params": "Parámetros de fragmentos", "Chunk Params": "Parámetros de fragmentos",
"Chunk Size": "Tamaño de fragmentos", "Chunk Size": "Tamaño de fragmentos",
"Citation": "",
"Click here for help.": "Presiona aquí para obtener ayuda.", "Click here for help.": "Presiona aquí para obtener ayuda.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Presiona aquí para consultar otros modelfiles.", "Click here to check other modelfiles.": "Presiona aquí para consultar otros modelfiles.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Nuevo Chat", "New Chat": "Nuevo Chat",
"New Password": "Nueva Contraseña", "New Password": "Nueva Contraseña",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "¿No sabes qué añadir?", "Not sure what to add?": "¿No sabes qué añadir?",
"Not sure what to write? Switch to": "¿No sabes qué escribir? Cambia a", "Not sure what to write? Switch to": "¿No sabes qué escribir? Cambia a",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Cerrar sesión", "Sign Out": "Cerrar sesión",
"Sign up": "Crear una cuenta", "Sign up": "Crear una cuenta",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}", "Speech recognition error: {{error}}": "Error de reconocimiento de voz: {{error}}",
"Speech-to-Text Engine": "Motor de voz a texto", "Speech-to-Text Engine": "Motor de voz a texto",
"SpeechRecognition API is not supported in this browser.": "La API SpeechRecognition no es compatible con este navegador.", "SpeechRecognition API is not supported in this browser.": "La API SpeechRecognition no es compatible con este navegador.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Eres un asistente útil.", "You're a helpful assistant.": "Eres un asistente útil.",
"You're now logged in.": "Has iniciado sesión.", "You're now logged in.": "Has iniciado sesión.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "همپوشانی تکه", "Chunk Overlap": "همپوشانی تکه",
"Chunk Params": "پارامترهای تکه", "Chunk Params": "پارامترهای تکه",
"Chunk Size": "اندازه تکه", "Chunk Size": "اندازه تکه",
"Citation": "",
"Click here for help.": "برای کمک اینجا را کلیک کنید.", "Click here for help.": "برای کمک اینجا را کلیک کنید.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "برای بررسی سایر فایل\u200cهای مدل اینجا را کلیک کنید.", "Click here to check other modelfiles.": "برای بررسی سایر فایل\u200cهای مدل اینجا را کلیک کنید.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "گپ جدید", "New Chat": "گپ جدید",
"New Password": "رمز عبور جدید", "New Password": "رمز عبور جدید",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "مطمئن نیستید چه چیزی را اضافه کنید؟", "Not sure what to add?": "مطمئن نیستید چه چیزی را اضافه کنید؟",
"Not sure what to write? Switch to": "مطمئن نیستید چه بنویسید؟ تغییر به", "Not sure what to write? Switch to": "مطمئن نیستید چه بنویسید؟ تغییر به",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "خروج", "Sign Out": "خروج",
"Sign up": "ثبت نام", "Sign up": "ثبت نام",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}", "Speech recognition error: {{error}}": "خطای تشخیص گفتار: {{error}}",
"Speech-to-Text Engine": "موتور گفتار به متن", "Speech-to-Text Engine": "موتور گفتار به متن",
"SpeechRecognition API is not supported in this browser.": "API تشخیص گفتار در این مرورگر پشتیبانی نمی شود.", "SpeechRecognition API is not supported in this browser.": "API تشخیص گفتار در این مرورگر پشتیبانی نمی شود.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "تو یک دستیار سودمند هستی.", "You're a helpful assistant.": "تو یک دستیار سودمند هستی.",
"You're now logged in.": "شما اکنون وارد شده\u200cاید.", "You're now logged in.": "شما اکنون وارد شده\u200cاید.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Chevauchement de bloc", "Chunk Overlap": "Chevauchement de bloc",
"Chunk Params": "Paramètres de bloc", "Chunk Params": "Paramètres de bloc",
"Chunk Size": "Taille de bloc", "Chunk Size": "Taille de bloc",
"Citation": "",
"Click here for help.": "Cliquez ici pour de l'aide.", "Click here for help.": "Cliquez ici pour de l'aide.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.", "Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Nouvelle discussion", "New Chat": "Nouvelle discussion",
"New Password": "Nouveau mot de passe", "New Password": "Nouveau mot de passe",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "Pas sûr de quoi ajouter ?", "Not sure what to add?": "Pas sûr de quoi ajouter ?",
"Not sure what to write? Switch to": "Pas sûr de quoi écrire ? Changez pour", "Not sure what to write? Switch to": "Pas sûr de quoi écrire ? Changez pour",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Se déconnecter", "Sign Out": "Se déconnecter",
"Sign up": "S'inscrire", "Sign up": "S'inscrire",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}", "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
"Speech-to-Text Engine": "Moteur reconnaissance vocale", "Speech-to-Text Engine": "Moteur reconnaissance vocale",
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.", "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Vous êtes un assistant utile", "You're a helpful assistant.": "Vous êtes un assistant utile",
"You're now logged in.": "Vous êtes maintenant connecté.", "You're now logged in.": "Vous êtes maintenant connecté.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Chevauchement de bloc", "Chunk Overlap": "Chevauchement de bloc",
"Chunk Params": "Paramètres de bloc", "Chunk Params": "Paramètres de bloc",
"Chunk Size": "Taille de bloc", "Chunk Size": "Taille de bloc",
"Citation": "",
"Click here for help.": "Cliquez ici pour de l'aide.", "Click here for help.": "Cliquez ici pour de l'aide.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.", "Click here to check other modelfiles.": "Cliquez ici pour vérifier d'autres fichiers de modèle.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Nouveau chat", "New Chat": "Nouveau chat",
"New Password": "Nouveau mot de passe", "New Password": "Nouveau mot de passe",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "Vous ne savez pas quoi ajouter ?", "Not sure what to add?": "Vous ne savez pas quoi ajouter ?",
"Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers", "Not sure what to write? Switch to": "Vous ne savez pas quoi écrire ? Basculer vers",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Se déconnecter", "Sign Out": "Se déconnecter",
"Sign up": "S'inscrire", "Sign up": "S'inscrire",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}", "Speech recognition error: {{error}}": "Erreur de reconnaissance vocale : {{error}}",
"Speech-to-Text Engine": "Moteur de reconnaissance vocale", "Speech-to-Text Engine": "Moteur de reconnaissance vocale",
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.", "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition n'est pas prise en charge dans ce navigateur.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Vous êtes un assistant utile", "You're a helpful assistant.": "Vous êtes un assistant utile",
"You're now logged in.": "Vous êtes maintenant connecté.", "You're now logged in.": "Vous êtes maintenant connecté.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "Sovrapposizione chunk", "Chunk Overlap": "Sovrapposizione chunk",
"Chunk Params": "Parametri chunk", "Chunk Params": "Parametri chunk",
"Chunk Size": "Dimensione chunk", "Chunk Size": "Dimensione chunk",
"Citation": "",
"Click here for help.": "Clicca qui per aiuto.", "Click here for help.": "Clicca qui per aiuto.",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "Clicca qui per controllare altri file modello.", "Click here to check other modelfiles.": "Clicca qui per controllare altri file modello.",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "Nuova chat", "New Chat": "Nuova chat",
"New Password": "Nuova password", "New Password": "Nuova password",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "Non sei sicuro di cosa aggiungere?", "Not sure what to add?": "Non sei sicuro di cosa aggiungere?",
"Not sure what to write? Switch to": "Non sei sicuro di cosa scrivere? Passa a", "Not sure what to write? Switch to": "Non sei sicuro di cosa scrivere? Passa a",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "Esci", "Sign Out": "Esci",
"Sign up": "Registrati", "Sign up": "Registrati",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}", "Speech recognition error: {{error}}": "Errore di riconoscimento vocale: {{error}}",
"Speech-to-Text Engine": "Motore da voce a testo", "Speech-to-Text Engine": "Motore da voce a testo",
"SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition non è supportata in questo browser.", "SpeechRecognition API is not supported in this browser.": "L'API SpeechRecognition non è supportata in questo browser.",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "Sei un assistente utile.", "You're a helpful assistant.": "Sei un assistente utile.",
"You're now logged in.": "Ora hai effettuato l'accesso.", "You're now logged in.": "Ora hai effettuato l'accesso.",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
...@@ -73,6 +73,7 @@ ...@@ -73,6 +73,7 @@
"Chunk Overlap": "チャンクオーバーラップ", "Chunk Overlap": "チャンクオーバーラップ",
"Chunk Params": "チャンクパラメーター", "Chunk Params": "チャンクパラメーター",
"Chunk Size": "チャンクサイズ", "Chunk Size": "チャンクサイズ",
"Citation": "",
"Click here for help.": "ヘルプについてはここをクリックしてください。", "Click here for help.": "ヘルプについてはここをクリックしてください。",
"Click here to": "", "Click here to": "",
"Click here to check other modelfiles.": "他のモデルファイルを確認するにはここをクリックしてください。", "Click here to check other modelfiles.": "他のモデルファイルを確認するにはここをクリックしてください。",
...@@ -270,6 +271,7 @@ ...@@ -270,6 +271,7 @@
"New Chat": "新しいチャット", "New Chat": "新しいチャット",
"New Password": "新しいパスワード", "New Password": "新しいパスワード",
"No results found": "", "No results found": "",
"No source available": "",
"Not factually correct": "", "Not factually correct": "",
"Not sure what to add?": "何を追加すればよいかわからない?", "Not sure what to add?": "何を追加すればよいかわからない?",
"Not sure what to write? Switch to": "何を書けばよいかわからない? 次に切り替える", "Not sure what to write? Switch to": "何を書けばよいかわからない? 次に切り替える",
...@@ -385,6 +387,7 @@ ...@@ -385,6 +387,7 @@
"Sign Out": "サインアウト", "Sign Out": "サインアウト",
"Sign up": "サインアップ", "Sign up": "サインアップ",
"Signing in": "", "Signing in": "",
"Source": "",
"Speech recognition error: {{error}}": "音声認識エラー: {{error}}", "Speech recognition error: {{error}}": "音声認識エラー: {{error}}",
"Speech-to-Text Engine": "音声テキスト変換エンジン", "Speech-to-Text Engine": "音声テキスト変換エンジン",
"SpeechRecognition API is not supported in this browser.": "このブラウザでは SpeechRecognition API がサポートされていません。", "SpeechRecognition API is not supported in this browser.": "このブラウザでは SpeechRecognition API がサポートされていません。",
...@@ -463,4 +466,4 @@ ...@@ -463,4 +466,4 @@
"You're a helpful assistant.": "あなたは役に立つアシスタントです。", "You're a helpful assistant.": "あなたは役に立つアシスタントです。",
"You're now logged in.": "ログインしました。", "You're now logged in.": "ログインしました。",
"Youtube": "" "Youtube": ""
} }
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment