From c5ef53a09faec59df3d9039e96eb797a276a1162 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 26 Nov 2024 21:28:49 -0800 Subject: [PATCH 01/58] refac: disable empty model id --- .../admin/Settings/Models/ConfigureModelsModal.svelte | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte b/src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte index 6a2feb6ccb..761ffefbad 100644 --- a/src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte +++ b/src/lib/components/admin/Settings/Models/ConfigureModelsModal.svelte @@ -185,6 +185,10 @@ From 26615ba995b5bfb913b0c6cc0f0bb30cb8c9ad02 Mon Sep 17 00:00:00 2001 From: Alex <70099710+Xelaph@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:04:54 +0100 Subject: [PATCH 02/58] Update translation.json Updated some translations for better consistency and accuracy. Also translated some newly added sentences --- src/lib/i18n/locales/nl-NL/translation.json | 74 ++++++++++----------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 2afc598b40..4cb3397883 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -65,16 +65,16 @@ "and {{COUNT}} more": "en {{COUNT}} meer", "and create a new shared link.": "en maak een nieuwe gedeelde link.", "API Base URL": "API Base URL", - "API Key": "API Key", - "API Key created.": "API Key gemaakt.", - "API keys": "API keys", + "API Key": "API-sleutel", + "API Key created.": "API-sleutel aangemaakt.", + "API keys": "API-sleutels", "Application DN": "Applicatie DN", "Application DN Password": "Applicatie", - "applies to all users with the \"user\" role": "wordt op alle gebruikers met de \"gebruiker\" toegepast", + "applies to all users with the \"user\" role": "wordt op alle gebruikers met de \"gebruikersrol\" toegepast", "April": "April", "Archive": "Archief", "Archive All Chats": "Archiveer alle chats", - "Archived Chats": "chatrecord", + "Archived Chats": "Chatrecord", "archived-chat-export": "gearchiveerde-chat-export", "Are you sure you want to unarchive all archived chats?": "Weet je zeker dat je alle gearchiveerde chats wil onarchiveren?", "Are you sure?": "Weet je het zeker?", @@ -122,7 +122,7 @@ "Chart new frontiers": "Verken nieuwe grenzen", "Chat": "Chat", "Chat Background Image": "Chatachtergrond", - "Chat Bubble UI": "Chatbubble UI", + "Chat Bubble UI": "Chatbubble-UI", "Chat Controls": "Chatbesturing", "Chat direction": "Chatrichting", "Chat Overview": "Chatoverzicht", @@ -167,7 +167,7 @@ "Completions": "Voltooiingen", "Concurrent Requests": "Gelijktijdige verzoeken", "Configure": "Configureer", - "Configure Models": "", + "Configure Models": "Configureer modellen", "Confirm": "Bevestigen", "Confirm Password": "Bevestig wachtwoord", "Confirm your action": "Bevestig uw actie", @@ -200,7 +200,7 @@ "Create Group": "Maak groep", "Create Knowledge": "Creër kennis", "Create new key": "Maak nieuwe sleutel", - "Create new secret key": "Maak nieuwe geheim sleutel", + "Create new secret key": "Maak nieuwe geheime sleutel", "Created at": "Gemaakt op", "Created At": "Gemaakt op", "Created by": "Gemaakt door", @@ -214,9 +214,9 @@ "Default": "Standaard", "Default (Open AI)": "Standaard (Open AI)", "Default (SentenceTransformers)": "Standaard (SentenceTransformers)", - "Default Model": "Standaard model", - "Default model updated": "Standaard model bijgewerkt", - "Default Models": "", + "Default Model": "Standaardmodel", + "Default model updated": "Standaardmodel bijgewerkt", + "Default Models": "Standaardmodellen", "Default permissions": "Standaardrechten", "Default permissions updated successfully": "Standaardrechten succesvol bijgewerkt", "Default Prompt Suggestions": "Standaard Prompt Suggesties", @@ -330,8 +330,8 @@ "Enter Jina API Key": "Voer Jina API-sleutel in", "Enter language codes": "Voeg taal codes toe", "Enter Model ID": "Voer model-ID in", - "Enter model tag (e.g. {{modelTag}})": "Voeg model tag toe (Bijv. {{modelTag}})", - "Enter Mojeek Search API Key": "", + "Enter model tag (e.g. {{modelTag}})": "Voeg model-tag toe (Bijv. {{modelTag}})", + "Enter Mojeek Search API Key": "Voer Mojeek Search API-sleutel in", "Enter Number of Steps (e.g. 50)": "Voeg aantal stappen toe (Bijv. 50)", "Enter Sampler (e.g. Euler a)": "Voer Sampler in (bv. Euler a)", "Enter Scheduler (e.g. Karras)": "Voer Scheduler in (bv. Karras)", @@ -377,7 +377,7 @@ "Export Config to JSON File": "Exporteer configuratie naar JSON-bestand", "Export Functions": "Exporteer functies", "Export Models": "Modellen exporteren", - "Export Presets": "Voorinstellingen exporteren", + "Export Presets": "Exporteer voorinstellingen", "Export Prompts": "Exporteer Prompts", "Export to CSV": "Exporteer naar CSV", "Export Tools": "Exporteer gereedschappen", @@ -385,7 +385,7 @@ "Failed to add file.": "Het is niet gelukt om het bestand toe te voegen.", "Failed to create API Key.": "Kan API Key niet aanmaken.", "Failed to read clipboard contents": "Kan klembord inhoud niet lezen", - "Failed to save models configuration": "", + "Failed to save models configuration": "Het is niet gelukt om de modelconfiguratie op te slaan", "Failed to update settings": "Instellingen konden niet worden bijgewerkt.", "Failed to upload file.": "Bestand kon niet worden geüpload.", "February": "Februari", @@ -404,7 +404,7 @@ "Filter is now globally enabled": "Filter is nu globaal ingeschakeld", "Filters": "Filters", "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Vingerafdruk spoofing gedetecteerd: kan initialen niet gebruiken als avatar. Standaardprofielafbeelding wordt gebruikt.", - "Fluidly stream large external response chunks": "Stream vloeiend grote externe responsbrokken", + "Fluidly stream large external response chunks": "Stream grote externe responsbrokken vloeiend", "Focus chat input": "Focus chat input", "Folder deleted successfully": "Map succesvol verwijderd", "Folder name cannot be empty": "Mapnaam kan niet leeg zijn", @@ -429,7 +429,7 @@ "Functions allow arbitrary code execution.": "Functies staan willekeurige code-uitvoering toe", "Functions imported successfully": "Functies succesvol geïmporteerd", "General": "Algemeen", - "General Settings": "Algemene Instellingen", + "General Settings": "Algemene instellingen", "Generate Image": "Genereer afbeelding", "Generating search query": "Zoekopdracht genereren", "Generation Info": "Generatie Info", @@ -461,9 +461,9 @@ "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Ik bevestig dat ik de implicaties van mijn actie heb gelezen en begrepen. Ik ben me bewust van de risico's die gepaard gaan met het uitvoeren van willekeurige code en ik heb de betrouwbaarheid van de bron gecontroleerd.", "ID": "ID", "Ignite curiosity": "Wakker nieuwsgierigheid aan", - "Image Generation (Experimental)": "Afbeelding Generatie (Experimenteel)", - "Image Generation Engine": "Afbeelding Generatie Engine", - "Image Settings": "Afbeelding Instellingen", + "Image Generation (Experimental)": "Afbeeldingsgeneratie (Experimenteel)", + "Image Generation Engine": "Afbeeldingsgeneratie Engine", + "Image Settings": "Afbeeldingsinstellingen", "Images": "Afbeeldingen", "Import Chats": "Importeer Chats", "Import Config from JSON File": "Importeer configuratie vanuit JSON-bestand", @@ -520,12 +520,12 @@ "Local": "Lokaal", "Local Models": "Lokale modellen", "Lost": "Verloren", - "LTR": "LTR", + "LTR": "LNR", "Made by OpenWebUI Community": "Gemaakt door OpenWebUI Community", "Make sure to enclose them with": "Zorg ervoor dat je ze omringt met", "Make sure to export a workflow.json file as API format from ComfyUI.": "Zorg ervoor dat je een workflow.json-bestand als API-formaat exporteert vanuit ComfyUI.", "Manage": "Beheren", - "Manage Arena Models": "Beheer Arenamodellen", + "Manage Arena Models": "Beheer srenamodellen", "Manage Ollama": "Beheer Ollama", "Manage Ollama API Connections": "Beheer Ollama API-verbindingen", "Manage OpenAI API Connections": "Beheer OpenAI API-verbindingen", @@ -573,8 +573,8 @@ "Modelfile Content": "Modelfile Inhoud", "Models": "Modellen", "Models Access": "Modellentoegang", - "Models configuration saved successfully": "", - "Mojeek Search API Key": "", + "Models configuration saved successfully": "Modellenconfiguratie succeslvol opgeslagen", + "Mojeek Search API Key": "Mojeek Search API-sleutel", "more": "Meer", "More": "Meer", "Name": "Naam", @@ -593,7 +593,7 @@ "No knowledge found": "Geen kennis gevonden", "No model IDs": "Geen model-ID's", "No models found": "Geen modellen gevonden", - "No models selected": "", + "No models selected": "Geen modellen geselecteerd", "No results found": "Geen resultaten gevonden", "No search query generated": "Geen zoekopdracht gegenereerd", "No source available": "Geen bron beschikbaar", @@ -604,7 +604,7 @@ "Not helpful": "Niet nuttig", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Opmerking: Als je een minimumscore instelt, levert de zoekopdracht alleen documenten op met een score groter dan of gelijk aan de minimumscore.", "Notes": "Aantekeningen", - "Notifications": "Desktop Notificaties", + "Notifications": "Notificaties", "November": "November", "num_gpu (Ollama)": "num_gpu (Ollama)", "num_thread (Ollama)": "num_thread (Ollama)", @@ -674,8 +674,8 @@ "Positive attitude": "Positieve positie", "Prefix ID": "Voorvoegsel-ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Voorvoegsel-ID wordt gebruikt om conflicten met andere verbindingen te vermijden door een voorvoegsel aan het model-ID toe te voegen - laat leeg om uit te schakelen", - "Previous 30 days": "Vorige 30 dagen", - "Previous 7 days": "Vorige 7 dagen", + "Previous 30 days": "Afgelopen 30 dagen", + "Previous 7 days": "Afgelopen 7 dagen", "Profile Image": "Profielafbeelding", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (bv. Vertel me een leuke gebeurtenis over het Romeinse Rijk)", "Prompt Content": "Promptinhoud", @@ -704,14 +704,14 @@ "Remove": "Verwijderen", "Remove Model": "Verwijder model", "Rename": "Hernoemen", - "Reorder Models": "", + "Reorder Models": "Herschik modellen", "Repeat Last N": "Herhaal Laatste N", "Request Mode": "Request Modus", "Reranking Model": "Reranking Model", "Reranking model disabled": "Reranking model uitgeschakeld", "Reranking model set to \"{{reranking_model}}\"": "Reranking model ingesteld op \"{{reranking_model}}\"", "Reset": "Herstellen", - "Reset All Models": "", + "Reset All Models": "Herstel alle modellen", "Reset Upload Directory": "Herstel Uploadmap", "Reset Vector Storage/Knowledge": "Herstel Vectoropslag/-kennis", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Antwoordmeldingen kunnen niet worden geactiveerd omdat de rechten voor de website zijn geweigerd. Ga naar de instellingen van uw browser om de benodigde toegang te verlenen.", @@ -722,7 +722,7 @@ "Role": "Rol", "Rosé Pine": "Rosé Pine", "Rosé Pine Dawn": "Rosé Pine Dawn", - "RTL": "RTL", + "RTL": "RNL", "Run": "Uitvoeren", "Running": "Aan het uitvoeren", "Save": "Opslaan", @@ -783,7 +783,7 @@ "Server connection verified": "Server verbinding geverifieerd", "Set as default": "Stel in als standaard", "Set CFG Scale": "Stel CFG-schaal in", - "Set Default Model": "Stel Standaard Model in", + "Set Default Model": "Stel Standaardmodel in", "Set embedding model": "Stel embedding-model in", "Set embedding model (e.g. {{model}})": "Stel embedding-model in (bv. {{model}})", "Set Image Size": "Stel afbeeldingsgrootte in", @@ -800,7 +800,7 @@ "Sets how strongly to penalize repetitions. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. (Default: 1.1)": "Stelt in hoe sterk herhalingen bestraft moeten worden. Een hogere waarde (bijv. 1,5) zal herhalingen sterker bestraffen, terwijl een lagere waarde (bijv. 0,9) milder zal zijn. (Standaard: 1.1)", "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt. (Default: random)": "Stelt de willekeurigheid in om te gebruiken voor het genereren. Als je dit op een specifiek getal instelt, genereert het model dezelfde tekst voor dezelfde prompt. (Standaard: willekeurig)", "Sets the size of the context window used to generate the next token. (Default: 2048)": "Stelt de grootte in van het contextvenster dat wordt gebruikt om het volgende token te genereren. (Standaard: 2048)", - "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Stelt de te gebruiken stopreeksen in. Als dit patroon wordt gevonden, stopt de LLM met het genereren van tekst en keert terug. Er kunnen meerdere stoppatronen worden ingesteld door meerdere afzonderlijke stopparameters op te geven in een modelbestand.", + "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Stelt de te gebruiken stopsequentie in. Als dit patroon wordt gevonden, stopt de LLM met het genereren van tekst en keert terug. Er kunnen meerdere stoppatronen worden ingesteld door meerdere afzonderlijke stopparameters op te geven in een modelbestand.", "Settings": "Instellingen", "Settings saved successfully!": "Instellingen succesvol opgeslagen!", "Share": "Delen", @@ -824,7 +824,7 @@ "Speech recognition error: {{error}}": "Spraakherkenning fout: {{error}}", "Speech-to-Text Engine": "Spraak-naar-tekst Engine", "Stop": "Stop", - "Stop Sequence": "Stop sequentie", + "Stop Sequence": "Stopsequentie", "Stream Chat Response": "Stream chat-antwoord", "STT Model": "STT Model", "STT Settings": "STT Instellingen", @@ -887,14 +887,14 @@ "Title Generation Prompt": "Titel Generatie Prompt", "TLS": "TLS", "To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,", - "To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,", + "To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF-modellen die beschikbaar zijn voor downloaden,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Om toegang te krijgen tot de WebUI, neem contact op met de administrator. Beheerders kunnen de gebruikersstatussen beheren vanuit het Beheerderspaneel.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Om hier een kennisbron bij te voegen, voeg ze eerst aan de \"Kennis\" werkplaats toe.", "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Om je privacy te beschermen, worden alleen beoordelingen, model-ID's, tags en metadata van je feedback gedeeld - je chatlogs blijven privé en worden niet opgenomen.", "To select actions here, add them to the \"Functions\" workspace first.": "Om hier acties te selecteren, voeg ze eerst aan de \"Functies\" Werkplaats toe.", "To select filters here, add them to the \"Functions\" workspace first.": "Om hier filters te selecteren, voeg ze eerst aan de \"Functies\" Werkplaats toe.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Om hier gereedschapssets te selecteren, voeg ze eerst aan de \"Gereedschappen\" Werkplaats toe.", - "Toast notifications for new updates": "Toast notificatie voor nieuwe updates", + "Toast notifications for new updates": "Toon notificaties voor nieuwe updates", "Today": "Vandaag", "Toggle settings": "Wissel instellingen", "Toggle sidebar": "Wissel sidebar", @@ -1003,7 +1003,7 @@ "Yesterday": "Gisteren", "You": "Jij", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Je kunt slechts met maximaal {{maxCount}} bestand(en) tegelijk chatten", - "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Je kunt je interacties met LLM's personaliseren door herinneringen toe te voegen via de 'Beheer'-knop hieronder, waardoor ze nuttiger en op maat gemaakt voor jou worden.", + "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Je kunt je interacties met LLM's personaliseren door herinneringen toe te voegen via de 'Beheer'-knop hieronder, waardoor ze nuttiger en voor jou op maat gemaakt worden.", "You cannot upload an empty file.": "Je kunt een leeg bestand niet uploaden.", "You do not have permission to upload files.": "Je hebt geen toestemming om bestanden up te loaden", "You have no archived conversations.": "Je hebt geen gearchiveerde gesprekken.", From 53296c1005c3f724b13c6f92b5dd269c41044845 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Wed, 27 Nov 2024 15:09:33 +0100 Subject: [PATCH 03/58] [feat] Allow use of proxy for downloading Youtube transscripts --- .../apps/retrieval/loaders/youtube.py | 21 +++++++++++++++++-- backend/open_webui/apps/retrieval/main.py | 10 ++++++++- backend/open_webui/config.py | 6 ++++++ src/lib/apis/retrieval/index.ts | 1 + .../admin/Settings/WebSearch.svelte | 20 +++++++++++++++++- 5 files changed, 54 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/apps/retrieval/loaders/youtube.py b/backend/open_webui/apps/retrieval/loaders/youtube.py index ad1088be0b..aa3be51f2b 100644 --- a/backend/open_webui/apps/retrieval/loaders/youtube.py +++ b/backend/open_webui/apps/retrieval/loaders/youtube.py @@ -1,7 +1,12 @@ +import logging + from typing import Any, Dict, Generator, List, Optional, Sequence, Union from urllib.parse import parse_qs, urlparse from langchain_core.documents import Document +from open_webui.env import SRC_LOG_LEVELS +log = logging.getLogger(__name__) +log.setLevel(SRC_LOG_LEVELS["RAG"]) ALLOWED_SCHEMES = {"http", "https"} ALLOWED_NETLOCS = { @@ -51,12 +56,14 @@ class YoutubeLoader: self, video_id: str, language: Union[str, Sequence[str]] = "en", + proxy_url: Optional[str] = None, ): """Initialize with YouTube video ID.""" _video_id = _parse_video_id(video_id) self.video_id = _video_id if _video_id is not None else video_id self._metadata = {"source": video_id} self.language = language + self.proxy_url = proxy_url if isinstance(language, str): self.language = [language] else: @@ -76,10 +83,20 @@ class YoutubeLoader: "Please install it with `pip install youtube-transcript-api`." ) + if self.proxy_url: + youtube_proxies = { + 'http': self.proxy_url, + 'https': self.proxy_url, + } + # Don't log complete URL because it might contain secrets + log.debug(f"Using proxy URL: {self.proxy_url[:14]}...") + else: + youtube_proxies = None + try: - transcript_list = YouTubeTranscriptApi.list_transcripts(self.video_id) + transcript_list = YouTubeTranscriptApi.list_transcripts(self.video_id, proxies=youtube_proxies) except Exception as e: - print(e) + log.exception("Loading YouTube transcript failed") return [] try: diff --git a/backend/open_webui/apps/retrieval/main.py b/backend/open_webui/apps/retrieval/main.py index 63bc18190e..801760a65e 100644 --- a/backend/open_webui/apps/retrieval/main.py +++ b/backend/open_webui/apps/retrieval/main.py @@ -105,6 +105,7 @@ from open_webui.config import ( TIKA_SERVER_URL, UPLOAD_DIR, YOUTUBE_LOADER_LANGUAGE, + YOUTUBE_LOADER_PROXY_URL, DEFAULT_LOCALE, AppConfig, ) @@ -171,6 +172,7 @@ app.state.config.OLLAMA_API_KEY = RAG_OLLAMA_API_KEY app.state.config.PDF_EXTRACT_IMAGES = PDF_EXTRACT_IMAGES app.state.config.YOUTUBE_LOADER_LANGUAGE = YOUTUBE_LOADER_LANGUAGE +app.state.config.YOUTUBE_LOADER_PROXY_URL = YOUTUBE_LOADER_PROXY_URL app.state.YOUTUBE_LOADER_TRANSLATION = None @@ -471,6 +473,7 @@ async def get_rag_config(user=Depends(get_admin_user)): "youtube": { "language": app.state.config.YOUTUBE_LOADER_LANGUAGE, "translation": app.state.YOUTUBE_LOADER_TRANSLATION, + "proxy_url": app.state.config.YOUTUBE_LOADER_PROXY_URL, }, "web": { "web_loader_ssl_verification": app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, @@ -518,6 +521,7 @@ class ChunkParamUpdateForm(BaseModel): class YoutubeLoaderConfig(BaseModel): language: list[str] translation: Optional[str] = None + proxy_url: str = "" class WebSearchConfig(BaseModel): @@ -580,6 +584,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_ if form_data.youtube is not None: app.state.config.YOUTUBE_LOADER_LANGUAGE = form_data.youtube.language + app.state.config.YOUTUBE_LOADER_PROXY_URL = form_data.youtube.proxy_url app.state.YOUTUBE_LOADER_TRANSLATION = form_data.youtube.translation if form_data.web is not None: @@ -640,6 +645,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_ }, "youtube": { "language": app.state.config.YOUTUBE_LOADER_LANGUAGE, + "proxy_url": app.state.config.YOUTUBE_LOADER_PROXY_URL, "translation": app.state.YOUTUBE_LOADER_TRANSLATION, }, "web": { @@ -1081,7 +1087,9 @@ def process_youtube_video(form_data: ProcessUrlForm, user=Depends(get_verified_u collection_name = calculate_sha256_string(form_data.url)[:63] loader = YoutubeLoader( - form_data.url, language=app.state.config.YOUTUBE_LOADER_LANGUAGE + form_data.url, + language=app.state.config.YOUTUBE_LOADER_LANGUAGE, + proxy_url=app.state.config.YOUTUBE_LOADER_PROXY_URL, ) docs = loader.load() diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 0a76626c15..3cfee3ee65 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1259,6 +1259,12 @@ YOUTUBE_LOADER_LANGUAGE = PersistentConfig( os.getenv("YOUTUBE_LOADER_LANGUAGE", "en").split(","), ) +YOUTUBE_LOADER_PROXY_URL = PersistentConfig( + "YOUTUBE_LOADER_PROXY_URL", + "rag.youtube_loader_proxy_url", + os.getenv("YOUTUBE_LOADER_PROXY_URL", ""), +) + ENABLE_RAG_WEB_SEARCH = PersistentConfig( "ENABLE_RAG_WEB_SEARCH", diff --git a/src/lib/apis/retrieval/index.ts b/src/lib/apis/retrieval/index.ts index 6c6b18b9fd..21ae792fa5 100644 --- a/src/lib/apis/retrieval/index.ts +++ b/src/lib/apis/retrieval/index.ts @@ -40,6 +40,7 @@ type ContentExtractConfigForm = { type YoutubeConfigForm = { language: string[]; translation?: string | null; + proxy_url: string; }; type RAGConfigForm = { diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index d8b1a33d14..a3ccbec1db 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -29,13 +29,15 @@ let youtubeLanguage = 'en'; let youtubeTranslation = null; + let youtubeProxyUrl = ''; const submitHandler = async () => { const res = await updateRAGConfig(localStorage.token, { web: webConfig, youtube: { language: youtubeLanguage.split(',').map((lang) => lang.trim()), - translation: youtubeTranslation + translation: youtubeTranslation, + proxy_url: youtubeProxyUrl } }); }; @@ -48,6 +50,7 @@ youtubeLanguage = res.youtube.language.join(','); youtubeTranslation = res.youtube.translation; + youtubeProxyUrl = res.youtube.proxy_url; } }); @@ -358,6 +361,21 @@ + +
+
+
{$i18n.t('Proxy URL')}
+
+ +
+
+
{/if} From dbd6ac80800a5b665dc27cc5e558dfaed486458e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 27 Nov 2024 11:25:54 -0800 Subject: [PATCH 04/58] refac: textarea --- src/lib/components/common/Textarea.svelte | 45 +++++++++++++++++++---- 1 file changed, 38 insertions(+), 7 deletions(-) diff --git a/src/lib/components/common/Textarea.svelte b/src/lib/components/common/Textarea.svelte index 4c18ae1953..254db2e4b7 100644 --- a/src/lib/components/common/Textarea.svelte +++ b/src/lib/components/common/Textarea.svelte @@ -10,18 +10,49 @@ let textareaElement; + $: if (textareaElement) { + if (textareaElement.innerText !== value) { + textareaElement.innerText = value; + } + } + // Adjust height on mount and after setting the element. onMount(async () => { await tick(); }); + + // Handle paste event to ensure only plaintext is pasted + function handlePaste(event: ClipboardEvent) { + event.preventDefault(); // Prevent the default paste action + const clipboardData = event.clipboardData?.getData('text/plain'); // Get plaintext from clipboard + document.execCommand('insertText', false, clipboardData); // Insert plaintext into contenteditable + } -