From 23991c32c560ee9527c3bacfd45fba4de7884038 Mon Sep 17 00:00:00 2001 From: Tiancong Li Date: Mon, 19 May 2025 12:09:07 +0800 Subject: [PATCH 001/144] i18n: update zh-TW --- src/lib/i18n/locales/zh-TW/translation.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 44ff803e9..71393a8c8 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -95,7 +95,7 @@ "API Key created.": "API 金鑰已建立。", "API Key Endpoint Restrictions": "API 金鑰端點限制", "API keys": "API 金鑰", - "API Version": "", + "API Version": "API 版本", "Application DN": "應用程式 DN", "Application DN Password": "應用程式 DN 密碼", "applies to all users with the \"user\" role": "適用於所有具有「使用者」角色的使用者", @@ -237,7 +237,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "連接至您自己的與 OpenAPI 相容的外部工具伺服器。", "Connection failed": "連線失敗", "Connection successful": "連線成功", - "Connection Type": "", + "Connection Type": "連線類型", "Connections": "連線", "Connections saved successfully": "連線已成功儲存", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "限制推理模型的推理程度。僅適用於特定供應商支援推理程度的推理模型。", @@ -321,7 +321,7 @@ "Deleted {{deleteModelTag}}": "已刪除 {{deleteModelTag}}", "Deleted {{name}}": "已刪除 {{name}}", "Deleted User": "刪除使用者?", - "Deployment names are required for Azure OpenAI": "", + "Deployment names are required for Azure OpenAI": "需要提供 Azure OpenAI 部署名稱", "Describe Pictures in Documents": "文件中的圖片描述", "Describe your knowledge base and objectives": "描述您的知識庫和目標", "Description": "描述", @@ -551,7 +551,7 @@ "Export Tools": "匯出工具", "External": "外部", "External Document Loader URL required.": "需要提供外部文件加載器 URL。", - "External Task Model": "", + "External Task Model": "外部任務模型", "External Web Loader API Key": "外部網頁載入器 API 金鑰", "External Web Loader URL": "外部網頁載入器 URL", "External Web Search API Key": "外部網路搜尋 API 金鑰", @@ -727,7 +727,7 @@ "Leaderboard": "排行榜", "Learn more about OpenAPI tool servers.": "進一步了解 OpenAPI 工具伺服器。", "Leave empty for unlimited": "留空表示無限制", - "Leave empty to include all models from \"{{url}}\" endpoint": "", + "Leave empty to include all models from \"{{url}}\" endpoint": "留空以包含來自「{{url}}」端點的所有模型", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "留空以包含來自 \"{{url}}/api/tags\" 端點的所有模型。", "Leave empty to include all models from \"{{url}}/models\" endpoint": "留空以包含來自 \"{{url}}/models\" 端點的所有模型。", "Leave empty to include all models or select specific models": "留空以包含所有模型或選擇特定模型", @@ -741,7 +741,7 @@ "Loader": "載入工具", "Loading Kokoro.js...": "Kokoro.js 載入中……", "Local": "本機", - "Local Task Model": "", + "Local Task Model": "本機任務模型", "Location access not allowed": "位置存取未獲允許", "Logit Bias": "Logit 偏差", "Lost": "已遺失", @@ -1135,7 +1135,7 @@ "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "尾部自由取樣用於減少輸出結果中較低機率 token 的影響。較高的值(例如:2.0)會減少更多影響,而值為 1.0 時會停用此設定。", "Talk to model": "與模型對話", "Tap to interrupt": "點選以中斷", - "Task Model": "", + "Task Model": "任務模型", "Tasks": "任務", "Tavily API Key": "Tavily API 金鑰", "Tavily Extract Depth": "Tavily 提取深度", @@ -1201,7 +1201,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "若要在此選擇工具包,請先將它們新增到「工具」工作區。", "Toast notifications for new updates": "快顯通知新的更新", "Today": "今天", - "Toggle search": "", + "Toggle search": "切換搜尋", "Toggle settings": "切換設定", "Toggle sidebar": "切換側邊欄", "Token": "Token", From c1066d7e081bd0d2a46f0af650da085b222c0973 Mon Sep 17 00:00:00 2001 From: hurxxxx <75428618+hurxxxx@users.noreply.github.com> Date: Mon, 19 May 2025 13:28:45 +0900 Subject: [PATCH 002/144] i18n: update ko-KR --- src/lib/i18n/locales/ko-KR/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index d67ff1c4b..7b7d0716b 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -671,7 +671,7 @@ "Import Config from JSON File": "JSON 파일에서 설정 가져오기", "Import Functions": "함수 가져오기", "Import Models": "모델 가져오기", - "Import Notes": "", + "Import Notes": "노트 가져오기", "Import Presets": "프리셋 가져오기", "Import Prompts": "프롬프트 가져오기", "Import Tools": "도구 가져오기", @@ -850,7 +850,7 @@ "Not helpful": "도움이 되지않음", "Note deleted successfully": "노트가 성공적으로 삭제되었습니다", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "참고: 최소 점수를 설정하면, 검색 결과로 최소 점수 이상의 점수를 가진 문서만 반환합니다.", - "Notes": "참고", + "Notes": "노트", "Notification Sound": "알림 소리", "Notification Webhook": "알림 웹훅", "Notifications": "알림", From 1d0921de0ddeccbc1b12aa7fca199462c1d82875 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Link=20=5B=D0=A1=D0=B2=D1=8F=D0=B7=D0=BD=D0=BE=D0=B9=5D?= Date: Mon, 19 May 2025 11:24:08 +0300 Subject: [PATCH 003/144] [i18n] Russian locale update --- src/lib/i18n/locales/ru-RU/translation.json | 108 ++++++++++---------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 4b988bb13..db24d1021 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -4,7 +4,7 @@ "(e.g. `sh webui.sh --api --api-auth username_password`)": "(например, `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(например, `sh webui.sh --api`)", "(latest)": "(последняя)", - "(leave blank for to use commercial endpoint)": "", + "(leave blank for to use commercial endpoint)": "(оставьте пустым поле для использования коммерческой конечной точки)", "(Ollama)": "", "{{ models }}": "{{ модели }}", "{{COUNT}} Available Tools": "{{COUNT}} доступных инструментов", @@ -74,8 +74,8 @@ "Allow User Location": "Разрешить доступ к местоположению пользователя", "Allow Voice Interruption in Call": "Разрешить прерывание голоса во время вызова", "Allowed Endpoints": "Разрешенные энд-поинты", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", + "Allowed File Extensions": "Разрешенные расширения файлов", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Разрешенные расширения файлов для загрузки. Разделите несколько расширений запятыми. Оставьте поле пустым для всех типов файлов.", "Already have an account?": "У вас уже есть учетная запись?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Альтернатива top_p и направлена на обеспечение баланса качества и разнообразия. Параметр p представляет минимальную вероятность того, что токен будет рассмотрен, по сравнению с вероятностью наиболее вероятного токена. Например, при p=0,05 и наиболее вероятном значении токена, имеющем вероятность 0,9, логиты со значением менее 0,045 отфильтровываются.", "Always": "Всегда", @@ -95,7 +95,7 @@ "API Key created.": "Ключ API создан.", "API Key Endpoint Restrictions": "Ограничения на энд-поинт API", "API keys": "Ключи API", - "API Version": "", + "API Version": "Версия API", "Application DN": "DN приложения", "Application DN Password": "DN-пароль приложения", "applies to all users with the \"user\" role": "применяется ко всем пользователям с ролью «пользователь»", @@ -162,7 +162,7 @@ "Cancel": "Отменить", "Capabilities": "Возможности", "Capture": "Захват", - "Capture Audio": "", + "Capture Audio": "Захват аудио", "Certificate Path": "Путь к сертификату", "Change Password": "Изменить пароль", "Channel Name": "Название канала", @@ -187,7 +187,7 @@ "Chunk Size": "Размер фрагмента", "Ciphers": "Шифры", "Citation": "Цитирование", - "Citations": "", + "Citations": "Цитаты", "Clear memory": "Очистить воспоминания", "Clear Memory": "Очисить память", "click here": "кликните сюда", @@ -237,7 +237,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "Подключитесь к вашим собственным внешним инструментальным серверам, совместимым с OpenAPI.", "Connection failed": "Подключение не удалось", "Connection successful": "Успешное подключение", - "Connection Type": "", + "Connection Type": "Тип подключения", "Connections": "Подключения", "Connections saved successfully": "Подключение успешно сохранено", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Ограничивает усилия по обоснованию для моделей обоснования. Применимо только к моделям обоснования от конкретных поставщиков, которые поддерживают усилия по обоснованию.", @@ -321,8 +321,8 @@ "Deleted {{deleteModelTag}}": "Удалено {{deleteModelTag}}", "Deleted {{name}}": "Удалено {{name}}", "Deleted User": "Удалённый пользователь", - "Deployment names are required for Azure OpenAI": "", - "Describe Pictures in Documents": "", + "Deployment names are required for Azure OpenAI": "Для Azure OpenAI требуются имена развертываний", + "Describe Pictures in Documents": "Опишите изображения в документах", "Describe your knowledge base and objectives": "Опишите свою базу знаний и цели", "Description": "Описание", "Detect Artifacts Automatically": "Автоматическое обнаружение артефактов", @@ -380,11 +380,11 @@ "e.g. My Tools": "например, мой инструмент", "e.g. my_filter": "например, мой_фильтр", "e.g. my_tools": "например, мой_инструмент", - "e.g. pdf, docx, txt": "", + "e.g. pdf, docx, txt": "например, pdf, docx, txt", "e.g. Tools for performing various operations": "например, инструменты для выполнения различных операций", "e.g., 3, 4, 5 (leave blank for default)": "например, 3, 4, 5 (оставьте поле пустым по умолчанию)", "e.g., en-US,ja-JP (leave blank for auto-detect)": "например, en-US,ja-JP (оставьте поле пустым для автоматического определения)", - "e.g., westus (leave blank for eastus)": "", + "e.g., westus (leave blank for eastus)": "например, западный (оставьте пустым для восточного)", "Edit": "Редактировать", "Edit Arena Model": "Изменить модель арены", "Edit Channel": "Редактировать канал", @@ -414,12 +414,12 @@ "Enabled": "Включено", "Endpoint URL": "", "Enforce Temporary Chat": "Принудительный временный чат", - "Enhance": "", + "Enhance": "Улучшить", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Убедитесь, что ваш CSV-файл включает в себя 4 столбца в следующем порядке: Имя, Электронная почта, Пароль, Роль.", "Enter {{role}} message here": "Введите сообщение {{role}} здесь", "Enter a detail about yourself for your LLMs to recall": "Введите детали о себе, чтобы LLMs могли запомнить", - "Enter a title for the pending user info overlay. Leave empty for default.": "", - "Enter a watermark for the response. Leave empty for none.": "", + "Enter a title for the pending user info overlay. Leave empty for default.": "Введите заголовок для ожидаемого отображения информации о пользователе. Оставьте поле пустым для параметра по умолчанию.", + "Enter a watermark for the response. Leave empty for none.": "Укажите водяной знак для ответа. Оставьте пустым чтобы не было никакого.", "Enter api auth string (e.g. username:password)": "Введите строку авторизации api (например, username:password)", "Enter Application DN": "Введите ND приложения", "Enter Application DN Password": "Введите пароль DN приложения", @@ -432,7 +432,7 @@ "Enter Chunk Overlap": "Введите перекрытие фрагмента", "Enter Chunk Size": "Введите размер фрагмента", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Введите пары \"token:bias_value\", разделенные запятыми (пример: 5432:100, 413:-100).", - "Enter content for the pending user info overlay. Leave empty for default.": "", + "Enter content for the pending user info overlay. Leave empty for default.": "Введите содержимое для отложенного отображения информации о пользователе. Оставьте поле пустым для параметра по умолчанию.", "Enter description": "Введите описание", "Enter Docling OCR Engine": "Введите Docling OCR Engine", "Enter Docling OCR Language(s)": "Введите языки для Docling OCR", @@ -441,8 +441,8 @@ "Enter Document Intelligence Key": "Введите ключ для анализа документов", "Enter domains separated by commas (e.g., example.com,site.org)": "Введите домены, разделенные запятыми (например, example.com,site.org)", "Enter Exa API Key": "Введите ключ API для Exa", - "Enter External Document Loader API Key": "", - "Enter External Document Loader URL": "", + "Enter External Document Loader API Key": "Введите ключ API внешнего загрузчика документов", + "Enter External Document Loader URL": "Введите URL-адрес внешнего загрузчика документов", "Enter External Web Loader API Key": "Введите ключ API внешнего веб-загрузчика", "Enter External Web Loader URL": "Введите URL-адрес внешнего веб-загрузчика", "Enter External Web Search API Key": "Введите ключ API внешнего веб-поиска", @@ -518,8 +518,8 @@ "Error": "Ошибка", "ERROR": "ОШИБКА", "Error accessing Google Drive: {{error}}": "Ошибка доступа к Google Drive: {{error}}", - "Error accessing media devices.": "", - "Error starting recording.": "", + "Error accessing media devices.": "Ошибка доступа к мультимедийным устройствам.", + "Error starting recording.": "Ошибка при запуске записи.", "Error uploading file: {{error}}": "Ошибка загрузки файла: {{error}}", "Evaluations": "Оценки", "Exa API Key": "Ключ API для Exa", @@ -550,8 +550,8 @@ "Export to CSV": "Экспортировать в CSV", "Export Tools": "Экспортировать инструменты", "External": "Внешнее", - "External Document Loader URL required.": "", - "External Task Model": "", + "External Document Loader URL required.": "Требуется URL-адрес внешнего загрузчика документов.", + "External Task Model": "Модель внешней задачи", "External Web Loader API Key": "Ключ API внешнего веб-загрузчика", "External Web Loader URL": "URL-адрес внешнего веб-загрузчика", "External Web Search API Key": "Внешний ключ API веб-поиска", @@ -559,7 +559,7 @@ "Failed to add file.": "Не удалось добавить файл.", "Failed to connect to {{URL}} OpenAPI tool server": "Не удалось подключиться к серверу инструмента OpenAI {{URL}}", "Failed to create API Key.": "Не удалось создать ключ API.", - "Failed to delete note": "", + "Failed to delete note": "Не удалось удалить заметку", "Failed to fetch models": "Не удалось получить модели", "Failed to load file content.": "Не удалось загрузить содержимое файла.", "Failed to read clipboard contents": "Не удалось прочитать содержимое буфера обмена", @@ -580,7 +580,7 @@ "File not found.": "Файл не найден.", "File removed successfully.": "Файл успешно удален.", "File size should not exceed {{maxSize}} MB.": "Размер файла не должен превышать {{maxSize}} МБ.", - "File Upload": "", + "File Upload": "Загрузка файла", "File uploaded successfully": "Файл успешно загружен", "Files": "Файлы", "Filter is now globally disabled": "Фильтр теперь отключен глобально", @@ -623,7 +623,7 @@ "Generate Image": "Сгенерировать изображение", "Generate prompt pair": "Сгенерировать пару запросов", "Generating search query": "Генерация поискового запроса", - "Generating...": "", + "Generating...": "Генерирую...", "Get started": "Давайте начнём", "Get started with {{WEBUI_NAME}}": "Давайте начнём с {{WEBUI_NAME}}", "Global": "Глобально", @@ -646,7 +646,7 @@ "Hex Color - Leave empty for default color": "Цвет Hex - оставьте пустым значение цвета по умолчанию", "Hide": "Скрыть", "Hide Model": "Скрыть модель", - "High Contrast Mode": "", + "High Contrast Mode": "Режим высокой контрастности", "Home": "Домой", "Host": "Хост", "How can I help you today?": "Чем я могу помочь вам сегодня?", @@ -686,7 +686,7 @@ "Instant Auto-Send After Voice Transcription": "Мгновенная автоматическая отправка после расшифровки голоса", "Integration": "Интеграция", "Interface": "Интерфейс", - "Invalid file content": "", + "Invalid file content": "Недопустимое содержимое файла", "Invalid file format.": "Неверный формат файла.", "Invalid JSON schema": "Недопустимая схема JSON", "Invalid Tag": "Недопустимый тег", @@ -727,7 +727,7 @@ "Leaderboard": "Таблица лидеров", "Learn more about OpenAPI tool servers.": "Узнайте больше о серверах инструментов OpenAPI.", "Leave empty for unlimited": "Оставьте пустым для неограниченного", - "Leave empty to include all models from \"{{url}}\" endpoint": "", + "Leave empty to include all models from \"{{url}}\" endpoint": "Оставьте пустым, чтобы включить все модели из конечной точки \"{{url}}\"", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Оставьте пустым, чтобы включить все модели из конечной точки \"{{url}}/api/tags\"", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Оставьте поле пустым, чтобы включить все модели из конечной точки \"{{url}}/models\"", "Leave empty to include all models or select specific models": "Оставьте поле пустым, чтобы включить все модели или выбрать конкретные модели", @@ -741,7 +741,7 @@ "Loader": "Загрузчик", "Loading Kokoro.js...": "Загрузка Kokoro.js", "Local": "Локально", - "Local Task Model": "", + "Local Task Model": "Модель локальной задачи", "Location access not allowed": "Доступ к местоположению запрещен", "Logit Bias": "", "Lost": "Поражение", @@ -758,7 +758,7 @@ "Manage Pipelines": "Управление конвейерами", "Manage Tool Servers": "Управление серверами инструментов", "March": "Март", - "Max Speakers": "", + "Max Speakers": "Максимальное количество динамиков", "Max Tokens (num_predict)": "Максимальное количество токенов (num_predict)", "Max Upload Count": "Максимальное количество загрузок", "Max Upload Size": "Максимальный размер загрузок", @@ -791,11 +791,11 @@ "Model {{name}} is now {{status}}": "Модель {{name}} теперь {{status}}", "Model {{name}} is now hidden": "Модель {{name}} теперь скрыта", "Model {{name}} is now visible": "Модель {{name}} теперь видна", - "Model accepts file inputs": "", + "Model accepts file inputs": "Модель принимает входные данные файла", "Model accepts image inputs": "Модель принимает изображения как входные данные", - "Model can execute code and perform calculations": "", - "Model can generate images based on text prompts": "", - "Model can search the web for information": "", + "Model can execute code and perform calculations": "Модель может выполнять код и выполнять вычисления", + "Model can generate images based on text prompts": "Модель может генерировать изображения на основе текстовых промптов", + "Model can search the web for information": "Модель может искать информацию в Интернете", "Model created successfully!": "Модель успешно создана!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Обнаружен путь к файловой системе модели. Для обновления требуется краткое имя модели, не удается продолжить.", "Model Filtering": "Фильтрация Моделей", @@ -806,7 +806,7 @@ "Model Params": "Параметры модели", "Model Permissions": "Разрешения Модели", "Model updated successfully": "Модель успешно обновлена", - "Model(s) do not support file upload": "", + "Model(s) do not support file upload": "Модель (или модели) не поддерживают загрузку файлов", "Modelfile Content": "Содержимое файла модели", "Models": "Модели", "Models Access": "Доступ к моделям", @@ -815,7 +815,7 @@ "Mojeek Search API Key": "Ключ API для поиска Mojeek", "more": "больше", "More": "Больше", - "My Notes": "", + "My Notes": "Мои заметки", "Name": "Имя", "Name your knowledge base": "Назовите свою базу знаний", "Native": "Нативно", @@ -848,7 +848,7 @@ "None": "Нет", "Not factually correct": "Не соответствует действительности", "Not helpful": "Бесполезно", - "Note deleted successfully": "", + "Note deleted successfully": "Заметка успешно удалена", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Обратите внимание: Если вы установите минимальный балл, поиск будет возвращать только документы с баллом больше или равным минимальному баллу.", "Notes": "Заметки", "Notification Sound": "Звук уведомления", @@ -871,7 +871,7 @@ "Only alphanumeric characters and hyphens are allowed": "Разрешены только буквенно-цифровые символы и дефисы.", "Only alphanumeric characters and hyphens are allowed in the command string.": "В строке команды разрешено использовать только буквенно-цифровые символы и дефисы.", "Only collections can be edited, create a new knowledge base to edit/add documents.": "Редактировать можно только коллекции, создайте новую базу знаний для редактирования/добавления документов.", - "Only markdown files are allowed": "", + "Only markdown files are allowed": "Разрешены только файлы markdown", "Only select users and groups with permission can access": "Доступ имеют только избранные пользователи и группы, имеющие разрешение.", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Упс! Похоже, что URL-адрес недействителен. Пожалуйста, перепроверьте и попробуйте еще раз.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Упс! Есть файлы, которые все еще загружаются. Пожалуйста, дождитесь завершения загрузки.", @@ -903,8 +903,8 @@ "PDF document (.pdf)": "PDF-документ (.pdf)", "PDF Extract Images (OCR)": "Извлечение изображений из PDF (OCR)", "pending": "ожидающий", - "Pending User Overlay Content": "", - "Pending User Overlay Title": "", + "Pending User Overlay Content": "Ожидание контента пользовательского оверлея", + "Pending User Overlay Title": "Ожидание заголовка пользовательского оверлея", "Permission denied when accessing media devices": "Отказано в разрешении на доступ к мультимедийным устройствам", "Permission denied when accessing microphone": "Отказано в разрешении на доступ к микрофону", "Permission denied when accessing microphone: {{error}}": "Отказано в разрешении на доступ к микрофону: {{error}}", @@ -919,8 +919,8 @@ "Pipelines": "Конвейеры", "Pipelines Not Detected": "Конвейеры не обнаружены", "Pipelines Valves": "Вентили конвейеров", - "Plain text (.md)": "", - "Plain text (.txt)": "Текст в формате .txt", + "Plain text (.md)": "Обычный текст (.md)", + "Plain text (.txt)": "Обычный текст (.txt)", "Playground": "Песочница", "Playwright Timeout (ms)": "Таймаут Playwright (мс)", "Playwright WebSocket URL": "", @@ -938,7 +938,7 @@ "Prefix ID": "ID префикса", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "ID префикса используется для предотвращения конфликтов с другими подключениями путем добавления префикса к идентификаторам моделей - оставьте пустым, чтобы отключить", "Presence Penalty": "Штраф за присутствие", - "Preview": "", + "Preview": "Предпросмотр", "Previous 30 days": "Предыдущие 30 дней", "Previous 7 days": "Предыдущие 7 дней", "Private": "Частное", @@ -984,7 +984,7 @@ "Repeat Penalty (Ollama)": "Повторить наказание (Ollama)", "Reply in Thread": "Ответить в обсуждении", "Request Mode": "Режим запроса", - "Reranking Engine": "", + "Reranking Engine": "Движок реранжирования", "Reranking Model": "Модель реранжирования", "Reset": "Сбросить", "Reset All Models": "Сбросить все модели", @@ -993,7 +993,7 @@ "Reset view": "Сбросить вид", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Уведомления об ответах не могут быть активированы, поскольку доступ к веб-сайту был заблокирован. Пожалуйста, перейдите к настройкам своего браузера, чтобы предоставить необходимый доступ.", "Response splitting": "Разделение ответов", - "Response Watermark": "", + "Response Watermark": "Водяной знак ответа", "Result": "Результат", "Retrieval": "Поиск", "Retrieval Query Generation": "Генерация поискового запроса", @@ -1093,8 +1093,8 @@ "Show": "Показать", "Show \"What's New\" modal on login": "Показывать окно «Что нового» при входе в систему", "Show Admin Details in Account Pending Overlay": "Показывать данные администратора в оверлее ожидающей учетной записи", - "Show All": "", - "Show Less": "", + "Show All": "Показать все", + "Show Less": "Показать меньше", "Show Model": "Показать модель", "Show shortcuts": "Показать горячие клавиши", "Show your support!": "Поддержите нас!", @@ -1118,7 +1118,7 @@ "Stream Chat Response": "Потоковый вывод ответа", "STT Model": "Модель распознавания речи", "STT Settings": "Настройки распознавания речи", - "Stylized PDF Export": "", + "Stylized PDF Export": "Стилизованный экспорт в формате PDF", "Subtitle (e.g. about the Roman Empire)": "Подзаголовок (напр., о Римской империи)", "Success": "Успех", "Successfully updated.": "Успешно обновлено.", @@ -1135,7 +1135,7 @@ "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Выборка без хвостов используется для уменьшения влияния менее вероятных токенов на выходные данные. Более высокое значение (например, 2.0) еще больше уменьшит влияние, в то время как значение 1.0 отключает эту настройку.", "Talk to model": "Поговорить с моделью", "Tap to interrupt": "Нажмите, чтобы прервать", - "Task Model": "", + "Task Model": "Модель задачи", "Tasks": "Задачи", "Tavily API Key": "Ключ API Tavily", "Tavily Extract Depth": "Глубина извлечения Tavily", @@ -1166,7 +1166,7 @@ "This chat won’t appear in history and your messages will not be saved.": "Этот чат не появится в истории, и ваши сообщения не будут сохранены.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Это обеспечивает сохранение ваших ценных разговоров в безопасной базе данных на вашем сервере. Спасибо!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Это экспериментальная функция, она может работать не так, как ожидалось, и может быть изменена в любое время.", - "This model is not publicly available. Please select another model.": "", + "This model is not publicly available. Please select another model.": "Эта модель недоступна в открытом доступе. Пожалуйста, выберите другую модель.", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Этот параметр определяет, сколько токенов сохраняется при обновлении контекста. Например, если задано значение 2, будут сохранены последние 2 токена контекста беседы. Сохранение контекста может помочь сохранить непрерывность беседы, но может уменьшить возможность отвечать на новые темы.", "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Этот параметр устанавливает максимальное количество токенов, которые модель может генерировать в своем ответе. Увеличение этого ограничения позволяет модели предоставлять более длинные ответы, но также может увеличить вероятность создания бесполезного или нерелевантного контента.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Эта опция удалит все существующие файлы в коллекции и заменит их вновь загруженными файлами.", @@ -1201,7 +1201,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "Чтобы выбрать инструменты, сначала добавьте их в \"Инструменты\" рабочего пространства.", "Toast notifications for new updates": "Уведомления о обновлениях", "Today": "Сегодня", - "Toggle search": "", + "Toggle search": "Переключить поиск", "Toggle settings": "Переключить настройки", "Toggle sidebar": "Переключить боковую панель", "Token": "Токен", @@ -1241,7 +1241,7 @@ "Unpin": "Открепить", "Unravel secrets": "Разгадать секреты", "Untagged": "Без тегов", - "Untitled": "", + "Untitled": "Без заголовка", "Update": "Обновить", "Update and Copy Link": "Обновить и скопировать ссылку", "Update for the latest features and improvements.": "Обновитесь для получения последних функций и улучшений.", @@ -1252,7 +1252,7 @@ "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Перейдите на лицензионный тарифный план, чтобы получить расширенные возможности, включая настраиваемую тематику и фирменный стиль, а также специальную поддержку.", "Upload": "Загрузить", "Upload a GGUF model": "Загрузить модель GGUF", - "Upload Audio": "", + "Upload Audio": "Загрузить аудио", "Upload directory": "Загрузить каталог", "Upload files": "Загрузить файлы", "Upload Files": "Загрузить файлы", @@ -1260,7 +1260,7 @@ "Upload Progress": "Прогресс загрузки", "URL": "", "URL Mode": "Режим URL", - "Usage": "", + "Usage": "Использование", "Use '#' in the prompt input to load and include your knowledge.": "Используйте «#» в строке ввода, чтобы загрузить и включить свои знания.", "Use Gravatar": "Использовать Gravatar", "Use groups to group your users and assign permissions.": "Используйте группы, чтобы группировать пользователей и назначать разрешения.", @@ -1290,7 +1290,7 @@ "View Replies": "С ответами", "View Result from **{{NAME}}**": "Просмотр результата от **{{NAME}}**", "Visibility": "Видимость", - "Vision": "", + "Vision": "Видение", "Voice": "Голос", "Voice Input": "Ввод голоса", "Warning": "Предупреждение", From d6ad96affbb664658d5287fb93d7b2d8f55200fa Mon Sep 17 00:00:00 2001 From: Marcelo Mendoza Date: Mon, 19 May 2025 17:24:47 +0200 Subject: [PATCH 004/144] fix: use get method for title and snippet in search results --- backend/open_webui/retrieval/web/searchapi.py | 2 +- backend/open_webui/retrieval/web/serpapi.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/retrieval/web/searchapi.py b/backend/open_webui/retrieval/web/searchapi.py index 38bc0b574..f3fbded8e 100644 --- a/backend/open_webui/retrieval/web/searchapi.py +++ b/backend/open_webui/retrieval/web/searchapi.py @@ -42,7 +42,7 @@ def search_searchapi( results = get_filtered_results(results, filter_list) return [ SearchResult( - link=result["link"], title=result["title"], snippet=result["snippet"] + link=result["link"], title=result.get("title"), snippet=result.get("snippet") ) for result in results[:count] ] diff --git a/backend/open_webui/retrieval/web/serpapi.py b/backend/open_webui/retrieval/web/serpapi.py index 028b6bcfe..7daa5f234 100644 --- a/backend/open_webui/retrieval/web/serpapi.py +++ b/backend/open_webui/retrieval/web/serpapi.py @@ -42,7 +42,7 @@ def search_serpapi( results = get_filtered_results(results, filter_list) return [ SearchResult( - link=result["link"], title=result["title"], snippet=result["snippet"] + link=result["link"], title=result.get("title"), snippet=result.get("snippet") ) for result in results[:count] ] From fd2ff5e7775c930cb31c3bef1f82e3e079f40d65 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Mon, 19 May 2025 19:28:12 +0200 Subject: [PATCH 005/144] i18n german update 1 --- src/lib/i18n/locales/de-DE/translation.json | 364 ++++++++++---------- 1 file changed, 182 insertions(+), 182 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index c7d73be27..8fe3a525a 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -4,10 +4,10 @@ "(e.g. `sh webui.sh --api --api-auth username_password`)": "(z. B. `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)", "(latest)": "(neueste)", - "(leave blank for to use commercial endpoint)": "", - "(Ollama)": "", + "(leave blank for to use commercial endpoint)": "(leer lassen, um kommerziellen Endpunkt zu verwenden)", + "(Ollama)": "(Ollama)", "{{ models }}": "{{ Modelle }}", - "{{COUNT}} Available Tools": "", + "{{COUNT}} Available Tools": "{{COUNT}} verfügbare Werkzeuge", "{{COUNT}} hidden lines": "{{COUNT}} versteckte Zeilen", "{{COUNT}} Replies": "{{COUNT}} Antworten", "{{user}}'s Chats": "{{user}}s Chats", @@ -74,14 +74,14 @@ "Allow User Location": "Standort freigeben", "Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen", "Allowed Endpoints": "Erlaubte Endpunkte", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", + "Allowed File Extensions": "Erlaubte Dateitypen-Erweiterungen", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Erlaubte Dateitypen. Trenne mehrere Erweiterungen mit einem Beistrich. Leer lassen um alle Dateitypen zu erlauben.", "Already have an account?": "Haben Sie bereits einen Account?", - "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "", + "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Eine Alternative zu top_p, die darauf abzielt, ein ausgewogenes Verhältnis von Qualität und Vielfalt zu gewährleisten. Der Parameter p stellt die Mindestwahrscheinlichkeit dar, mit der ein Token berücksichtigt wird, relativ zur Wahrscheinlichkeit des wahrscheinlichsten Tokens. Wenn beispielsweise p = 0,05 ist und das wahrscheinlichste Token eine Wahrscheinlichkeit von 0,9 hat, werden Logits mit einem Wert kleiner als 0,045 herausgefiltert.", "Always": "Immer", "Always Collapse Code Blocks": "Code-Blöcke immer zuklappen", "Always Expand Details": "Details immer aufklappen", - "Always Play Notification Sound": "", + "Always Play Notification Sound": "Benachrichtungston immer abspielen", "Amazing": "Fantastisch", "an assistant": "ein Assistent", "Analyzed": "Analysiert", @@ -89,13 +89,13 @@ "and": "und", "and {{COUNT}} more": "und {{COUNT}} mehr", "and create a new shared link.": "und erstellen Sie einen neuen freigegebenen Link.", - "Android": "", + "Android": "Android", "API Base URL": "API-Basis-URL", "API Key": "API-Schlüssel", "API Key created.": "API-Schlüssel erstellt.", "API Key Endpoint Restrictions": "API-Schlüssel Endpunkteinschränkungen", "API keys": "API-Schlüssel", - "API Version": "", + "API Version": "API Version", "Application DN": "Anwendungs-DN", "Application DN Password": "Anwendungs-DN-Passwort", "applies to all users with the \"user\" role": "gilt für alle Benutzer mit der Rolle \"Benutzer\"", @@ -108,7 +108,7 @@ "Are you sure you want to delete this channel?": "Sind Sie sicher, dass Sie diesen Kanal löschen möchten?", "Are you sure you want to delete this message?": "Sind Sie sicher, dass Sie diese Nachricht löschen möchten?", "Are you sure you want to unarchive all archived chats?": "Sind Sie sicher, dass Sie alle archivierten Chats wiederherstellen möchten?", - "Are you sure you want to update this user's role to **{{ROLE}}**?": "", + "Are you sure you want to update this user's role to **{{ROLE}}**?": "Sind Sie sicher, dass Sie die Rolle dieses Benutzers auf **{{ROLE}}** ändern möchten?", "Are you sure?": "Sind Sie sicher?", "Arena Models": "Arena-Modelle", "Artifacts": "Artefakte", @@ -121,10 +121,10 @@ "Attribute for Username": "Attribut für Benutzername", "Audio": "Audio", "August": "August", - "Auth": "", + "Auth": "Authentifizierung", "Authenticate": "Authentifizieren", "Authentication": "Authentifizierung", - "Auto": "", + "Auto": "Automatisch", "Auto-Copy Response to Clipboard": "Antwort automatisch in die Zwischenablage kopieren", "Auto-playback response": "Antwort automatisch abspielen", "Autocomplete Generation": "Automatische Vervollständigung", @@ -149,9 +149,9 @@ "Beta": "Beta", "Bing Search V7 Endpoint": "Bing Search V7-Endpunkt", "Bing Search V7 Subscription Key": "Bing Search V7-Abonnement-Schlüssel", - "Bocha Search API Key": "", - "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "", - "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "", + "Bocha Search API Key": "Bocha Search API-Schlüssel", + "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Verstärkung oder Bestrafung spezifischer Tokens für eingeschränkte Antworten. Bias-Werte werden zwischen -100 und 100 (einschließlich) begrenzt. (Standard: keine)", + "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "Entweder müssen Docling OCR-Engine und Sprache(n) angegeben oder beide leer gelassen werden.", "Brave Search API Key": "Brave Search API-Schlüssel", "By {{name}}": "Von {{name}}", "Bypass Embedding and Retrieval": "Embedding und Retrieval umgehen", @@ -161,8 +161,8 @@ "Camera": "Kamera", "Cancel": "Abbrechen", "Capabilities": "Fähigkeiten", - "Capture": "Aufnehmen", - "Capture Audio": "", + "Capture": "Aufzeichnen", + "Capture Audio": "Audio aufzeichnen", "Certificate Path": "Zertifikatpfad", "Change Password": "Passwort ändern", "Channel Name": "Kanalname", @@ -181,13 +181,13 @@ "Chats": "Chats", "Check Again": "Erneut überprüfen", "Check for updates": "Nach Updates suchen", - "Checking for updates...": "Sucht nach Updates...", + "Checking for updates...": "Suche nach Updates...", "Choose a model before saving...": "Wählen Sie ein Modell, bevor Sie speichern...", "Chunk Overlap": "Blocküberlappung", "Chunk Size": "Blockgröße", "Ciphers": "Verschlüsselungen", - "Citation": "Zitate", - "Citations": "", + "Citation": "Zitat", + "Citations": "Zitate", "Clear memory": "Alle Erinnerungen entfernen", "Clear Memory": "Alle Erinnerungen entfernen", "click here": "hier klicken", @@ -210,12 +210,12 @@ "Close": "Schließen", "Code execution": "Codeausführung", "Code Execution": "Codeausführung", - "Code Execution Engine": "", + "Code Execution Engine": "Code Ausführungs-Engine", "Code Execution Timeout": "Timeout für Codeausführung", "Code formatted successfully": "Code erfolgreich formatiert", "Code Interpreter": "Code-Interpreter", - "Code Interpreter Engine": "", - "Code Interpreter Prompt Template": "", + "Code Interpreter Engine": "Code Interpreter-Engine", + "Code Interpreter Prompt Template": "Code Interpreter Prompt Vorlage", "Collapse": "Zuklappen", "Collection": "Kollektion", "Color": "Farbe", @@ -237,22 +237,22 @@ "Connect to your own OpenAPI compatible external tool servers.": "Verbinden Sie sich zu Ihren OpenAPI-kompatiblen Werkzeug-Servern.", "Connection failed": "Verbindung fehlgeschlagen", "Connection successful": "Verbindung erfolgreich", - "Connection Type": "", + "Connection Type": "Verbindungstyp", "Connections": "Verbindungen", - "Connections saved successfully": "", - "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "", + "Connections saved successfully": "Verbindungen erfolgreich gespeichert", + "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Beschränkt den Reasoning-Aufwand für Reasoning-Modelle. Nur anwendbar auf Reasoning-Modelle von spezifischen Anbietern, die den Reasoning-Aufwand unterstützen.", "Contact Admin for WebUI Access": "Kontaktieren Sie den Administrator für den Zugriff auf die Weboberfläche", - "Content": "Info", - "Content Extraction Engine": "", + "Content": "Inhalt", + "Content Extraction Engine": "Inhaltsextraktions-Egine", "Context Length": "Kontextlänge", "Continue Response": "Antwort fortsetzen", "Continue with {{provider}}": "Mit {{provider}} fortfahren", "Continue with Email": "Mit Email fortfahren", "Continue with LDAP": "Mit LDAP fortfahren", "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Kontrollieren Sie, wie Nachrichtentext für TTS-Anfragen aufgeteilt wird. 'Punctuation' teilt in Sätze auf, 'paragraphs' teilt in Absätze auf und 'none' behält die Nachricht als einzelnen String.", - "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "", + "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "Steuert die Wiederholung von Token-Sequenzen im generierten Text. Ein höherer Wert (z. B. 1,5) bestraft Wiederholungen stärker, während ein niedrigerer Wert (z. B. 1,1) toleranter ist. Bei 1 ist die Funktion deaktiviert.", "Controls": "Steuerung", - "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "", + "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Steuert das Gleichgewicht zwischen Kohärenz und Vielfalt der Ausgabe. Ein niedrigerer Wert führt zu fokussierterem und kohärenterem Text.", "Copied": "Kopiert", "Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!", "Copied to clipboard": "In die Zwischenablage kopiert", @@ -275,7 +275,7 @@ "Create new key": "Neuen Schlüssel erstellen", "Create new secret key": "Neuen API-Schlüssel erstellen", "Create Note": "Notiz erstellen", - "Create your first note by clicking on the plus button below.": "", + "Create your first note by clicking on the plus button below.": "Erstellen Sie Ihre erste Notiz, indem Sie unten auf die Plus-Schaltfläche klicken.", "Created at": "Erstellt am", "Created At": "Erstellt am", "Created by": "Erstellt von", @@ -300,7 +300,7 @@ "Default Prompt Suggestions": "Prompt-Vorschläge", "Default to 389 or 636 if TLS is enabled": "Standardmäßig auf 389 oder 636 setzen, wenn TLS aktiviert ist", "Default to ALL": "Standardmäßig auf ALLE setzen", - "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "", + "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Standardmäßig segmentierte Abfrage für fokussierte und relevante Inhaltsestraktion verwenden, dies wird für die meisten Fälle empfohlen.", "Default User Role": "Standardbenutzerrolle", "Delete": "Löschen", "Delete a model": "Ein Modell löschen", @@ -321,9 +321,9 @@ "Deleted {{deleteModelTag}}": "{{deleteModelTag}} gelöscht", "Deleted {{name}}": "{{name}} gelöscht", "Deleted User": "Benutzer gelöscht", - "Deployment names are required for Azure OpenAI": "", - "Describe Pictures in Documents": "", - "Describe your knowledge base and objectives": "Beschreibe deinen Wissensspeicher und deine Ziele", + "Deployment names are required for Azure OpenAI": "Deployment-Namen sind für Azure OpenAI erforderlich.", + "Describe Pictures in Documents": "Bilder in Dokumenten beschreiben", + "Describe your knowledge base and objectives": "Beschreiben Sie Ihren Wissensspeicher und Ihre Ziele", "Description": "Beschreibung", "Detect Artifacts Automatically": "Artefakte automatisch erkennen", "Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt", @@ -337,7 +337,7 @@ "Discover a model": "Entdecken Sie weitere Modelle", "Discover a prompt": "Entdecken Sie weitere Prompts", "Discover a tool": "Entdecken Sie weitere Werkzeuge", - "Discover how to use Open WebUI and seek support from the community.": "Entdecke, wie Sie Open WebUI nutzen und erhalten Sie Unterstützung von der Community.", + "Discover how to use Open WebUI and seek support from the community.": "Entdecken Sie, wie Sie Open WebUI nutzen und Unterstützung von der Community erhalten.", "Discover wonders": "Entdecken Sie Wunder", "Discover, download, and explore custom functions": "Entdecken und beziehen Sie benutzerdefinierte Funktionen", "Discover, download, and explore custom prompts": "Entdecken und beziehen Sie benutzerdefinierte Prompts", @@ -351,11 +351,11 @@ "Dive into knowledge": "Tauchen Sie in das Wissen ein", "Do not install functions from sources you do not fully trust.": "Installieren Sie keine Funktionen aus Quellen, denen Sie nicht vollständig vertrauen.", "Do not install tools from sources you do not fully trust.": "Installieren Sie keine Werkzeuge aus Quellen, denen Sie nicht vollständig vertrauen.", - "Docling": "", - "Docling Server URL required.": "", + "Docling": "Docling", + "Docling Server URL required.": "Docling Server URL benötigt", "Document": "Dokument", - "Document Intelligence": "", - "Document Intelligence endpoint and key required.": "", + "Document Intelligence": "Dokumentenintelligenz", + "Document Intelligence endpoint and key required.": "Endpunkt und Schlüssel für Dokumentenintelligenz erforderlich.", "Documentation": "Dokumentation", "Documents": "Dokumente", "does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Ihre Daten bleiben sicher auf Ihrem lokal gehosteten Server.", @@ -371,20 +371,20 @@ "Download Database": "Datenbank exportieren", "Drag and drop a file to upload or select a file to view": "Ziehen Sie eine Datei zum Hochladen oder wählen Sie eine Datei zum Anzeigen aus", "Draw": "Zeichnen", - "Drop any files here to upload": "", + "Drop any files here to upload": "Dateien hierher ziehen, um sie hochzuladen", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z. B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.", - "e.g. \"json\" or a JSON schema": "", + "e.g. \"json\" or a JSON schema": "z. B. \"json\" oder ein JSON-Schema", "e.g. 60": "z. B. 60", "e.g. A filter to remove profanity from text": "z. B. Ein Filter, um Schimpfwörter aus Text zu entfernen", "e.g. My Filter": "z. B. Mein Filter", "e.g. My Tools": "z. B. Meine Werkzeuge", "e.g. my_filter": "z. B. mein_filter", "e.g. my_tools": "z. B. meine_werkzeuge", - "e.g. pdf, docx, txt": "", + "e.g. pdf, docx, txt": "z. B. pdf, docx, txt", "e.g. Tools for performing various operations": "z. B. Werkzeuge für verschiedene Operationen", - "e.g., 3, 4, 5 (leave blank for default)": "", + "e.g., 3, 4, 5 (leave blank for default)": "z. B. 3, 4, 5 (leer lassen für Standard)", "e.g., en-US,ja-JP (leave blank for auto-detect)": "z. B. en-US,de-DE (freilassen für automatische Erkennung)", - "e.g., westus (leave blank for eastus)": "", + "e.g., westus (leave blank for eastus)": "z. B. westus (leer lassen für eastus)", "Edit": "Bearbeiten", "Edit Arena Model": "Arena-Modell bearbeiten", "Edit Channel": "Kanal bearbeiten", @@ -396,7 +396,7 @@ "ElevenLabs": "ElevenLabs", "Email": "E-Mail", "Embark on adventures": "Abenteuer erleben", - "Embedding": "", + "Embedding": "Embedding", "Embedding Batch Size": "Embedding-Stapelgröße", "Embedding Model": "Embedding-Modell", "Embedding Model Engine": "Embedding-Modell-Engine", @@ -409,17 +409,17 @@ "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.", "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktiviere Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.", "Enable Message Rating": "Nachrichtenbewertung aktivieren", - "Enable Mirostat sampling for controlling perplexity.": "", + "Enable Mirostat sampling for controlling perplexity.": "Mirostat-Sampling zur Steuerung der Perplexität aktivieren.", "Enable New Sign Ups": "Registrierung erlauben", "Enabled": "Aktiviert", - "Endpoint URL": "", + "Endpoint URL": "Endpunkt-URL", "Enforce Temporary Chat": "Temporären Chat erzwingen", - "Enhance": "", + "Enhance": "Verbessern", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Stellen Sie sicher, dass Ihre CSV-Datei 4 Spalten in dieser Reihenfolge enthält: Name, E-Mail, Passwort, Rolle.", "Enter {{role}} message here": "Geben Sie die {{role}}-Nachricht hier ein", "Enter a detail about yourself for your LLMs to recall": "Geben Sie ein Detail über sich selbst ein, das Ihre Sprachmodelle (LLMs) sich merken sollen", - "Enter a title for the pending user info overlay. Leave empty for default.": "", - "Enter a watermark for the response. Leave empty for none.": "", + "Enter a title for the pending user info overlay. Leave empty for default.": "Geben Sie einen Titel für das Overlay 'Ausstehende Kontoaktivierung' ein. Für Standard leer lassen.", + "Enter a watermark for the response. Leave empty for none.": "Geben Sie ein Wasserzeichen für die Antwort ein. Für keines leer lassen.", "Enter api auth string (e.g. username:password)": "Geben Sie die API-Authentifizierungszeichenfolge ein (z. B. Benutzername:Passwort)", "Enter Application DN": "Geben Sie die Anwendungs-DN ein", "Enter Application DN Password": "Geben Sie das Anwendungs-DN-Passwort ein", @@ -431,22 +431,22 @@ "Enter CFG Scale (e.g. 7.0)": "Geben Sie die CFG-Skala ein (z. B. 7.0)", "Enter Chunk Overlap": "Geben Sie die Blocküberlappung ein", "Enter Chunk Size": "Geben Sie die Blockgröße ein", - "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "", - "Enter content for the pending user info overlay. Leave empty for default.": "", + "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Geben Sie kommagetrennte \"token:bias_value\"-Paare ein (Beispiel: 5432:100, 413:-100)", + "Enter content for the pending user info overlay. Leave empty for default.": "Geben Sie Inhalt für das Overlay 'Ausstehende Kontoaktivierung' ein. Für Standard leer lassen.", "Enter description": "Geben Sie eine Beschreibung ein", - "Enter Docling OCR Engine": "", - "Enter Docling OCR Language(s)": "", - "Enter Docling Server URL": "", - "Enter Document Intelligence Endpoint": "", - "Enter Document Intelligence Key": "", - "Enter domains separated by commas (e.g., example.com,site.org)": "Geben Sie die Domains durch Kommas separiert ein (z.B. example.com,site.org)", + "Enter Docling OCR Engine": "Docling OCR-Engine eingeben", + "Enter Docling OCR Language(s)": "Docling OCR-Sprache(n) eingeben", + "Enter Docling Server URL": "Docling Server-URL eingeben", + "Enter Document Intelligence Endpoint": "ndpunkt für Dokumentenintelligenz eingeben", + "Enter Document Intelligence Key": "Schlüssel für Dokumentenintelligenz eingeben", + "Enter domains separated by commas (e.g., example.com,site.org)": "Geben Sie die Domains durch Kommas separiert ein (z. B. example.com,site.org)", "Enter Exa API Key": "Geben Sie den Exa-API-Schlüssel ein", - "Enter External Document Loader API Key": "", - "Enter External Document Loader URL": "", - "Enter External Web Loader API Key": "", - "Enter External Web Loader URL": "", - "Enter External Web Search API Key": "", - "Enter External Web Search URL": "", + "Enter External Document Loader API Key": "API-Schlüssel für externen Dokumenten-Loader eingeben", + "Enter External Document Loader URL": "URL für externen Dokumenten-Loader eingeben", + "Enter External Web Loader API Key": "API-Schlüssel für externen Web-Loader eingeben", + "Enter External Web Loader URL": "URL für externen Web-Loader eingeben", + "Enter External Web Search API Key": "API-Schlüssel für externe Websuche eingeben", + "Enter External Web Search URL": "URL für externe Websuche eingeben", "Enter Firecrawl API Base URL": "Geben Sie die Firecrawl Basis-URL ein", "Enter Firecrawl API Key": "Geben Sie den Firecrawl API-Schlüssel ein", "Enter Github Raw URL": "Geben Sie die Github Raw-URL ein", @@ -464,10 +464,10 @@ "Enter Model ID": "Geben Sie die Modell-ID ein", "Enter model tag (e.g. {{modelTag}})": "Geben Sie den Model-Tag ein", "Enter Mojeek Search API Key": "Geben Sie den Mojeek Search API-Schlüssel ein", - "Enter New Password": "", + "Enter New Password": "Neues Passwort eingeben", "Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)", "Enter Perplexity API Key": "Geben Sie den Perplexity API-Schlüssel ein", - "Enter Playwright Timeout": "", + "Enter Playwright Timeout": "Playwright Timeout eingeben", "Enter Playwright WebSocket URL": "Geben Sie die Playwright WebSocket-URL ein", "Enter proxy URL (e.g. https://user:password@host:port)": "Geben sie die Proxy-URL ein (z. B. https://user:password@host:port)", "Enter reasoning effort": "Geben Sie den Schlussfolgerungsaufwand ein", @@ -479,20 +479,20 @@ "Enter Searxng Query URL": "Geben Sie die Searxng-Abfrage-URL ein", "Enter Seed": "Geben Sie den Seed ein", "Enter SerpApi API Key": "Geben Sie den SerpApi API-Schlüssel ein", - "Enter SerpApi Engine": "", + "Enter SerpApi Engine": "SerpApi-Engine eingeben", "Enter Serper API Key": "Geben Sie den Serper-API-Schlüssel ein", "Enter Serply API Key": "Geben Sie den", "Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein", "Enter server host": "Geben Sie den Server-Host ein", "Enter server label": "Geben Sie das Server-Label ein", "Enter server port": "Geben Sie den Server-Port ein", - "Enter Sougou Search API sID": "", - "Enter Sougou Search API SK": "", + "Enter Sougou Search API sID": "Sougou Search API sID eingeben", + "Enter Sougou Search API SK": "Sougou Search API SK eingeben", "Enter stop sequence": "Stop-Sequenz eingeben", "Enter system prompt": "Systemprompt eingeben", "Enter system prompt here": "Systemprompt hier eingeben", "Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein", - "Enter Tavily Extract Depth": "", + "Enter Tavily Extract Depth": "Tavily Extraktionstiefe eingeben", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Geben sie die öffentliche URL Ihrer WebUI ein. Diese URL wird verwendet, um Links in den Benachrichtigungen zu generieren.", "Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein", "Enter timeout in seconds": "Geben Sie den Timeout in Sekunden ein", @@ -501,15 +501,15 @@ "Enter Top K Reranker": "Geben Sie Top K für Reranker ein", "Enter URL (e.g. http://127.0.0.1:7860/)": "Geben Sie die URL ein (z. B. http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)", - "Enter Yacy Password": "", - "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "", - "Enter Yacy Username": "", + "Enter Yacy Password": "Yacy-Passwort eingeben", + "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Yacy-URL eingeben (z. B. http://yacy.example.com:8090 )", + "Enter Yacy Username": "Yacy-Benutzernamen eingeben", "Enter your current password": "Geben Sie Ihr aktuelles Passwort ein", "Enter Your Email": "Geben Sie Ihre E-Mail-Adresse ein", "Enter Your Full Name": "Geben Sie Ihren vollständigen Namen ein", "Enter your message": "Geben Sie Ihre Nachricht ein", "Enter your name": "Geben Sie Ihren Namen ein", - "Enter Your Name": "", + "Enter Your Name": "Geben Sie Ihren Namen ein", "Enter your new password": "Geben Sie Ihr neues Passwort ein", "Enter Your Password": "Geben Sie Ihr Passwort ein", "Enter Your Role": "Geben Sie Ihre Rolle ein", @@ -518,8 +518,8 @@ "Error": "Fehler", "ERROR": "FEHLER", "Error accessing Google Drive: {{error}}": "Fehler beim Zugriff auf Google Drive: {{error}}", - "Error accessing media devices.": "", - "Error starting recording.": "", + "Error accessing media devices.": "Fehler beim Zugreifen auf Mediengeräte", + "Error starting recording.": "Fehler beim starten der Aufnahme", "Error uploading file: {{error}}": "Fehler beim Hochladen der Datei: {{error}}", "Evaluations": "Evaluationen", "Exa API Key": "Exa-API-Schlüssel", @@ -528,10 +528,10 @@ "Example: mail": "Beispiel: mail", "Example: ou=users,dc=foo,dc=example": "Beispiel: ou=users,dc=foo,dc=example", "Example: sAMAccountName or uid or userPrincipalName": "Beispiel: sAMAccountName or uid or userPrincipalName", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Die Anzahl der Plätze in Ihrer Lizenz wurde überschritten. Bitte kontaktieren Sie den Support, um die Anzahl der Plätze zu erhöhen.", "Exclude": "Ausschließen", "Execute code for analysis": "Code für Analyse ausführen", - "Executing **{{NAME}}**...": "", + "Executing **{{NAME}}**...": "**{{NAME}}** wird ausgeführt...", "Expand": "Aufklappen", "Experimental": "Experimentell", "Explain": "Erklären", @@ -550,20 +550,20 @@ "Export to CSV": "Als CSV exportieren", "Export Tools": "Werkzeuge exportieren", "External": "Extern", - "External Document Loader URL required.": "", - "External Task Model": "", - "External Web Loader API Key": "", - "External Web Loader URL": "", - "External Web Search API Key": "", - "External Web Search URL": "", + "External Document Loader URL required.": "URL für externen Dokumenten-Loader erforderlich.", + "External Task Model": "Externes Aufgabenmodell", + "External Web Loader API Key": "Externer Web-Loader API-Schlüssel", + "External Web Loader URL": "Externer Web-Loader URL", + "External Web Search API Key": "Externe Websuche API-Schlüssel", + "External Web Search URL": "Externe Websuche URL", "Failed to add file.": "Fehler beim Hinzufügen der Datei.", - "Failed to connect to {{URL}} OpenAPI tool server": "", + "Failed to connect to {{URL}} OpenAPI tool server": "Verbindung zum OpenAPI-Toolserver {{URL}} fehlgeschlagen", "Failed to create API Key.": "Fehler beim Erstellen des API-Schlüssels.", - "Failed to delete note": "", + "Failed to delete note": "Notiz konnte nicht gelöscht werden", "Failed to fetch models": "Fehler beim Abrufen der Modelle", - "Failed to load file content.": "", + "Failed to load file content.": "Fehler beim Laden des Dateiinhalts.", "Failed to read clipboard contents": "Fehler beim Abruf der Zwischenablage", - "Failed to save connections": "", + "Failed to save connections": "Verbindungen konnten nicht gespeichert werden", "Failed to save models configuration": "Fehler beim Speichern der Modellkonfiguration", "Failed to update settings": "Fehler beim Aktualisieren der Einstellungen", "Failed to upload file.": "Fehler beim Hochladen der Datei.", @@ -580,7 +580,7 @@ "File not found.": "Datei nicht gefunden.", "File removed successfully.": "Datei erfolgreich entfernt.", "File size should not exceed {{maxSize}} MB.": "Datei darf nicht größer als {{maxSize}} MB sein.", - "File Upload": "", + "File Upload": "Dateiupload", "File uploaded successfully": "Datei erfolgreich hochgeladen", "Files": "Dateien", "Filter is now globally disabled": "Filter ist jetzt global deaktiviert", @@ -598,7 +598,7 @@ "Forge new paths": "Neue Wege beschreiten", "Form": "Formular", "Format your variables using brackets like this:": "Formatieren Sie Ihre Variablen mit Klammern, wie hier:", - "Forwards system user session credentials to authenticate": "", + "Forwards system user session credentials to authenticate": "Leitet Anmeldeinformationen der Systembenutzersitzung zur Authentifizierung weiter", "Frequency Penalty": "Frequenzstrafe", "Full Context Mode": "Voll-Kontext Modus", "Function": "Funktion", @@ -618,10 +618,10 @@ "Gemini API Config": "Gemini API-Konfiguration", "Gemini API Key is required.": "Gemini API-Schlüssel ist erforderlich.", "General": "Allgemein", - "Generate": "", + "Generate": "Generiere", "Generate an image": "Bild erzeugen", "Generate Image": "Bild erzeugen", - "Generate prompt pair": "", + "Generate prompt pair": "Prompt-Paar generieren", "Generating search query": "Suchanfrage wird erstellt", "Generating...": "Generiere...", "Get started": "Loslegen", @@ -646,16 +646,16 @@ "Hex Color - Leave empty for default color": "Hex-Farbe - Leer lassen für Standardfarbe", "Hide": "Verbergen", "Hide Model": "Modell verstecken", - "High Contrast Mode": "", - "Home": "", + "High Contrast Mode": "Modus für hohen Kontrast", + "Home": "Startseite", "Host": "Host", "How can I help you today?": "Wie kann ich Ihnen heute helfen?", "How would you rate this response?": "Wie würden Sie diese Antwort bewerten?", "Hybrid Search": "Hybride Suche", "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.": "Ich bestätige, dass ich gelesen habe und die Auswirkungen meiner Aktion verstehe. Mir sind die Risiken bewusst, die mit der Ausführung beliebigen Codes verbunden sind, und ich habe die Vertrauenswürdigkeit der Quelle überprüft.", "ID": "ID", - "iframe Sandbox Allow Forms": "", - "iframe Sandbox Allow Same Origin": "", + "iframe Sandbox Allow Forms": "iFrame-Sandbox: Formulare erlauben", + "iframe Sandbox Allow Same Origin": "iFrame-Sandbox: Gleichen Ursprung erlauben", "Ignite curiosity": "Neugier entfachen", "Image": "Bild", "Image Compression": "Bildkomprimierung", @@ -671,24 +671,24 @@ "Import Config from JSON File": "Konfiguration aus JSON-Datei importieren", "Import Functions": "Funktionen importieren", "Import Models": "Modelle importieren", - "Import Notes": "", + "Import Notes": "Notizen importieren", "Import Presets": "Voreinstellungen importieren", "Import Prompts": "Prompts importieren", "Import Tools": "Werkzeuge importieren", "Include": "Einschließen", "Include `--api-auth` flag when running stable-diffusion-webui": "Fügen Sie beim Ausführen von stable-diffusion-webui die Option `--api-auth` hinzu", "Include `--api` flag when running stable-diffusion-webui": "Fügen Sie beim Ausführen von stable-diffusion-webui die Option `--api` hinzu", - "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "", + "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Beeinflusst, wie schnell der Algorithmus auf Feedback aus dem generierten Text reagiert. Eine niedrigere Lernrate führt zu langsameren Anpassungen, während eine höhere Lernrate den Algorithmus reaktionsschneller macht.", "Info": "Info", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Gesamten Inhalt als Kontext für umfassende Verarbeitung einfügen, dies wird für komplexe Abfragen empfohlen.", "Input commands": "Eingabebefehle", "Install from Github URL": "Installiere von der Github-URL", "Instant Auto-Send After Voice Transcription": "Spracherkennung direkt absenden", - "Integration": "", + "Integration": "Integration", "Interface": "Oberfläche", - "Invalid file content": "", + "Invalid file content": "Ungültiger Dateiinhalt", "Invalid file format.": "Ungültiges Dateiformat.", - "Invalid JSON schema": "", + "Invalid JSON schema": "Ungültiges JSON-Schema", "Invalid Tag": "Ungültiger Tag", "is typing...": "schreibt ...", "January": "Januar", @@ -698,8 +698,8 @@ "JSON Preview": "JSON-Vorschau", "July": "Juli", "June": "Juni", - "Jupyter Auth": "", - "Jupyter URL": "", + "Jupyter Auth": "Jupyter-Authentifizierung", + "Jupyter URL": "Jupyter-URL", "JWT Expiration": "JWT-Ablauf", "JWT Token": "JWT-Token", "Kagi Search API Key": "Kagi Search API-Schlüssel", @@ -710,7 +710,7 @@ "Knowledge Access": "Wissenszugriff", "Knowledge created successfully.": "Wissen erfolgreich erstellt.", "Knowledge deleted successfully.": "Wissen erfolgreich gelöscht.", - "Knowledge Public Sharing": "", + "Knowledge Public Sharing": "Öffentliche Freigabe von Wissen", "Knowledge reset successfully.": "Wissen erfolgreich zurückgesetzt.", "Knowledge updated successfully": "Wissen erfolgreich aktualisiert", "Kokoro.js (Browser)": "", @@ -725,11 +725,11 @@ "LDAP": "LDAP", "LDAP server updated": "LDAP-Server aktualisiert", "Leaderboard": "Bestenliste", - "Learn more about OpenAPI tool servers.": "", + "Learn more about OpenAPI tool servers.": "Erfahren Sie mehr über OpenAPI-Toolserver.", "Leave empty for unlimited": "Leer lassen für unbegrenzt", - "Leave empty to include all models from \"{{url}}\" endpoint": "", - "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "", - "Leave empty to include all models from \"{{url}}/models\" endpoint": "", + "Leave empty to include all models from \"{{url}}\" endpoint": "Leer lassen, um alle Modelle vom Endpunkt \"{{url}}\" einzuschließen", + "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Leer lassen, um alle Modelle vom Endpunkt \"{{url}}/api/tags\" einzuschließen", + "Leave empty to include all models from \"{{url}}/models\" endpoint": "Leer lassen, um alle Modelle vom Endpunkt \"{{url}}/models\" einzuschließen", "Leave empty to include all models or select specific models": "Leer lassen, um alle Modelle einzuschließen oder spezifische Modelle auszuwählen", "Leave empty to use the default prompt, or enter a custom prompt": "Leer lassen, um den Standardprompt zu verwenden, oder geben Sie einen benutzerdefinierten Prompt ein", "Leave model field empty to use the default model.": "Leer lassen, um das Standardmodell zu verwenden.", @@ -737,17 +737,17 @@ "Light": "Hell", "Listening...": "Höre zu...", "Llama.cpp": "Llama.cpp", - "LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfe wichtige Informationen.", + "LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfen Sie wichtige Informationen.", "Loader": "", "Loading Kokoro.js...": "Lade Kokoro.js...", "Local": "Lokal", - "Local Task Model": "", + "Local Task Model": "Lokales Aufgabenmodell", "Location access not allowed": "Standortzugriff nicht erlaub", "Logit Bias": "", "Lost": "Verloren", "LTR": "LTR", "Made by Open WebUI Community": "Von der OpenWebUI-Community", - "Make sure to enclose them with": "Umschließe Variablen mit", + "Make sure to enclose them with": "Umschließen Sie Variablen mit", "Make sure to export a workflow.json file as API format from ComfyUI.": "Stellen Sie sicher, dass sie eine workflow.json-Datei im API-Format von ComfyUI exportieren.", "Manage": "Verwalten", "Manage Direct Connections": "Direkte Verbindungen verwalten", @@ -756,7 +756,7 @@ "Manage Ollama API Connections": "Ollama-API-Verbindungen verwalten", "Manage OpenAI API Connections": "OpenAI-API-Verbindungen verwalten", "Manage Pipelines": "Pipelines verwalten", - "Manage Tool Servers": "", + "Manage Tool Servers": "Tool Server verwalten", "March": "März", "Max Speakers": "", "Max Tokens (num_predict)": "Maximale Tokenanzahl (num_predict)", @@ -775,8 +775,8 @@ "Message rating should be enabled to use this feature": "Antwortbewertung muss aktiviert sein, um diese Funktion zu verwenden", "Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können den freigegebenen Chat einsehen.", "Microsoft OneDrive": "", - "Microsoft OneDrive (personal)": "", - "Microsoft OneDrive (work/school)": "", + "Microsoft OneDrive (personal)": "Microsoft OneDrive (persönlich)", + "Microsoft OneDrive (work/school)": "Microsoft OneDrive (Arbeit/Schule)", "Min P": "Min P", "Mirostat": "Mirostat", "Mirostat Eta": "Mirostat Eta", @@ -791,11 +791,11 @@ "Model {{name}} is now {{status}}": "Modell {{name}} ist jetzt {{status}}", "Model {{name}} is now hidden": "Modell {{name}} ist jetzt versteckt.", "Model {{name}} is now visible": "Modell {{name}} ist jetzt sichtbar.", - "Model accepts file inputs": "", + "Model accepts file inputs": "Modell akzeptiert Dateieingaben", "Model accepts image inputs": "Modell akzeptiert Bildeingaben", - "Model can execute code and perform calculations": "", - "Model can generate images based on text prompts": "", - "Model can search the web for information": "", + "Model can execute code and perform calculations": "Modell kann Code ausführen und Berechnungen durchführen", + "Model can generate images based on text prompts": "Modell kann Bilder basierend auf Text-Prompts generieren", + "Model can search the web for information": "Modell kann das Web nach Informationen durchsuchen", "Model created successfully!": "Modell erfolgreich erstellt!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modell-Dateisystempfad erkannt. Modellkurzname ist für das Update erforderlich, Fortsetzung nicht möglich.", "Model Filtering": "Modellfilterung", @@ -806,12 +806,12 @@ "Model Params": "Modell-Parameter", "Model Permissions": "Modellberechtigungen", "Model updated successfully": "Modell erfolgreich aktualisiert", - "Model(s) do not support file upload": "", + "Model(s) do not support file upload": "Modell(e) unterstützen keinen Dateiupload", "Modelfile Content": "Modelfile-Inhalt", "Models": "Modelle", "Models Access": "Modell-Zugriff", "Models configuration saved successfully": "Modellkonfiguration erfolgreich gespeichert", - "Models Public Sharing": "", + "Models Public Sharing": "Öffentliche Freigabe von Modellen", "Mojeek Search API Key": "Mojeek Search API-Schlüssel", "more": "mehr", "More": "Mehr", @@ -826,7 +826,7 @@ "new-channel": "neuer-kanal", "No content": "Kein Inhalt", "No content found": "Kein Inhalt gefunden", - "No content found in file.": "", + "No content found in file.": "Kein Inhalt in Datei gefunden.", "No content to speak": "Kein Inhalt zum Vorlesen", "No distance available": "Keine Distanz verfügbar", "No feedbacks found": "Kein Feedback gefunden", @@ -848,7 +848,7 @@ "None": "Nichts", "Not factually correct": "Nicht sachlich korrekt", "Not helpful": "Nicht hilfreich", - "Note deleted successfully": "", + "Note deleted successfully": "Notiz erfolgreich gelöscht", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Hinweis: Wenn Sie eine Mindestpunktzahl festlegen, werden in der Suche nur Dokumente mit einer Punktzahl größer oder gleich der Mindestpunktzahl zurückgegeben.", "Notes": "Notizen", "Notification Sound": "Benachrichtigungston", @@ -871,7 +871,7 @@ "Only alphanumeric characters and hyphens are allowed": "Nur alphanumerische Zeichen und Bindestriche sind erlaubt", "Only alphanumeric characters and hyphens are allowed in the command string.": "In der Befehlszeichenfolge sind nur alphanumerische Zeichen und Bindestriche erlaubt.", "Only collections can be edited, create a new knowledge base to edit/add documents.": "Nur Sammlungen können bearbeitet werden. Erstellen Sie eine neue Wissensbasis, um Dokumente zu bearbeiten/hinzuzufügen.", - "Only markdown files are allowed": "", + "Only markdown files are allowed": "Nur Markdown-Dateien sind erlaubt", "Only select users and groups with permission can access": "Nur ausgewählte Benutzer und Gruppen mit Berechtigung können darauf zugreifen", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppla! Es scheint, dass die URL ungültig ist. Bitte überprüfen Sie diese und versuchen Sie es erneut.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Hoppla! Es werden noch Dateien hochgeladen. Bitte warten Sie, bis der Upload abgeschlossen ist.", @@ -880,7 +880,7 @@ "Open file": "Datei öffnen", "Open in full screen": "Im Vollbildmodus öffnen", "Open new chat": "Neuen Chat öffnen", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI kann Werkzeuge verwenden, die von jedem OpenAPI-Server bereitgestellt werden.", "Open WebUI uses faster-whisper internally.": "Open WebUI verwendet intern faster-whisper.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI verwendet SpeechT5 und CMU Arctic-Sprecher-Embeddings.", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Die installierte Open-WebUI-Version (v{{OPEN_WEBUI_VERSION}}) ist niedriger als die erforderliche Version (v{{REQUIRED_VERSION}})", @@ -903,8 +903,8 @@ "PDF document (.pdf)": "PDF-Dokument (.pdf)", "PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)", "pending": "ausstehend", - "Pending User Overlay Content": "", - "Pending User Overlay Title": "", + "Pending User Overlay Content": "Inhalt des Overlays für ausstehende Kontoaktivierung", + "Pending User Overlay Title": "Titel des Overlays für ausstehende Kontoaktivierung", "Permission denied when accessing media devices": "Zugriff auf Mediengeräte verweigert", "Permission denied when accessing microphone": "Zugriff auf das Mikrofon verweigert", "Permission denied when accessing microphone: {{error}}": "Zugriff auf das Mikrofon verweigert: {{error}}", @@ -919,11 +919,11 @@ "Pipelines": "Pipelines", "Pipelines Not Detected": "Pipelines nicht erkannt", "Pipelines Valves": "Pipeline Valves", - "Plain text (.md)": "", + "Plain text (.md)": "Nur Text (.md)", "Plain text (.txt)": "Nur Text (.txt)", "Playground": "Testumgebung", - "Playwright Timeout (ms)": "", - "Playwright WebSocket URL": "", + "Playwright Timeout (ms)": "Playwright Timeout (ms)", + "Playwright WebSocket URL": "Playwright WebSocket-URL", "Please carefully review the following warnings:": "Bitte überprüfen Sie die folgenden Warnungen sorgfältig:", "Please do not close the settings page while loading the model.": "Bitte schließen die Einstellungen-Seite nicht, während das Modell lädt.", "Please enter a prompt": "Bitte geben Sie einen Prompt ein", @@ -938,21 +938,21 @@ "Prefix ID": "Präfix-ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Prefix-ID wird verwendet, um Konflikte mit anderen Verbindungen zu vermeiden, indem ein Präfix zu den Modell-IDs hinzugefügt wird - leer lassen, um zu deaktivieren", "Presence Penalty": "", - "Preview": "", + "Preview": "Vorschau", "Previous 30 days": "Vorherige 30 Tage", "Previous 7 days": "Vorherige 7 Tage", "Private": "Privat", "Profile Image": "Profilbild", "Prompt": "Prompt", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (z. B. \"Erzähle mir eine interessante Tatsache über das Römische Reich\")", - "Prompt Autocompletion": "", + "Prompt Autocompletion": "Prompt Autovervollständigung", "Prompt Content": "Prompt-Inhalt", "Prompt created successfully": "Prompt erfolgreich erstellt", "Prompt suggestions": "Prompt-Vorschläge", "Prompt updated successfully": "Prompt erfolgreich aktualisiert", "Prompts": "Prompts", "Prompts Access": "Prompt-Zugriff", - "Prompts Public Sharing": "", + "Prompts Public Sharing": "Öffentliche Freigabe von Prompts", "Public": "Öffentlich", "Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com beziehen", "Pull a model from Ollama.com": "Modell von Ollama.com beziehen", @@ -966,13 +966,13 @@ "Record": "Aufzeichnen", "Record voice": "Stimme aufnehmen", "Redirecting you to Open WebUI Community": "Sie werden zur OpenWebUI-Community weitergeleitet", - "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "", + "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Reduziert die Wahrscheinlichkeit, unsinnige Ergebnisse zu generieren. Ein höherer Wert (z. B. 100) führt zu vielfältigeren Antworten, während ein niedrigerer Wert (z. B. 10) konservativere Ergebnisse liefert.", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Beziehen Sie sich auf sich selbst als \"Benutzer\" (z. B. \"Benutzer lernt Spanisch\")", "References from": "Referenzen aus", "Refused when it shouldn't have": "Abgelehnt, obwohl es nicht hätte abgelehnt werden sollen", "Regenerate": "Neu generieren", "Reindex": "Neu indexieren", - "Reindex Knowledge Base Vectors": "", + "Reindex Knowledge Base Vectors": "Vektoren der Wissensdatenbank neu indizieren", "Release Notes": "Veröffentlichungshinweise", "Relevance": "Relevanz", "Relevance Threshold": "Relevanzschwelle", @@ -984,7 +984,7 @@ "Repeat Penalty (Ollama)": "Wiederholungsstrafe (Ollama)", "Reply in Thread": "Im Thread antworten", "Request Mode": "Anforderungsmodus", - "Reranking Engine": "", + "Reranking Engine": "Reranking-Engine", "Reranking Model": "Reranking-Modell", "Reset": "Zurücksetzen", "Reset All Models": "Alle Modelle zurücksetzen", @@ -993,7 +993,7 @@ "Reset view": "Ansicht zurücksetzen", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Benachrichtigungen können nicht aktiviert werden, da die Website-Berechtigungen abgelehnt wurden. Bitte besuchen Sie Ihre Browser-Einstellungen, um den erforderlichen Zugriff zu gewähren.", "Response splitting": "Antwortaufteilung", - "Response Watermark": "", + "Response Watermark": "Antwort Wasserzeichen", "Result": "Ergebnis", "Retrieval": "", "Retrieval Query Generation": "Abfragegenerierung", @@ -1058,8 +1058,8 @@ "Send message": "Nachricht senden", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "Sendet `stream_options: { include_usage: true }` in der Anfrage.\nUnterstützte Anbieter geben Token-Nutzungsinformationen in der Antwort zurück, wenn dies festgelegt ist.", "September": "September", - "SerpApi API Key": "", - "SerpApi Engine": "", + "SerpApi API Key": "SerpApi API-Schlüssel", + "SerpApi Engine": "SerpApi-Engine", "Serper API Key": "Serper-API-Schlüssel", "Serply API Key": "Serply-API-Schlüssel", "Serpstack API Key": "Serpstack-API-Schlüssel", @@ -1078,11 +1078,11 @@ "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Legt die Anzahl der für die Berechnung verwendeten GPU-Geräte fest. Diese Option steuert, wie viele GPU-Geräte (falls verfügbar) zur Verarbeitung eingehender Anfragen verwendet werden. Eine Erhöhung dieses Wertes kann die Leistung für Modelle, die für GPU-Beschleunigung optimiert sind, erheblich verbessern, kann jedoch auch mehr Strom und GPU-Ressourcen verbrauchen.", "Set Voice": "Stimme festlegen", "Set whisper model": "Whisper-Modell festlegen", - "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets how far back for the model to look back to prevent repetition.": "", - "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.": "", - "Sets the size of the context window used to generate the next token.": "", + "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Legt einen flachen Bias gegen Tokens fest, die mindestens einmal erschienen sind. Ein höherer Wert (z.B. 1,5) bestraft Wiederholungen stärker, während ein niedrigerer Wert (z.B. 0,9) nachsichtiger ist. Bei 0 ist es deaktiviert.", + "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Legt einen skalierenden Bias gegen Tokens fest, um Wiederholungen basierend auf ihrer Häufigkeit zu bestrafen. Ein höherer Wert (z.B. 1,5) bestraft Wiederholungen stärker, während ein niedrigerer Wert (z.B. 0,9) nachsichtiger ist. Bei 0 ist es deaktiviert.", + "Sets how far back for the model to look back to prevent repetition.": "Legt fest, wie weit das Modell zurückblickt, um Wiederholungen zu vermeiden.", + "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.": "Legt den Zufallszahlengenerator-Seed für die Generierung fest. Das Festlegen auf eine bestimmte Zahl bewirkt, dass das Modell für denselben Prompt denselben Text generiert.", + "Sets the size of the context window used to generate the next token.": "Legt die Größe des Kontextfensters fest, das zur Generierung des nächsten Tokens verwendet wird.", "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.": "Legt die zu verwendenden Stoppsequenzen fest. Wenn dieses Muster erkannt wird, stoppt das LLM die Textgenerierung und gibt zurück. Mehrere Stoppmuster können festgelegt werden, indem mehrere separate Stopp-Parameter in einer Modelldatei angegeben werden.", "Settings": "Einstellungen", "Settings saved successfully!": "Einstellungen erfolgreich gespeichert!", @@ -1093,8 +1093,8 @@ "Show": "Anzeigen", "Show \"What's New\" modal on login": "\"Was gibt's Neues\"-Modal beim Anmelden anzeigen", "Show Admin Details in Account Pending Overlay": "Admin-Details im Account-Pending-Overlay anzeigen", - "Show All": "", - "Show Less": "", + "Show All": "Alle anzeigen", + "Show Less": "Weniger anzeigen", "Show Model": "Modell anzeigen", "Show shortcuts": "Verknüpfungen anzeigen", "Show your support!": "Zeigen Sie Ihre Unterstützung!", @@ -1107,8 +1107,8 @@ "Sign up to {{WEBUI_NAME}}": "Bei {{WEBUI_NAME}} registrieren", "Signing in to {{WEBUI_NAME}}": "Wird bei {{WEBUI_NAME}} angemeldet", "sk-1234": "sk-1234", - "Sougou Search API sID": "", - "Sougou Search API SK": "", + "Sougou Search API sID": "Sougou Search API sID", + "Sougou Search API SK": "Sougou Search API SK", "Source": "Quelle", "Speech Playback Speed": "Sprachwiedergabegeschwindigkeit", "Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}", @@ -1118,7 +1118,7 @@ "Stream Chat Response": "Chat-Antwort streamen", "STT Model": "STT-Modell", "STT Settings": "STT-Einstellungen", - "Stylized PDF Export": "", + "Stylized PDF Export": "Stilisierter PDF-Export", "Subtitle (e.g. about the Roman Empire)": "Untertitel (z. B. über das Römische Reich)", "Success": "Erfolg", "Successfully updated.": "Erfolgreich aktualisiert.", @@ -1129,17 +1129,17 @@ "System": "System", "System Instructions": "Systemanweisungen", "System Prompt": "System-Prompt", - "Tags": "", + "Tags": "Tags", "Tags Generation": "Tag-Generierung", "Tags Generation Prompt": "Prompt für Tag-Generierung", - "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail-Free Sampling wird verwendet, um den Einfluss weniger wahrscheinlicher Tokens auf die Ausgabe zu reduzieren. Ein höherer Wert (z.B. 2.0) reduziert den Einfluss stärker, während ein Wert von 1.0 diese Einstellung deaktiviert. (Standard: 1)", + "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Tail-Free Sampling wird verwendet, um den Einfluss weniger wahrscheinlicher Tokens auf die Ausgabe zu reduzieren. Ein höherer Wert (z. B. 2.0) reduziert den Einfluss stärker, während ein Wert von 1.0 diese Einstellung deaktiviert. (Standard: 1)", "Talk to model": "Zu einem Modell sprechen", "Tap to interrupt": "Zum Unterbrechen tippen", - "Task Model": "", + "Task Model": "Aufgabenmodell", "Tasks": "Aufgaben", "Tavily API Key": "Tavily-API-Schlüssel", - "Tavily Extract Depth": "", - "Tell us more:": "Erzähl uns mehr", + "Tavily Extract Depth": "Tavily Extraktionstiefe", + "Tell us more:": "Erzählen Sie uns mehr:", "Temperature": "Temperatur", "Template": "Vorlage", "Temporary Chat": "Temporäre Unterhaltung", @@ -1158,17 +1158,17 @@ "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Die maximale Dateigröße in MB. Wenn die Dateigröße dieses Limit überschreitet, wird die Datei nicht hochgeladen.", "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Die maximale Anzahl von Dateien, die gleichzeitig im Chat verwendet werden können. Wenn die Anzahl der Dateien dieses Limit überschreitet, werden die Dateien nicht hochgeladen.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.", - "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "", + "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "Die Temperatur des Modells. Eine Erhöhung der Temperatur führt zu kreativeren Antworten des Modells.", "Theme": "Design", "Thinking...": "Denke nach...", "This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Dieser Kanal wurde am {{createdAt}} erstellt. Dies ist der Beginn des {{channelName}} Kanals.", - "This chat won’t appear in history and your messages will not be saved.": "Diese Unterhaltung erscheint nicht in deinem Chat-Verlauf. Alle Nachrichten sind privat und werden nicht gespeichert.", + "This chat won’t appear in history and your messages will not be saved.": "Diese Unterhaltung erscheint nicht in Ihrem Chat-Verlauf. Alle Nachrichten sind privat und werden nicht gespeichert.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Chats sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion, sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.", - "This model is not publicly available. Please select another model.": "", - "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", - "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", + "This model is not publicly available. Please select another model.": "Dieses Modell ist nicht öffentlich verfügbar. Bitte wählen Sie ein anderes Modell aus.", + "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Diese Option steuert, wie viele Tokens beim Aktualisieren des Kontexts beibehalten werden. Wenn beispielsweise 2 eingestellt ist, werden die letzten 2 Tokens des Gesprächskontexts beibehalten. Das Beibehalten des Kontexts kann helfen, die Kontinuität eines Gesprächs zu wahren, kann aber die Fähigkeit, auf neue Themen zu reagieren, einschränken.", + "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Diese Option legt die maximale Anzahl von Tokens fest, die das Modell in seiner Antwort generieren kann. Eine Erhöhung dieses Limits ermöglicht längere Antworten, kann aber auch die Wahrscheinlichkeit erhöhen, dass unbrauchbare oder irrelevante Inhalte generiert werden.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Diese Option löscht alle vorhandenen Dateien in der Sammlung und ersetzt sie durch neu hochgeladene Dateien.", "This response was generated by \"{{model}}\"": "Diese Antwort wurde von \"{{model}}\" generiert", "This will delete": "Dies löscht", @@ -1201,7 +1201,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "Um Toolkits auszuwählen, fügen Sie sie zunächst dem Arbeitsbereich „Werkzeuge“ hinzu.", "Toast notifications for new updates": "Toast-Benachrichtigungen für neue Updates", "Today": "Heute", - "Toggle search": "", + "Toggle search": "Suche umschalten", "Toggle settings": "Einstellungen umschalten", "Toggle sidebar": "Seitenleiste umschalten", "Token": "Token", @@ -1213,17 +1213,17 @@ "Tool ID": "Werkzeug-ID", "Tool imported successfully": "Werkzeug erfolgreich importiert", "Tool Name": "Werkzeugname", - "Tool Servers": "", + "Tool Servers": "Werkzeugserver", "Tool updated successfully": "Werkzeug erfolgreich aktualisiert", "Tools": "Werkzeuge", "Tools Access": "Werkzeugzugriff", "Tools are a function calling system with arbitrary code execution": "Wekzeuge sind ein Funktionssystem mit beliebiger Codeausführung", "Tools Function Calling Prompt": "Prompt für Funktionssystemaufrufe", "Tools have a function calling system that allows arbitrary code execution.": "Werkzeuge verfügen über ein Funktionssystem, das die Ausführung beliebigen Codes ermöglicht.", - "Tools Public Sharing": "", - "Top K": "Top K", - "Top K Reranker": "", - "Top P": "Top P", + "Tools Public Sharing": "Öffentliche Freigabe von Werkzeugen", + "Top K": "Top-K", + "Top K Reranker": "Top-K Reranker", + "Top P": "Top-P", "Transformers": "Transformers", "Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?", "Trust Proxy Environment": "Proxy-Umgebung vertrauen", @@ -1252,7 +1252,7 @@ "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Upgrade auf einen lizenzierten Plan für erweiterte Funktionen wie individuelles Design, Branding und dedizierten Support.", "Upload": "Hochladen", "Upload a GGUF model": "GGUF-Model hochladen", - "Upload Audio": "", + "Upload Audio": "Audio hochladen", "Upload directory": "Upload-Verzeichnis", "Upload files": "Dateien hochladen", "Upload Files": "Datei(en) hochladen", @@ -1260,13 +1260,13 @@ "Upload Progress": "Hochladefortschritt", "URL": "URL", "URL Mode": "URL-Modus", - "Usage": "", + "Usage": "Nutzung", "Use '#' in the prompt input to load and include your knowledge.": "Nutzen Sie '#' in der Prompt-Eingabe, um Ihr Wissen zu laden und einzuschließen.", "Use Gravatar": "Gravatar verwenden", "Use groups to group your users and assign permissions.": "Nutzen Sie Gruppen, um Ihre Benutzer zu gruppieren und Berechtigungen zuzuweisen.", "Use Initials": "Initialen verwenden", - "Use no proxy to fetch page contents.": "", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", + "Use no proxy to fetch page contents.": "Keinen Proxy zum Abrufen von Seiteninhalten verwenden.", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Den durch die Umgebungsvariablen http_proxy und https_proxy festgelegten Proxy zum Abrufen von Seiteninhalten verwenden.", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "Benutzer", @@ -1288,19 +1288,19 @@ "Version": "Version", "Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} von {{totalVersions}}", "View Replies": "Antworten anzeigen", - "View Result from **{{NAME}}**": "", + "View Result from **{{NAME}}**": "Ergebnis von **{{NAME}}** anzeigen", "Visibility": "Sichtbarkeit", - "Vision": "", + "Vision": "Visuelle Wahrnehmung", "Voice": "Stimme", "Voice Input": "Spracheingabe", "Warning": "Warnung", "Warning:": "Warnung:", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Warnung: Wenn Sie dies aktivieren, können Benutzer beliebigen Code auf dem Server hochladen.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Warnung: Wenn Sie das Einbettungsmodell aktualisieren oder ändern, müssen Sie alle Dokumente erneut importieren.", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Warnung: Die Jupyter-Ausführung ermöglicht beliebige Codeausführung und birgt erhebliche Sicherheitsrisiken – gehen Sie mit äußerster Vorsicht vor.", "Web": "Web", "Web API": "Web-API", - "Web Loader Engine": "", + "Web Loader Engine": "Web-Lade-Engine", "Web Search": "Websuche", "Web Search Engine": "Suchmaschine", "Web Search in Chat": "Websuche im Chat", @@ -1308,7 +1308,7 @@ "Webhook URL": "Webhook URL", "WebUI Settings": "WebUI-Einstellungen", "WebUI URL": "WebUI-URL", - "WebUI will make requests to \"{{url}}\"": "", + "WebUI will make requests to \"{{url}}\"": "WebUI wird Anfragen an \"{{url}}\" senden", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI wird Anfragen an \"{{url}}/api/chat\" senden", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI wird Anfragen an \"{{url}}/chat/completions\" senden", "What are you trying to achieve?": "Was versuchen Sie zu erreichen?", @@ -1320,7 +1320,7 @@ "Why?": "Warum?", "Widescreen Mode": "Breitbildmodus", "Won": "Gewonnen", - "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "", + "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "Funktioniert zusammen mit Top-K. Ein höherer Wert (z. B. 0,95) führt zu vielfältigerem Text, während ein niedrigerer Wert (z. B. 0,5) fokussierteren und konservativeren Text erzeugt.", "Workspace": "Arbeitsbereich", "Workspace Permissions": "Arbeitsbereichsberechtigungen", "Write": "Schreiben", @@ -1328,17 +1328,17 @@ "Write a summary in 50 words that summarizes [topic or keyword].": "Schreibe eine kurze Zusammenfassung in 50 Wörtern, die [Thema oder Schlüsselwort] zusammenfasst.", "Write something...": "Schreiben Sie etwas...", "Write your model template content here": "Schreiben Sie hier Ihren Modellvorlageninhalt", - "Yacy Instance URL": "", - "Yacy Password": "", - "Yacy Username": "", + "Yacy Instance URL": "Yacy-Instanz-URL", + "Yacy Password": "Yacy-Passwort", + "Yacy Username": "Yacy-Benutzername", "Yesterday": "Gestern", "You": "Sie", - "You are currently using a trial license. Please contact support to upgrade your license.": "", + "You are currently using a trial license. Please contact support to upgrade your license.": "Sie benutzen zurzeit eine Testlizenz. Bitte kontaktieren Sie den Support für ein Lizenzupgrade.", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Sie können nur mit maximal {{maxCount}} Datei(en) gleichzeitig chatten.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Personalisieren Sie Interaktionen mit LLMs, indem Sie über die Schaltfläche \"Verwalten\" Erinnerungen hinzufügen.", "You cannot upload an empty file.": "Sie können keine leere Datei hochladen.", "You do not have permission to upload files.": "Sie haben keine Berechtigung zum Hochladen von Dateien.", - "You have no archived conversations.": "Du hast keine archivierten Chats.", + "You have no archived conversations.": "Sie haben keine archivierten Chats.", "You have shared this chat": "Sie haben diesen Chat geteilt", "You're a helpful assistant.": "Du bist ein hilfreicher Assistent.", "You're now logged in.": "Sie sind jetzt eingeloggt.", @@ -1346,5 +1346,5 @@ "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.": "Ihr gesamter Beitrag geht direkt an den Plugin-Entwickler; Open WebUI behält keinen Prozentsatz ein. Die gewählte Finanzierungsplattform kann jedoch eigene Gebühren haben.", "Youtube": "YouTube", "Youtube Language": "YouTube Sprache", - "Youtube Proxy URL": "" + "Youtube Proxy URL": "YouTube Proxy URL" } From 4b538047ddf9755b1f7b89132741b299a454110b Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Mon, 19 May 2025 19:35:08 +0200 Subject: [PATCH 006/144] various i18n fixes typos, incomplete sentences fixed, wrong translations, inconsistencies fixed --- src/lib/i18n/locales/de-DE/translation.json | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 8fe3a525a..1953341d6 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -14,7 +14,7 @@ "{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich", "*Prompt node ID(s) are required for image generation": "*Prompt-Node-ID(s) sind für die Bildgenerierung erforderlich", "A new version (v{{LATEST_VERSION}}) is now available.": "Eine neue Version (v{{LATEST_VERSION}}) ist jetzt verfügbar.", - "A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Chat-Titel oder Websuchanfragen generieren.", + "A task model is used when performing tasks such as generating titles for chats and web search queries": "Ein Aufgabenmodell wird verwendet, wenn Aufgaben wie das Generieren von Titeln für Chats und Websuchanfragen ausgeführt werden.", "a user": "ein Benutzer", "About": "Über", "Accept autocomplete generation / Jump to prompt variable": "Automatische Vervollständigung akzeptieren / Zur Prompt-Variable springen", @@ -52,7 +52,7 @@ "Admin": "Administrator", "Admin Panel": "Administration", "Admin Settings": "Administration", - "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratoren haben jederzeit Zugriff auf alle Werkzeuge. Benutzer können im Arbeitsbereich zugewiesen.", + "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratoren haben jederzeit Zugriff auf alle Werkzeuge; Benutzern müssen Werkzeuge pro Modell im Arbeitsbereich zugewiesen werden.", "Advanced Parameters": "Erweiterte Parameter", "Advanced Params": "Erweiterte Parameter", "All": "Alle", @@ -75,7 +75,7 @@ "Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen", "Allowed Endpoints": "Erlaubte Endpunkte", "Allowed File Extensions": "Erlaubte Dateitypen-Erweiterungen", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Erlaubte Dateitypen. Trenne mehrere Erweiterungen mit einem Beistrich. Leer lassen um alle Dateitypen zu erlauben.", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Erlaubte Dateierweiterungen für den Upload. Trennen Sie mehrere Erweiterungen mit Kommas. Leer lassen, um alle Dateitypen zu erlauben.", "Already have an account?": "Haben Sie bereits einen Account?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "Eine Alternative zu top_p, die darauf abzielt, ein ausgewogenes Verhältnis von Qualität und Vielfalt zu gewährleisten. Der Parameter p stellt die Mindestwahrscheinlichkeit dar, mit der ein Token berücksichtigt wird, relativ zur Wahrscheinlichkeit des wahrscheinlichsten Tokens. Wenn beispielsweise p = 0,05 ist und das wahrscheinlichste Token eine Wahrscheinlichkeit von 0,9 hat, werden Logits mit einem Wert kleiner als 0,045 herausgefiltert.", "Always": "Immer", @@ -197,10 +197,10 @@ "Click here to download user import template file.": "Klicken Sie hier, um die Vorlage für den Benutzerimport herunterzuladen.", "Click here to learn more about faster-whisper and see the available models.": "Klicken Sie hier, um mehr über faster-whisper zu erfahren und die verfügbaren Modelle zu sehen.", "Click here to see available models.": "Klicken Sie hier, um die verfügbaren Modelle anzuzeigen.", - "Click here to select": "Klicke Sie zum Auswählen hier", + "Click here to select": "Klicken Sie hier zum Auswählen.", "Click here to select a csv file.": "Klicken Sie zum Auswählen einer CSV-Datei hier.", "Click here to select a py file.": "Klicken Sie zum Auswählen einer py-Datei hier.", - "Click here to upload a workflow.json file.": "Klicken sie zum Hochladen einer workflow.json-Datei hier.", + "Click here to upload a workflow.json file.": "Klicken Sie hier, um eine workflow.json-Datei hochzuladen.", "click here.": "hier klicken.", "Click on the user role button to change a user's role.": "Klicken Sie auf die Benutzerrolle, um sie zu ändern.", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Schreibberechtigung für die Zwischenablage verweigert. Bitte überprüfen Sie Ihre Browsereinstellungen, um den erforderlichen Zugriff zu erlauben.", @@ -406,8 +406,8 @@ "Enable Code Execution": "Codeausführung aktivieren", "Enable Code Interpreter": "Code-Interpreter aktivieren", "Enable Community Sharing": "Community-Freigabe aktivieren", - "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.", - "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktiviere Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.", + "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktivieren Sie Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.", + "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktivieren Sie Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.", "Enable Message Rating": "Nachrichtenbewertung aktivieren", "Enable Mirostat sampling for controlling perplexity.": "Mirostat-Sampling zur Steuerung der Perplexität aktivieren.", "Enable New Sign Ups": "Registrierung erlauben", @@ -481,7 +481,7 @@ "Enter SerpApi API Key": "Geben Sie den SerpApi API-Schlüssel ein", "Enter SerpApi Engine": "SerpApi-Engine eingeben", "Enter Serper API Key": "Geben Sie den Serper-API-Schlüssel ein", - "Enter Serply API Key": "Geben Sie den", + "Enter Serply API Key": "Geben Sie den Serply API-Schlüssel ein", "Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein", "Enter server host": "Geben Sie den Server-Host ein", "Enter server label": "Geben Sie das Server-Label ein", @@ -562,7 +562,7 @@ "Failed to delete note": "Notiz konnte nicht gelöscht werden", "Failed to fetch models": "Fehler beim Abrufen der Modelle", "Failed to load file content.": "Fehler beim Laden des Dateiinhalts.", - "Failed to read clipboard contents": "Fehler beim Abruf der Zwischenablage", + "Failed to read clipboard contents": "Fehler beim Lesen des Inhalts der Zwischenablage.", "Failed to save connections": "Verbindungen konnten nicht gespeichert werden", "Failed to save models configuration": "Fehler beim Speichern der Modellkonfiguration", "Failed to update settings": "Fehler beim Aktualisieren der Einstellungen", @@ -618,7 +618,7 @@ "Gemini API Config": "Gemini API-Konfiguration", "Gemini API Key is required.": "Gemini API-Schlüssel ist erforderlich.", "General": "Allgemein", - "Generate": "Generiere", + "Generate": "Generieren", "Generate an image": "Bild erzeugen", "Generate Image": "Bild erzeugen", "Generate prompt pair": "Prompt-Paar generieren", @@ -682,7 +682,7 @@ "Info": "Info", "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Gesamten Inhalt als Kontext für umfassende Verarbeitung einfügen, dies wird für komplexe Abfragen empfohlen.", "Input commands": "Eingabebefehle", - "Install from Github URL": "Installiere von der Github-URL", + "Install from Github URL": "Von GitHub-URL installieren", "Instant Auto-Send After Voice Transcription": "Spracherkennung direkt absenden", "Integration": "Integration", "Interface": "Oberfläche", @@ -742,7 +742,7 @@ "Loading Kokoro.js...": "Lade Kokoro.js...", "Local": "Lokal", "Local Task Model": "Lokales Aufgabenmodell", - "Location access not allowed": "Standortzugriff nicht erlaub", + "Location access not allowed": "Standortzugriff nicht erlaubt", "Logit Bias": "", "Lost": "Verloren", "LTR": "LTR", @@ -903,8 +903,8 @@ "PDF document (.pdf)": "PDF-Dokument (.pdf)", "PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)", "pending": "ausstehend", - "Pending User Overlay Content": "Inhalt des Overlays für ausstehende Kontoaktivierung", - "Pending User Overlay Title": "Titel des Overlays für ausstehende Kontoaktivierung", + "Pending User Overlay Content": "Inhalt des Overlays 'Ausstehende Kontoaktivierung'", + "Pending User Overlay Title": "Titel des Overlays 'Ausstehende Kontoaktivierung'", "Permission denied when accessing media devices": "Zugriff auf Mediengeräte verweigert", "Permission denied when accessing microphone": "Zugriff auf das Mikrofon verweigert", "Permission denied when accessing microphone: {{error}}": "Zugriff auf das Mikrofon verweigert: {{error}}", @@ -1075,7 +1075,7 @@ "Set Scheduler": "Scheduler festlegen", "Set Steps": "Schrittgröße festlegen", "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Legen Sie die Anzahl der Schichten fest, die auf die GPU ausgelagert werden. Eine Erhöhung dieses Wertes kann die Leistung für Modelle, die für die GPU-Beschleunigung optimiert sind, erheblich verbessern, kann jedoch auch mehr Strom und GPU-Ressourcen verbrauchen.", - "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Legt die Anzahl der für die Berechnung verwendeten GPU-Geräte fest. Diese Option steuert, wie viele GPU-Geräte (falls verfügbar) zur Verarbeitung eingehender Anfragen verwendet werden. Eine Erhöhung dieses Wertes kann die Leistung für Modelle, die für GPU-Beschleunigung optimiert sind, erheblich verbessern, kann jedoch auch mehr Strom und GPU-Ressourcen verbrauchen.", + "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Legt die Anzahl der für die Berechnung verwendeten Worker-Threads fest. Diese Option steuert, wie viele Threads zur gleichzeitigen Verarbeitung eingehender Anfragen verwendet werden. Eine Erhöhung dieses Wertes kann die Leistung bei hoher Parallelität verbessern, verbraucht aber möglicherweise auch mehr CPU-Ressourcen.", "Set Voice": "Stimme festlegen", "Set whisper model": "Whisper-Modell festlegen", "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Legt einen flachen Bias gegen Tokens fest, die mindestens einmal erschienen sind. Ein höherer Wert (z.B. 1,5) bestraft Wiederholungen stärker, während ein niedrigerer Wert (z.B. 0,9) nachsichtiger ist. Bei 0 ist es deaktiviert.", @@ -1276,7 +1276,7 @@ "Username": "Benutzername", "Users": "Benutzer", "Using the default arena model with all models. Click the plus button to add custom models.": "Verwendung des Standard-Arena-Modells mit allen Modellen. Klicken Sie auf die Plus-Schaltfläche, um benutzerdefinierte Modelle hinzuzufügen.", - "Utilize": "Verwende", + "Utilize": "Verwenden", "Valid time units:": "Gültige Zeiteinheiten:", "Valves": "Valves", "Valves updated": "Valves aktualisiert", From 83ed2d06612768d749e89e27f0ccc329df1175d8 Mon Sep 17 00:00:00 2001 From: Silentoplayz <50341825+Silentoplayz@users.noreply.github.com> Date: Mon, 19 May 2025 17:12:36 -0400 Subject: [PATCH 007/144] chore: delete lightblub.svelte --- .../ContentRenderer/FloatingButtons.svelte | 2 +- .../Messages/Markdown/AlertRenderer.svelte | 2 +- src/lib/components/icons/LightBlub.svelte | 19 ------------------- 3 files changed, 2 insertions(+), 21 deletions(-) delete mode 100644 src/lib/components/icons/LightBlub.svelte diff --git a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte index 9286aaed0..98a07e94e 100644 --- a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte +++ b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte @@ -10,7 +10,7 @@ import { chatCompletion } from '$lib/apis/openai'; import ChatBubble from '$lib/components/icons/ChatBubble.svelte'; - import LightBlub from '$lib/components/icons/LightBlub.svelte'; + import LightBulb from '$lib/components/icons/LightBulb.svelte'; import Markdown from '../Messages/Markdown.svelte'; import Skeleton from '../Messages/Skeleton.svelte'; diff --git a/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte b/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte index caf1410b1..4537254e7 100644 --- a/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte +++ b/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte @@ -65,7 +65,7 @@ - - - - From 58b309149ac990cbf004a298971beb0b8a5b79e0 Mon Sep 17 00:00:00 2001 From: Silentoplayz <50341825+Silentoplayz@users.noreply.github.com> Date: Mon, 19 May 2025 17:21:43 -0400 Subject: [PATCH 008/144] chore: adjustment --- src/lib/components/chat/ContentRenderer/FloatingButtons.svelte | 2 +- src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte index 98a07e94e..a22cad5ed 100644 --- a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte +++ b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte @@ -256,7 +256,7 @@ explainHandler(); }} > - +
{$i18n.t('Explain')}
diff --git a/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte b/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte index 4537254e7..ae00acb60 100644 --- a/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte +++ b/src/lib/components/chat/Messages/Markdown/AlertRenderer.svelte @@ -24,7 +24,7 @@ TIP: { border: 'border-emerald-500', text: 'text-emerald-500', - icon: LightBlub + icon: LightBulb }, IMPORTANT: { border: 'border-purple-500', From ab9486603cc632c2115924871669865e3f9af7aa Mon Sep 17 00:00:00 2001 From: Silentoplayz <50341825+Silentoplayz@users.noreply.github.com> Date: Mon, 19 May 2025 22:42:15 -0400 Subject: [PATCH 009/144] chore: fix on-hover visual --- src/lib/components/workspace/Knowledge.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/workspace/Knowledge.svelte b/src/lib/components/workspace/Knowledge.svelte index b7c904fd8..6a5ea532a 100644 --- a/src/lib/components/workspace/Knowledge.svelte +++ b/src/lib/components/workspace/Knowledge.svelte @@ -147,7 +147,7 @@
{#each filteredItems as item}
{/if} + + {#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true} +
+
{$i18n.t('BM25 Weight')}
+
+ +
+
+ {/if} {/if}
diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 5516b6e1f..ea3308b6c 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -425,6 +425,7 @@ "Enter Application DN Password": "", "Enter Bing Search V7 Endpoint": "", "Enter Bing Search V7 Subscription Key": "", + "Enter BM25 Weight": "", "Enter Bocha Search API Key": "", "Enter Brave Search API Key": "", "Enter certificate path": "", From 308d8ac04a8e71485c4c89bc0da1acaab804b38d Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Tue, 20 May 2025 11:21:14 +0200 Subject: [PATCH 014/144] make bm25_weight a regular parameter of query_doc.. / get_sources_from_files functions --- backend/open_webui/retrieval/utils.py | 12 ++++++++---- backend/open_webui/routers/retrieval.py | 10 ++++++++++ backend/open_webui/utils/middleware.py | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index c083b9f67..70c3f4115 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -29,7 +29,6 @@ from open_webui.config import ( RAG_EMBEDDING_QUERY_PREFIX, RAG_EMBEDDING_CONTENT_PREFIX, RAG_EMBEDDING_PREFIX_FIELD_NAME, - RAG_BM25_WEIGHT, ) log = logging.getLogger(__name__) @@ -117,6 +116,7 @@ def query_doc_with_hybrid_search( reranking_function, k_reranker: int, r: float, + bm25_weight: float, ) -> dict: try: log.debug(f"query_doc_with_hybrid_search:doc {collection_name}") @@ -132,18 +132,18 @@ def query_doc_with_hybrid_search( top_k=k, ) - if RAG_BM25_WEIGHT <= 0: + if bm25_weight <= 0: ensemble_retriever = EnsembleRetriever( retrievers=[vector_search_retriever], weights=[1.] ) - elif RAG_BM25_WEIGHT >= 1: + elif bm25_weight >= 1: ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever], weights=[1.] ) else: ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_search_retriever], - weights=[RAG_BM25_WEIGHT, 1. - RAG_BM25_WEIGHT] + weights=[bm25_weight, 1. - bm25_weight] ) compressor = RerankCompressor( @@ -325,6 +325,7 @@ def query_collection_with_hybrid_search( reranking_function, k_reranker: int, r: float, + bm25_weight: float, ) -> dict: results = [] error = False @@ -358,6 +359,7 @@ def query_collection_with_hybrid_search( reranking_function=reranking_function, k_reranker=k_reranker, r=r, + bm25_weight=bm25_weight, ) return result, None except Exception as e: @@ -445,6 +447,7 @@ def get_sources_from_files( reranking_function, k_reranker, r, + bm25_weight, hybrid_search, full_context=False, ): @@ -562,6 +565,7 @@ def get_sources_from_files( reranking_function=reranking_function, k_reranker=k_reranker, r=r, + bm25_weight=bm25_weight, ) except Exception as e: log.debug( diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index cdd71196c..e31dba299 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1782,6 +1782,11 @@ def query_doc_handler( if form_data.r else request.app.state.config.RELEVANCE_THRESHOLD ), + bm25_weight=( + form_data.bm25_weight + if form_data.bm25_weight + else request.app.state.config.BM25_WEIGHT + ), user=user, ) else: @@ -1833,6 +1838,11 @@ def query_collection_handler( if form_data.r else request.app.state.config.RELEVANCE_THRESHOLD ), + bm25_weight=( + form_data.bm25_weight + if form_data.bm25_weight + else request.app.state.config.BM25_WEIGHT + ), ) else: return query_collection( diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index c9095f931..c0ce2f063 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -603,6 +603,7 @@ async def chat_completion_files_handler( reranking_function=request.app.state.rf, k_reranker=request.app.state.config.TOP_K_RERANKER, r=request.app.state.config.RELEVANCE_THRESHOLD, + bm25_weight=request.app.state.config.BM25_WEIGHT, hybrid_search=request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, full_context=request.app.state.config.RAG_FULL_CONTEXT, ), From b735042eccd911cdb4a1e57be1170de182e880f3 Mon Sep 17 00:00:00 2001 From: toriset Date: Tue, 20 May 2025 14:33:04 +0300 Subject: [PATCH 015/144] Fix alignment issues with Buttons in UI --- src/lib/components/chat/MessageInput.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index e1a5b1ea6..de438a88b 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1221,7 +1221,7 @@ {/if} @@ -1240,7 +1240,7 @@ > @@ -1259,7 +1259,7 @@ > @@ -1278,7 +1278,7 @@ > From 78befd5a2fb04233cb7a3a2d11e59a77acf243b2 Mon Sep 17 00:00:00 2001 From: tth37 Date: Tue, 20 May 2025 19:44:18 +0800 Subject: [PATCH 016/144] fix: Default web loader fail when `verify_ssl=False` --- backend/open_webui/retrieval/web/utils.py | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/open_webui/retrieval/web/utils.py b/backend/open_webui/retrieval/web/utils.py index b8ec538d3..5a90a86e0 100644 --- a/backend/open_webui/retrieval/web/utils.py +++ b/backend/open_webui/retrieval/web/utils.py @@ -517,7 +517,6 @@ class SafeWebBaseLoader(WebBaseLoader): async with session.get( url, **(self.requests_kwargs | kwargs), - ssl=AIOHTTP_CLIENT_SESSION_SSL, ) as response: if self.raise_for_status: response.raise_for_status() From 74ace200fead4fe407fce9868d0ba47bb3032add Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 May 2025 20:20:27 +0400 Subject: [PATCH 017/144] fix/refac: functions multi-replica issue --- backend/open_webui/functions.py | 7 ++----- backend/open_webui/routers/functions.py | 28 +++++++------------------ backend/open_webui/utils/chat.py | 7 ++----- backend/open_webui/utils/filter.py | 8 +++---- backend/open_webui/utils/models.py | 7 ++----- 5 files changed, 17 insertions(+), 40 deletions(-) diff --git a/backend/open_webui/functions.py b/backend/open_webui/functions.py index 340b60ba4..aa7dbccf9 100644 --- a/backend/open_webui/functions.py +++ b/backend/open_webui/functions.py @@ -54,11 +54,8 @@ log.setLevel(SRC_LOG_LEVELS["MAIN"]) def get_function_module_by_id(request: Request, pipe_id: str): # Check if function is already loaded - if pipe_id not in request.app.state.FUNCTIONS: - function_module, _, _ = load_function_module_by_id(pipe_id) - request.app.state.FUNCTIONS[pipe_id] = function_module - else: - function_module = request.app.state.FUNCTIONS[pipe_id] + function_module, _, _ = load_function_module_by_id(pipe_id) + request.app.state.FUNCTIONS[pipe_id] = function_module if hasattr(function_module, "valves") and hasattr(function_module, "Valves"): valves = Functions.get_function_valves_by_id(pipe_id) diff --git a/backend/open_webui/routers/functions.py b/backend/open_webui/routers/functions.py index 206610138..bfbedcbe3 100644 --- a/backend/open_webui/routers/functions.py +++ b/backend/open_webui/routers/functions.py @@ -262,11 +262,8 @@ async def get_function_valves_spec_by_id( ): function = Functions.get_function_by_id(id) if function: - if id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[id] - else: - function_module, function_type, frontmatter = load_function_module_by_id(id) - request.app.state.FUNCTIONS[id] = function_module + function_module, function_type, frontmatter = load_function_module_by_id(id) + request.app.state.FUNCTIONS[id] = function_module if hasattr(function_module, "Valves"): Valves = function_module.Valves @@ -290,11 +287,8 @@ async def update_function_valves_by_id( ): function = Functions.get_function_by_id(id) if function: - if id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[id] - else: - function_module, function_type, frontmatter = load_function_module_by_id(id) - request.app.state.FUNCTIONS[id] = function_module + function_module, function_type, frontmatter = load_function_module_by_id(id) + request.app.state.FUNCTIONS[id] = function_module if hasattr(function_module, "Valves"): Valves = function_module.Valves @@ -353,11 +347,8 @@ async def get_function_user_valves_spec_by_id( ): function = Functions.get_function_by_id(id) if function: - if id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[id] - else: - function_module, function_type, frontmatter = load_function_module_by_id(id) - request.app.state.FUNCTIONS[id] = function_module + function_module, function_type, frontmatter = load_function_module_by_id(id) + request.app.state.FUNCTIONS[id] = function_module if hasattr(function_module, "UserValves"): UserValves = function_module.UserValves @@ -377,11 +368,8 @@ async def update_function_user_valves_by_id( function = Functions.get_function_by_id(id) if function: - if id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[id] - else: - function_module, function_type, frontmatter = load_function_module_by_id(id) - request.app.state.FUNCTIONS[id] = function_module + function_module, function_type, frontmatter = load_function_module_by_id(id) + request.app.state.FUNCTIONS[id] = function_module if hasattr(function_module, "UserValves"): UserValves = function_module.UserValves diff --git a/backend/open_webui/utils/chat.py b/backend/open_webui/utils/chat.py index ce86811d4..d846e35b6 100644 --- a/backend/open_webui/utils/chat.py +++ b/backend/open_webui/utils/chat.py @@ -392,11 +392,8 @@ async def chat_action(request: Request, action_id: str, form_data: dict, user: A } ) - if action_id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[action_id] - else: - function_module, _, _ = load_function_module_by_id(action_id) - request.app.state.FUNCTIONS[action_id] = function_module + function_module, _, _ = load_function_module_by_id(action_id) + request.app.state.FUNCTIONS[action_id] = function_module if hasattr(function_module, "valves") and hasattr(function_module, "Valves"): valves = Functions.get_function_valves_by_id(action_id) diff --git a/backend/open_webui/utils/filter.py b/backend/open_webui/utils/filter.py index 02e504765..d6bd9b306 100644 --- a/backend/open_webui/utils/filter.py +++ b/backend/open_webui/utils/filter.py @@ -13,11 +13,9 @@ def get_function_module(request, function_id): """ Get the function module by its ID. """ - if function_id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[function_id] - else: - function_module, _, _ = load_function_module_by_id(function_id) - request.app.state.FUNCTIONS[function_id] = function_module + + function_module, _, _ = load_function_module_by_id(function_id) + request.app.state.FUNCTIONS[function_id] = function_module return function_module diff --git a/backend/open_webui/utils/models.py b/backend/open_webui/utils/models.py index 77ff0c932..684d2074e 100644 --- a/backend/open_webui/utils/models.py +++ b/backend/open_webui/utils/models.py @@ -239,11 +239,8 @@ async def get_all_models(request, user: UserModel = None): ] def get_function_module_by_id(function_id): - if function_id in request.app.state.FUNCTIONS: - function_module = request.app.state.FUNCTIONS[function_id] - else: - function_module, _, _ = load_function_module_by_id(function_id) - request.app.state.FUNCTIONS[function_id] = function_module + function_module, _, _ = load_function_module_by_id(function_id) + request.app.state.FUNCTIONS[function_id] = function_module return function_module for model in models: From 03eeb75bfe19e9efbdb6fe56c32741798a846c84 Mon Sep 17 00:00:00 2001 From: Silentoplayz <50341825+Silentoplayz@users.noreply.github.com> Date: Tue, 20 May 2025 12:21:32 -0400 Subject: [PATCH 018/144] feat: Add Clear button for Function and admin Model pages --- src/lib/components/admin/Functions.svelte | 14 ++++++++++++++ src/lib/components/admin/Settings/Models.svelte | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/lib/components/admin/Functions.svelte b/src/lib/components/admin/Functions.svelte index 9897f7f11..82dc6f438 100644 --- a/src/lib/components/admin/Functions.svelte +++ b/src/lib/components/admin/Functions.svelte @@ -32,6 +32,7 @@ import Search from '../icons/Search.svelte'; import Plus from '../icons/Plus.svelte'; import ChevronRight from '../icons/ChevronRight.svelte'; + import XMark from '../icons/XMark.svelte'; const i18n = getContext('i18n'); @@ -215,6 +216,19 @@ bind:value={query} placeholder={$i18n.t('Search Functions')} /> + + {#if query} +
+ +
+ {/if}
diff --git a/src/lib/components/admin/Settings/Models.svelte b/src/lib/components/admin/Settings/Models.svelte index 4966e9f6d..1287051ee 100644 --- a/src/lib/components/admin/Settings/Models.svelte +++ b/src/lib/components/admin/Settings/Models.svelte @@ -20,6 +20,7 @@ import Tooltip from '$lib/components/common/Tooltip.svelte'; import Switch from '$lib/components/common/Switch.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; + import XMark from '$lib/components/icons/XMark.svelte'; import ModelEditor from '$lib/components/workspace/Models/ModelEditor.svelte'; import { toast } from 'svelte-sonner'; @@ -271,6 +272,18 @@ bind:value={searchValue} placeholder={$i18n.t('Search Models')} /> + {#if searchValue} +
+ +
+ {/if}
From 8b80555adf7a5feb142afc6f7c69c8ddd094da2b Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 20 May 2025 20:03:21 +0200 Subject: [PATCH 019/144] fix attempt #1 --- src/lib/components/layout/Sidebar.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index 945c99e0d..2de1e3510 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -366,7 +366,7 @@ window.addEventListener('touchend', onTouchEnd); window.addEventListener('focus', onFocus); - window.addEventListener('blur-sm', onBlur); + window.addEventListener('blur', onBlur); const dropZone = document.getElementById('sidebar'); @@ -383,7 +383,7 @@ window.removeEventListener('touchend', onTouchEnd); window.removeEventListener('focus', onFocus); - window.removeEventListener('blur-sm', onBlur); + window.removeEventListener('blur', onBlur); const dropZone = document.getElementById('sidebar'); From 12896fb7281130831dbbd0a4044675d3c89e35a5 Mon Sep 17 00:00:00 2001 From: Bryan Bassett Date: Fri, 21 Feb 2025 07:56:57 -0500 Subject: [PATCH 020/144] use unquote_user in peewee 3.17.10 --- backend/open_webui/internal/wrappers.py | 4 ++-- backend/requirements.txt | 2 +- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/internal/wrappers.py b/backend/open_webui/internal/wrappers.py index ccc62b9a5..5cf352930 100644 --- a/backend/open_webui/internal/wrappers.py +++ b/backend/open_webui/internal/wrappers.py @@ -43,7 +43,7 @@ class ReconnectingPostgresqlDatabase(CustomReconnectMixin, PostgresqlDatabase): def register_connection(db_url): - db = connect(db_url, unquote_password=True) + db = connect(db_url, unquote_user=True, unquote_password=True) if isinstance(db, PostgresqlDatabase): # Enable autoconnect for SQLite databases, managed by Peewee db.autoconnect = True @@ -51,7 +51,7 @@ def register_connection(db_url): log.info("Connected to PostgreSQL database") # Get the connection details - connection = parse(db_url, unquote_password=True) + connection = parse(db_url, unquote_user=True, unquote_password=True) # Use our custom database class that supports reconnection db = ReconnectingPostgresqlDatabase(**connection) diff --git a/backend/requirements.txt b/backend/requirements.txt index 07dc09be6..bcb07258e 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -15,7 +15,7 @@ aiofiles sqlalchemy==2.0.38 alembic==1.14.0 -peewee==3.17.9 +peewee==3.18.1 peewee-migrate==1.12.2 psycopg2-binary==2.9.9 pgvector==0.4.0 diff --git a/pyproject.toml b/pyproject.toml index 01e6bd72c..4fb8d1ed5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ dependencies = [ "sqlalchemy==2.0.38", "alembic==1.14.0", - "peewee==3.17.9", + "peewee==3.18.1", "peewee-migrate==1.12.2", "psycopg2-binary==2.9.9", "pgvector==0.4.0", From 512345f40e56cbcd3b1efcc5fb8b9325f90557c2 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 May 2025 23:33:23 +0400 Subject: [PATCH 021/144] refac: chat transition --- src/lib/components/chat/Chat.svelte | 371 ++++++++++++++-------------- 1 file changed, 187 insertions(+), 184 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 77f2fd6a1..12775d3cb 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -88,6 +88,7 @@ import Placeholder from './Placeholder.svelte'; import NotificationToast from '../NotificationToast.svelte'; import Spinner from '../common/Spinner.svelte'; + import { fade } from 'svelte/transition'; export let chatIdProp = ''; @@ -2011,196 +2012,198 @@ id="chat-container" > {#if !loading} - {#if $settings?.backgroundImageUrl ?? null} -
- -
- {/if} - - - - + {#if $settings?.backgroundImageUrl ?? null} +
-
- {#if $settings?.landingPageMode === 'chat' || createMessagesList(history, history.currentId).length > 0} - - - - { - const model = $models.find((m) => m.id === e); - if (model) { - return [...a, model]; - } - return a; - }, [])} - {submitPrompt} - {stopResponse} - {showMessage} - {eventTarget} - /> - + { + const model = $models.find((m) => m.id === e); + if (model) { + return [...a, model]; + } + return a; + }, [])} + {submitPrompt} + {stopResponse} + {showMessage} + {eventTarget} + /> + +
{:else if loading}
From b78354100fcf9f856b5e4dd54c055387440b0203 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 May 2025 23:33:41 +0400 Subject: [PATCH 022/144] refac --- src/lib/components/chat/Chat.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 12775d3cb..cee724e30 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2012,7 +2012,7 @@ id="chat-container" > {#if !loading} -
+
{#if $settings?.backgroundImageUrl ?? null} -
+
{#if chatList} {#if chatList.length === 0} -
+
{$i18n.t('No results found')}
{/if} - {#each chatList as chat, idx} + {#each chatList as chat, idx (chat.id)} {#if idx === 0 || (idx > 0 && chat.time_range !== chatList[idx - 1].time_range)}
{$i18n.t(chat.time_range)}
{ selectedIdx = null; From e3e7eb96f6ee0336bed1bdc8ac066baab1297e1c Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 20 May 2025 23:55:11 +0400 Subject: [PATCH 024/144] refac --- backend/open_webui/utils/middleware.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index c9095f931..d77e4eded 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -975,6 +975,7 @@ async def process_chat_response( messages.append( { + **message, "role": message["role"], "content": content, } From ed0538e6432ec93470a063d87550cfc7b0bac298 Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Wed, 21 May 2025 07:34:07 +0800 Subject: [PATCH 025/144] i18n: update and improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 106 ++++++++++---------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index c17ba804b..a4fe945b7 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -4,7 +4,7 @@ "(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)", "(latest)": "(最新版)", - "(leave blank for to use commercial endpoint)": "", + "(leave blank for to use commercial endpoint)": "(留空以使用商业端点)", "(Ollama)": "(Ollama)", "{{ models }}": "{{ models }}", "{{COUNT}} Available Tools": "{{COUNT}} 个可用工具", @@ -74,8 +74,8 @@ "Allow User Location": "允许获取您的位置", "Allow Voice Interruption in Call": "允许通话中的打断语音", "Allowed Endpoints": "允许的 API 端点", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", + "Allowed File Extensions": "允许的文件扩展名", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "允许上传的文件扩展名。多个扩展名用逗号分隔。留空以允许所有文件类型。", "Already have an account?": "已经拥有账号了?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "top_p 的替代方法,旨在确保质量和多样性之间的平衡。参数 p 表示相对于最可能令牌的概率,一个令牌被考虑的最小概率。例如,当 p=0.05 且最可能的令牌概率为 0.9 时,概率值小于 0.045 的词元将被过滤掉。", "Always": "保持", @@ -95,7 +95,7 @@ "API Key created.": "API 密钥已创建。", "API Key Endpoint Restrictions": "API 密钥端点限制", "API keys": "API 密钥", - "API Version": "", + "API Version": "API 版本", "Application DN": "Application DN", "Application DN Password": "Application DN 密码", "applies to all users with the \"user\" role": "用于所有具有“用户”角色的用户", @@ -131,8 +131,8 @@ "Autocomplete Generation Input Max Length": "输入框内容自动补全输入最大长度", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api 鉴权字符串", - "AUTOMATIC1111 Base URL": "AUTOMATIC1111 请求地址", - "AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 请求地址。", + "AUTOMATIC1111 Base URL": "AUTOMATIC1111 URL", + "AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 URL。", "Available list": "可用列表", "Available Tools": "可用工具", "available!": "版本可用!", @@ -151,7 +151,7 @@ "Bing Search V7 Subscription Key": "Bing 搜索 V7 订阅密钥", "Bocha Search API Key": "Bocha Search API 密钥", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "为受限响应提升或惩罚特定标记。偏置值将被限制在 -100 到 100(包括两端)之间。(默认:无)", - "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "必须提供 Docling OCR Engine 和语言,或者都留空。", + "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "必需提供 Docling OCR Engine 和语言,或者都留空。", "Brave Search API Key": "Brave Search API 密钥", "By {{name}}": "由 {{name}} 提供", "Bypass Embedding and Retrieval": "绕过嵌入和检索", @@ -187,7 +187,7 @@ "Chunk Size": "块大小 (Chunk Size)", "Ciphers": "加密算法 (Ciphers)", "Citation": "引文", - "Citations": "", + "Citations": "引用", "Clear memory": "清除记忆", "Clear Memory": "清除记忆", "click here": "点击此处", @@ -221,8 +221,8 @@ "Color": "颜色", "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI API 密钥", - "ComfyUI Base URL": "ComfyUI 请求地址", - "ComfyUI Base URL is required.": "ComfyUI 请求地址为必需填写。", + "ComfyUI Base URL": "ComfyUI URL", + "ComfyUI Base URL is required.": "ComfyUI URL 必需填写。", "ComfyUI Workflow": "ComfyUI 工作流", "ComfyUI Workflow Nodes": "ComfyUI 工作流节点", "Command": "命令", @@ -237,7 +237,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "连接到您自己的兼容 OpenAPI 的外部工具服务器。", "Connection failed": "连接失败", "Connection successful": "连接成功", - "Connection Type": "", + "Connection Type": "连接类型", "Connections": "外部连接", "Connections saved successfully": "连接保存成功", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "约束推理模型的推理努力程度。仅适用于支持推理努力控制的特定提供商的推理模型。", @@ -321,8 +321,8 @@ "Deleted {{deleteModelTag}}": "已删除 {{deleteModelTag}}", "Deleted {{name}}": "已删除 {{name}}", "Deleted User": "已删除用户", - "Deployment names are required for Azure OpenAI": "", - "Describe Pictures in Documents": "", + "Deployment names are required for Azure OpenAI": "Azure OpenAI 需要部署名称", + "Describe Pictures in Documents": "描述文档中的图片", "Describe your knowledge base and objectives": "描述您的知识库和目标", "Description": "描述", "Detect Artifacts Automatically": "自动检测 Artifacts", @@ -380,11 +380,11 @@ "e.g. My Tools": "例如:我的工具", "e.g. my_filter": "例如:my_filter", "e.g. my_tools": "例如:my_tools", - "e.g. pdf, docx, txt": "", + "e.g. pdf, docx, txt": "例如:pdf,docx,txt", "e.g. Tools for performing various operations": "例如:用于执行各种操作的工具", - "e.g., 3, 4, 5 (leave blank for default)": "例如:3、4、5(留空为默认值)", - "e.g., en-US,ja-JP (leave blank for auto-detect)": "例如,'en-US,ja-JP'(留空以便自动检测)", - "e.g., westus (leave blank for eastus)": "", + "e.g., 3, 4, 5 (leave blank for default)": "例如:3,4,5(留空使用默认值)", + "e.g., en-US,ja-JP (leave blank for auto-detect)": "例如:en-US,ja-JP(留空则自动检测)", + "e.g., westus (leave blank for eastus)": "例如:westus(留空则默认为eastus)", "Edit": "编辑", "Edit Arena Model": "编辑竞技场模型", "Edit Channel": "编辑频道", @@ -412,14 +412,14 @@ "Enable Mirostat sampling for controlling perplexity.": "启用 Mirostat 采样以控制困惑度", "Enable New Sign Ups": "允许新用户注册", "Enabled": "启用", - "Endpoint URL": "", + "Endpoint URL": "端点 URL", "Enforce Temporary Chat": "强制临时聊天", - "Enhance": "增强", + "Enhance": "润色", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、电子邮箱、密码、角色。", "Enter {{role}} message here": "在此处输入 {{role}} 的对话内容", "Enter a detail about yourself for your LLMs to recall": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容", - "Enter a title for the pending user info overlay. Leave empty for default.": "", - "Enter a watermark for the response. Leave empty for none.": "", + "Enter a title for the pending user info overlay. Leave empty for default.": "输入用户待激活界面的标题。留空使用默认", + "Enter a watermark for the response. Leave empty for none.": "输入回复水印。留空则不添加", "Enter api auth string (e.g. username:password)": "输入 api 鉴权路径 (例如:用户名:密码)", "Enter Application DN": "输入 Application DN", "Enter Application DN Password": "输入 Application DN 密码", @@ -432,7 +432,7 @@ "Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)", "Enter Chunk Size": "输入块大小 (Chunk Size)", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "输入以逗号分隔的“token:bias_value”对(例如:5432:100, 413:-100)", - "Enter content for the pending user info overlay. Leave empty for default.": "", + "Enter content for the pending user info overlay. Leave empty for default.": "输入用户待激活界面的内容。留空使用默认", "Enter description": "输入简介描述", "Enter Docling OCR Engine": "输入 Docling OCR Engine", "Enter Docling OCR Language(s)": "输入 Docling OCR 语言", @@ -441,13 +441,13 @@ "Enter Document Intelligence Key": "输入 Document Intelligence 密钥", "Enter domains separated by commas (e.g., example.com,site.org)": "输入以逗号分隔的域名(例如:example.com,site.org)", "Enter Exa API Key": "输入 Exa API 密钥", - "Enter External Document Loader API Key": "", - "Enter External Document Loader URL": "", + "Enter External Document Loader API Key": "输入外部 Document Loader API 密钥", + "Enter External Document Loader URL": "输入外部 Document Loader URL", "Enter External Web Loader API Key": "输入外部 Web Loader API 密钥", "Enter External Web Loader URL": "输入外部 Web Loader URL", "Enter External Web Search API Key": "输入外部 Web Search API 密钥", "Enter External Web Search URL": "输入外部 Web Search URL", - "Enter Firecrawl API Base URL": "输入 Firecrawl API 请求地址", + "Enter Firecrawl API Base URL": "输入 Firecrawl API URL", "Enter Firecrawl API Key": "输入 Firecrawl API 密钥", "Enter Github Raw URL": "输入 Github Raw 地址", "Enter Google PSE API Key": "输入 Google PSE API 密钥", @@ -550,8 +550,8 @@ "Export to CSV": "导出到 CSV", "Export Tools": "导出工具", "External": "外部", - "External Document Loader URL required.": "", - "External Task Model": "", + "External Document Loader URL required.": "外部 Document Loader URL 必需填写", + "External Task Model": "外部任务模型", "External Web Loader API Key": "外部 Web Loader API 密钥", "External Web Loader URL": "外部 Web Loader API URL", "External Web Search API Key": "外部 Web Search API 密钥", @@ -580,14 +580,14 @@ "File not found.": "文件未找到。", "File removed successfully.": "文件成功删除", "File size should not exceed {{maxSize}} MB.": "文件大小不应超过 {{maxSize}} MB。", - "File Upload": "", - "File uploaded successfully": "文件上传成功。", + "File Upload": "文件上传", + "File uploaded successfully": "文件上传成功", "Files": "文件", "Filter is now globally disabled": "过滤器已全局禁用", "Filter is now globally enabled": "过滤器已全局启用", "Filters": "过滤器", "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "检测到指纹伪造:无法使用姓名缩写作为头像。默认使用默认个人形象。", - "Firecrawl API Base URL": "Firecrawl API 请求地址", + "Firecrawl API Base URL": "Firecrawl API URL", "Firecrawl API Key": "Firecrawl API 密钥", "Fluidly stream large external response chunks": "流畅地传输外部大型响应块数据", "Focus chat input": "聚焦对话输入", @@ -646,7 +646,7 @@ "Hex Color - Leave empty for default color": "十六进制颜色代码 - 留空使用默认颜色", "Hide": "隐藏", "Hide Model": "隐藏模型", - "High Contrast Mode": "", + "High Contrast Mode": "高对比度模式", "Home": "主页", "Host": "主机", "How can I help you today?": "有什么我能帮您的吗?", @@ -727,7 +727,7 @@ "Leaderboard": "排行榜", "Learn more about OpenAPI tool servers.": "进一步了解 OpenAPI 工具服务器。", "Leave empty for unlimited": "留空表示无限制", - "Leave empty to include all models from \"{{url}}\" endpoint": "", + "Leave empty to include all models from \"{{url}}\" endpoint": "留空以包含来自 \"{{url}}\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "留空以包含来自 \"{{url}}/api/tags\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/models\" endpoint": "留空以包含来自 \"{{url}}/models\" 端点的所有模型", "Leave empty to include all models or select specific models": "留空表示包含所有模型或请选择模型", @@ -741,7 +741,7 @@ "Loader": "加载器", "Loading Kokoro.js...": "载入 Kokoro.js...", "Local": "本地", - "Local Task Model": "", + "Local Task Model": "本地任务模型", "Location access not allowed": "不允许访问位置信息", "Logit Bias": "Logit 偏置", "Lost": "落败", @@ -791,11 +791,11 @@ "Model {{name}} is now {{status}}": "模型 {{name}} 现在是 {{status}}", "Model {{name}} is now hidden": "模型 {{name}} 现已隐藏", "Model {{name}} is now visible": "模型 {{name}} 现已可见", - "Model accepts file inputs": "", - "Model accepts image inputs": "模型接受图像输入", - "Model can execute code and perform calculations": "", - "Model can generate images based on text prompts": "", - "Model can search the web for information": "", + "Model accepts file inputs": "模型支持文件输入", + "Model accepts image inputs": "模型支持图像输入", + "Model can execute code and perform calculations": "模型可执行代码并进行计算", + "Model can generate images based on text prompts": "模型可根据文本提示生成图像", + "Model can search the web for information": "模型可在网络上搜索信息", "Model created successfully!": "模型创建成功!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "检测到模型文件系统路径,无法继续进行。更新操作需要提供模型简称。", "Model Filtering": "模型白名单", @@ -806,7 +806,7 @@ "Model Params": "模型参数", "Model Permissions": "模型权限", "Model updated successfully": "模型更新成功", - "Model(s) do not support file upload": "", + "Model(s) do not support file upload": "模型不支持文件上传", "Modelfile Content": "模型文件内容", "Models": "模型", "Models Access": "访问模型列表", @@ -903,8 +903,8 @@ "PDF document (.pdf)": "PDF 文档 (.pdf)", "PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)", "pending": "待激活", - "Pending User Overlay Content": "", - "Pending User Overlay Title": "", + "Pending User Overlay Content": "用户待激活界面内容", + "Pending User Overlay Title": "用户待激活界面标题", "Permission denied when accessing media devices": "申请媒体设备权限被拒绝", "Permission denied when accessing microphone": "申请麦克风权限被拒绝", "Permission denied when accessing microphone: {{error}}": "申请麦克风权限被拒绝:{{error}}", @@ -938,7 +938,7 @@ "Prefix ID": "Prefix ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Prefix ID 用于通过为模型 ID 添加前缀来避免与其他连接发生冲突 - 留空则禁用此功能", "Presence Penalty": "重复惩罚 (Presence Penalty)", - "Preview": "", + "Preview": "预览", "Previous 30 days": "过去 30 天", "Previous 7 days": "过去 7 天", "Private": "私有", @@ -984,8 +984,8 @@ "Repeat Penalty (Ollama)": "重复惩罚 (Ollama)", "Reply in Thread": "在主题中回复", "Request Mode": "请求模式", - "Reranking Engine": "", - "Reranking Model": "重排模型", + "Reranking Engine": "重排序引擎", + "Reranking Model": "重排序模型", "Reset": "重置", "Reset All Models": "重置所有模型", "Reset Upload Directory": "重置上传目录", @@ -993,7 +993,7 @@ "Reset view": "重置视图", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "无法激活回复时发送通知。请检查浏览器设置,并授予必要的访问权限。", "Response splitting": "拆分回复", - "Response Watermark": "", + "Response Watermark": "回复水印", "Result": "结果", "Retrieval": "检索", "Retrieval Query Generation": "检索查询生成", @@ -1093,8 +1093,8 @@ "Show": "显示", "Show \"What's New\" modal on login": "在登录时显示“更新内容”弹窗", "Show Admin Details in Account Pending Overlay": "在用户待激活界面中显示管理员邮箱等详细信息", - "Show All": "", - "Show Less": "", + "Show All": "显示全部", + "Show Less": "收起", "Show Model": "显示模型", "Show shortcuts": "显示快捷方式", "Show your support!": "表达你的支持!", @@ -1118,7 +1118,7 @@ "Stream Chat Response": "以流式返回对话响应", "STT Model": "语音转文本模型", "STT Settings": "语音转文本设置", - "Stylized PDF Export": "", + "Stylized PDF Export": "风格化 PDF 导出", "Subtitle (e.g. about the Roman Empire)": "副标题(例如:关于罗马帝国的副标题)", "Success": "成功", "Successfully updated.": "成功更新。", @@ -1135,7 +1135,7 @@ "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "无尾采样用于减少输出中出现概率较小的 Token 的影响。较高的值(例如 2.0)将进一步减少影响,而值 1.0 则禁用此设置。", "Talk to model": "与模型交谈", "Tap to interrupt": "点击以中断", - "Task Model": "", + "Task Model": "任务模型", "Tasks": "任务", "Tavily API Key": "Tavily API 密钥", "Tavily Extract Depth": "Tavily 提取深度", @@ -1166,7 +1166,7 @@ "This chat won’t appear in history and your messages will not be saved.": "此聊天不会出现在历史记录中,且您的消息不会被保存。", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "这将确保您的宝贵对话被安全地保存到后台数据库中。感谢!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "这是一个实验功能,可能不会如预期那样工作,而且可能随时发生变化。", - "This model is not publicly available. Please select another model.": "", + "This model is not publicly available. Please select another model.": "此模型未公开。请选择其他模型", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "此选项控制刷新上下文时保留多少 Token。例如,如果设置为 2,则将保留对话上下文的最后 2 个 Token。保留上下文有助于保持对话的连续性,但可能会降低响应新主题的能力。", "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "此项用于设置模型在其响应中可以生成的最大 Token 数。增加此限制可让模型提供更长的答案,但也可能增加生成无用或不相关内容的可能性。", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "此选项将会删除文件集中所有文件,并用新上传的文件替换。", @@ -1201,7 +1201,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "要在这里选择工具包,请先将其添加到工作空间中的“工具”。", "Toast notifications for new updates": "更新后弹窗提示更新内容", "Today": "今天", - "Toggle search": "", + "Toggle search": "切换搜索", "Toggle settings": "切换设置", "Toggle sidebar": "切换侧边栏", "Token": "Token", @@ -1260,7 +1260,7 @@ "Upload Progress": "上传进度", "URL": "URL", "URL Mode": "URL 模式", - "Usage": "", + "Usage": "用量", "Use '#' in the prompt input to load and include your knowledge.": "在输入框中输入 '#' 号来加载你需要的知识库内容。", "Use Gravatar": "使用来自 Gravatar 的头像", "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限。", @@ -1290,7 +1290,7 @@ "View Replies": "查看回复", "View Result from **{{NAME}}**": "查看来自 **{{NAME}}** 的结果", "Visibility": "可见性", - "Vision": "", + "Vision": "视觉", "Voice": "语音", "Voice Input": "语音输入", "Warning": "警告", From 9201fd46528b2605520ae2037beb6a4f4b4e1b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Link=20=5B=D0=A1=D0=B2=D1=8F=D0=B7=D0=BD=D0=BE=D0=B9=5D?= Date: Wed, 21 May 2025 14:48:57 +0300 Subject: [PATCH 026/144] [i18n] Russian locale update --- src/lib/i18n/locales/ru-RU/translation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index db24d1021..1ab8af25a 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -108,7 +108,7 @@ "Are you sure you want to delete this channel?": "Вы уверены, что хотите удалить этот канал?", "Are you sure you want to delete this message?": "Вы уверены, что хотите удалить это сообщение?", "Are you sure you want to unarchive all archived chats?": "Вы уверены, что хотите разархивировать все заархивированные чаты?", - "Are you sure you want to update this user's role to **{{ROLE}}**?": "", + "Are you sure you want to update this user's role to **{{ROLE}}**?": "Вы уверены, что хотите изменить роль этого пользователя на **{{ROLE}}**?", "Are you sure?": "Вы уверены?", "Arena Models": "Арена моделей", "Artifacts": "Артефакты", @@ -412,7 +412,7 @@ "Enable Mirostat sampling for controlling perplexity.": "Включите выборку Mirostat для контроля путаницы.", "Enable New Sign Ups": "Разрешить новые регистрации", "Enabled": "Включено", - "Endpoint URL": "", + "Endpoint URL": "URL-адрес конечной точки", "Enforce Temporary Chat": "Принудительный временный чат", "Enhance": "Улучшить", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Убедитесь, что ваш CSV-файл включает в себя 4 столбца в следующем порядке: Имя, Электронная почта, Пароль, Роль.", @@ -680,7 +680,7 @@ "Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui", "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Влияет на то, насколько быстро алгоритм реагирует на обратную связь из сгенерированного текста. Более низкая скорость обучения приведет к более медленной корректировке, в то время как более высокая скорость обучения сделает алгоритм более отзывчивым.", "Info": "Информация", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Вводите весь контент в качестве контекста для комплексной обработки, это рекомендуется для сложных запросов.", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Использовать весь контент в качестве контекста для комплексной обработки, это рекомендуется для сложных запросов.", "Input commands": "Введите команды", "Install from Github URL": "Установка с URL-адреса Github", "Instant Auto-Send After Voice Transcription": "Мгновенная автоматическая отправка после расшифровки голоса", From bd40cceb2d3fd555744c3d727791f8647bc3eafa Mon Sep 17 00:00:00 2001 From: lilosti <60880318+lilosti@users.noreply.github.com> Date: Wed, 21 May 2025 14:52:33 +0200 Subject: [PATCH 027/144] Updated danish translations --- src/lib/i18n/locales/da-DK/translation.json | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index a9b04b7fa..da7463832 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -7,9 +7,9 @@ "(leave blank for to use commercial endpoint)": "", "(Ollama)": "(Ollama)", "{{ models }}": "{{ modeller }}", - "{{COUNT}} Available Tools": "{{COUNT}} Tilgængelige Værktøj", + "{{COUNT}} Available Tools": "{{COUNT}} Tilgængelige værktøjer", "{{COUNT}} hidden lines": "{{COUNT}} skjulte linjer", - "{{COUNT}} Replies": "{{COUNT}} Svar", + "{{COUNT}} Replies": "{{COUNT}} svar", "{{user}}'s Chats": "{{user}}s chats", "{{webUIName}} Backend Required": "{{webUIName}} Backend kræves", "*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) er påkrævet for at kunne generere billeder", @@ -29,10 +29,10 @@ "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktiver denne kommando ved at skrive \"/{{COMMAND}}\" til chat input.", "Active Users": "Aktive brugere", "Add": "Tilføj", - "Add a model ID": "Tilføj en model-ID", + "Add a model ID": "Tilføj et model-ID", "Add a short description about what this model does": "En kort beskrivelse af hvad denne model gør", "Add a tag": "Tilføj et tag", - "Add Arena Model": "Tilføj Area Model", + "Add Arena Model": "Tilføj Arena Model", "Add Connection": "Tilføj forbindelser", "Add Content": "Tilføj indhold", "Add content here": "Tilføj indhold her", @@ -70,18 +70,18 @@ "Allow non-local voices": "Tillad ikke-lokale stemmer", "Allow Speech to Text": "Tillad tale til tekst", "Allow Temporary Chat": "Tillad midlertidig chat", - "Allow Text to Speech": "Tillad tekst til take", + "Allow Text to Speech": "Tillad tekst til tale", "Allow User Location": "Tillad bruger-lokation", "Allow Voice Interruption in Call": "Tillad afbrydelser i stemme i opkald", "Allowed Endpoints": "Tilladte endpoints", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", + "Allowed File Extensions": "Tilladte filtypenavne", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Filtypenavne tilladte til upload. Adskil flere filtypenavne med komma. Lad den være tom for alle filtypenavne", "Already have an account?": "Har du allerede en profil?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "", "Always": "Altid", "Always Collapse Code Blocks": "Altid kollapsere kodeblokke", "Always Expand Details": "Altid udvide detaljer", - "Always Play Notification Sound": "", + "Always Play Notification Sound": "Afspil altid notifikationslyde", "Amazing": "Fantastisk", "an assistant": "en assistent", "Analyzed": "Analyseret", @@ -161,8 +161,8 @@ "Camera": "Kamera", "Cancel": "Afbryd", "Capabilities": "Funktioner", - "Capture": "Indfang", - "Capture Audio": "", + "Capture": "Tag billede eller screendump", + "Capture Audio": "Optag lyd", "Certificate Path": "Certifikat sti", "Change Password": "Skift password", "Channel Name": "Kanalnavn", @@ -187,7 +187,7 @@ "Chunk Size": "Chunk størrelse", "Ciphers": "Ciphers", "Citation": "Citat", - "Citations": "", + "Citations": "Citater", "Clear memory": "Slet hukommelse", "Clear Memory": "Slet hukommelse", "click here": "klik her", @@ -1241,7 +1241,7 @@ "Unpin": "Frigør", "Unravel secrets": "Afslør hemmeligheder", "Untagged": "Uden mærker", - "Untitled": "", + "Untitled": "Unavngivet", "Update": "Opdater", "Update and Copy Link": "Opdater og kopier link", "Update for the latest features and improvements.": "Opdater for at få de nyeste funktioner og forbedringer.", From ff46fa5b33382839af9b5946850997df2eb46776 Mon Sep 17 00:00:00 2001 From: Vombit Date: Wed, 21 May 2025 21:15:42 +0500 Subject: [PATCH 028/144] fix: fixed a typo in the translation --- src/lib/i18n/locales/ru-RU/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 4b988bb13..270600fb2 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -189,7 +189,7 @@ "Citation": "Цитирование", "Citations": "", "Clear memory": "Очистить воспоминания", - "Clear Memory": "Очисить память", + "Clear Memory": "Очистить память", "click here": "кликните сюда", "Click here for filter guides.": "Нажмите здесь, чтобы просмотреть руководства по фильтрам.", "Click here for help.": "Нажмите здесь для получения помощи.", @@ -655,7 +655,7 @@ "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.": "Я подтверждаю, что прочитал и осознаю последствия своих действий. Я осознаю риски, связанные с выполнением произвольного кода, и я проверил достоверность источника.", "ID": "", "iframe Sandbox Allow Forms": "Позволять формы для iframe Sandbox", - "iframe Sandbox Allow Same Origin": "Позводять одно и то же происхождение для iframe Sandbox", + "iframe Sandbox Allow Same Origin": "Позволять одно и то же происхождение для iframe Sandbox", "Ignite curiosity": "Разожгите любопытство", "Image": "Изображение", "Image Compression": "Сжатие изображения", From 86e24bb4aa806f9b626081eb42e1e8ec65ce58c5 Mon Sep 17 00:00:00 2001 From: PVBLIC Foundation Date: Wed, 21 May 2025 15:28:42 -0700 Subject: [PATCH 029/144] Update pinecone.py I've improved the pinecone.py file by: Updated from the deprecated PineconeGRPC client to the newer Pinecone client Modified the client initialization code to match the new API requirements Added better response handling with getattr() to safely access attributes from response objects Removed the streaming_upsert method which is not available in the newer client Added safer attribute access with fallbacks throughout the code Updated the close method to reflect that the newer client doesn't need explicit closing These changes ensure the code is compatible with the latest Pinecone Python SDK and will be more robust against future changes. The key improvement is migrating away from the deprecated gRPC client which will eventually stop working. --- .../retrieval/vector/dbs/pinecone.py | 65 ++++++------------- 1 file changed, 20 insertions(+), 45 deletions(-) diff --git a/backend/open_webui/retrieval/vector/dbs/pinecone.py b/backend/open_webui/retrieval/vector/dbs/pinecone.py index c921089b6..9f8abf460 100644 --- a/backend/open_webui/retrieval/vector/dbs/pinecone.py +++ b/backend/open_webui/retrieval/vector/dbs/pinecone.py @@ -1,13 +1,12 @@ from typing import Optional, List, Dict, Any, Union import logging import time # for measuring elapsed time -from pinecone import ServerlessSpec +from pinecone import Pinecone, ServerlessSpec import asyncio # for async upserts import functools # for partial binding in async tasks import concurrent.futures # for parallel batch upserts -from pinecone.grpc import PineconeGRPC # use gRPC client for faster upserts from open_webui.retrieval.vector.main import ( VectorDBBase, @@ -47,10 +46,8 @@ class PineconeClient(VectorDBBase): self.metric = PINECONE_METRIC self.cloud = PINECONE_CLOUD - # Initialize Pinecone gRPC client for improved performance - self.client = PineconeGRPC( - api_key=self.api_key, environment=self.environment, cloud=self.cloud - ) + # Initialize Pinecone client for improved performance + self.client = Pinecone(api_key=self.api_key) # Persistent executor for batch operations self._executor = concurrent.futures.ThreadPoolExecutor(max_workers=5) @@ -147,8 +144,8 @@ class PineconeClient(VectorDBBase): metadatas = [] for match in matches: - metadata = match.get("metadata", {}) - ids.append(match["id"]) + metadata = getattr(match, "metadata", {}) or {} + ids.append(match.id if hasattr(match, "id") else match["id"]) documents.append(metadata.get("text", "")) metadatas.append(metadata) @@ -174,7 +171,8 @@ class PineconeClient(VectorDBBase): filter={"collection_name": collection_name_with_prefix}, include_metadata=False, ) - return len(response.matches) > 0 + matches = getattr(response, "matches", []) or [] + return len(matches) > 0 except Exception as e: log.exception( f"Error checking collection '{collection_name_with_prefix}': {e}" @@ -321,32 +319,6 @@ class PineconeClient(VectorDBBase): f"Successfully async upserted {len(points)} vectors in batches into '{collection_name_with_prefix}'" ) - def streaming_upsert(self, collection_name: str, items: List[VectorItem]) -> None: - """Perform a streaming upsert over gRPC for performance testing.""" - if not items: - log.warning("No items to upsert via streaming") - return - - collection_name_with_prefix = self._get_collection_name_with_prefix( - collection_name - ) - points = self._create_points(items, collection_name_with_prefix) - - # Open a streaming upsert channel - stream = self.index.streaming_upsert() - try: - for point in points: - # send each point over the stream - stream.send(point) - # close the stream to finalize - stream.close() - log.info( - f"Successfully streamed upsert of {len(points)} vectors into '{collection_name_with_prefix}'" - ) - except Exception as e: - log.error(f"Error during streaming upsert: {e}") - raise - def search( self, collection_name: str, vectors: List[List[Union[float, int]]], limit: int ) -> Optional[SearchResult]: @@ -374,7 +346,8 @@ class PineconeClient(VectorDBBase): filter={"collection_name": collection_name_with_prefix}, ) - if not query_response.matches: + matches = getattr(query_response, "matches", []) or [] + if not matches: # Return empty result if no matches return SearchResult( ids=[[]], @@ -384,13 +357,13 @@ class PineconeClient(VectorDBBase): ) # Convert to GetResult format - get_result = self._result_to_get_result(query_response.matches) + get_result = self._result_to_get_result(matches) # Calculate normalized distances based on metric distances = [ [ - self._normalize_distance(match.score) - for match in query_response.matches + self._normalize_distance(getattr(match, "score", 0.0)) + for match in matches ] ] @@ -432,7 +405,8 @@ class PineconeClient(VectorDBBase): include_metadata=True, ) - return self._result_to_get_result(query_response.matches) + matches = getattr(query_response, "matches", []) or [] + return self._result_to_get_result(matches) except Exception as e: log.error(f"Error querying collection '{collection_name}': {e}") @@ -456,7 +430,8 @@ class PineconeClient(VectorDBBase): filter={"collection_name": collection_name_with_prefix}, ) - return self._result_to_get_result(query_response.matches) + matches = getattr(query_response, "matches", []) or [] + return self._result_to_get_result(matches) except Exception as e: log.error(f"Error getting collection '{collection_name}': {e}") @@ -516,12 +491,12 @@ class PineconeClient(VectorDBBase): raise def close(self): - """Shut down the gRPC channel and thread pool.""" + """Shut down resources.""" try: - self.client.close() - log.info("Pinecone gRPC channel closed.") + # The new Pinecone client doesn't need explicit closing + pass except Exception as e: - log.warning(f"Failed to close Pinecone gRPC channel: {e}") + log.warning(f"Failed to clean up Pinecone resources: {e}") self._executor.shutdown(wait=True) def __enter__(self): From 558b2b101614e8cff35a82f03f5fdfdd2c51377d Mon Sep 17 00:00:00 2001 From: Silentoplayz <50341825+Silentoplayz@users.noreply.github.com> Date: Wed, 21 May 2025 20:41:19 -0400 Subject: [PATCH 030/144] Update General.svelte --- src/lib/components/admin/Settings/General.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte index 85f21824f..df79249b0 100644 --- a/src/lib/components/admin/Settings/General.svelte +++ b/src/lib/components/admin/Settings/General.svelte @@ -84,7 +84,7 @@ if (res) { saveHandler(); } else { - toast.error(i18n.t('Failed to update settings')); + toast.error($i18n.t('Failed to update settings')); } }; From dd6124a84f48b6b0c376576ccfcd2c6989fd5a85 Mon Sep 17 00:00:00 2001 From: U8F69 Date: Thu, 22 May 2025 11:03:43 +0800 Subject: [PATCH 031/144] fix(auth): fix invalid password use in auth --- backend/open_webui/models/auths.py | 8 ++++++-- backend/open_webui/retrieval/web/searchapi.py | 4 +++- backend/open_webui/retrieval/web/serpapi.py | 4 +++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/models/auths.py b/backend/open_webui/models/auths.py index f07c36c73..86eec77e9 100644 --- a/backend/open_webui/models/auths.py +++ b/backend/open_webui/models/auths.py @@ -129,12 +129,16 @@ class AuthsTable: def authenticate_user(self, email: str, password: str) -> Optional[UserModel]: log.info(f"authenticate_user: {email}") + + user = Users.get_user_by_email(email) + if not user: + return None + try: with get_db() as db: - auth = db.query(Auth).filter_by(email=email, active=True).first() + auth = db.query(Auth).filter_by(id=user.id, active=True).first() if auth: if verify_password(password, auth.password): - user = Users.get_user_by_id(auth.id) return user else: return None diff --git a/backend/open_webui/retrieval/web/searchapi.py b/backend/open_webui/retrieval/web/searchapi.py index f3fbded8e..d7704638c 100644 --- a/backend/open_webui/retrieval/web/searchapi.py +++ b/backend/open_webui/retrieval/web/searchapi.py @@ -42,7 +42,9 @@ def search_searchapi( results = get_filtered_results(results, filter_list) return [ SearchResult( - link=result["link"], title=result.get("title"), snippet=result.get("snippet") + link=result["link"], + title=result.get("title"), + snippet=result.get("snippet"), ) for result in results[:count] ] diff --git a/backend/open_webui/retrieval/web/serpapi.py b/backend/open_webui/retrieval/web/serpapi.py index 7daa5f234..8762210bf 100644 --- a/backend/open_webui/retrieval/web/serpapi.py +++ b/backend/open_webui/retrieval/web/serpapi.py @@ -42,7 +42,9 @@ def search_serpapi( results = get_filtered_results(results, filter_list) return [ SearchResult( - link=result["link"], title=result.get("title"), snippet=result.get("snippet") + link=result["link"], + title=result.get("title"), + snippet=result.get("snippet"), ) for result in results[:count] ] From 787987d2f03ceb2b7de2da8a8cbc12c30a11ce72 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 22 May 2025 12:41:00 +0400 Subject: [PATCH 032/144] refac/fix: optional tool param type --- backend/open_webui/utils/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index f0b37b605..481e1e6e6 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -160,7 +160,7 @@ def get_tools( # TODO: Fix hack for OpenAI API # Some times breaks OpenAI but others don't. Leaving the comment for val in spec.get("parameters", {}).get("properties", {}).values(): - if val["type"] == "str": + if val.get("type") == "str": val["type"] = "string" # Remove internal reserved parameters (e.g. __id__, __user__) From 7489bc612620407396ba3dd2c6e87a91de48e2b5 Mon Sep 17 00:00:00 2001 From: Zyfax Date: Thu, 22 May 2025 11:07:46 +0200 Subject: [PATCH 033/144] fix: image model list OpenAI image model added: gpt-image-1 Gemini image model renamed: id: imagen-3-0-generate-002 to imagen-3.0-generate-002 --- backend/open_webui/routers/images.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index b8bb110f5..57e21a258 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -333,10 +333,11 @@ def get_models(request: Request, user=Depends(get_verified_user)): return [ {"id": "dall-e-2", "name": "DALL·E 2"}, {"id": "dall-e-3", "name": "DALL·E 3"}, + {"id": "gpt-image-1", "name": "GPT-IMAGE 1"}, ] elif request.app.state.config.IMAGE_GENERATION_ENGINE == "gemini": return [ - {"id": "imagen-3-0-generate-002", "name": "imagen-3.0 generate-002"}, + {"id": "imagen-3.0-generate-002", "name": "imagen-3.0 generate-002"}, ] elif request.app.state.config.IMAGE_GENERATION_ENGINE == "comfyui": # TODO - get models from comfyui From d4c3cfbabaa74ff535a6bbb047fbafd6cf3db53f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 01:03:28 +0400 Subject: [PATCH 034/144] refac: oauth redirect url to use WEBUI_URL --- backend/open_webui/utils/oauth.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index f6004515f..de3355859 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -536,5 +536,10 @@ class OAuthManager: secure=WEBUI_AUTH_COOKIE_SECURE, ) # Redirect back to the frontend with the JWT token - redirect_url = f"{request.base_url}auth#token={jwt_token}" + + redirect_base_url = request.app.state.config.WEBUI_URL or request.base_url + if redirect_base_url.endswith("/"): + redirect_base_url = redirect_base_url[:-1] + redirect_url = f"{redirect_base_url}/auth#token={jwt_token}" + return RedirectResponse(url=redirect_url, headers=response.headers) From cbe84d71390a8c2ff85ebc07010f35f3a59110ec Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 01:08:28 +0400 Subject: [PATCH 035/144] enh: token expiry buffer --- src/routes/+layout.svelte | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 96936c338..5d69f559a 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -7,7 +7,7 @@ stiffness: 0.05 }); - import { onMount, tick, setContext } from 'svelte'; + import { onMount, tick, setContext, onDestroy } from 'svelte'; import { config, user, @@ -454,6 +454,7 @@ } }; + const TOKEN_EXPIRY_BUFFER = 60; // seconds const checkTokenExpiry = async () => { const exp = $user?.expires_at; // token expiry time in unix timestamp const now = Math.floor(Date.now() / 1000); // current time in unix timestamp @@ -463,7 +464,7 @@ return; } - if (now >= exp) { + if (now >= exp - TOKEN_EXPIRY_BUFFER) { const res = await userSignOut(); user.set(null); localStorage.removeItem('token'); @@ -508,6 +509,9 @@ if (document.visibilityState === 'visible') { isLastActiveTab.set(true); // This tab is now the active tab bc.postMessage('active'); // Notify other tabs that this tab is active + + // Check token expiry when the tab becomes active + checkTokenExpiry(); } }; From 71288ea3f21c59b1c85da28f1acb022737f8282b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 01:11:44 +0400 Subject: [PATCH 036/144] refac --- src/routes/+layout.svelte | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 5d69f559a..a214bf7b1 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -541,6 +541,12 @@ $socket?.on('chat-events', chatEventHandler); $socket?.on('channel-events', channelEventHandler); + + // Set up the token expiry check + if (tokenTimer) { + clearInterval(tokenTimer); + } + tokenTimer = setInterval(checkTokenExpiry, 15000); } else { $socket?.off('chat-events', chatEventHandler); $socket?.off('channel-events', channelEventHandler); @@ -593,12 +599,6 @@ await user.set(sessionUser); await config.set(await getBackendConfig()); - - // Set up the token expiry check - if (tokenTimer) { - clearInterval(tokenTimer); - } - tokenTimer = setInterval(checkTokenExpiry, 1000); } else { // Redirect Invalid Session User to /auth Page localStorage.removeItem('token'); From f2d2cae8fb3de8a83a47ab7b9389aea527f07cc6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 01:16:08 +0400 Subject: [PATCH 037/144] enh: help menu --- src/lib/components/layout/Help/HelpMenu.svelte | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/lib/components/layout/Help/HelpMenu.svelte b/src/lib/components/layout/Help/HelpMenu.svelte index 7371f629c..805e4678a 100644 --- a/src/lib/components/layout/Help/HelpMenu.svelte +++ b/src/lib/components/layout/Help/HelpMenu.svelte @@ -7,8 +7,9 @@ import Dropdown from '$lib/components/common/Dropdown.svelte'; import QuestionMarkCircle from '$lib/components/icons/QuestionMarkCircle.svelte'; - import Lifebuoy from '$lib/components/icons/Lifebuoy.svelte'; import Keyboard from '$lib/components/icons/Keyboard.svelte'; + import Map from '$lib/components/icons/Map.svelte'; + const i18n = getContext('i18n'); export let showDocsHandler: Function; @@ -45,6 +46,18 @@
{$i18n.t('Documentation')}
+ + { + window.open('https://github.com/open-webui/open-webui/releases', '_blank'); + }} + > + +
{$i18n.t('Releases')}
+
+ Date: Fri, 23 May 2025 01:29:48 +0400 Subject: [PATCH 038/144] refac: reranker Co-Authored-By: Tornike Gurgenidze --- backend/open_webui/retrieval/models/base_reranker.py | 8 ++++++++ backend/open_webui/retrieval/models/colbert.py | 4 +++- backend/open_webui/retrieval/models/external.py | 4 +++- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 backend/open_webui/retrieval/models/base_reranker.py diff --git a/backend/open_webui/retrieval/models/base_reranker.py b/backend/open_webui/retrieval/models/base_reranker.py new file mode 100644 index 000000000..6be7a5649 --- /dev/null +++ b/backend/open_webui/retrieval/models/base_reranker.py @@ -0,0 +1,8 @@ +from abc import ABC, abstractmethod +from typing import Optional, List, Tuple + + +class BaseReranker(ABC): + @abstractmethod + def predict(self, sentences: List[Tuple[str, str]]) -> Optional[List[float]]: + pass diff --git a/backend/open_webui/retrieval/models/colbert.py b/backend/open_webui/retrieval/models/colbert.py index 5b7499fd1..7ec888437 100644 --- a/backend/open_webui/retrieval/models/colbert.py +++ b/backend/open_webui/retrieval/models/colbert.py @@ -7,11 +7,13 @@ from colbert.modeling.checkpoint import Checkpoint from open_webui.env import SRC_LOG_LEVELS +from open_webui.retrieval.models.base_reranker import BaseReranker + log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["RAG"]) -class ColBERT: +class ColBERT(BaseReranker): def __init__(self, name, **kwargs) -> None: log.info("ColBERT: Loading model", name) self.device = "cuda" if torch.cuda.is_available() else "cpu" diff --git a/backend/open_webui/retrieval/models/external.py b/backend/open_webui/retrieval/models/external.py index 187d66e38..5ebc3e52e 100644 --- a/backend/open_webui/retrieval/models/external.py +++ b/backend/open_webui/retrieval/models/external.py @@ -3,12 +3,14 @@ import requests from typing import Optional, List, Tuple from open_webui.env import SRC_LOG_LEVELS +from open_webui.retrieval.models.base_reranker import BaseReranker + log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["RAG"]) -class ExternalReranker: +class ExternalReranker(BaseReranker): def __init__( self, api_key: str, From a68ec8822a01fb606defe1f59785eb7990d0c7ce Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 01:33:08 +0400 Subject: [PATCH 039/144] enh: filter md image for task generations --- backend/open_webui/utils/middleware.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index d77e4eded..a3f9b45f9 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -967,7 +967,7 @@ async def process_chat_response( if isinstance(content, str): content = re.sub( - r"]*>.*?<\/details>", + r"]*>.*?<\/details>|!\[.*?\]\(.*?\)", "", content, flags=re.S | re.I, From 0b7f927983e5126b1d04c08ae7ce0f38a48e0553 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 02:02:11 +0400 Subject: [PATCH 040/144] enh: sortable banners --- .../admin/Settings/Interface.svelte | 69 ++---------- .../admin/Settings/Interface/Banners.svelte | 101 ++++++++++++++++++ 2 files changed, 108 insertions(+), 62 deletions(-) create mode 100644 src/lib/components/admin/Settings/Interface/Banners.svelte diff --git a/src/lib/components/admin/Settings/Interface.svelte b/src/lib/components/admin/Settings/Interface.svelte index 6b062d772..e6257ba96 100644 --- a/src/lib/components/admin/Settings/Interface.svelte +++ b/src/lib/components/admin/Settings/Interface.svelte @@ -10,13 +10,14 @@ import { banners as _banners } from '$lib/stores'; import type { Banner } from '$lib/types'; + import { getBaseModels } from '$lib/apis/models'; import { getBanners, setBanners } from '$lib/apis/configs'; import Tooltip from '$lib/components/common/Tooltip.svelte'; import Switch from '$lib/components/common/Switch.svelte'; import Textarea from '$lib/components/common/Textarea.svelte'; import Spinner from '$lib/components/common/Spinner.svelte'; - import { getBaseModels } from '$lib/apis/models'; + import Banners from './Interface/Banners.svelte'; const dispatch = createEventDispatcher(); @@ -355,9 +356,9 @@
-
-
-
+
+
+
{$i18n.t('Banners')}
@@ -393,69 +394,13 @@
-
- {#each banners as banner, bannerIdx} -
-
- - - - -
- - - -
-
- - -
- {/each} -
+
{#if $user?.role === 'admin'}
-
+
{$i18n.t('Default Prompt Suggestions')}
diff --git a/src/lib/components/admin/Settings/Interface/Banners.svelte b/src/lib/components/admin/Settings/Interface/Banners.svelte new file mode 100644 index 000000000..00d422ced --- /dev/null +++ b/src/lib/components/admin/Settings/Interface/Banners.svelte @@ -0,0 +1,101 @@ + + +
+ {#each banners as banner, bannerIdx (banner.id)} + + {/each} +
From 2eca6f6414170e16cfc8b2b90a660298ad49789e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 02:30:35 +0400 Subject: [PATCH 041/144] feat: bypass web loader in web search Co-Authored-By: Perry Li Co-Authored-By: WilliamGates <3852641+williamgateszhao@users.noreply.github.com> --- backend/open_webui/config.py | 7 ++++ backend/open_webui/main.py | 2 ++ backend/open_webui/routers/retrieval.py | 36 +++++++++++++++---- .../admin/Settings/WebSearch.svelte | 13 +++++++ 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index b1955b056..85fac016a 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2177,6 +2177,12 @@ BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig( ) +BYPASS_WEB_SEARCH_WEB_LOADER = PersistentConfig( + "BYPASS_WEB_SEARCH_WEB_LOADER", + "rag.web.search.bypass_web_loader", + os.getenv("BYPASS_WEB_SEARCH_WEB_LOADER", "False").lower() == "true", +) + WEB_SEARCH_RESULT_COUNT = PersistentConfig( "WEB_SEARCH_RESULT_COUNT", "rag.web.search.result_count", @@ -2202,6 +2208,7 @@ WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig( int(os.getenv("WEB_SEARCH_CONCURRENT_REQUESTS", "10")), ) + WEB_LOADER_ENGINE = PersistentConfig( "WEB_LOADER_ENGINE", "rag.web.loader.engine", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index a5aee4bb8..1c3681c22 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -228,6 +228,7 @@ from open_webui.config import ( ENABLE_WEB_SEARCH, WEB_SEARCH_ENGINE, BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + BYPASS_WEB_SEARCH_WEB_LOADER, WEB_SEARCH_RESULT_COUNT, WEB_SEARCH_CONCURRENT_REQUESTS, WEB_SEARCH_TRUST_ENV, @@ -707,6 +708,7 @@ app.state.config.WEB_SEARCH_TRUST_ENV = WEB_SEARCH_TRUST_ENV app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ( BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL ) +app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER = BYPASS_WEB_SEARCH_WEB_LOADER app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION = ENABLE_GOOGLE_DRIVE_INTEGRATION app.state.config.ENABLE_ONEDRIVE_INTEGRATION = ENABLE_ONEDRIVE_INTEGRATION diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 5cb47373f..82114d755 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -387,6 +387,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "WEB_SEARCH_CONCURRENT_REQUESTS": request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, "WEB_SEARCH_DOMAIN_FILTER_LIST": request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "BYPASS_WEB_SEARCH_WEB_LOADER": request.app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER, "SEARXNG_QUERY_URL": request.app.state.config.SEARXNG_QUERY_URL, "YACY_QUERY_URL": request.app.state.config.YACY_QUERY_URL, "YACY_USERNAME": request.app.state.config.YACY_USERNAME, @@ -439,6 +440,7 @@ class WebConfig(BaseModel): WEB_SEARCH_CONCURRENT_REQUESTS: Optional[int] = None WEB_SEARCH_DOMAIN_FILTER_LIST: Optional[List[str]] = [] BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL: Optional[bool] = None + BYPASS_WEB_SEARCH_WEB_LOADER: Optional[bool] = None SEARXNG_QUERY_URL: Optional[str] = None YACY_QUERY_URL: Optional[str] = None YACY_USERNAME: Optional[str] = None @@ -751,6 +753,9 @@ async def update_rag_config( request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ( form_data.web.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL ) + request.app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER = ( + form_data.web.BYPASS_WEB_SEARCH_WEB_LOADER + ) request.app.state.config.SEARXNG_QUERY_URL = form_data.web.SEARXNG_QUERY_URL request.app.state.config.YACY_QUERY_URL = form_data.web.YACY_QUERY_URL request.app.state.config.YACY_USERNAME = form_data.web.YACY_USERNAME @@ -875,6 +880,7 @@ async def update_rag_config( "WEB_SEARCH_CONCURRENT_REQUESTS": request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, "WEB_SEARCH_DOMAIN_FILTER_LIST": request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "BYPASS_WEB_SEARCH_WEB_LOADER": request.app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER, "SEARXNG_QUERY_URL": request.app.state.config.SEARXNG_QUERY_URL, "YACY_QUERY_URL": request.app.state.config.YACY_QUERY_URL, "YACY_USERNAME": request.app.state.config.YACY_USERNAME, @@ -1678,13 +1684,29 @@ async def process_web_search( ) try: - loader = get_web_loader( - urls, - verify_ssl=request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, - requests_per_second=request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, - trust_env=request.app.state.config.WEB_SEARCH_TRUST_ENV, - ) - docs = await loader.aload() + if request.app.state.config.BYPASS_WEB_SEARCH_WEB_LOADER: + docs = [ + Document( + page_content=result.snippet, + metadata={ + "source": result.link, + "title": result.title, + "snippet": result.snippet, + "link": result.link, + }, + ) + for result in search_results + if hasattr(result, "snippet") + ] + else: + loader = get_web_loader( + urls, + verify_ssl=request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, + requests_per_second=request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, + trust_env=request.app.state.config.WEB_SEARCH_TRUST_ENV, + ) + docs = await loader.aload() + urls = [ doc.metadata.get("source") for doc in docs if doc.metadata.get("source") ] # only keep the urls returned by the loader diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index e25852cc3..c0712d8ad 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -613,6 +613,19 @@
+
+
+ + {$i18n.t('Bypass Web Loader')} + +
+
+ + + +
+
+
{$i18n.t('Trust Proxy Environment')} From 1f632d3570b90e6da2bef66c5630b456e8920c7e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 02:39:19 +0400 Subject: [PATCH 042/144] fix: remove leading dot for file extension check --- backend/open_webui/routers/files.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index ad556d327..9f4697593 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -96,6 +96,9 @@ def upload_file( filename = os.path.basename(unsanitized_filename) file_extension = os.path.splitext(filename)[1] + # Remove the leading dot from the file extension + file_extension = file_extension[1:] if file_extension else "" + if request.app.state.config.ALLOWED_FILE_EXTENSIONS: request.app.state.config.ALLOWED_FILE_EXTENSIONS = [ ext for ext in request.app.state.config.ALLOWED_FILE_EXTENSIONS if ext From 4c55ad71a709493bbc50b77ea022a1fc8750a812 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 02:48:31 +0400 Subject: [PATCH 043/144] fix: local/external models --- backend/open_webui/utils/task.py | 2 +- src/lib/components/chat/ModelSelector/Selector.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/task.py b/backend/open_webui/utils/task.py index 66bdb4b3e..95018eef1 100644 --- a/backend/open_webui/utils/task.py +++ b/backend/open_webui/utils/task.py @@ -22,7 +22,7 @@ def get_task_model_id( # Set the task model task_model_id = default_model_id # Check if the user has a custom task model and use that model - if models[task_model_id].get("owned_by") == "ollama": + if models[task_model_id].get("connection_type") == "local": if task_model and task_model in models: task_model_id = task_model else: diff --git a/src/lib/components/chat/ModelSelector/Selector.svelte b/src/lib/components/chat/ModelSelector/Selector.svelte index 118e007fb..5d0bf6b65 100644 --- a/src/lib/components/chat/ModelSelector/Selector.svelte +++ b/src/lib/components/chat/ModelSelector/Selector.svelte @@ -557,7 +557,7 @@
- {:else if item.model.owned_by === 'openai'} + {:else if item.model.connection_type === 'external'}
Date: Fri, 23 May 2025 02:53:08 +0400 Subject: [PATCH 044/144] fix: image generation with allowed file extensions --- backend/open_webui/routers/files.py | 6 +++--- backend/open_webui/routers/images.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 9f4697593..1acecad08 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -85,12 +85,12 @@ def upload_file( request: Request, file: UploadFile = File(...), user=Depends(get_verified_user), - file_metadata: dict = None, + metadata: dict = None, process: bool = Query(True), ): log.info(f"file.content_type: {file.content_type}") - file_metadata = file_metadata if file_metadata else {} + file_metadata = metadata if metadata else {} try: unsanitized_filename = file.filename filename = os.path.basename(unsanitized_filename) @@ -99,7 +99,7 @@ def upload_file( # Remove the leading dot from the file extension file_extension = file_extension[1:] if file_extension else "" - if request.app.state.config.ALLOWED_FILE_EXTENSIONS: + if not file_metadata and request.app.state.config.ALLOWED_FILE_EXTENSIONS: request.app.state.config.ALLOWED_FILE_EXTENSIONS = [ ext for ext in request.app.state.config.ALLOWED_FILE_EXTENSIONS if ext ] diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index 57e21a258..c34ce48f0 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -451,7 +451,7 @@ def load_url_image_data(url, headers=None): return None -def upload_image(request, image_metadata, image_data, content_type, user): +def upload_image(request, image_data, content_type, metadata, user): image_format = mimetypes.guess_extension(content_type) file = UploadFile( file=io.BytesIO(image_data), @@ -460,7 +460,7 @@ def upload_image(request, image_metadata, image_data, content_type, user): "content-type": content_type, }, ) - file_item = upload_file(request, file, user, file_metadata=image_metadata) + file_item = upload_file(request, file, user, metadata=metadata) url = request.app.url_path_for("get_file_content_by_id", id=file_item.id) return url @@ -527,7 +527,7 @@ async def image_generations( else: image_data, content_type = load_b64_image_data(image["b64_json"]) - url = upload_image(request, data, image_data, content_type, user) + url = upload_image(request, image_data, content_type, data, user) images.append({"url": url}) return images From 7071a03419dbab6f5c792d4dc1c87d0b3ef9782d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 02:54:44 +0400 Subject: [PATCH 045/144] chore: format --- src/lib/i18n/locales/ar-BH/translation.json | 2 ++ src/lib/i18n/locales/ar/translation.json | 2 ++ src/lib/i18n/locales/bg-BG/translation.json | 2 ++ src/lib/i18n/locales/bn-BD/translation.json | 2 ++ src/lib/i18n/locales/bo-TB/translation.json | 2 ++ src/lib/i18n/locales/ca-ES/translation.json | 2 ++ src/lib/i18n/locales/ceb-PH/translation.json | 2 ++ src/lib/i18n/locales/cs-CZ/translation.json | 2 ++ src/lib/i18n/locales/da-DK/translation.json | 2 ++ src/lib/i18n/locales/de-DE/translation.json | 2 ++ src/lib/i18n/locales/dg-DG/translation.json | 2 ++ src/lib/i18n/locales/el-GR/translation.json | 2 ++ src/lib/i18n/locales/en-GB/translation.json | 2 ++ src/lib/i18n/locales/en-US/translation.json | 2 ++ src/lib/i18n/locales/es-ES/translation.json | 2 ++ src/lib/i18n/locales/et-EE/translation.json | 2 ++ src/lib/i18n/locales/eu-ES/translation.json | 2 ++ src/lib/i18n/locales/fa-IR/translation.json | 2 ++ src/lib/i18n/locales/fi-FI/translation.json | 2 ++ src/lib/i18n/locales/fr-CA/translation.json | 2 ++ src/lib/i18n/locales/fr-FR/translation.json | 2 ++ src/lib/i18n/locales/he-IL/translation.json | 2 ++ src/lib/i18n/locales/hi-IN/translation.json | 2 ++ src/lib/i18n/locales/hr-HR/translation.json | 2 ++ src/lib/i18n/locales/hu-HU/translation.json | 2 ++ src/lib/i18n/locales/id-ID/translation.json | 2 ++ src/lib/i18n/locales/ie-GA/translation.json | 2 ++ src/lib/i18n/locales/it-IT/translation.json | 2 ++ src/lib/i18n/locales/ja-JP/translation.json | 2 ++ src/lib/i18n/locales/ka-GE/translation.json | 2 ++ src/lib/i18n/locales/ko-KR/translation.json | 2 ++ src/lib/i18n/locales/lt-LT/translation.json | 2 ++ src/lib/i18n/locales/ms-MY/translation.json | 2 ++ src/lib/i18n/locales/nb-NO/translation.json | 2 ++ src/lib/i18n/locales/nl-NL/translation.json | 2 ++ src/lib/i18n/locales/pa-IN/translation.json | 2 ++ src/lib/i18n/locales/pl-PL/translation.json | 2 ++ src/lib/i18n/locales/pt-BR/translation.json | 2 ++ src/lib/i18n/locales/pt-PT/translation.json | 2 ++ src/lib/i18n/locales/ro-RO/translation.json | 2 ++ src/lib/i18n/locales/ru-RU/translation.json | 2 ++ src/lib/i18n/locales/sk-SK/translation.json | 2 ++ src/lib/i18n/locales/sr-RS/translation.json | 2 ++ src/lib/i18n/locales/sv-SE/translation.json | 2 ++ src/lib/i18n/locales/th-TH/translation.json | 2 ++ src/lib/i18n/locales/tk-TW/translation.json | 2 ++ src/lib/i18n/locales/tr-TR/translation.json | 2 ++ src/lib/i18n/locales/uk-UA/translation.json | 2 ++ src/lib/i18n/locales/ur-PK/translation.json | 2 ++ src/lib/i18n/locales/vi-VN/translation.json | 2 ++ src/lib/i18n/locales/zh-CN/translation.json | 2 ++ src/lib/i18n/locales/zh-TW/translation.json | 2 ++ 52 files changed, 104 insertions(+) diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index f7d88543e..c2e6b1c29 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "مفتاح واجهة برمجة تطبيقات البحث الشجاع", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "ملاحظات الإصدار", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "إزالة", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index 5a9e76f36..fb4be0c93 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "مفتاح API لـ Brave Search", "By {{name}}": "بواسطة {{name}}", "Bypass Embedding and Retrieval": "تجاوز التضمين والاسترجاع", + "Bypass Web Loader": "", "Calendar": "التقويم", "Call": "مكالمة", "Call feature is not supported when using Web STT engine": "ميزة الاتصال غير مدعومة عند استخدام محرك Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "ملاحظات الإصدار", + "Releases": "", "Relevance": "الصلة", "Relevance Threshold": "", "Remove": "إزالة", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index bc1ede8b9..e8a48f03b 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "API ключ за Brave Search", "By {{name}}": "От {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "Календар", "Call": "Обаждане", "Call feature is not supported when using Web STT engine": "Функцията за обаждане не се поддържа при използването на Web STT двигател", @@ -974,6 +975,7 @@ "Reindex": "Реиндексирай", "Reindex Knowledge Base Vectors": "", "Release Notes": "Бележки по изданието", + "Releases": "", "Relevance": "Релевантност", "Relevance Threshold": "", "Remove": "Изтриване", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index 6223c9bf3..704cd3dcb 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "সাহসী অনুসন্ধান API কী", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "রিলিজ নোটসমূহ", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "রিমুভ করুন", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index 0d7ed51e3..b32063bd5 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API ལྡེ་མིག", "By {{name}}": "{{name}} ཡིས།", "Bypass Embedding and Retrieval": "ཚུད་འཇུག་དང་ལེན་ཚུར་སྒྲུབ་ལས་བརྒལ་བ།", + "Bypass Web Loader": "", "Calendar": "ལོ་ཐོ།", "Call": "སྐད་འབོད།", "Call feature is not supported when using Web STT engine": "Web STT མ་ལག་སྤྱོད་སྐབས་སྐད་འབོད་ཀྱི་ཁྱད་ཆོས་ལ་རྒྱབ་སྐྱོར་མེད།", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "འགྲེམས་སྤེལ་མཆན་བུ།", + "Releases": "", "Relevance": "འབྲེལ་ཡོད་རང་བཞིན།", "Relevance Threshold": "", "Remove": "འདོར་བ།", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 0ed128707..d0575764f 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Clau API de Brave Search", "By {{name}}": "Per {{name}}", "Bypass Embedding and Retrieval": "Desactivar l'Embedding i el Retrieval", + "Bypass Web Loader": "", "Calendar": "Calendari", "Call": "Trucada", "Call feature is not supported when using Web STT engine": "La funció de trucada no s'admet quan s'utilitza el motor Web STT", @@ -974,6 +975,7 @@ "Reindex": "Reindexar", "Reindex Knowledge Base Vectors": "Reindexar els vector base del Coneixement", "Release Notes": "Notes de la versió", + "Releases": "", "Relevance": "Rellevància", "Relevance Threshold": "Límit de rellevància", "Remove": "Eliminar", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 0fcb81596..fe4bd6835 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Release Notes", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 3e6670214..dcf53e8ad 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Klíč API pro Brave Search", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Volání", "Call feature is not supported when using Web STT engine": "Funkce pro volání není podporována při použití Web STT engine.", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Záznamy o vydání", + "Releases": "", "Relevance": "Relevance", "Relevance Threshold": "", "Remove": "Odebrat", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index da7463832..7c95a21ff 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API nøgle", "By {{name}}": "Af {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "Kalender", "Call": "Opkald", "Call feature is not supported when using Web STT engine": "Opkaldsfunktion er ikke understøttet for Web STT engine", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Udgivelsesnoter", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Fjern", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 008a634fb..83a9d7caa 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API-Schlüssel", "By {{name}}": "Von {{name}}", "Bypass Embedding and Retrieval": "Embedding und Retrieval umgehen", + "Bypass Web Loader": "", "Calendar": "Kalender", "Call": "Anrufen", "Call feature is not supported when using Web STT engine": "Die Anruffunktion wird nicht unterstützt, wenn die Web-STT-Engine verwendet wird.", @@ -974,6 +975,7 @@ "Reindex": "Neu indexieren", "Reindex Knowledge Base Vectors": "Vektoren der Wissensdatenbank neu indizieren", "Release Notes": "Veröffentlichungshinweise", + "Releases": "", "Relevance": "Relevanz", "Relevance Threshold": "Relevanzschwelle", "Remove": "Entfernen", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index b7a67e3e2..e739fab62 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Release Borks", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 1b35b538e..735c575eb 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Κλειδί API Brave Search", "By {{name}}": "Από {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Κλήση", "Call feature is not supported when using Web STT engine": "Η λειτουργία κλήσης δεν υποστηρίζεται όταν χρησιμοποιείται η μηχανή Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Σημειώσεις Έκδοσης", + "Releases": "", "Relevance": "Σχετικότητα", "Relevance Threshold": "", "Remove": "Αφαίρεση", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 5516b6e1f..3a92ed09d 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 5516b6e1f..3a92ed09d 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 787603684..f614c3977 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Clave API de Brave Search", "By {{name}}": "Por {{name}}", "Bypass Embedding and Retrieval": "Evitar Incrustración y Recuperación", + "Bypass Web Loader": "", "Calendar": "Calendario", "Call": "Llamada", "Call feature is not supported when using Web STT engine": "La funcionalidad de Llamada no está soportada cuando se usa el motor Web STT", @@ -974,6 +975,7 @@ "Reindex": "Reindexar", "Reindex Knowledge Base Vectors": "Reindexar Base Vectorial de Conocimiento", "Release Notes": "Notas de la Versión", + "Releases": "", "Relevance": "Relevancia", "Relevance Threshold": "Umbral de Relevancia", "Remove": "Eliminar", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index ac66e77d9..7171faea6 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API võti", "By {{name}}": "Autor: {{name}}", "Bypass Embedding and Retrieval": "Möödaminek sisestamisest ja taastamisest", + "Bypass Web Loader": "", "Calendar": "Kalender", "Call": "Kõne", "Call feature is not supported when using Web STT engine": "Kõnefunktsioon ei ole Web STT mootorit kasutades toetatud", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Väljalaskemärkmed", + "Releases": "", "Relevance": "Asjakohasus", "Relevance Threshold": "", "Remove": "Eemalda", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index 275184559..85e2a6111 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Bilaketa API Gakoa", "By {{name}}": "{{name}}-k", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Deia", "Call feature is not supported when using Web STT engine": "Dei funtzioa ez da onartzen Web STT motorra erabiltzean", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Bertsio oharrak", + "Releases": "", "Relevance": "Garrantzia", "Relevance Threshold": "", "Remove": "Kendu", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 5c8d0b2e4..ecc82a15f 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "کلید API جستجوی شجاع", "By {{name}}": "توسط {{name}}", "Bypass Embedding and Retrieval": "دور زدن جاسازی و بازیابی", + "Bypass Web Loader": "", "Calendar": "تقویم", "Call": "تماس", "Call feature is not supported when using Web STT engine": "ویژگی تماس هنگام استفاده از موتور Web STT پشتیبانی نمی\u200cشود", @@ -974,6 +975,7 @@ "Reindex": "فهرست\u200cبندی مجدد", "Reindex Knowledge Base Vectors": "فهرست\u200cبندی مجدد بردارهای پایگاه دانش", "Release Notes": "یادداشت\u200cهای انتشار", + "Releases": "", "Relevance": "ارتباط", "Relevance Threshold": "آستانه ارتباط", "Remove": "حذف", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 7e8e88914..8982117e7 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API -avain", "By {{name}}": "Tekijä {{name}}", "Bypass Embedding and Retrieval": "Ohita upotus ja haku", + "Bypass Web Loader": "", "Calendar": "Kalenteri", "Call": "Puhelu", "Call feature is not supported when using Web STT engine": "Puhelutoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria", @@ -974,6 +975,7 @@ "Reindex": "Indeksoi uudelleen", "Reindex Knowledge Base Vectors": "Indeksoi tietämyksen vektorit uudelleen", "Release Notes": "Julkaisutiedot", + "Releases": "", "Relevance": "Relevanssi", "Relevance Threshold": "Relevanssikynnys", "Remove": "Poista", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index a54d41da5..6d243caf7 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Clé API Brave Search", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Appeler", "Call feature is not supported when using Web STT engine": "La fonction d'appel n'est pas prise en charge lors de l'utilisation du moteur Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Notes de publication", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Retirer", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index dc54e6e8a..18a62db2b 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Clé API Brave Search", "By {{name}}": "Par {{name}}", "Bypass Embedding and Retrieval": "Ignorer l'Embedding et le Retrieval", + "Bypass Web Loader": "", "Calendar": "Calendrier", "Call": "Appeler", "Call feature is not supported when using Web STT engine": "La fonction d'appel n'est pas prise en charge lors de l'utilisation du moteur Web STT", @@ -974,6 +975,7 @@ "Reindex": "Réindexer", "Reindex Knowledge Base Vectors": "Réindexer les vecteurs de la base de connaissance", "Release Notes": "Notes de mise à jour", + "Releases": "", "Relevance": "Pertinence", "Relevance Threshold": "Seuil de pertinence", "Remove": "Retirer", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index c04df8c45..0a66d307b 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "מפתח API של חיפוש אמיץ", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "הערות שחרור", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "הסר", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 57fcc7350..1fd8e0afe 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave सर्च एपीआई कुंजी", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "रिलीज नोट्स", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "हटा दें", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 1529ec45d..191e616ea 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave tražilica - API ključ", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Poziv", "Call feature is not supported when using Web STT engine": "Značajka poziva nije podržana kada se koristi Web STT mehanizam", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Bilješke o izdanju", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Ukloni", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 93f84f341..eb6127f3d 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API kulcs", "By {{name}}": "Készítette: {{name}}", "Bypass Embedding and Retrieval": "Beágyazás és visszakeresés kihagyása", + "Bypass Web Loader": "", "Calendar": "Naptár", "Call": "Hívás", "Call feature is not supported when using Web STT engine": "A hívás funkció nem támogatott Web STT motor használatakor", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Kiadási jegyzetek", + "Releases": "", "Relevance": "Relevancia", "Relevance Threshold": "", "Remove": "Eltávolítás", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 7cdbdb3ca..ac05a666a 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Kunci API Pencarian Berani", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Panggilan", "Call feature is not supported when using Web STT engine": "Fitur panggilan tidak didukung saat menggunakan mesin Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Catatan Rilis", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Hapus", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index f0d27de63..6304861dd 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Eochair API Cuardaigh Brave", "By {{name}}": "Le {{name}}", "Bypass Embedding and Retrieval": "Seachbhóthar Leabú agus Aisghabháil", + "Bypass Web Loader": "", "Calendar": "Féilire", "Call": "Glaoigh", "Call feature is not supported when using Web STT engine": "Ní thacaítear le gné glaonna agus inneall Web STT á úsáid", @@ -974,6 +975,7 @@ "Reindex": "Reindex", "Reindex Knowledge Base Vectors": "Veicteoirí Bonn Eolais a ath-innéacsú", "Release Notes": "Nótaí Scaoilte", + "Releases": "", "Relevance": "Ábharthacht", "Relevance Threshold": "Tairseach Ábharthaíochta", "Remove": "Bain", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 3d71dc3b9..e570e97a0 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Chiave API di ricerca Brave", "By {{name}}": "Di {{name}}", "Bypass Embedding and Retrieval": "Bypass embedding e recupero", + "Bypass Web Loader": "", "Calendar": "Calendario", "Call": "Chiamata", "Call feature is not supported when using Web STT engine": "La funzione di chiamata non è supportata quando si utilizza il motore Web STT", @@ -974,6 +975,7 @@ "Reindex": "Reindicizza", "Reindex Knowledge Base Vectors": "Reindicizza i Vettori della Base di Conoscenza", "Release Notes": "Note di Rilascio", + "Releases": "", "Relevance": "Rilevanza", "Relevance Threshold": "Soglia di Rilevanza", "Remove": "Rimuovi", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index f5950cca7..aaa913239 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search APIキー", "By {{name}}": "{{name}}による", "Bypass Embedding and Retrieval": "埋め込みと検索をバイパス", + "Bypass Web Loader": "", "Calendar": "カレンダー", "Call": "コール", "Call feature is not supported when using Web STT engine": "Web STTエンジンを使用している場合、コール機能はサポートされていません。", @@ -974,6 +975,7 @@ "Reindex": "再インデックス", "Reindex Knowledge Base Vectors": "ナレッジベースベクターを再インデックス", "Release Notes": "リリースノート", + "Releases": "", "Relevance": "関連性", "Relevance Threshold": "関連性の閾値", "Remove": "削除", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 18a52e35d..e6568254b 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API-ის გასაღები", "By {{name}}": "ავტორი {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "კალენდარი", "Call": "ზარი", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "გამოცემის შენიშვნები", + "Releases": "", "Relevance": "შესაბამისობა", "Relevance Threshold": "", "Remove": "წაშლა", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 7b7d0716b..7293c5d05 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API 키", "By {{name}}": "작성자: {{name}}", "Bypass Embedding and Retrieval": "임베딩 검색 우회", + "Bypass Web Loader": "", "Calendar": "캘린더", "Call": "음성 기능", "Call feature is not supported when using Web STT engine": "웹 STT 엔진 사용 시, 음성 기능은 지원되지 않습니다.", @@ -974,6 +975,7 @@ "Reindex": "재색인", "Reindex Knowledge Base Vectors": "전체 지식 베이스 재색인", "Release Notes": "릴리스 노트", + "Releases": "", "Relevance": "관련도", "Relevance Threshold": "관련성 임계값", "Remove": "삭제", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index e8e3af794..45dea1024 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API raktas", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Skambinti", "Call feature is not supported when using Web STT engine": "Skambučio funkcionalumas neleidžiamas naudojant Web STT variklį", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Naujovės", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Pašalinti", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 659d7d808..a7ee4da7d 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Kunci API Carian Brave", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Hubungi", "Call feature is not supported when using Web STT engine": "Ciri panggilan tidak disokong apabila menggunakan enjin Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Nota Keluaran", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Hapuskan", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 8af59814c..f949ec0a2 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "API-nøkkel for Brave Search", "By {{name}}": "Etter {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "Kalender", "Call": "Ring", "Call feature is not supported when using Web STT engine": "Ringefunksjonen støttes ikke når du bruker Web STT-motoren", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Utgivelsesnotater", + "Releases": "", "Relevance": "Relevans", "Relevance Threshold": "", "Remove": "Fjern", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 8c48aeb28..af560ea2d 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API-sleutel", "By {{name}}": "Op {{name}}", "Bypass Embedding and Retrieval": "Embedding en ophalen omzeilen ", + "Bypass Web Loader": "", "Calendar": "Agenda", "Call": "Oproep", "Call feature is not supported when using Web STT engine": "Belfunctie wordt niet ondersteund bij gebruik van de Web STT engine", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Release-opmerkingen", + "Releases": "", "Relevance": "Relevantie", "Relevance Threshold": "", "Remove": "Verwijderen", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index 86b127f56..e36fef539 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "ਬਹਾਦਰ ਖੋਜ API ਕੁੰਜੀ", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "ਰਿਲੀਜ਼ ਨੋਟਸ", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "ਹਟਾਓ", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index ecdb4c647..1110a181e 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Klucz API wyszukiwania Brave", "By {{name}}": "Przez {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "Kalendarz", "Call": "Rozmowa", "Call feature is not supported when using Web STT engine": "Funkcja rozmowy nie jest obsługiwana podczas korzystania z silnika Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Notatki do wydania", + "Releases": "", "Relevance": "Trafność", "Relevance Threshold": "", "Remove": "Usuń", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 80ab1c6a9..6ccc8b908 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Chave API do Brave Search", "By {{name}}": "Por {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Chamada", "Call feature is not supported when using Web STT engine": "O recurso de chamada não é suportado ao usar o mecanismo Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Notas de Lançamento", + "Releases": "", "Relevance": "Relevância", "Relevance Threshold": "", "Remove": "Remover", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index 6d89a965f..80bba3cef 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Chave da API de Pesquisa Brave", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Chamar", "Call feature is not supported when using Web STT engine": "A funcionalide de Chamar não é suportada quando usa um motor Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Notas de Lançamento", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Remover", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 6129d80c9..5f263f36d 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Cheie API Brave Search", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Apel", "Call feature is not supported when using Web STT engine": "Funcția de apel nu este suportată când se utilizează motorul Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Note de Lansare", + "Releases": "", "Relevance": "Relevanță", "Relevance Threshold": "", "Remove": "Înlătură", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 98b5a71e5..8b8a1a8bc 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Ключ API поиска Brave", "By {{name}}": "От {{name}}", "Bypass Embedding and Retrieval": "Обход встраивания и извлечения данных", + "Bypass Web Loader": "", "Calendar": "Календарь", "Call": "Вызов", "Call feature is not supported when using Web STT engine": "Функция вызова не поддерживается при использовании Web STT (распознавание речи) движка", @@ -974,6 +975,7 @@ "Reindex": "Переиндексировать", "Reindex Knowledge Base Vectors": "Переиндексировать векторы базы знаний", "Release Notes": "Примечания к выпуску", + "Releases": "", "Relevance": "Релевантность", "Relevance Threshold": "Порог релевантности", "Remove": "Удалить", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 39690be9e..3280df6ad 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "API kľúč pre Brave Search", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Volanie", "Call feature is not supported when using Web STT engine": "Funkcia volania nie je podporovaná pri použití Web STT engine.", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Záznamy o vydaní", + "Releases": "", "Relevance": "Relevancia", "Relevance Threshold": "", "Remove": "Odstrániť", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 705151ab3..3aecd8000 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Апи кључ за храбру претрагу", "By {{name}}": "Од {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "Позив", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Напомене о издању", + "Releases": "", "Relevance": "Примењивост", "Relevance Threshold": "", "Remove": "Уклони", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 4fbd9f2af..b53a0f7a6 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "API-nyckel för Brave Search", "By {{name}}": "Av {{name}}", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "Kalender", "Call": "Samtal", "Call feature is not supported when using Web STT engine": "Samtalsfunktionen är inte kompatibel med Web Tal-till-text motor", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Versionsinformation", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "Ta bort", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 9b2028751..3afe71844 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "คีย์ API ของ Brave Search", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "โทร", "Call feature is not supported when using Web STT engine": "ไม่รองรับฟีเจอร์การโทรเมื่อใช้เครื่องยนต์ Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "บันทึกรุ่น", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "ลบ", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index 5e741edfc..2230e9f44 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "", "Call feature is not supported when using Web STT engine": "", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "", + "Releases": "", "Relevance": "", "Relevance Threshold": "", "Remove": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 954006c94..d63942ae0 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API Anahtarı", "By {{name}}": "{{name}} Tarafından", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "Takvim", "Call": "Arama", "Call feature is not supported when using Web STT engine": "Web STT motoru kullanılırken arama özelliği desteklenmiyor", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Sürüm Notları", + "Releases": "", "Relevance": "İlgili", "Relevance Threshold": "İlgi Eşiği", "Remove": "Kaldır", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 8132bae92..7df6ffd11 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Ключ API пошуку Brave", "By {{name}}": "Від {{name}}", "Bypass Embedding and Retrieval": "Минути вбудовування та пошук", + "Bypass Web Loader": "", "Calendar": "Календар", "Call": "Виклик", "Call feature is not supported when using Web STT engine": "Функція виклику не підтримується при використанні Web STT (розпізнавання мовлення) рушія", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Нотатки до випуску", + "Releases": "", "Relevance": "Актуальність", "Relevance Threshold": "", "Remove": "Видалити", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 9d79c993b..f4419ede0 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "بریو سرچ API کلید", "By {{name}}": "", "Bypass Embedding and Retrieval": "", + "Bypass Web Loader": "", "Calendar": "", "Call": "کال کریں", "Call feature is not supported when using Web STT engine": "کال کی خصوصیت ویب STT انجن استعمال کرتے وقت معاونت یافتہ نہیں ہے", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "ریلیز نوٹس", + "Releases": "", "Relevance": "موزونیت", "Relevance Threshold": "", "Remove": "ہٹا دیں", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index c080f40fa..848be5033 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Khóa API tìm kiếm dũng cảm", "By {{name}}": "Bởi {{name}}", "Bypass Embedding and Retrieval": "Bỏ qua Embedding và Truy xuất", + "Bypass Web Loader": "", "Calendar": "Lịch", "Call": "Gọi", "Call feature is not supported when using Web STT engine": "Tính năng gọi điện không được hỗ trợ khi sử dụng công cụ Web STT", @@ -974,6 +975,7 @@ "Reindex": "", "Reindex Knowledge Base Vectors": "", "Release Notes": "Mô tả những cập nhật mới", + "Releases": "", "Relevance": "Mức độ liên quan", "Relevance Threshold": "", "Remove": "Xóa", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index a4fe945b7..ee5807140 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave Search API 密钥", "By {{name}}": "由 {{name}} 提供", "Bypass Embedding and Retrieval": "绕过嵌入和检索", + "Bypass Web Loader": "", "Calendar": "日历", "Call": "呼叫", "Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能。", @@ -974,6 +975,7 @@ "Reindex": "重建索引", "Reindex Knowledge Base Vectors": "重建知识库向量", "Release Notes": "更新日志", + "Releases": "", "Relevance": "相关性", "Relevance Threshold": "相关性阈值", "Remove": "移除", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 71393a8c8..81832549d 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -155,6 +155,7 @@ "Brave Search API Key": "Brave 搜尋 API 金鑰", "By {{name}}": "由 {{name}} 製作", "Bypass Embedding and Retrieval": "繞過嵌入與檢索", + "Bypass Web Loader": "", "Calendar": "日曆", "Call": "通話", "Call feature is not supported when using Web STT engine": "使用網頁語音辨識 (Web STT) 引擎時不支援通話功能", @@ -974,6 +975,7 @@ "Reindex": "重新索引", "Reindex Knowledge Base Vectors": "重新索引知識庫向量", "Release Notes": "釋出説明", + "Releases": "", "Relevance": "相關性", "Relevance Threshold": "相關性閾值", "Remove": "移除", From a2f12db8d9cc70a1f17f7249cea3a6850cfea912 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 03:26:14 +0400 Subject: [PATCH 046/144] refac: memories --- backend/open_webui/utils/middleware.py | 38 ++++++++++++++++++++++++++ backend/open_webui/utils/misc.py | 9 ++++-- src/lib/components/chat/Chat.svelte | 38 +++----------------------- 3 files changed, 49 insertions(+), 36 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index a3f9b45f9..f0ff460c9 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -41,6 +41,7 @@ from open_webui.routers.pipelines import ( process_pipeline_inlet_filter, process_pipeline_outlet_filter, ) +from open_webui.routers.memories import query_memory, QueryMemoryForm from open_webui.utils.webhook import post_webhook @@ -290,6 +291,38 @@ async def chat_completion_tools_handler( return body, {"sources": sources} +async def chat_memory_handler( + request: Request, form_data: dict, extra_params: dict, user +): + results = await query_memory( + request, + QueryMemoryForm( + **{"content": get_last_user_message(form_data["messages"]), "k": 3} + ), + user, + ) + + user_context = "" + if results and hasattr(results, "documents"): + if results.documents and len(results.documents) > 0: + for doc_idx, doc in enumerate(results.documents[0]): + created_at_date = "Unknown Date" + + if results.metadatas[0][doc_idx].get("created_at"): + created_at_timestamp = results.metadatas[0][doc_idx]["created_at"] + created_at_date = time.strftime( + "%Y-%m-%d", time.localtime(created_at_timestamp) + ) + + user_context += f"{doc_idx + 1}. [{created_at_date}] {doc}\n" + + form_data["messages"] = add_or_update_system_message( + f"User Context:\n{user_context}\n", form_data["messages"], append=True + ) + + return form_data + + async def chat_web_search_handler( request: Request, form_data: dict, extra_params: dict, user ): @@ -774,6 +807,11 @@ async def process_chat_payload(request, form_data, user, metadata, model): features = form_data.pop("features", None) if features: + if "memory" in features and features["memory"]: + form_data = await chat_memory_handler( + request, form_data, extra_params, user + ) + if "web_search" in features and features["web_search"]: form_data = await chat_web_search_handler( request, form_data, extra_params, user diff --git a/backend/open_webui/utils/misc.py b/backend/open_webui/utils/misc.py index 98938dfea..b804afd2c 100644 --- a/backend/open_webui/utils/misc.py +++ b/backend/open_webui/utils/misc.py @@ -130,7 +130,9 @@ def prepend_to_first_user_message_content( return messages -def add_or_update_system_message(content: str, messages: list[dict]): +def add_or_update_system_message( + content: str, messages: list[dict], append: bool = False +): """ Adds a new system message at the beginning of the messages list or updates the existing system message at the beginning. @@ -141,7 +143,10 @@ def add_or_update_system_message(content: str, messages: list[dict]): """ if messages and messages[0].get("role") == "system": - messages[0]["content"] = f"{content}\n{messages[0]['content']}" + if append: + messages[0]["content"] = f"{messages[0]['content']}\n{content}" + else: + messages[0]["content"] = f"{content}\n{messages[0]['content']}" else: # Insert at the beginning messages.insert(0, {"role": "system", "content": content}) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index cee724e30..d30cb811d 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1431,7 +1431,6 @@ model: model.id, modelName: model.name ?? model.id, modelIdx: modelIdx ? modelIdx : _modelIdx, - userContext: null, timestamp: Math.floor(Date.now() / 1000) // Unix epoch }; @@ -1486,32 +1485,6 @@ let responseMessageId = responseMessageIds[`${modelId}-${modelIdx ? modelIdx : _modelIdx}`]; - let responseMessage = _history.messages[responseMessageId]; - - let userContext = null; - if ($settings?.memory ?? false) { - if (userContext === null) { - const res = await queryMemory(localStorage.token, prompt).catch((error) => { - toast.error(`${error}`); - return null; - }); - if (res) { - if (res.documents[0].length > 0) { - userContext = res.documents[0].reduce((acc, doc, index) => { - const createdAtTimestamp = res.metadatas[0][index].created_at; - const createdAtDate = new Date(createdAtTimestamp * 1000) - .toISOString() - .split('T')[0]; - return `${acc}${index + 1}. [${createdAtDate}]. ${doc}\n`; - }, ''); - } - - console.log(userContext); - } - } - } - responseMessage.userContext = userContext; - const chatEventEmitter = await getChatEventEmitter(model.id, _chatId); scrollToBottom(); @@ -1573,7 +1546,7 @@ true; let messages = [ - params?.system || $settings.system || (responseMessage?.userContext ?? null) + params?.system || $settings.system ? { role: 'system', content: `${promptTemplate( @@ -1585,11 +1558,7 @@ return undefined; }) : undefined - )}${ - (responseMessage?.userContext ?? null) - ? `\n\nUser Context:\n${responseMessage?.userContext ?? ''}` - : '' - }` + )}` } : undefined, ...createMessagesList(_history, responseMessageId).map((message) => ({ @@ -1666,7 +1635,8 @@ $config?.features?.enable_web_search && ($user?.role === 'admin' || $user?.permissions?.features?.web_search) ? webSearchEnabled || ($settings?.webSearch ?? false) === 'always' - : false + : false, + memory: $settings?.memory ?? false }, variables: { ...getPromptVariables( From 1d382b83c82362c99b279392420c4f1d0d50dfe1 Mon Sep 17 00:00:00 2001 From: Zayd Krunz <70227235+ShrootBuck@users.noreply.github.com> Date: Fri, 23 May 2025 01:16:47 +0000 Subject: [PATCH 047/144] refac: improve prompt formatting for selected text in FloatingButtons --- .../chat/ContentRenderer/FloatingButtons.svelte | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte index 9286aaed0..de3752157 100644 --- a/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte +++ b/src/lib/components/chat/ContentRenderer/FloatingButtons.svelte @@ -44,7 +44,13 @@ toast.error('Model not selected'); return; } - prompt = `${floatingInputValue}\n\`\`\`\n${selectedText}\n\`\`\``; + prompt = [ + // Blockquote each line of the selected text + ...selectedText.split('\n').map(line => `> ${line}`), + '', + // Then your question + floatingInputValue + ].join('\n'); floatingInputValue = ''; responseContent = ''; @@ -121,8 +127,11 @@ toast.error('Model not selected'); return; } - const explainText = $i18n.t('Explain this section to me in more detail'); - prompt = `${explainText}\n\n\`\`\`\n${selectedText}\n\`\`\``; + const quotedText = selectedText + .split('\n') + .map(line => `> ${line}`) + .join('\n'); + prompt = `${quotedText}\n\nExplain`; responseContent = ''; const [res, controller] = await chatCompletion(localStorage.token, { From 28e44452ddac11fa77aafb18037c6b3b2adcdaab Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Fri, 23 May 2025 09:51:05 +0800 Subject: [PATCH 048/144] i18n: Update & Improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 164 ++++++++++---------- 1 file changed, 82 insertions(+), 82 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index ee5807140..1d9d9beb5 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -1,8 +1,8 @@ { "-1 for no limit, or a positive integer for a specific limit": "-1 表示无限制,正整数表示具体限制", - "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示无过期时间。", - "(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`)", - "(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`)", + "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' 或 '-1' 表示无过期时间", + "(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如:`sh webui.sh --api --api-auth username_password`)", + "(e.g. `sh webui.sh --api`)": "(例如:`sh webui.sh --api`)", "(latest)": "(最新版)", "(leave blank for to use commercial endpoint)": "(留空以使用商业端点)", "(Ollama)": "(Ollama)", @@ -13,7 +13,7 @@ "{{user}}'s Chats": "{{user}} 的对话记录", "{{webUIName}} Backend Required": "{{webUIName}} 需要后端服务", "*Prompt node ID(s) are required for image generation": "*图片生成需要 Prompt node ID", - "A new version (v{{LATEST_VERSION}}) is now available.": "新版本(v{{LATEST_VERSION}})现已发布。", + "A new version (v{{LATEST_VERSION}}) is now available.": "新版本(v{{LATEST_VERSION}})现已发布", "A task model is used when performing tasks such as generating titles for chats and web search queries": "任务模型用于执行生成对话标题和联网搜索查询等任务", "a user": "用户", "About": "关于", @@ -47,7 +47,7 @@ "Add text content": "添加文本内容", "Add User": "添加用户", "Add User Group": "添加权限组", - "Adjusting these settings will apply changes universally to all users.": "调整这些设置将会对所有用户应用更改。", + "Adjusting these settings will apply changes universally to all users.": "调整这些设置将会对所有用户应用更改", "admin": "管理员", "Admin": "管理员联系方式", "Admin Panel": "管理员面板", @@ -88,7 +88,7 @@ "Analyzing...": "正在分析...", "and": "和", "and {{COUNT}} more": "还有 {{COUNT}} 个", - "and create a new shared link.": "并创建一个新的分享链接。", + "and create a new shared link.": "并创建一个新的分享链接", "Android": "Android", "API Base URL": "API 请求地址", "API Key": "API 密钥", @@ -155,10 +155,10 @@ "Brave Search API Key": "Brave Search API 密钥", "By {{name}}": "由 {{name}} 提供", "Bypass Embedding and Retrieval": "绕过嵌入和检索", - "Bypass Web Loader": "", + "Bypass Web Loader": "绕过网页加载器", "Calendar": "日历", "Call": "呼叫", - "Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能。", + "Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能", "Camera": "摄像头", "Cancel": "取消", "Capabilities": "能力", @@ -192,18 +192,18 @@ "Clear memory": "清除记忆", "Clear Memory": "清除记忆", "click here": "点击此处", - "Click here for filter guides.": "点击此处查看 filter 指南。", + "Click here for filter guides.": "点击此处查看 filter 指南", "Click here for help.": "点击这里获取帮助。", "Click here to": "点击", - "Click here to download user import template file.": "点击此处下载用户导入所需的模板文件。", + "Click here to download user import template file.": "点击此处下载用户导入所需的模板文件", "Click here to learn more about faster-whisper and see the available models.": "点击此处了解更多关于faster-whisper的信息,并查看可用的模型。", - "Click here to see available models.": "单击此处查看可用模型。", + "Click here to see available models.": "单击此处查看可用模型", "Click here to select": "点击这里选择", "Click here to select a csv file.": "点击此处选择 csv 文件。", "Click here to select a py file.": "点击此处选择 py 文件。", - "Click here to upload a workflow.json file.": "点击此处上传 workflow.json 文件。", + "Click here to upload a workflow.json file.": "点击此处上传 workflow.json 文件", "click here.": "点击这里。", - "Click on the user role button to change a user's role.": "点击角色前方的组别按钮以更改用户所属权限组。", + "Click on the user role button to change a user's role.": "点击角色前方的组别按钮以更改用户所属权限组", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "写入剪贴板时被拒绝。请检查浏览器设置,授予必要权限。", "Clone": "复制", "Clone Chat": "克隆聊天", @@ -223,7 +223,7 @@ "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI API 密钥", "ComfyUI Base URL": "ComfyUI URL", - "ComfyUI Base URL is required.": "ComfyUI URL 必需填写。", + "ComfyUI Base URL is required.": "ComfyUI URL 必需填写", "ComfyUI Workflow": "ComfyUI 工作流", "ComfyUI Workflow Nodes": "ComfyUI 工作流节点", "Command": "命令", @@ -234,8 +234,8 @@ "Confirm Password": "确认密码", "Confirm your action": "确定吗?", "Confirm your new password": "确认新密码", - "Connect to your own OpenAI compatible API endpoints.": "连接到你自己的与 OpenAI 兼容的 API 接口端点。", - "Connect to your own OpenAPI compatible external tool servers.": "连接到您自己的兼容 OpenAPI 的外部工具服务器。", + "Connect to your own OpenAI compatible API endpoints.": "连接到你自己的与 OpenAI 兼容的 API 接口端点", + "Connect to your own OpenAPI compatible external tool servers.": "连接到您自己的兼容 OpenAPI 的外部工具服务器", "Connection failed": "连接失败", "Connection successful": "连接成功", "Connection Type": "连接类型", @@ -276,7 +276,7 @@ "Create new key": "创建新密钥", "Create new secret key": "创建新安全密钥", "Create Note": "创建笔记", - "Create your first note by clicking on the plus button below.": "单击下面的加号按钮创建您的第一个笔记。", + "Create your first note by clicking on the plus button below.": "单击下面的加号按钮创建您的第一个笔记", "Created at": "创建于", "Created At": "创建于", "Created by": "作者", @@ -330,7 +330,7 @@ "Didn't fully follow instructions": "没有完全遵照指示", "Direct": "直接", "Direct Connections": "直接连接", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接功能允许用户连接至其自有的、兼容 OpenAI 的 API 端点。", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户接入自有的 OpenAI 兼容 API 端点", "Direct Connections settings updated": "直接连接设置已更新", "Direct Tool Servers": "直接连接工具服务器", "Disabled": "禁用", @@ -338,7 +338,7 @@ "Discover a model": "发现更多模型", "Discover a prompt": "发现更多提示词", "Discover a tool": "发现更多工具", - "Discover how to use Open WebUI and seek support from the community.": "了解如何使用 Open WebUI 并寻求社区支持。", + "Discover how to use Open WebUI and seek support from the community.": "了解如何使用 Open WebUI 并寻求社区支持", "Discover wonders": "发现奇迹", "Discover, download, and explore custom functions": "发现、下载并探索更多函数", "Discover, download, and explore custom prompts": "发现、下载并探索更多自定义提示词", @@ -350,20 +350,20 @@ "Display the username instead of You in the Chat": "在对话中显示用户名而不是“你”", "Displays citations in the response": "在回复中显示引用", "Dive into knowledge": "深入知识的海洋", - "Do not install functions from sources you do not fully trust.": "切勿安装来源不完全可信的函数。", - "Do not install tools from sources you do not fully trust.": "切勿安装来源不完全可信的工具。", + "Do not install functions from sources you do not fully trust.": "切勿安装来源不完全可信的函数", + "Do not install tools from sources you do not fully trust.": "切勿安装来源不完全可信的工具", "Docling": "Docling", "Docling Server URL required.": "需要提供 Docling 服务器 URL", "Document": "文档", "Document Intelligence": "Document Intelligence", - "Document Intelligence endpoint and key required.": "需要 Document Intelligence 端点和密钥。", + "Document Intelligence endpoint and key required.": "需要 Document Intelligence 端点和密钥", "Documentation": "帮助文档", "Documents": "文档", "does not make any external connections, and your data stays securely on your locally hosted server.": "不会与外部建立任何连接,您的数据会安全地存储在本地托管的服务器上。", "Domain Filter List": "域名过滤列表", "Don't have an account?": "没有账号?", - "don't install random functions from sources you don't trust.": "切勿随意从不完全可信的来源安装函数。", - "don't install random tools from sources you don't trust.": "切勿随意从不完全可信的来源安装工具。", + "don't install random functions from sources you don't trust.": "切勿随意从不完全可信的来源安装函数", + "don't install random tools from sources you don't trust.": "切勿随意从不完全可信的来源安装工具", "Don't like the style": "不喜欢这个文风", "Done": "完成", "Download": "下载", @@ -373,9 +373,9 @@ "Drag and drop a file to upload or select a file to view": "拖动文件上传或选择文件查看", "Draw": "平局", "Drop any files here to upload": "将任何文件拖放到此处进行上传", - "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如 '30s','10m'。有效的时间单位是秒:'s',分:'m',时:'h'。", - "e.g. \"json\" or a JSON schema": "例如 \"json\" 或一个 JSON schema", - "e.g. 60": "例如 '60'", + "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "例如:'30s','10m'。有效的时间单位是秒:'s',分:'m',时:'h'", + "e.g. \"json\" or a JSON schema": "例如:\"json\" 或一个 JSON schema", + "e.g. 60": "例如:'60'", "e.g. A filter to remove profanity from text": "例如:一个用于过滤文本中不当内容的过滤器", "e.g. My Filter": "例如:我的过滤器", "e.g. My Tools": "例如:我的工具", @@ -494,7 +494,7 @@ "Enter system prompt here": "在这里输入系统提示词 (Prompt)", "Enter Tavily API Key": "输入 Tavily API 密钥", "Enter Tavily Extract Depth": "输入 Tavily 提取深度", - "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "输入 WebUI 的公共 URL。此 URL 将用于在通知中生成链接。", + "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "输入 WebUI 的公共 URL。此 URL 将用于在通知中生成链接", "Enter Tika Server URL": "输入 Tika 服务器地址", "Enter timeout in seconds": "输入以秒为单位的超时时间", "Enter to Send": "Enter 键发送", @@ -580,7 +580,7 @@ "File Mode": "文件模式", "File not found.": "文件未找到。", "File removed successfully.": "文件成功删除", - "File size should not exceed {{maxSize}} MB.": "文件大小不应超过 {{maxSize}} MB。", + "File size should not exceed {{maxSize}} MB.": "文件大小不应超过 {{maxSize}} MB", "File Upload": "文件上传", "File uploaded successfully": "文件上传成功", "Files": "文件", @@ -593,14 +593,14 @@ "Fluidly stream large external response chunks": "流畅地传输外部大型响应块数据", "Focus chat input": "聚焦对话输入", "Folder deleted successfully": "分组删除成功", - "Folder name cannot be empty.": "分组名称不能为空。", + "Folder name cannot be empty.": "分组名称不能为空", "Folder name updated successfully": "分组名称更新成功。", "Followed instructions perfectly": "完全按照指示执行", "Forge new paths": "开拓新道路", "Form": "手动创建", "Format your variables using brackets like this:": "使用括号格式化你的变量,如下所示:", "Forwards system user session credentials to authenticate": "转发系统用户 session 凭证以进行身份\u200b\u200b验证", - "Frequency Penalty": "频率惩罚", + "Frequency Penalty": "频率惩罚 (Frequency Penalty)", "Full Context Mode": "完整上下文模式", "Function": "函数", "Function Calling": "函数调用 (Function Calling)", @@ -613,11 +613,11 @@ "Function Name": "函数名称", "Function updated successfully": "函数更新成功", "Functions": "函数", - "Functions allow arbitrary code execution.": "注意:函数有权执行任意代码。", + "Functions allow arbitrary code execution.": "注意:函数有权执行任意代码", "Functions imported successfully": "函数导入成功", "Gemini": "Gemini", "Gemini API Config": "Gemini API 配置", - "Gemini API Key is required.": "需要 Gemini API 密钥。", + "Gemini API Key is required.": "需要 Gemini API 密钥", "General": "通用", "Generate": "生成", "Generate an image": "生成图像", @@ -639,7 +639,7 @@ "Group updated successfully": "权限组更新成功", "Groups": "权限组", "Haptic Feedback": "震动反馈", - "has no conversations.": "没有对话。", + "has no conversations.": "没有对话", "Hello, {{name}}": "您好,{{name}}", "Help": "帮助", "Help us create the best community leaderboard by sharing your feedback history!": "分享您的反馈历史记录,共建最佳模型社区排行榜!", @@ -694,7 +694,7 @@ "is typing...": "输入中...", "January": "一月", "Jina API Key": "Jina API 密钥", - "join our Discord for help.": "加入我们的 Discord 寻求帮助。", + "join our Discord for help.": "加入我们的 Discord 寻求帮助", "JSON": "JSON", "JSON Preview": "JSON 预览", "July": "七月", @@ -726,25 +726,25 @@ "LDAP": "LDAP", "LDAP server updated": "LDAP 服务器已更新", "Leaderboard": "排行榜", - "Learn more about OpenAPI tool servers.": "进一步了解 OpenAPI 工具服务器。", + "Learn more about OpenAPI tool servers.": "进一步了解 OpenAPI 工具服务器", "Leave empty for unlimited": "留空表示无限制", "Leave empty to include all models from \"{{url}}\" endpoint": "留空以包含来自 \"{{url}}\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "留空以包含来自 \"{{url}}/api/tags\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/models\" endpoint": "留空以包含来自 \"{{url}}/models\" 端点的所有模型", "Leave empty to include all models or select specific models": "留空表示包含所有模型或请选择模型", - "Leave empty to use the default prompt, or enter a custom prompt": "留空以使用默认提示词,或输入自定义提示词。", - "Leave model field empty to use the default model.": "将模型字段留空以使用默认模型。", + "Leave empty to use the default prompt, or enter a custom prompt": "留空以使用默认提示词,或输入自定义提示词", + "Leave model field empty to use the default model.": "将模型字段留空以使用默认模型", "License": "授权", "Light": "浅色", "Listening...": "正在倾听...", "Llama.cpp": "Llama.cpp", - "LLMs can make mistakes. Verify important information.": "大语言模型可能会生成误导性错误信息,请对关键信息加以验证。", + "LLMs can make mistakes. Verify important information.": "大语言模型可能会生成误导性错误信息,请对关键信息加以验证", "Loader": "加载器", "Loading Kokoro.js...": "载入 Kokoro.js...", "Local": "本地", "Local Task Model": "本地任务模型", "Location access not allowed": "不允许访问位置信息", - "Logit Bias": "Logit 偏置", + "Logit Bias": "Logit 偏置 (Logit Bias)", "Lost": "落败", "LTR": "从左至右", "Made by Open WebUI Community": "由 OpenWebUI 社区制作", @@ -765,7 +765,7 @@ "Max Upload Size": "最大上传大小", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。", "May": "五月", - "Memories accessible by LLMs will be shown here.": "大语言模型可访问的记忆将在此显示。", + "Memories accessible by LLMs will be shown here.": "大语言模型可访问的记忆将在此显示", "Memory": "记忆", "Memory added successfully": "记忆添加成功", "Memory cleared successfully": "记忆清除成功", @@ -785,8 +785,8 @@ "Mistral OCR": "Mistral OCR", "Mistral OCR API Key required.": "需要 Mistral OCR API 密钥。", "Model": "模型", - "Model '{{modelName}}' has been successfully downloaded.": "模型'{{modelName}}'已成功下载。", - "Model '{{modelTag}}' is already in queue for downloading.": "模型'{{modelTag}}'已在下载队列中。", + "Model '{{modelName}}' has been successfully downloaded.": "模型'{{modelName}}'已成功下载", + "Model '{{modelTag}}' is already in queue for downloading.": "模型'{{modelTag}}'已在下载队列中", "Model {{modelId}} not found": "未找到模型 {{modelId}}", "Model {{modelName}} is not vision capable": "模型 {{modelName}} 不支持视觉能力", "Model {{name}} is now {{status}}": "模型 {{name}} 现在是 {{status}}", @@ -926,12 +926,12 @@ "Playwright Timeout (ms)": "Playwright 超时时间 (ms)", "Playwright WebSocket URL": "Playwright WebSocket URL", "Please carefully review the following warnings:": "请仔细阅读以下警告信息:", - "Please do not close the settings page while loading the model.": "加载模型时请不要关闭设置页面。", + "Please do not close the settings page while loading the model.": "加载模型时请不要关闭设置页面", "Please enter a prompt": "请输入一个 Prompt", "Please enter a valid path": "请输入有效路径", "Please enter a valid URL": "请输入有效 URL", "Please fill in all fields.": "请填写所有字段。", - "Please select a model first.": "请先选择一个模型。", + "Please select a model first.": "请先选择一个模型", "Please select a model.": "请选择一个模型。", "Please select a reason": "请选择原因", "Port": "端口", @@ -945,7 +945,7 @@ "Private": "私有", "Profile Image": "用户头像", "Prompt": "提示词 (Prompt)", - "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示词(例如:给我讲一个关于罗马帝国的趣事。)", + "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示词(例如:给我讲一个关于罗马帝国的趣事)", "Prompt Autocompletion": "提示词自动补全", "Prompt Content": "提示词内容", "Prompt created successfully": "提示词创建成功", @@ -963,7 +963,7 @@ "Re-rank models by topic similarity": "根据主题相似性对模型重新排序", "Read": "只读", "Read Aloud": "朗读", - "Reasoning Effort": "推理努力", + "Reasoning Effort": "推理努力 (Reasoning Effort)", "Record": "录制", "Record voice": "录音", "Redirecting you to Open WebUI Community": "正在将您重定向到 OpenWebUI 社区", @@ -975,7 +975,7 @@ "Reindex": "重建索引", "Reindex Knowledge Base Vectors": "重建知识库向量", "Release Notes": "更新日志", - "Releases": "", + "Releases": "发行版", "Relevance": "相关性", "Relevance Threshold": "相关性阈值", "Remove": "移除", @@ -1045,8 +1045,8 @@ "Select a function": "选择一个函数", "Select a group": "选择一个权限组", "Select a model": "选择一个模型", - "Select a pipeline": "选择一个管道", - "Select a pipeline url": "选择一个管道 URL", + "Select a pipeline": "选择一个 Pipeline", + "Select a pipeline url": "选择一个 Pipeline URL", "Select a tool": "选择一个工具", "Select an auth method": "选择身份验证方式", "Select an Ollama instance": "选择一个 Ollama 实例。", @@ -1087,7 +1087,7 @@ "Sets the size of the context window used to generate the next token.": "设置用于生成下一个 Token 的上下文窗口的大小。", "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.": "设置要使用的停止序列。遇到这种模式时,大语言模型将停止生成文本并返回。可以通过在模型文件中指定多个单独的停止参数来设置多个停止模式。", "Settings": "设置", - "Settings saved successfully!": "设置已成功保存!", + "Settings saved successfully!": "设置已成功保存!", "Share": "分享", "Share Chat": "分享对话", "Share to Open WebUI Community": "分享到 OpenWebUI 社区", @@ -1117,13 +1117,13 @@ "Speech-to-Text Engine": "语音转文本引擎", "Stop": "停止", "Stop Sequence": "停止序列 (Stop Sequence)", - "Stream Chat Response": "以流式返回对话响应", + "Stream Chat Response": "流式对话响应 (Stream Chat Response)", "STT Model": "语音转文本模型", "STT Settings": "语音转文本设置", "Stylized PDF Export": "风格化 PDF 导出", "Subtitle (e.g. about the Roman Empire)": "副标题(例如:关于罗马帝国的副标题)", "Success": "成功", - "Successfully updated.": "成功更新。", + "Successfully updated.": "成功更新", "Suggested": "建议", "Support": "支持", "Support this plugin:": "支持此插件", @@ -1182,25 +1182,25 @@ "Thought for {{DURATION}}": "思考用时 {{DURATION}}", "Thought for {{DURATION}} seconds": "思考用时 {{DURATION}} 秒", "Tika": "Tika", - "Tika Server URL required.": "请输入 Tika 服务器地址。", + "Tika Server URL required.": "请输入 Tika 服务器地址", "Tiktoken": "Tiktoken", "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "提示:在每次替换后,在对话输入中按 Tab 键可以连续更新多个变量。", "Title": "标题", - "Title (e.g. Tell me a fun fact)": "标题(例如:给我讲一个有趣的事实)", + "Title (e.g. Tell me a fun fact)": "标题(例如:给我讲一个有趣的冷知识)", "Title Auto-Generation": "自动生成标题", - "Title cannot be an empty string.": "标题不能为空。", + "Title cannot be an empty string.": "标题不能为空", "Title Generation": "标题生成", "Title Generation Prompt": "用于自动生成标题的提示词", - "TLS": "传输层安全协议", + "TLS": "TLS", "To access the available model names for downloading,": "要访问可下载的模型名称,", "To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "请联系管理员以访问。管理员可以在后台管理面板中管理用户状态。", - "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "要在这里附加知识库,请先将其添加到工作空间中的“知识库”。", - "To learn more about available endpoints, visit our documentation.": "要了解有关可用端点的更多信息,请访问我们的文档。", + "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "要在这里附加知识库,请先将其添加到工作空间中的“知识库”", + "To learn more about available endpoints, visit our documentation.": "要了解有关可用端点的更多信息,请访问我们的文档", "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.": "为了保护您的隐私,只有评分、模型ID、标签和元数据会从您的反馈中分享——您的聊天记录将保持私密,不会被包含在内。", - "To select actions here, add them to the \"Functions\" workspace first.": "要在这里选择自动化,请先将其添加到工作空间中的“函数”。", - "To select filters here, add them to the \"Functions\" workspace first.": "要在这里选择过滤器,请先将其添加到工作空间中的“函数”。", - "To select toolkits here, add them to the \"Tools\" workspace first.": "要在这里选择工具包,请先将其添加到工作空间中的“工具”。", + "To select actions here, add them to the \"Functions\" workspace first.": "要在这里选择自动化,请先将其添加到工作空间中的“函数”", + "To select filters here, add them to the \"Functions\" workspace first.": "要在这里选择过滤器,请先将其添加到工作空间中的“函数”", + "To select toolkits here, add them to the \"Tools\" workspace first.": "要在这里选择工具包,请先将其添加到工作空间中的“工具”", "Toast notifications for new updates": "更新后弹窗提示更新内容", "Today": "今天", "Toggle search": "切换搜索", @@ -1221,7 +1221,7 @@ "Tools Access": "访问工具", "Tools are a function calling system with arbitrary code execution": "工具是一个具有任意代码执行能力的函数调用系统", "Tools Function Calling Prompt": "工具函数调用提示词", - "Tools have a function calling system that allows arbitrary code execution.": "注意:工具有权执行任意代码。", + "Tools have a function calling system that allows arbitrary code execution.": "注意:工具有权执行任意代码", "Tools Public Sharing": "工具公开分享", "Top K": "Top K", "Top K Reranker": "Top K Reranker", @@ -1234,7 +1234,7 @@ "TTS Voice": "文本转语音音色", "Type": "类型", "Type Hugging Face Resolve (Download) URL": "输入 Hugging Face 解析(下载)URL", - "Uh-oh! There was an issue with the response.": "啊哦!回复有问题。", + "Uh-oh! There was an issue with the response.": "啊哦!回复有问题", "UI": "界面", "Unarchive All": "取消所有存档", "Unarchive All Archived Chats": "取消所有已存档的对话", @@ -1246,7 +1246,7 @@ "Untitled": "无标题", "Update": "更新", "Update and Copy Link": "更新和复制链接", - "Update for the latest features and improvements.": "更新来获得最新功能与改进。", + "Update for the latest features and improvements.": "更新来获得最新功能与改进", "Update password": "更新密码", "Updated": "已更新", "Updated at": "更新于", @@ -1263,28 +1263,28 @@ "URL": "URL", "URL Mode": "URL 模式", "Usage": "用量", - "Use '#' in the prompt input to load and include your knowledge.": "在输入框中输入 '#' 号来加载你需要的知识库内容。", + "Use '#' in the prompt input to load and include your knowledge.": "在输入框中输入 '#' 号来加载你需要的知识库内容", "Use Gravatar": "使用来自 Gravatar 的头像", - "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限。", + "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限", "Use Initials": "使用首个字符作为头像", - "Use no proxy to fetch page contents.": "不使用代理获取页面内容。", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "使用由 http_proxy 和 https_proxy 环境变量指定的代理获取页面内容。", + "Use no proxy to fetch page contents.": "不使用代理获取页面内容", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "使用由 http_proxy 和 https_proxy 环境变量指定的代理获取页面内容", "use_mlock (Ollama)": "use_mlock(Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "用户", "User": "用户", - "User location successfully retrieved.": "成功检索到用户位置。", + "User location successfully retrieved.": "成功检索到用户位置", "User Webhooks": "用户 Webhook", "Username": "用户名", "Users": "用户", - "Using the default arena model with all models. Click the plus button to add custom models.": "竞技场模型默认使用所有模型。单击加号按钮添加自定义模型。", + "Using the default arena model with all models. Click the plus button to add custom models.": "竞技场模型默认使用所有模型。单击加号按钮添加自定义模型", "Utilize": "利用", "Valid time units:": "有效时间单位:", "Valves": "值", "Valves updated": "已更新值", "Valves updated successfully": "值更新成功", "variable": "变量", - "variable to have them replaced with clipboard content.": "变量将被剪贴板内容替换。", + "variable to have them replaced with clipboard content.": "变量将被剪贴板内容替换", "Verify Connection": "验证连接", "Verify SSL Certificate": "验证 SSL 证书", "Version": "版本", @@ -1297,9 +1297,9 @@ "Voice Input": "语音输入", "Warning": "警告", "Warning:": "警告:", - "Warning: Enabling this will allow users to upload arbitrary code on the server.": "警告:启用此功能将允许用户在服务器上上传任意代码。", - "Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告:如果您修改了语义向量模型,则需要重新导入所有文档。", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "警告:Jupyter 执行允许任意代码执行,存在严重的安全风险——请极其谨慎地操作。", + "Warning: Enabling this will allow users to upload arbitrary code on the server.": "警告:启用此功能将允许用户在服务器上上传任意代码", + "Warning: If you update or change your embedding model, you will need to re-import all documents.": "警告:如果您修改了语义向量模型,则需要重新导入所有文档", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "警告:Jupyter 执行允许任意代码执行,存在严重的安全风险——请极其谨慎地操作", "Web": "网页", "Web API": "网页 API", "Web Loader Engine": "网页加载引擎", @@ -1327,7 +1327,7 @@ "Workspace Permissions": "工作空间权限", "Write": "写作", "Write a prompt suggestion (e.g. Who are you?)": "写一个提示词建议(例如:你是谁?)", - "Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]。", + "Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]", "Write something...": "单击以键入内容...", "Write your model template content here": "在此写入模型模板内容", "Yacy Instance URL": "Yacy Instance URL", @@ -1338,13 +1338,13 @@ "You are currently using a trial license. Please contact support to upgrade your license.": "当前为试用许可证,请联系支持人员升级许可证。", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "每次对话最多仅能附上 {{maxCount}} 个文件。", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "通过点击下方的“管理”按钮,你可以添加记忆,以个性化大语言模型的互动,使其更有用,更符合你的需求。", - "You cannot upload an empty file.": "请勿上传空文件。", - "You do not have permission to upload files.": "你没有上传文件的权限。", - "You have no archived conversations.": "没有已归档的对话。", + "You cannot upload an empty file.": "请勿上传空文件", + "You do not have permission to upload files.": "你没有上传文件的权限", + "You have no archived conversations.": "没有已归档的对话", "You have shared this chat": "此对话已经分享过", - "You're a helpful assistant.": "你是一个有帮助的助手。", - "You're now logged in.": "已登录。", - "Your account status is currently pending activation.": "您的账号当前状态为待激活。", + "You're a helpful assistant.": "你是一个有帮助的助手", + "You're now logged in.": "已登录", + "Your account status is currently pending activation.": "您的账号当前状态为待激活", "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.": "您的全部捐款将直接给到插件开发者,Open WebUI 不会收取任何比例。但众筹平台可能会有服务费、抽成。", "Youtube": "YouTube", "Youtube Language": "Youtube 语言", From ed9a2c295c15a12fffa6cb61dc164ce6750f501d Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Fri, 23 May 2025 12:34:30 +0800 Subject: [PATCH 049/144] i18n: Update & Improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 1d9d9beb5..0d0ee08e0 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -442,12 +442,12 @@ "Enter Document Intelligence Key": "输入 Document Intelligence 密钥", "Enter domains separated by commas (e.g., example.com,site.org)": "输入以逗号分隔的域名(例如:example.com,site.org)", "Enter Exa API Key": "输入 Exa API 密钥", - "Enter External Document Loader API Key": "输入外部 Document Loader API 密钥", - "Enter External Document Loader URL": "输入外部 Document Loader URL", - "Enter External Web Loader API Key": "输入外部 Web Loader API 密钥", - "Enter External Web Loader URL": "输入外部 Web Loader URL", - "Enter External Web Search API Key": "输入外部 Web Search API 密钥", - "Enter External Web Search URL": "输入外部 Web Search URL", + "Enter External Document Loader API Key": "输入外部文档加载器 API 密钥", + "Enter External Document Loader URL": "输入外部文档加载器 URL", + "Enter External Web Loader API Key": "输入外部网页加载器 API 密钥", + "Enter External Web Loader URL": "输入外部网页加载器 URL", + "Enter External Web Search API Key": "输入外部联网搜索 API 密钥", + "Enter External Web Search URL": "输入外部联网搜索 URL", "Enter Firecrawl API Base URL": "输入 Firecrawl API URL", "Enter Firecrawl API Key": "输入 Firecrawl API 密钥", "Enter Github Raw URL": "输入 Github Raw 地址", @@ -551,12 +551,12 @@ "Export to CSV": "导出到 CSV", "Export Tools": "导出工具", "External": "外部", - "External Document Loader URL required.": "外部 Document Loader URL 必需填写", + "External Document Loader URL required.": "外部文档加载器 URL 必需填写", "External Task Model": "外部任务模型", - "External Web Loader API Key": "外部 Web Loader API 密钥", - "External Web Loader URL": "外部 Web Loader API URL", - "External Web Search API Key": "外部 Web Search API 密钥", - "External Web Search URL": "外部 Web Search API URL", + "External Web Loader API Key": "外部网页加载器 API 密钥", + "External Web Loader URL": "外部网页加载器 API URL", + "External Web Search API Key": "外部联网搜索 API 密钥", + "External Web Search URL": "外部联网搜索 API URL", "Failed to add file.": "添加文件失败。", "Failed to connect to {{URL}} OpenAPI tool server": "无法连接到 {{URL}} OpenAPI 工具服务器", "Failed to create API Key.": "无法创建 API 密钥。", @@ -1305,8 +1305,8 @@ "Web Loader Engine": "网页加载引擎", "Web Search": "联网搜索", "Web Search Engine": "联网搜索引擎", - "Web Search in Chat": "聊天中的网页搜索", - "Web Search Query Generation": "网页搜索关键词生成", + "Web Search in Chat": "聊天中的联网搜索", + "Web Search Query Generation": "联网搜索关键词生成", "Webhook URL": "Webhook URL", "WebUI Settings": "WebUI 设置", "WebUI URL": "WebUI URL", From 4025c96d0f0f8a50474f9a4086195a83f563628f Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Fri, 23 May 2025 12:39:45 +0800 Subject: [PATCH 050/144] i18n: Update zh-TW --- src/lib/i18n/locales/zh-TW/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 81832549d..60f718705 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -155,7 +155,7 @@ "Brave Search API Key": "Brave 搜尋 API 金鑰", "By {{name}}": "由 {{name}} 製作", "Bypass Embedding and Retrieval": "繞過嵌入與檢索", - "Bypass Web Loader": "", + "Bypass Web Loader": "繞過網頁載入器", "Calendar": "日曆", "Call": "通話", "Call feature is not supported when using Web STT engine": "使用網頁語音辨識 (Web STT) 引擎時不支援通話功能", @@ -975,7 +975,7 @@ "Reindex": "重新索引", "Reindex Knowledge Base Vectors": "重新索引知識庫向量", "Release Notes": "釋出説明", - "Releases": "", + "Releases": "發行版", "Relevance": "相關性", "Relevance Threshold": "相關性閾值", "Remove": "移除", From aa6648ba8a3af85cdba4d38ad64e794e337d4429 Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Fri, 23 May 2025 15:46:03 +0800 Subject: [PATCH 051/144] i18n: Update & Improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 0d0ee08e0..cc932ab39 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -235,7 +235,7 @@ "Confirm your action": "确定吗?", "Confirm your new password": "确认新密码", "Connect to your own OpenAI compatible API endpoints.": "连接到你自己的与 OpenAI 兼容的 API 接口端点", - "Connect to your own OpenAPI compatible external tool servers.": "连接到您自己的兼容 OpenAPI 的外部工具服务器", + "Connect to your own OpenAPI compatible external tool servers.": "连接到你自己的兼容 OpenAPI 的外部工具服务器", "Connection failed": "连接失败", "Connection successful": "连接成功", "Connection Type": "连接类型", @@ -309,15 +309,15 @@ "Delete All Models": "删除所有模型", "Delete chat": "删除对话记录", "Delete Chat": "删除对话记录", - "Delete chat?": "删除对话记录?", - "Delete folder?": "删除分组?", - "Delete function?": "删除函数?", + "Delete chat?": "要删除此对话记录吗?", + "Delete folder?": "要删除此分组吗?", + "Delete function?": "要删除此函数吗?", "Delete Message": "删除消息", - "Delete message?": "删除消息?", - "Delete note?": "删除笔记?", - "Delete prompt?": "删除提示词?", + "Delete message?": "要删除此消息吗?", + "Delete note?": "要删除此笔记吗?", + "Delete prompt?": "要删除此提示词吗?", "delete this link": "此处删除这个链接", - "Delete tool?": "删除工具?", + "Delete tool?": "要删除此工具吗?", "Delete User": "删除用户", "Deleted {{deleteModelTag}}": "已删除 {{deleteModelTag}}", "Deleted {{name}}": "已删除 {{name}}", @@ -554,9 +554,9 @@ "External Document Loader URL required.": "外部文档加载器 URL 必需填写", "External Task Model": "外部任务模型", "External Web Loader API Key": "外部网页加载器 API 密钥", - "External Web Loader URL": "外部网页加载器 API URL", + "External Web Loader URL": "外部网页加载器 URL", "External Web Search API Key": "外部联网搜索 API 密钥", - "External Web Search URL": "外部联网搜索 API URL", + "External Web Search URL": "外部联网搜索 URL", "Failed to add file.": "添加文件失败。", "Failed to connect to {{URL}} OpenAPI tool server": "无法连接到 {{URL}} OpenAPI 工具服务器", "Failed to create API Key.": "无法创建 API 密钥。", From 3d2a26fe0b0dd1fa15d0fed41bf7c7ff44c4ce92 Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Fri, 23 May 2025 16:54:20 +0800 Subject: [PATCH 052/144] i18n: Update & Improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 42 ++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index cc932ab39..bfb6e7b70 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -104,12 +104,12 @@ "Archive All Chats": "归档所有对话记录", "Archived Chats": "已归档对话", "archived-chat-export": "导出已归档对话", - "Are you sure you want to clear all memories? This action cannot be undone.": "是否确认清除所有记忆?清除后无法还原", - "Are you sure you want to delete this channel?": "是否确认删除此频道?", - "Are you sure you want to delete this message?": "是否确认删除此消息?", + "Are you sure you want to clear all memories? This action cannot be undone.": "是否确认清除所有记忆?清除后无法还原。", + "Are you sure you want to delete this channel?": "你确认要删除此频道吗?", + "Are you sure you want to delete this message?": "你确认要删除此消息吗?", "Are you sure you want to unarchive all archived chats?": "是否确认取消所有已归档的对话?", - "Are you sure you want to update this user's role to **{{ROLE}}**?": "您确定要将此用户的角色更新为 **{{ROLE}}** 吗?", - "Are you sure?": "是否确定?", + "Are you sure you want to update this user's role to **{{ROLE}}**?": "您确认要将此用户的角色更新为 **{{ROLE}}** 吗?", + "Are you sure?": "你确认吗?", "Arena Models": "启用竞技场匿名评价模型", "Artifacts": "Artifacts", "Ask": "提问", @@ -132,7 +132,7 @@ "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api 鉴权字符串", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 URL", - "AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 URL。", + "AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 URL", "Available list": "可用列表", "Available Tools": "可用工具", "available!": "版本可用!", @@ -193,16 +193,16 @@ "Clear Memory": "清除记忆", "click here": "点击此处", "Click here for filter guides.": "点击此处查看 filter 指南", - "Click here for help.": "点击这里获取帮助。", + "Click here for help.": "点击这里获取帮助", "Click here to": "点击", "Click here to download user import template file.": "点击此处下载用户导入所需的模板文件", "Click here to learn more about faster-whisper and see the available models.": "点击此处了解更多关于faster-whisper的信息,并查看可用的模型。", "Click here to see available models.": "单击此处查看可用模型", "Click here to select": "点击这里选择", - "Click here to select a csv file.": "点击此处选择 csv 文件。", - "Click here to select a py file.": "点击此处选择 py 文件。", + "Click here to select a csv file.": "点击此处选择 csv 文件", + "Click here to select a py file.": "点击此处选择 py 文件", "Click here to upload a workflow.json file.": "点击此处上传 workflow.json 文件", - "click here.": "点击这里。", + "click here.": "点击这里", "Click on the user role button to change a user's role.": "点击角色前方的组别按钮以更改用户所属权限组", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "写入剪贴板时被拒绝。请检查浏览器设置,授予必要权限。", "Clone": "复制", @@ -223,7 +223,7 @@ "ComfyUI": "ComfyUI", "ComfyUI API Key": "ComfyUI API 密钥", "ComfyUI Base URL": "ComfyUI URL", - "ComfyUI Base URL is required.": "ComfyUI URL 必需填写", + "ComfyUI Base URL is required.": "需要 ComfyUI 基础 URL", "ComfyUI Workflow": "ComfyUI 工作流", "ComfyUI Workflow Nodes": "ComfyUI 工作流节点", "Command": "命令", @@ -232,10 +232,10 @@ "Configure": "配置", "Confirm": "确认", "Confirm Password": "确认密码", - "Confirm your action": "确定吗?", + "Confirm your action": "确认要继续吗?", "Confirm your new password": "确认新密码", - "Connect to your own OpenAI compatible API endpoints.": "连接到你自己的与 OpenAI 兼容的 API 接口端点", - "Connect to your own OpenAPI compatible external tool servers.": "连接到你自己的兼容 OpenAPI 的外部工具服务器", + "Connect to your own OpenAI compatible API endpoints.": "连接到你自有的 OpenAI 兼容 API 的接口端点", + "Connect to your own OpenAPI compatible external tool servers.": "连接到你自有的 OpenAPI 兼容外部工具服务器", "Connection failed": "连接失败", "Connection successful": "连接成功", "Connection Type": "连接类型", @@ -330,7 +330,7 @@ "Didn't fully follow instructions": "没有完全遵照指示", "Direct": "直接", "Direct Connections": "直接连接", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户接入自有的 OpenAI 兼容 API 端点", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户接入自有的 OpenAI 兼容的 API 端点", "Direct Connections settings updated": "直接连接设置已更新", "Direct Tool Servers": "直接连接工具服务器", "Disabled": "禁用", @@ -418,7 +418,7 @@ "Enhance": "润色", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "确保您的 CSV 文件按以下顺序包含 4 列: 姓名、电子邮箱、密码、角色。", "Enter {{role}} message here": "在此处输入 {{role}} 的对话内容", - "Enter a detail about yourself for your LLMs to recall": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容", + "Enter a detail about yourself for your LLMs to recall": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容。", "Enter a title for the pending user info overlay. Leave empty for default.": "输入用户待激活界面的标题。留空使用默认", "Enter a watermark for the response. Leave empty for none.": "输入回复水印。留空则不添加", "Enter api auth string (e.g. username:password)": "输入 api 鉴权路径 (例如:用户名:密码)", @@ -518,10 +518,10 @@ "Enter your webhook URL": "输入您的 Webhook URL", "Error": "错误", "ERROR": "错误", - "Error accessing Google Drive: {{error}}": "访问 Google 云端硬盘 出错: {{error}}", + "Error accessing Google Drive: {{error}}": "访问 Google 云端硬盘 出错:{{error}}", "Error accessing media devices.": "访问媒体设备时出错。", "Error starting recording.": "开始录制时出错。", - "Error uploading file: {{error}}": "上传文件时出错: {{error}}", + "Error uploading file: {{error}}": "上传文件时出错:{{error}}", "Evaluations": "竞技场评估", "Exa API Key": "Exa API 密钥", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "例如:(&(objectClass=inetOrgPerson)(uid=%s))", @@ -551,7 +551,7 @@ "Export to CSV": "导出到 CSV", "Export Tools": "导出工具", "External": "外部", - "External Document Loader URL required.": "外部文档加载器 URL 必需填写", + "External Document Loader URL required.": "需要外部文档加载器 URL", "External Task Model": "外部任务模型", "External Web Loader API Key": "外部网页加载器 API 密钥", "External Web Loader URL": "外部网页加载器 URL", @@ -876,7 +876,7 @@ "Only select users and groups with permission can access": "只有具有权限的用户和组才能访问", "Oops! Looks like the URL is invalid. Please double-check and try again.": "此链接似乎为无效链接。请检查后重试。", "Oops! There are files still uploading. Please wait for the upload to complete.": "稍等!还有文件正在上传。请等待上传完成。", - "Oops! There was an error in the previous response.": "糟糕!有一个错误出现在了之前的回复中。", + "Oops! There was an error in the previous response.": "糟糕!有一个错误出现在了之前的回复中", "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "你正在使用不被支持的方法(仅运行前端服务)。需要后端提供 WebUI 服务。", "Open file": "打开文件", "Open in full screen": "全屏打开", @@ -888,7 +888,7 @@ "OpenAI": "OpenAI", "OpenAI API": "OpenAI API", "OpenAI API Config": "OpenAI API 配置", - "OpenAI API Key is required.": "需要 OpenAI API 密钥。", + "OpenAI API Key is required.": "需要 OpenAI API 密钥", "OpenAI API settings updated": "OpenAI API 设置已更新", "OpenAI URL/Key required.": "需要 OpenAI URL/Key", "openapi.json Path": "openapi.json 路径", From e10d6ad79cb453680301d2e45d3fcd4466eff294 Mon Sep 17 00:00:00 2001 From: Suleiman Elkhoury <108065141+suleimanelkhoury@users.noreply.github.com> Date: Fri, 23 May 2025 11:09:40 +0200 Subject: [PATCH 053/144] Fix S3 allowed characters in Tags. In Amazon S3 storage, only the following charaters allowed in Tagging "letters (a-z, A-Z), numbers (0-9), and spaces representable in UTF-8, and the following characters: + - = . _ : / @". Added a sanitizer function to clear tags before the put request. --- backend/open_webui/storage/provider.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/storage/provider.py b/backend/open_webui/storage/provider.py index 5c85f88bc..41a92fafe 100644 --- a/backend/open_webui/storage/provider.py +++ b/backend/open_webui/storage/provider.py @@ -2,6 +2,7 @@ import os import shutil import json import logging +import re from abc import ABC, abstractmethod from typing import BinaryIO, Tuple, Dict @@ -136,6 +137,11 @@ class S3StorageProvider(StorageProvider): self.bucket_name = S3_BUCKET_NAME self.key_prefix = S3_KEY_PREFIX if S3_KEY_PREFIX else "" + @staticmethod + def sanitize_tag_value(s: str) -> str: + """Only include S3 allowed characters.""" + return re.sub(r"[^a-zA-Z0-9 äöüÄÖÜß\+\-=\._:/@]", "", s) + def upload_file( self, file: BinaryIO, filename: str, tags: Dict[str, str] ) -> Tuple[bytes, str]: @@ -145,7 +151,15 @@ class S3StorageProvider(StorageProvider): try: self.s3_client.upload_file(file_path, self.bucket_name, s3_key) if S3_ENABLE_TAGGING and tags: - tagging = {"TagSet": [{"Key": k, "Value": v} for k, v in tags.items()]} + sanitized_tags = { + self.sanitize_tag_value(k): self.sanitize_tag_value(v) + for k, v in tags.items() + } + tagging = { + "TagSet": [ + {"Key": k, "Value": v} for k, v in sanitized_tags.items() + ] + } self.s3_client.put_object_tagging( Bucket=self.bucket_name, Key=s3_key, From dd8e742c2d1446a82d312054d51de8ebc26d71e0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 13:40:33 +0400 Subject: [PATCH 054/144] refac: tts details tags --- src/lib/components/chat/Chat.svelte | 14 ++++++++------ .../chat/Messages/ResponseMessage.svelte | 6 ++++-- src/lib/utils/index.ts | 5 ++--- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index d30cb811d..7cd77c30c 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -49,7 +49,8 @@ sleep, removeDetails, getPromptVariables, - processDetails + processDetails, + removeAllDetails } from '$lib/utils'; import { generateChatCompletion } from '$lib/apis/ollama'; @@ -1172,7 +1173,7 @@ // Emit chat event for TTS const messageContentParts = getMessageContentParts( - message.content, + removeAllDetails(message.content), $config?.audio?.tts?.split_on ?? 'punctuation' ); messageContentParts.pop(); @@ -1206,7 +1207,7 @@ // Emit chat event for TTS const messageContentParts = getMessageContentParts( - message.content, + removeAllDetails(message.content), $config?.audio?.tts?.split_on ?? 'punctuation' ); messageContentParts.pop(); @@ -1253,9 +1254,10 @@ // Emit chat event for TTS let lastMessageContentPart = - getMessageContentParts(message.content, $config?.audio?.tts?.split_on ?? 'punctuation')?.at( - -1 - ) ?? ''; + getMessageContentParts( + removeAllDetails(message.content), + $config?.audio?.tts?.split_on ?? 'punctuation' + )?.at(-1) ?? ''; if (lastMessageContentPart) { eventTarget.dispatchEvent( new CustomEvent('chat', { diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index deb96c153..cf16a869e 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -212,6 +212,8 @@ speaking = true; + const content = removeAllDetails(content); + if ($config.audio.tts.engine === '') { let voices = []; const getVoicesLoop = setInterval(() => { @@ -228,7 +230,7 @@ console.log(voice); - const speak = new SpeechSynthesisUtterance(message.content); + const speak = new SpeechSynthesisUtterance(content); speak.rate = $settings.audio?.tts?.playbackRate ?? 1; console.log(speak); @@ -251,7 +253,7 @@ loadingSpeech = true; const messageContentParts: string[] = getMessageContentParts( - message.content, + content, $config?.audio?.tts?.split_on ?? 'punctuation' ); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index acdcbe1c8..85bc40fd2 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -867,11 +867,10 @@ export const extractSentencesForAudio = (text: string) => { }, [] as string[]); }; -export const getMessageContentParts = (content: string, split_on: string = 'punctuation') => { - content = removeDetails(content, ['reasoning', 'code_interpreter', 'tool_calls']); +export const getMessageContentParts = (content: string, splitOn: string = 'punctuation') => { const messageContentParts: string[] = []; - switch (split_on) { + switch (splitOn) { default: case TTS_RESPONSE_SPLIT.PUNCTUATION: messageContentParts.push(...extractSentencesForAudio(content)); From 02000b1a6c709f950b77b55141509d09ad614567 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 16:49:11 +0400 Subject: [PATCH 055/144] refac: include help items in user menu --- src/lib/components/channel/Navbar.svelte | 3 +- src/lib/components/chat/Navbar.svelte | 3 +- src/lib/components/layout/Help.svelte | 40 ----------- src/lib/components/layout/Navbar.svelte | 3 +- .../components/layout/Sidebar/UserMenu.svelte | 69 ++++++++++++++++--- src/routes/(app)/+page.svelte | 2 - src/routes/(app)/c/[id]/+page.svelte | 2 - src/routes/(app)/notes/+layout.svelte | 3 +- 8 files changed, 67 insertions(+), 58 deletions(-) delete mode 100644 src/lib/components/layout/Help.svelte diff --git a/src/lib/components/channel/Navbar.svelte b/src/lib/components/channel/Navbar.svelte index 7c2bc1839..31f94fb48 100644 --- a/src/lib/components/channel/Navbar.svelte +++ b/src/lib/components/channel/Navbar.svelte @@ -57,8 +57,9 @@
{#if $user !== undefined} { if (e.detail === 'archived-chat') { showArchivedChats.set(true); diff --git a/src/lib/components/chat/Navbar.svelte b/src/lib/components/chat/Navbar.svelte index 4687dd983..12cab4d6e 100644 --- a/src/lib/components/chat/Navbar.svelte +++ b/src/lib/components/chat/Navbar.svelte @@ -154,8 +154,9 @@ {#if $user !== undefined && $user !== null} { if (e.detail === 'archived-chat') { showArchivedChats.set(true); diff --git a/src/lib/components/layout/Help.svelte b/src/lib/components/layout/Help.svelte deleted file mode 100644 index 0fe0a53b9..000000000 --- a/src/lib/components/layout/Help.svelte +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/src/lib/components/layout/Navbar.svelte b/src/lib/components/layout/Navbar.svelte index b92d5fcf3..586dbcaf1 100644 --- a/src/lib/components/layout/Navbar.svelte +++ b/src/lib/components/layout/Navbar.svelte @@ -166,8 +166,9 @@ {#if $user !== undefined} { if (e.detail === 'archived-chat') { showArchivedChats.set(true); diff --git a/src/lib/components/layout/Sidebar/UserMenu.svelte b/src/lib/components/layout/Sidebar/UserMenu.svelte index 0993c784d..e816b43e5 100644 --- a/src/lib/components/layout/Sidebar/UserMenu.svelte +++ b/src/lib/components/layout/Sidebar/UserMenu.svelte @@ -9,16 +9,25 @@ import { fade, slide } from 'svelte/transition'; import Tooltip from '$lib/components/common/Tooltip.svelte'; import { userSignOut } from '$lib/apis/auths'; + import QuestionMarkCircle from '$lib/components/icons/QuestionMarkCircle.svelte'; + import Map from '$lib/components/icons/Map.svelte'; + import Keyboard from '$lib/components/icons/Keyboard.svelte'; + import ShortcutsModal from '$lib/components/chat/ShortcutsModal.svelte'; const i18n = getContext('i18n'); export let show = false; export let role = ''; + export let help = false; export let className = 'max-w-[240px]'; + let showShortcuts = false; + const dispatch = createEventDispatcher(); + + { @@ -32,13 +41,13 @@ fade(e, { duration: 100 })} > {#if $activeUserIds?.length > 0} -
+
0 ? `${$i18n.t('Running')}: ${$USAGE_POOL.join(', ')} ✨` : ''} > -
+
{/if} - diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte index 08026e7aa..dcc0d4547 100644 --- a/src/routes/(app)/+page.svelte +++ b/src/routes/(app)/+page.svelte @@ -1,7 +1,5 @@ - diff --git a/src/routes/(app)/c/[id]/+page.svelte b/src/routes/(app)/c/[id]/+page.svelte index 2cc68782e..53a2b61f5 100644 --- a/src/routes/(app)/c/[id]/+page.svelte +++ b/src/routes/(app)/c/[id]/+page.svelte @@ -2,8 +2,6 @@ import { page } from '$app/stores'; import Chat from '$lib/components/chat/Chat.svelte'; - import Help from '$lib/components/layout/Help.svelte'; - diff --git a/src/routes/(app)/notes/+layout.svelte b/src/routes/(app)/notes/+layout.svelte index 84267b6ae..ed121d3d2 100644 --- a/src/routes/(app)/notes/+layout.svelte +++ b/src/routes/(app)/notes/+layout.svelte @@ -68,8 +68,9 @@
{#if $user !== undefined && $user !== null} { if (e.detail === 'archived-chat') { showArchivedChats.set(true); From 03288d9fcad191958cd941b33946e30b195c6f2e Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 17:30:17 +0400 Subject: [PATCH 056/144] refac: redesign --- src/lib/components/chat/MessageInput.svelte | 130 ++++++++++++-------- 1 file changed, 79 insertions(+), 51 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index de438a88b..5dabbb08c 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -151,6 +151,30 @@ .map((id) => ($models.find((model) => model.id === id) || {})?.filters ?? []) .reduce((acc, filters) => acc.filter((f1) => filters.some((f2) => f2.id === f1.id))); + let showToolsButton = false; + $: showToolsButton = toolServers.length + selectedToolIds.length > 0; + + let showWebSearchButton = false; + $: showWebSearchButton = + (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === + webSearchCapableModels.length && + $config?.features?.enable_web_search && + ($_user.role === 'admin' || $_user?.permissions?.features?.web_search); + + let showImageGenerationButton = false; + $: showImageGenerationButton = + (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === + imageGenerationCapableModels.length && + $config?.features?.enable_image_generation && + ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation); + + let showCodeInterpreterButton = false; + $: showCodeInterpreterButton = + (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === + codeInterpreterCapableModels.length && + $config?.features?.enable_code_interpreter && + ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter); + const scrollToBottom = () => { const element = document.getElementById('messages-container'); element.scrollTo({ @@ -1091,8 +1115,8 @@ {/if}
-
-
+
+
-
- {#if toolServers.length + selectedToolIds.length > 0} - - - - {/if} + + {toolServers.length + selectedToolIds.length} + + + + {/if} - {#if $_user} {#each toggleFilters as filter, filterIdx (filter.id)} {/each} - {#if (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === webSearchCapableModels.length && $config?.features?.enable_web_search && ($_user.role === 'admin' || $_user?.permissions?.features?.web_search)} + {#if showWebSearchButton} {/if} - {#if (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === imageGenerationCapableModels.length && $config?.features?.enable_image_generation && ($_user.role === 'admin' || $_user?.permissions?.features?.image_generation)} + {#if showImageGenerationButton} {/if} - {#if (atSelectedModel?.id ? [atSelectedModel.id] : selectedModels).length === codeInterpreterCapableModels.length && $config?.features?.enable_code_interpreter && ($_user.role === 'admin' || $_user?.permissions?.features?.code_interpreter)} + {#if showCodeInterpreterButton} {/if} - {/if} -
+
+ {/if}
From 62fbd6c91c79a48dba2f96f4b31a28387d2f9523 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 18:17:35 +0400 Subject: [PATCH 057/144] refac --- src/lib/components/chat/MessageInput.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 5dabbb08c..c7e56c9b4 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1231,7 +1231,7 @@ class="px-2 @xl:px-2.5 py-2 flex gap-1.5 items-center text-sm rounded-full transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden hover:bg-gray-50 dark:hover:bg-gray-800 {selectedFilterIds.includes( filter.id ) - ? 'text-sky-500 dark:text-sky-300 bg-sky-100 dark:bg-sky-200/5' + ? 'text-sky-500 dark:text-sky-300 bg-sky-50 dark:bg-sky-200/5' : 'bg-transparent text-gray-600 dark:text-gray-300 '} capitalize" > {#if filter?.icon} @@ -1263,7 +1263,7 @@ type="button" class="px-2 @xl:px-2.5 py-2 flex gap-1.5 items-center text-sm rounded-full transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden hover:bg-gray-50 dark:hover:bg-gray-800 {webSearchEnabled || ($settings?.webSearch ?? false) === 'always' - ? ' text-sky-500 dark:text-sky-300 bg-sky-100 dark:bg-sky-200/5' + ? ' text-sky-500 dark:text-sky-300 bg-sky-50 dark:bg-sky-200/5' : 'bg-transparent text-gray-600 dark:text-gray-300 '}" > @@ -1282,7 +1282,7 @@ (imageGenerationEnabled = !imageGenerationEnabled)} type="button" class="px-2 @xl:px-2.5 py-2 flex gap-1.5 items-center text-sm rounded-full transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden hover:bg-gray-50 dark:hover:bg-gray-800 {imageGenerationEnabled - ? ' text-sky-500 dark:text-sky-300 bg-sky-100 dark:bg-sky-200/5' + ? ' text-sky-500 dark:text-sky-300 bg-sky-50 dark:bg-sky-200/5' : 'bg-transparent text-gray-600 dark:text-gray-300 '}" > @@ -1301,7 +1301,7 @@ (codeInterpreterEnabled = !codeInterpreterEnabled)} type="button" class="px-2 @xl:px-2.5 py-2 flex gap-1.5 items-center text-sm rounded-full transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden hover:bg-gray-50 dark:hover:bg-gray-800 {codeInterpreterEnabled - ? ' text-sky-500 dark:text-sky-300 bg-sky-100 dark:bg-sky-200/5' + ? ' text-sky-500 dark:text-sky-300 bg-sky-50 dark:bg-sky-200/5' : 'bg-transparent text-gray-600 dark:text-gray-300 '}" > From 65d997a6c56ac88c55cdc86d714a558e8cc998c2 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 18:22:57 +0400 Subject: [PATCH 058/144] refac --- src/lib/components/admin/Settings/Interface.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/admin/Settings/Interface.svelte b/src/lib/components/admin/Settings/Interface.svelte index e6257ba96..8fb882bd8 100644 --- a/src/lib/components/admin/Settings/Interface.svelte +++ b/src/lib/components/admin/Settings/Interface.svelte @@ -45,6 +45,7 @@ const updateInterfaceHandler = async () => { taskConfig = await updateTaskConfig(localStorage.token, taskConfig); + promptSuggestions = promptSuggestions.filter((p) => p.content !== ''); promptSuggestions = await setDefaultPromptSuggestions(localStorage.token, promptSuggestions); await updateBanners(); From a50a8e2ef9befb6962b640eb1f3f4a205e6f35db Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 18:47:50 +0400 Subject: [PATCH 059/144] refac: ollama ps --- backend/open_webui/routers/ollama.py | 125 ++++++++++++++++++--------- 1 file changed, 83 insertions(+), 42 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 7c313ea97..86b4b3f7d 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -300,6 +300,22 @@ async def update_config( } +def merge_ollama_models_lists(model_lists): + merged_models = {} + + for idx, model_list in enumerate(model_lists): + if model_list is not None: + for model in model_list: + id = model["model"] + if id not in merged_models: + model["urls"] = [idx] + merged_models[id] = model + else: + merged_models[id]["urls"].append(idx) + + return list(merged_models.values()) + + @cached(ttl=1) async def get_all_models(request: Request, user: UserModel = None): log.info("get_all_models()") @@ -364,23 +380,8 @@ async def get_all_models(request: Request, user: UserModel = None): if connection_type: model["connection_type"] = connection_type - def merge_models_lists(model_lists): - merged_models = {} - - for idx, model_list in enumerate(model_lists): - if model_list is not None: - for model in model_list: - id = model["model"] - if id not in merged_models: - model["urls"] = [idx] - merged_models[id] = model - else: - merged_models[id]["urls"].append(idx) - - return list(merged_models.values()) - models = { - "models": merge_models_lists( + "models": merge_ollama_models_lists( map( lambda response: response.get("models", []) if response else None, responses, @@ -468,6 +469,72 @@ async def get_ollama_tags( return models +@router.get("/api/ps") +async def get_ollama_loaded_models(request: Request, user=Depends(get_verified_user)): + """ + List models that are currently loaded into Ollama memory, and which node they are loaded on. + """ + if request.app.state.config.ENABLE_OLLAMA_API: + request_tasks = [] + for idx, url in enumerate(request.app.state.config.OLLAMA_BASE_URLS): + if (str(idx) not in request.app.state.config.OLLAMA_API_CONFIGS) and ( + url not in request.app.state.config.OLLAMA_API_CONFIGS # Legacy support + ): + request_tasks.append(send_get_request(f"{url}/api/ps", user=user)) + else: + api_config = request.app.state.config.OLLAMA_API_CONFIGS.get( + str(idx), + request.app.state.config.OLLAMA_API_CONFIGS.get( + url, {} + ), # Legacy support + ) + + enable = api_config.get("enable", True) + key = api_config.get("key", None) + + if enable: + request_tasks.append( + send_get_request(f"{url}/api/ps", key, user=user) + ) + else: + request_tasks.append(asyncio.ensure_future(asyncio.sleep(0, None))) + + responses = await asyncio.gather(*request_tasks) + + for idx, response in enumerate(responses): + if response: + url = request.app.state.config.OLLAMA_BASE_URLS[idx] + api_config = request.app.state.config.OLLAMA_API_CONFIGS.get( + str(idx), + request.app.state.config.OLLAMA_API_CONFIGS.get( + url, {} + ), # Legacy support + ) + + prefix_id = api_config.get("prefix_id", None) + + for model in response.get("models", []): + if prefix_id: + model["model"] = f"{prefix_id}.{model['model']}" + + models = { + "models": merge_ollama_models_lists( + map( + lambda response: response.get("models", []) if response else None, + responses, + ) + ) + } + + if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL: + models["models"] = await get_filtered_models(models, user) + + else: + models = {"models": []} + + return models + + @router.get("/api/version") @router.get("/api/version/{url_idx}") async def get_ollama_versions(request: Request, url_idx: Optional[int] = None): @@ -541,32 +608,6 @@ async def get_ollama_versions(request: Request, url_idx: Optional[int] = None): return {"version": False} -@router.get("/api/ps") -async def get_ollama_loaded_models(request: Request, user=Depends(get_verified_user)): - """ - List models that are currently loaded into Ollama memory, and which node they are loaded on. - """ - if request.app.state.config.ENABLE_OLLAMA_API: - request_tasks = [ - send_get_request( - f"{url}/api/ps", - request.app.state.config.OLLAMA_API_CONFIGS.get( - str(idx), - request.app.state.config.OLLAMA_API_CONFIGS.get( - url, {} - ), # Legacy support - ).get("key", None), - user=user, - ) - for idx, url in enumerate(request.app.state.config.OLLAMA_BASE_URLS) - ] - responses = await asyncio.gather(*request_tasks) - - return dict(zip(request.app.state.config.OLLAMA_BASE_URLS, responses)) - else: - return {} - - class ModelNameForm(BaseModel): name: str From 0e6f09a0a9f676f051c5bdf4050806664c79bdcf Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 19:13:18 +0400 Subject: [PATCH 060/144] enh: ollama loaded model display --- backend/open_webui/routers/ollama.py | 21 +++-- .../chat/ModelSelector/Selector.svelte | 85 +++++++++++++------ 2 files changed, 74 insertions(+), 32 deletions(-) diff --git a/backend/open_webui/routers/ollama.py b/backend/open_webui/routers/ollama.py index 86b4b3f7d..da2e8b388 100644 --- a/backend/open_webui/routers/ollama.py +++ b/backend/open_webui/routers/ollama.py @@ -9,6 +9,8 @@ import os import random import re import time +from datetime import datetime + from typing import Optional, Union from urllib.parse import urlparse import aiohttp @@ -389,6 +391,19 @@ async def get_all_models(request: Request, user: UserModel = None): ) } + loaded_models = await get_ollama_loaded_models(request, user=user) + expires_map = { + m["name"]: m["expires_at"] + for m in loaded_models["models"] + if "expires_at" in m + } + + for m in models["models"]: + if m["name"] in expires_map: + # Parse ISO8601 datetime with offset, get unix timestamp as int + dt = datetime.fromisoformat(expires_map[m["name"]]) + m["expires_at"] = int(dt.timestamp()) + else: models = {"models": []} @@ -470,7 +485,7 @@ async def get_ollama_tags( @router.get("/api/ps") -async def get_ollama_loaded_models(request: Request, user=Depends(get_verified_user)): +async def get_ollama_loaded_models(request: Request, user=Depends(get_admin_user)): """ List models that are currently loaded into Ollama memory, and which node they are loaded on. """ @@ -525,10 +540,6 @@ async def get_ollama_loaded_models(request: Request, user=Depends(get_verified_u ) ) } - - if user.role == "user" and not BYPASS_MODEL_ACCESS_CONTROL: - models["models"] = await get_filtered_models(models, user) - else: models = {"models": []} diff --git a/src/lib/components/chat/ModelSelector/Selector.svelte b/src/lib/components/chat/ModelSelector/Selector.svelte index 5d0bf6b65..f60620996 100644 --- a/src/lib/components/chat/ModelSelector/Selector.svelte +++ b/src/lib/components/chat/ModelSelector/Selector.svelte @@ -29,6 +29,9 @@ import Switch from '$lib/components/common/Switch.svelte'; import ChatBubbleOval from '$lib/components/icons/ChatBubbleOval.svelte'; import { goto } from '$app/navigation'; + import dayjs from '$lib/dayjs'; + import relativeTime from 'dayjs/plugin/relativeTime'; + dayjs.extend(relativeTime); const i18n = getContext('i18n'); const dispatch = createEventDispatcher(); @@ -326,8 +329,17 @@ aria-label={placeholder} id="model-selector-{id}-button" > -
{ + models.set( + await getModels( + localStorage.token, + $config?.features?.enable_direct_connections && ($settings?.directConnections ?? null) + ) + ); + }} + type="button" > {#if selectedModel} {selectedModel.label} @@ -335,7 +347,7 @@ {placeholder} {/if} -
+ {item.label}
- - {#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''} -
- - {item.model.ollama?.details?.parameter_size ?? ''} - -
- {/if}
+ {#if item.model.owned_by === 'ollama'} + {#if (item.model.ollama?.details?.parameter_size ?? '') !== ''} +
+ + {item.model.ollama?.details?.parameter_size ?? ''} + +
+ {/if} + {#if item.model.ollama?.expires_at && new Date(item.model.ollama?.expires_at * 1000) > new Date()} +
+ +
+ + + + +
+
+
+ {/if} + {/if} + {#if item.model?.direct} - +
{:else if item.model.connection_type === 'external'} - +
{#if showTemporaryChatControl} -
+
+ + {/if} + + {#if value === item.value} +
+ +
+ {/if} +
{:else}
From f75ac5cc01e9dca0fefb13e8815627c439704162 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 20:06:05 +0400 Subject: [PATCH 064/144] refac: styling --- src/lib/components/chat/Settings/Audio.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/chat/Settings/Audio.svelte b/src/lib/components/chat/Settings/Audio.svelte index 9b896628d..38ed005da 100644 --- a/src/lib/components/chat/Settings/Audio.svelte +++ b/src/lib/components/chat/Settings/Audio.svelte @@ -293,7 +293,7 @@
@@ -330,7 +330,7 @@
From ed0bebc7ef9adb6573c851f8300673c97241d8dc Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 20:10:16 +0400 Subject: [PATCH 065/144] enh: granular audio playback speed --- src/lib/components/chat/Settings/Audio.svelte | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/lib/components/chat/Settings/Audio.svelte b/src/lib/components/chat/Settings/Audio.svelte index 38ed005da..a24a25ace 100644 --- a/src/lib/components/chat/Settings/Audio.svelte +++ b/src/lib/components/chat/Settings/Audio.svelte @@ -35,7 +35,6 @@ // Audio speed control let playbackRate = 1; - const speedOptions = [2, 1.75, 1.5, 1.25, 1, 0.75, 0.5]; const getVoices = async () => { if (TTSEngine === 'browser-kokoro') { @@ -270,15 +269,15 @@
{$i18n.t('Speech Playback Speed')}
-
- - {#each speedOptions as option} - - {/each} - + class=" text-sm text-right bg-transparent dark:text-gray-300 outline-hidden" + /> + x
From b9afef85c4f1d7856e5d063507b0e7086ae86cc1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 20:44:19 +0400 Subject: [PATCH 066/144] refac: advanced params --- .../Settings/Advanced/AdvancedParams.svelte | 659 +++++++++--------- 1 file changed, 330 insertions(+), 329 deletions(-) diff --git a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte index 2c4a6886e..8c2969423 100644 --- a/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte +++ b/src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte @@ -309,7 +309,7 @@ >
- {$i18n.t('Logit Bias')} + {'logit_bias'}
-
- - - {#if (params?.mirostat ?? null) !== null} -
-
- -
-
- -
-
- {/if} -
-
- {$i18n.t('Mirostat Eta')} + {'max_tokens'}
+
- {#if (params?.mirostat_eta ?? null) !== null} + {#if (params?.max_tokens ?? null) !== null}
-
-
- {/if} -
- -
- -
-
- {$i18n.t('Mirostat Tau')} -
- - -
-
- - {#if (params?.mirostat_tau ?? null) !== null} -
-
- -
-
-
@@ -518,7 +409,7 @@ >
- {$i18n.t('Top K')} + {'top_k'}
+
+ + + {#if (params?.mirostat ?? null) !== null} +
+
+ +
+
+ +
+
+ {/if} +
+ +
+ +
+
+ {'mirostat_eta'} +
+ +
+
+ + {#if (params?.mirostat_eta ?? null) !== null} +
+
+ +
+
+ +
+
+ {/if} +
+ +
+ +
+
+ {'mirostat_tau'} +
+ + +
+
+ + {#if (params?.mirostat_tau ?? null) !== null} +
+
+ +
+
+ +
+
+ {/if} +
+
- {$i18n.t('Repeat Last N')} + {'repeat_last_n'}
+
+
+ + {#if (params?.repeat_penalty ?? null) !== null} +
+
+ +
+
+ +
+
+ {/if} +
+ + {#if admin} +
+ +
+
+ {'use_mmap'} +
+ +
+
+ + {#if (params?.use_mmap ?? null) !== null} +
+
+ {params.use_mmap ? 'Enabled' : 'Disabled'} +
+
+ +
+
+ {/if} +
+ +
+ +
+
+ {'use_mlock'} +
+ + +
+
+ + {#if (params?.use_mlock ?? null) !== null} +
+
+ {params.use_mlock ? 'Enabled' : 'Disabled'} +
+ +
+ +
+
+ {/if} +
+ {/if} +
- {$i18n.t('Tokens To Keep On Context Refresh (num_keep)')} + {'num_keep'} ({$i18n.t('Ollama')})
-
-
- - {#if (params?.max_tokens ?? null) !== null} -
-
- -
-
- -
-
- {/if} -
- -
- -
-
- {$i18n.t('Repeat Penalty (Ollama)')} -
- - -
-
- - {#if (params?.repeat_penalty ?? null) !== null} -
-
- -
-
- -
-
- {/if} -
-
- {$i18n.t('Context Length')} - {$i18n.t('(Ollama)')} + {'num_ctx'} ({$i18n.t('Ollama')})
-
-
- - {#if (params?.use_mmap ?? null) !== null} -
-
- {params.use_mmap ? 'Enabled' : 'Disabled'} -
-
- -
-
- {/if} -
- -
- -
-
- {$i18n.t('use_mlock (Ollama)')} -
- - -
-
- - {#if (params?.use_mlock ?? null) !== null} -
-
- {params.use_mlock ? 'Enabled' : 'Disabled'} -
- -
- -
-
- {/if} -
-
- {$i18n.t('num_thread (Ollama)')} + {'num_thread'} ({$i18n.t('Ollama')})
+ {#if document.metadata?.parameters} +
+ {$i18n.t('Parameters')} +
+
{JSON.stringify(document.metadata.parameters, null, 2)}
+ {/if} {#if showRelevance}
{$i18n.t('Relevance')} From 3f2025dc6e0efabf1b3c382599a5790a24b81d1d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 21:55:09 +0400 Subject: [PATCH 071/144] enh: always process file with external document loader --- backend/open_webui/routers/files.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 1acecad08..ab3b35cc6 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -154,14 +154,11 @@ def upload_file( ProcessFileForm(file_id=id, content=result.get("text", "")), user=user, ) - elif file.content_type not in [ - "image/png", - "image/jpeg", - "image/gif", - "video/mp4", - "video/ogg", - "video/quicktime", - ]: + elif ( + not file.content_type.startswith(("image/", "video/")) + or request.app.state.config.CONTENT_EXTRACTION_ENGINE + == "external" + ): process_file(request, ProcessFileForm(file_id=id), user=user) else: log.info( From 6636207e0cd63dbb566201a505ac078817f9e452 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 22:10:57 +0400 Subject: [PATCH 072/144] refac --- backend/open_webui/routers/files.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index ab3b35cc6..098fcc4d6 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -154,10 +154,8 @@ def upload_file( ProcessFileForm(file_id=id, content=result.get("text", "")), user=user, ) - elif ( - not file.content_type.startswith(("image/", "video/")) - or request.app.state.config.CONTENT_EXTRACTION_ENGINE - == "external" + elif (not file.content_type.startswith(("image/", "video/"))) or ( + request.app.state.config.CONTENT_EXTRACTION_ENGINE == "external" ): process_file(request, ProcessFileForm(file_id=id), user=user) else: From bf12946ac95bfdcfd8762fa54913447dcfde18c8 Mon Sep 17 00:00:00 2001 From: Kylapaallikko Date: Fri, 23 May 2025 22:12:00 +0300 Subject: [PATCH 073/144] Update fi-FI translation.json --- src/lib/i18n/locales/fi-FI/translation.json | 142 ++++++++++---------- 1 file changed, 71 insertions(+), 71 deletions(-) diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index 8179ab9db..b7d111337 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -4,7 +4,7 @@ "(e.g. `sh webui.sh --api --api-auth username_password`)": "(esim. `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)", "(latest)": "(uusin)", - "(leave blank for to use commercial endpoint)": "", + "(leave blank for to use commercial endpoint)": "(Jätä tyhjäksi, jos haluat käyttää kaupallista päätepistettä)", "{{ models }}": "{{ mallit }}", "{{COUNT}} Available Tools": "{{COUNT}} työkalua saatavilla", "{{COUNT}} hidden lines": "{{COUNT}} piilotettua riviä", @@ -73,8 +73,8 @@ "Allow User Location": "Salli käyttäjän sijainti", "Allow Voice Interruption in Call": "Salli äänen keskeytys puhelussa", "Allowed Endpoints": "Hyväksytyt päätepisteet", - "Allowed File Extensions": "", - "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "", + "Allowed File Extensions": "Hyväksytyt tiedostomuodot", + "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Hyväksyty tiedostomuodot. Erittele tiedostomuodot pilkulla. Jätä tyhjäksi kaikille tiedostomuodoille.", "Already have an account?": "Onko sinulla jo tili?", "Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "", "Always": "Aina", @@ -94,7 +94,7 @@ "API Key created.": "API-avain luotu.", "API Key Endpoint Restrictions": "API-avaimen päätepiste rajoitukset", "API keys": "API-avaimet", - "API Version": "", + "API Version": "API-versio", "Application DN": "Sovelluksen DN", "Application DN Password": "Sovelluksen DN-salasana", "applies to all users with the \"user\" role": "koskee kaikkia käyttäjiä, joilla on \"käyttäjä\"-rooli", @@ -116,8 +116,8 @@ "Assistant": "Avustaja", "Attach file from knowledge": "Liitä tiedosto tietokannasta", "Attention to detail": "Huomio yksityiskohtiin", - "Attribute for Mail": "", - "Attribute for Username": "Käyttäjänimi-määritämä", + "Attribute for Mail": "Attribuutti sähköpostille", + "Attribute for Username": "Attribuutti käyttäjätunnukselle", "Audio": "Ääni", "August": "elokuu", "Auth": "Todennus", @@ -149,11 +149,11 @@ "Bing Search V7 Subscription Key": "Bing Search V7 -tilauskäyttäjäavain", "Bocha Search API Key": "Bocha Search API -avain", "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "", - "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "", + "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "Docling OCR moottori ja kiele(t) tulee täyttää, tai jättää molemmat tyhjäksi.", "Brave Search API Key": "Brave Search API -avain", "By {{name}}": "Tekijä {{name}}", "Bypass Embedding and Retrieval": "Ohita upotus ja haku", - "Bypass Web Loader": "", + "Bypass Web Loader": "Ohita verkkolataaja", "Calendar": "Kalenteri", "Call": "Puhelu", "Call feature is not supported when using Web STT engine": "Puhelutoimintoa ei tueta käytettäessä web-puheentunnistusmoottoria", @@ -186,7 +186,7 @@ "Chunk Size": "Osien koko", "Ciphers": "Salausalgoritmi", "Citation": "Lähdeviite", - "Citations": "", + "Citations": "Lähdeviitteet", "Clear memory": "Tyhjennä muisti", "Clear Memory": "Tyhjennä Muisti", "click here": "klikkaa tästä", @@ -236,7 +236,7 @@ "Connect to your own OpenAPI compatible external tool servers.": "Yhdistä omat ulkopuoliset OpenAPI yhteensopivat työkalu palvelimet.", "Connection failed": "Yhteys epäonnistui", "Connection successful": "Yhteys onnistui", - "Connection Type": "", + "Connection Type": "Yhteystyyppi", "Connections": "Yhteydet", "Connections saved successfully": "Yhteyksien tallentaminen onnistui", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "", @@ -289,7 +289,7 @@ "Default": "Oletus", "Default (Open AI)": "Oletus (Open AI)", "Default (SentenceTransformers)": "Oletus (SentenceTransformers)", - "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "", + "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "Oletustila toimii laajemman mallivalikoiman kanssa kutsumalla työkaluja kerran ennen suorittamista. Natiivitila hyödyntää mallin sisäänrakennettuja työkalujen kutsumisominaisuuksia, mutta edellyttää, että malli tukee tätä ominaisuutta.", "Default Model": "Oletusmalli", "Default model updated": "Oletusmalli päivitetty", "Default Models": "Oletusmallit", @@ -319,8 +319,8 @@ "Deleted {{deleteModelTag}}": "Poistettu {{deleteModelTag}}", "Deleted {{name}}": "Poistettu {{nimi}}", "Deleted User": "Käyttäjä poistettu", - "Deployment names are required for Azure OpenAI": "", - "Describe Pictures in Documents": "", + "Deployment names are required for Azure OpenAI": "Azure OpenAI:lle vaaditaan käyttöönottojen nimet", + "Describe Pictures in Documents": "Kuvaile dokumentin kuvia", "Describe your knowledge base and objectives": "Kuvaa tietokantasi ja tavoitteesi", "Description": "Kuvaus", "Detect Artifacts Automatically": "Tunnista artefaktit automaattisesti", @@ -378,11 +378,11 @@ "e.g. My Tools": "esim. Omat työkalut", "e.g. my_filter": "esim. oma_suodatin", "e.g. my_tools": "esim. omat_työkalut", - "e.g. pdf, docx, txt": "", + "e.g. pdf, docx, txt": "esim. pdf, docx, txt", "e.g. Tools for performing various operations": "esim. työkaluja erilaisten toimenpiteiden suorittamiseen", "e.g., 3, 4, 5 (leave blank for default)": "esim. 3, 4, 5 (jätä tyhjäksi, jos haluat oletusarvon)", "e.g., en-US,ja-JP (leave blank for auto-detect)": "esim. en-US,ja-JP (Tyhjäksi jättämällä, automaattinen tunnistus)", - "e.g., westus (leave blank for eastus)": "", + "e.g., westus (leave blank for eastus)": "esim. westus (jätä tyhjäksi eastusta varten)", "Edit": "Muokkaa", "Edit Arena Model": "Muokkaa Arena-mallia", "Edit Channel": "Muokkaa kanavaa", @@ -391,7 +391,7 @@ "Edit Memory": "Muokkaa muistia", "Edit User": "Muokkaa käyttäjää", "Edit User Group": "Muokkaa käyttäjäryhmää", - "Eject": "", + "Eject": "Poista", "ElevenLabs": "ElevenLabs", "Email": "Sähköposti", "Embark on adventures": "Lähde seikkailuille", @@ -411,14 +411,14 @@ "Enable Mirostat sampling for controlling perplexity.": "", "Enable New Sign Ups": "Salli uudet rekisteröitymiset", "Enabled": "Käytössä", - "Endpoint URL": "", + "Endpoint URL": "Päätepiste verkko-osoite", "Enforce Temporary Chat": "Pakota väliaikaiset keskustelut", "Enhance": "Paranna", "Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Varmista, että CSV-tiedostossasi on 4 saraketta tässä järjestyksessä: Nimi, Sähköposti, Salasana, Rooli.", "Enter {{role}} message here": "Kirjoita {{role}}-viesti tähän", "Enter a detail about yourself for your LLMs to recall": "Kirjoita yksityiskohta itsestäsi, jonka LLM-ohjelmat voivat muistaa", - "Enter a title for the pending user info overlay. Leave empty for default.": "", - "Enter a watermark for the response. Leave empty for none.": "", + "Enter a title for the pending user info overlay. Leave empty for default.": "Kirjoita infon otsikko odottaville käyttäjille. Käytä oletusta jättämällä tyhjäksi.", + "Enter a watermark for the response. Leave empty for none.": "Kirjoita vastauksen vesileima. Jätä tyhjäksi, jos et halua mitään.", "Enter api auth string (e.g. username:password)": "Kirjoita API-todennusmerkkijono (esim. käyttäjätunnus:salasana)", "Enter Application DN": "Kirjoita sovelluksen DN", "Enter Application DN Password": "Kirjoita sovelluksen DN-salasana", @@ -431,7 +431,7 @@ "Enter Chunk Overlap": "Syötä osien päällekkäisyys", "Enter Chunk Size": "Syötä osien koko", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Syötä pilkulla erottaen \"token:bias_value\" parit (esim. 5432:100, 413:-100)", - "Enter content for the pending user info overlay. Leave empty for default.": "", + "Enter content for the pending user info overlay. Leave empty for default.": "Kirjoita odottavien käyttäjien infon tekstisisältö. Käytä oletusta jättämällä tyhjäksi.", "Enter description": "Kirjoita kuvaus", "Enter Docling OCR Engine": "Kirjoita Docling OCR moottori", "Enter Docling OCR Language(s)": "Kirjoita Docling OCR kieli(ä)", @@ -440,12 +440,12 @@ "Enter Document Intelligence Key": "Kirjoiuta asiakirja tiedustelun avain", "Enter domains separated by commas (e.g., example.com,site.org)": "Verkko-osoitteet erotetaan pilkulla (esim. esimerkki.com,sivu.org)", "Enter Exa API Key": "Kirjoita Exa API -avain", - "Enter External Document Loader API Key": "", - "Enter External Document Loader URL": "", - "Enter External Web Loader API Key": "", - "Enter External Web Loader URL": "", - "Enter External Web Search API Key": "", - "Enter External Web Search URL": "", + "Enter External Document Loader API Key": "Kirjoita ulkoisen Document Loader API-avain", + "Enter External Document Loader URL": "Kirjoita ulkoisen Document Loader:n verkko-osoite", + "Enter External Web Loader API Key": "Kirjoita ulkoisen Web Loader API-avain", + "Enter External Web Loader URL": "Kirjoita ulkoisen Web Loader:n verkko-osoite", + "Enter External Web Search API Key": "Kirjoita ulkoisen Web Search API avain", + "Enter External Web Search URL": "Kirjoita ulkoisen Web Search verkko-osoite", "Enter Firecrawl API Base URL": "Kirjoita Firecrawl API -verkko-osoite", "Enter Firecrawl API Key": "Kirjoita Firecrawl API-avain", "Enter Github Raw URL": "Kirjoita Github Raw -verkko-osoite", @@ -491,7 +491,7 @@ "Enter system prompt": "Kirjoita järjestelmäkehote", "Enter system prompt here": "Kirjoita järjestelmäkehote tähän", "Enter Tavily API Key": "Kirjoita Tavily API -avain", - "Enter Tavily Extract Depth": "", + "Enter Tavily Extract Depth": "Kirjoita Tavily pominta syvyys", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Kirjoita julkinen WebUI verkko-osoitteesi. Verkko-osoitetta käytetään osoitteiden luontiin ilmoituksissa.", "Enter Tika Server URL": "Kirjoita Tika Server URL", "Enter timeout in seconds": "Aseta aikakatkaisu sekunneissa", @@ -519,7 +519,7 @@ "Error accessing Google Drive: {{error}}": "Virhe yhdistäessä Google Drive: {{error}}", "Error accessing media devices.": "Virhe medialaitteita käytettäessä.", "Error starting recording.": "Virhe nauhoitusta aloittaessa.", - "Error unloading model: {{error}}": "", + "Error unloading model: {{error}}": "Virhe mallia ladattaessa: {{error}}", "Error uploading file: {{error}}": "Virhe ladattaessa tiedostoa: {{error}}", "Evaluations": "Arvioinnit", "Exa API Key": "Exa API -avain", @@ -549,12 +549,12 @@ "Export to CSV": "Vie CSV-tiedostoon", "Export Tools": "Vie työkalut", "External": "Ulkoiset", - "External Document Loader URL required.": "", - "External Task Model": "", - "External Web Loader API Key": "", - "External Web Loader URL": "", - "External Web Search API Key": "", - "External Web Search URL": "", + "External Document Loader URL required.": "Ulkoisen Document Loader:n verkko-osoite on vaaditaan.", + "External Task Model": "Ulkoinen työmalli", + "External Web Loader API Key": "Ulkoinen Web Loader API-avain", + "External Web Loader URL": "Ulkoinen Web Loader verkko-osoite", + "External Web Search API Key": "Ulkoinen Web Search API-avain", + "External Web Search URL": "Ulkoinen Web Search verkko-osoite", "Failed to add file.": "Tiedoston lisääminen epäonnistui.", "Failed to connect to {{URL}} OpenAPI tool server": "Yhdistäminen {{URL}} OpenAPI työkalu palvelimeen epäonnistui", "Failed to create API Key.": "API-avaimen luonti epäonnistui.", @@ -579,7 +579,7 @@ "File not found.": "Tiedostoa ei löytynyt.", "File removed successfully.": "Tiedosto poistettu onnistuneesti.", "File size should not exceed {{maxSize}} MB.": "Tiedoston koko ei saa ylittää {{maxSize}} MB.", - "File Upload": "", + "File Upload": "Tiedoston lataus", "File uploaded successfully": "Tiedosto ladattiin onnistuneesti", "Files": "Tiedostot", "Filter is now globally disabled": "Suodatin on nyt poistettu käytöstä globaalisti", @@ -644,7 +644,7 @@ "Hex Color - Leave empty for default color": "Heksadesimaaliväri - Jätä tyhjäksi, jos haluat oletusvärin", "Hide": "Piilota", "Hide Model": "Piilota malli", - "High Contrast Mode": "", + "High Contrast Mode": "Korkean kontrastin tila", "Home": "Koti", "Host": "Palvelin", "How can I help you today?": "Miten voin auttaa sinua tänään?", @@ -725,7 +725,7 @@ "Leaderboard": "Tulosluettelo", "Learn more about OpenAPI tool servers.": "Lue lisää OpenAPI työkalu palvelimista.", "Leave empty for unlimited": "Rajaton tyhjäksi jättämällä", - "Leave empty to include all models from \"{{url}}\" endpoint": "", + "Leave empty to include all models from \"{{url}}\" endpoint": "Jätä tyhjäksi sisällyttääksesi \"{{url}}\" päätepisteen mallit", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Jätä tyhjäksi sisällyttääksesi \"{{url}}/api/tags\" päätepisteen mallit", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Jätä tyhjäksi sisällyttääksesi \"{{url}}/models\" päätepisteen mallit", "Leave empty to include all models or select specific models": "Jätä tyhjäksi, jos haluat sisällyttää kaikki mallit tai valitse tietyt mallit", @@ -739,7 +739,7 @@ "Loader": "Lataaja", "Loading Kokoro.js...": "Ladataan Kokoro.js...", "Local": "Paikallinen", - "Local Task Model": "", + "Local Task Model": "Paikallinen työmalli", "Location access not allowed": "Ei pääsyä sijaintitietoihin", "Lost": "Mennyt", "LTR": "LTR", @@ -783,11 +783,11 @@ "Model {{name}} is now {{status}}": "Malli {{name}} on nyt {{status}}", "Model {{name}} is now hidden": "Malli {{name}} on nyt piilotettu", "Model {{name}} is now visible": "Malli {{name}} on nyt näkyvissä", - "Model accepts file inputs": "", + "Model accepts file inputs": "Malli hyväksyy tiedostosyötteet", "Model accepts image inputs": "Malli hyväksyy kuvasyötteitä", - "Model can execute code and perform calculations": "", - "Model can generate images based on text prompts": "", - "Model can search the web for information": "", + "Model can execute code and perform calculations": "Malli voi suorittaa koodia ja laskelmia", + "Model can generate images based on text prompts": "Malli voi luoda kuvia tekstikehotteiden perusteella", + "Model can search the web for information": "Malli voi hakea tietoa verkosta", "Model created successfully!": "Malli luotu onnistuneesti!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Mallin tiedostojärjestelmäpolku havaittu. Mallin lyhytnimi vaaditaan päivitykseen, ei voida jatkaa.", "Model Filtering": "Mallin suodatus", @@ -797,9 +797,9 @@ "Model not selected": "Mallia ei ole valittu", "Model Params": "Mallin parametrit", "Model Permissions": "Mallin käyttöoikeudet", - "Model unloaded successfully": "", + "Model unloaded successfully": "Malli purettu onnistuneesti", "Model updated successfully": "Malli päivitetty onnistuneesti", - "Model(s) do not support file upload": "", + "Model(s) do not support file upload": "Malli(t) ei tue tiedostojen lataamista", "Modelfile Content": "Mallitiedoston sisältö", "Models": "Mallit", "Models Access": "Mallien käyttöoikeudet", @@ -894,8 +894,8 @@ "PDF document (.pdf)": "PDF-asiakirja (.pdf)", "PDF Extract Images (OCR)": "Poimi kuvat PDF:stä (OCR)", "pending": "odottaa", - "Pending User Overlay Content": "", - "Pending User Overlay Title": "", + "Pending User Overlay Content": "Odottavien käyttäjien sisältö", + "Pending User Overlay Title": "Odottavien käyttäjien otsikko", "Permission denied when accessing media devices": "Käyttöoikeus evätty media-laitteille", "Permission denied when accessing microphone": "Käyttöoikeus evätty mikrofonille", "Permission denied when accessing microphone: {{error}}": "Käyttöoikeus evätty mikrofonille: {{error}}", @@ -928,7 +928,7 @@ "Positive attitude": "Positiivinen asenne", "Prefix ID": "Etuliite-ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Etuliite-ID:tä käytetään välttämään ristiriidat muiden yhteyksien kanssa lisäämällä etuliite mallitunnuksiin - jätä tyhjäksi, jos haluat ottaa sen pois käytöstä", - "Preview": "", + "Preview": "Esikatselu", "Previous 30 days": "Edelliset 30 päivää", "Previous 7 days": "Edelliset 7 päivää", "Private": "Yksityinen", @@ -964,7 +964,7 @@ "Reindex": "Indeksoi uudelleen", "Reindex Knowledge Base Vectors": "Indeksoi tietämyksen vektorit uudelleen", "Release Notes": "Julkaisutiedot", - "Releases": "", + "Releases": "Julkaisut", "Relevance": "Relevanssi", "Relevance Threshold": "Relevanssikynnys", "Remove": "Poista", @@ -973,7 +973,7 @@ "Reorder Models": "Uudelleenjärjestä malleja", "Reply in Thread": "Vastauksia ", "Request Mode": "Pyyntötila", - "Reranking Engine": "", + "Reranking Engine": "Uudelleenpisteytymismallin moottori", "Reranking Model": "Uudelleenpisteytymismalli", "Reset": "Palauta", "Reset All Models": "Palauta kaikki mallit", @@ -982,7 +982,7 @@ "Reset view": "Palauta näkymä", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "Vastausilmoituksia ei voida ottaa käyttöön, koska verkkosivuston käyttöoikeudet on evätty. Myönnä tarvittavat käyttöoikeudet selaimesi asetuksista.", "Response splitting": "Vastauksen jakaminen", - "Response Watermark": "", + "Response Watermark": "Vastauksen vesileima", "Result": "Tulos", "Retrieval": "Haku", "Retrieval Query Generation": "Hakukyselyn luominen", @@ -1001,7 +1001,7 @@ "Save Tag": "Tallenna tagi", "Saved": "Tallennettu", "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Keskustelulokien tallentaminen suoraan selaimen tallennustilaan ei ole enää tuettu. Lataa ja poista keskustelulokit napsauttamalla alla olevaa painiketta. Älä huoli, voit helposti tuoda keskustelulokit takaisin backendiin", - "Scroll On Branch Change": "", + "Scroll On Branch Change": "Vieritä haaran vaihtoon", "Search": "Haku", "Search a model": "Hae mallia", "Search Base": "Hakupohja", @@ -1082,8 +1082,8 @@ "Show": "Näytä", "Show \"What's New\" modal on login": "Näytä \"Mitä uutta\" -modaali kirjautumisen yhteydessä", "Show Admin Details in Account Pending Overlay": "Näytä ylläpitäjän tiedot odottavan tilin päällä", - "Show All": "", - "Show Less": "", + "Show All": "Näytä kaikki", + "Show Less": "Näytä vähemmän", "Show Model": "Näytä malli", "Show shortcuts": "Näytä pikanäppäimet", "Show your support!": "Osoita tukesi!", @@ -1096,8 +1096,8 @@ "Sign up to {{WEBUI_NAME}}": "Rekisteröidy palveluun {{WEBUI_NAME}}", "Signing in to {{WEBUI_NAME}}": "Kirjaudutaan sisään palveluun {{WEBUI_NAME}}", "sk-1234": "", - "Sougou Search API sID": "", - "Sougou Search API SK": "", + "Sougou Search API sID": "Sougou Search API sID", + "Sougou Search API SK": "Sougou Search API SK", "Source": "Lähde", "Speech Playback Speed": "Puhetoiston nopeus", "Speech recognition error: {{error}}": "Puheentunnistusvirhe: {{error}}", @@ -1107,7 +1107,7 @@ "Stream Chat Response": "Streamaa keskusteluvastaus", "STT Model": "Puheentunnistusmalli", "STT Settings": "Puheentunnistuksen asetukset", - "Stylized PDF Export": "", + "Stylized PDF Export": "Muotoiltun PDF-vienti", "Subtitle (e.g. about the Roman Empire)": "Alaotsikko (esim. Rooman valtakunta)", "Success": "Onnistui", "Successfully updated.": "Päivitetty onnistuneesti.", @@ -1124,10 +1124,10 @@ "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "", "Talk to model": "Puhu mallille", "Tap to interrupt": "Napauta keskeyttääksesi", - "Task Model": "", + "Task Model": "Työmalli", "Tasks": "Tehtävät", "Tavily API Key": "Tavily API -avain", - "Tavily Extract Depth": "", + "Tavily Extract Depth": "Tavily poiminta syvyys", "Tell us more:": "Kerro lisää:", "Temperature": "Lämpötila", "Template": "Malli", @@ -1137,10 +1137,10 @@ "Thanks for your feedback!": "Kiitos palautteestasi!", "The Application Account DN you bind with for search": "Hakua varten sidottu sovelluksen käyttäjätilin DN", "The base to search for users": "Käyttäjien haun perusta", - "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", + "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Eräkoko määrittää, kuinka monta tekstipyyntöä käsitellään kerralla. Suurempi eräkoko voi parantaa mallin suorituskykyä ja nopeutta, mutta se vaatii myös enemmän muistia.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Tämän lisäosan takana olevat kehittäjät ovat intohimoisia vapaaehtoisyhteisöstä. Jos koet tämän lisäosan hyödylliseksi, harkitse sen kehittämisen tukemista.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Arviointitulosluettelo perustuu Elo-luokitusjärjestelmään ja päivittyy reaaliajassa.", - "The LDAP attribute that maps to the mail that users use to sign in.": "", + "The LDAP attribute that maps to the mail that users use to sign in.": "LDAP-määrite, joka yhdistää käyttäjien kirjautumiseen käyttämään sähköpostiin.", "The LDAP attribute that maps to the username that users use to sign in.": "LDAP-määrite, joka vastaa käyttäjien kirjautumiskäyttäjänimeä.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tulosluettelo on tällä hetkellä beta-vaiheessa, ja voimme säätää pisteytyksen laskentaa hienostaessamme algoritmia.", "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Enimmäistiedostokoko megatavuissa. Jos tiedoston koko ylittää tämän rajan, tiedostoa ei ladata.", @@ -1154,9 +1154,9 @@ "This chat won’t appear in history and your messages will not be saved.": "Tämä keskustelu ei näy historiassa, eikä viestejäsi tallenneta.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Tämä varmistaa, että arvokkaat keskustelusi tallennetaan turvallisesti backend-tietokantaasi. Kiitos!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Tämä on kokeellinen ominaisuus, se ei välttämättä toimi odotetulla tavalla ja se voi muuttua milloin tahansa.", - "This model is not publicly available. Please select another model.": "", - "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", - "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", + "This model is not publicly available. Please select another model.": "Tämä malli ei ole julkisesti saatavilla. Valitse toinen malli.", + "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Tämä asetus määrittää, kuinka monta tokenia säilytetään kontekstia päivitettäessä. Jos arvoksi on asetettu esimerkiksi 2, keskustelukontekstin kaksi viimeistä tokenia säilytetään. Kontekstin säilyttäminen voi auttaa ylläpitämään keskustelun jatkuvuutta, mutta se voi heikentää kykyä vastata uusiin aiheisiin.", + "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Tämä vaihtoehto asettaa mallin vastauksessaan luomien tokenien enimmäismäärän. Tämän rajan nostaminen antaa mallille mahdollisuuden tarjota pidempiä vastauksia, mutta se voi myös lisätä hyödyttömän tai epäolennaisen sisällön luomisen todennäköisyyttä.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Tämä vaihtoehto poistaa kaikki kokoelman nykyiset tiedostot ja korvaa ne uusilla ladatuilla tiedostoilla.", "This response was generated by \"{{model}}\"": "Tämän vastauksen tuotti \"{{model}}\"", "This will delete": "Tämä poistaa", @@ -1189,7 +1189,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "Valitaksesi työkalusettejä tässä, lisää ne ensin \"Työkalut\"-työtilaan.", "Toast notifications for new updates": "Ilmoituspopuppien näyttäminen uusista päivityksistä", "Today": "Tänään", - "Toggle search": "", + "Toggle search": "Kytke haku", "Toggle settings": "Kytke asetukset", "Toggle sidebar": "Kytke sivupalkki", "Token": "Token", @@ -1223,7 +1223,7 @@ "Unarchive All": "Pura kaikkien arkistointi", "Unarchive All Archived Chats": "Pura kaikkien arkistoitujen keskustelujen arkistointi", "Unarchive Chat": "Pura keskustelun arkistointi", - "Unloads {{FROM_NOW}}": "", + "Unloads {{FROM_NOW}}": "Purkuja {{FROM_NOW}}", "Unlock mysteries": "Selvitä arvoituksia", "Unpin": "Irrota kiinnitys", "Unravel secrets": "Avaa salaisuuksia", @@ -1247,7 +1247,7 @@ "Upload Progress": "Latauksen edistyminen", "URL": "URL", "URL Mode": "URL-tila", - "Usage": "", + "Usage": "Käyttö", "Use '#' in the prompt input to load and include your knowledge.": "Käytä '#' -merkkiä kehotekenttään ladataksesi ja sisällyttääksesi tietämystäsi.", "Use Gravatar": "Käytä Gravataria", "Use groups to group your users and assign permissions.": "Käytä ryhmiä jäsentääksesi käyttäjiä ja antaaksesi käyttöoikeuksia.", @@ -1275,7 +1275,7 @@ "View Replies": "Näytä vastaukset", "View Result from **{{NAME}}**": "Näytä **{{NAME}}** tulokset", "Visibility": "Näkyvyys", - "Vision": "", + "Vision": "Visio", "Voice": "Ääni", "Voice Input": "Äänitulolaitteen käyttö", "Warning": "Varoitus", @@ -1285,7 +1285,7 @@ "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Varoitus: Jupyter käyttö voi mahdollistaa mielivaltaiseen koodin suorittamiseen, mikä voi aiheuttaa tietoturvariskejä - käytä äärimmäisen varoen.", "Web": "Web", "Web API": "Web-API", - "Web Loader Engine": "Verkko lataaja moottori", + "Web Loader Engine": "Verkkolataaja moottori", "Web Search": "Verkkohaku", "Web Search Engine": "Hakukoneet", "Web Search in Chat": "Verkkohaku keskustelussa", @@ -1313,9 +1313,9 @@ "Write a summary in 50 words that summarizes [topic or keyword].": "Kirjoita 50 sanan yhteenveto, joka tiivistää [aihe tai avainsana].", "Write something...": "Kirjoita jotain...", "Write your model template content here": "Kirjoita mallisi mallinnesisältö tähän", - "Yacy Instance URL": "", - "Yacy Password": "", - "Yacy Username": "", + "Yacy Instance URL": "Yacy instanssin verkko-osoite", + "Yacy Password": "Yacy salasana", + "Yacy Username": "Yacy käyttäjänimi", "Yesterday": "Eilen", "You": "Sinä", "You are currently using a trial license. Please contact support to upgrade your license.": "Käytät tällä hetkellä kokeiluversiota. Ota yhteyttä tukeen lisenssin päivittämiseksi.", From 88a296b989f5104eab2218945c2819c42e50a566 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 23 May 2025 23:52:10 +0400 Subject: [PATCH 074/144] refac: chat reset input behaviour --- src/lib/components/chat/Chat.svelte | 40 +++++++++++++++++------------ 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 7cd77c30c..787e046da 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -195,15 +195,27 @@ console.log('saveSessionSelectedModels', selectedModels, sessionStorage.selectedModels); }; - $: if (selectedModels) { - setToolIds(); - setFilterIds(); + let oldSelectedModelIds = ['']; + $: if (JSON.stringify(selectedModelIds) !== JSON.stringify(oldSelectedModelIds)) { + onSelectedModelIdsChange(); } - $: if (atSelectedModel || selectedModels) { + const onSelectedModelIdsChange = () => { + if (oldSelectedModelIds.filter((id) => id).length > 0) { + resetInput(); + } + oldSelectedModelIds = selectedModelIds; + }; + + const resetInput = () => { + console.debug('resetInput'); setToolIds(); - setFilterIds(); - } + + selectedFilterIds = []; + webSearchEnabled = false; + imageGenerationEnabled = false; + codeInterpreterEnabled = false; + }; const setToolIds = async () => { if (!$tools) { @@ -215,20 +227,14 @@ } const model = atSelectedModel ?? $models.find((m) => m.id === selectedModels[0]); - if (model) { + if (model && model?.info?.meta?.toolIds) { selectedToolIds = [ ...new Set( - [...selectedToolIds, ...(model?.info?.meta?.toolIds ?? [])].filter((id) => - $tools.find((t) => t.id === id) - ) + [...(model?.info?.meta?.toolIds ?? [])].filter((id) => $tools.find((t) => t.id === id)) ) ]; - } - }; - - const setFilterIds = async () => { - if (selectedModels.length !== 1 && !atSelectedModel) { - selectedFilterIds = []; + } else { + selectedToolIds = []; } }; @@ -846,6 +852,8 @@ (chatContent?.models ?? undefined) !== undefined ? chatContent.models : [chatContent.models ?? '']; + oldSelectedModelIds = selectedModels; + history = (chatContent?.history ?? undefined) !== undefined ? chatContent.history From e70dd3323390c9da5c9197efbbc50a07db7d79d2 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Fri, 23 May 2025 22:06:44 +0200 Subject: [PATCH 075/144] rename BM25_WEIGHT -> HYBRID_BM25_WEIGHT --- backend/open_webui/config.py | 8 ++--- backend/open_webui/main.py | 4 +-- backend/open_webui/retrieval/utils.py | 16 +++++----- backend/open_webui/routers/retrieval.py | 30 +++++++++---------- backend/open_webui/utils/middleware.py | 2 +- .../admin/Settings/Documents.svelte | 4 +-- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index eac03fd8a..d21832e3c 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -1928,10 +1928,10 @@ RAG_RELEVANCE_THRESHOLD = PersistentConfig( "rag.relevance_threshold", float(os.environ.get("RAG_RELEVANCE_THRESHOLD", "0.0")), ) -RAG_BM25_WEIGHT = PersistentConfig( - "RAG_BM25_WEIGHT", - "rag.bm25_weight", - float(os.environ.get("RAG_BM25_WEIGHT", "0.5")), +RAG_HYBRID_BM25_WEIGHT = PersistentConfig( + "RAG_HYBRID_BM25_WEIGHT", + "rag.hybrid_bm25_weight", + float(os.environ.get("RAG_HYBRID_BM25_WEIGHT", "0.5")), ) ENABLE_RAG_HYBRID_SEARCH = PersistentConfig( diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 01dd42cf3..c384f55e6 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -199,7 +199,7 @@ from open_webui.config import ( RAG_TOP_K, RAG_TOP_K_RERANKER, RAG_RELEVANCE_THRESHOLD, - RAG_BM25_WEIGHT, + RAG_HYBRID_BM25_WEIGHT, RAG_ALLOWED_FILE_EXTENSIONS, RAG_FILE_MAX_COUNT, RAG_FILE_MAX_SIZE, @@ -647,7 +647,7 @@ app.state.FUNCTIONS = {} app.state.config.TOP_K = RAG_TOP_K app.state.config.TOP_K_RERANKER = RAG_TOP_K_RERANKER app.state.config.RELEVANCE_THRESHOLD = RAG_RELEVANCE_THRESHOLD -app.state.config.BM25_WEIGHT = RAG_BM25_WEIGHT +app.state.config.HYBRID_BM25_WEIGHT = RAG_HYBRID_BM25_WEIGHT app.state.config.ALLOWED_FILE_EXTENSIONS = RAG_ALLOWED_FILE_EXTENSIONS app.state.config.FILE_MAX_SIZE = RAG_FILE_MAX_SIZE app.state.config.FILE_MAX_COUNT = RAG_FILE_MAX_COUNT diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 70c3f4115..b7b4912ac 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -116,7 +116,7 @@ def query_doc_with_hybrid_search( reranking_function, k_reranker: int, r: float, - bm25_weight: float, + hybrid_bm25_weight: float, ) -> dict: try: log.debug(f"query_doc_with_hybrid_search:doc {collection_name}") @@ -132,18 +132,18 @@ def query_doc_with_hybrid_search( top_k=k, ) - if bm25_weight <= 0: + if hybrid_bm25_weight <= 0: ensemble_retriever = EnsembleRetriever( retrievers=[vector_search_retriever], weights=[1.] ) - elif bm25_weight >= 1: + elif hybrid_bm25_weight >= 1: ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever], weights=[1.] ) else: ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_search_retriever], - weights=[bm25_weight, 1. - bm25_weight] + weights=[hybrid_bm25_weight, 1. - hybrid_bm25_weight] ) compressor = RerankCompressor( @@ -325,7 +325,7 @@ def query_collection_with_hybrid_search( reranking_function, k_reranker: int, r: float, - bm25_weight: float, + hybrid_bm25_weight: float, ) -> dict: results = [] error = False @@ -359,7 +359,7 @@ def query_collection_with_hybrid_search( reranking_function=reranking_function, k_reranker=k_reranker, r=r, - bm25_weight=bm25_weight, + hybrid_bm25_weight=hybrid_bm25_weight, ) return result, None except Exception as e: @@ -447,7 +447,7 @@ def get_sources_from_files( reranking_function, k_reranker, r, - bm25_weight, + hybrid_bm25_weight, hybrid_search, full_context=False, ): @@ -565,7 +565,7 @@ def get_sources_from_files( reranking_function=reranking_function, k_reranker=k_reranker, r=r, - bm25_weight=bm25_weight, + hybrid_bm25_weight=hybrid_bm25_weight, ) except Exception as e: log.debug( diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index e31dba299..5076ff8a6 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -349,7 +349,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "ENABLE_RAG_HYBRID_SEARCH": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, "TOP_K_RERANKER": request.app.state.config.TOP_K_RERANKER, "RELEVANCE_THRESHOLD": request.app.state.config.RELEVANCE_THRESHOLD, - "BM25_WEIGHT": request.app.state.config.BM25_WEIGHT, + "HYBRID_BM25_WEIGHT": request.app.state.config.HYBRID_BM25_WEIGHT, # Content extraction settings "CONTENT_EXTRACTION_ENGINE": request.app.state.config.CONTENT_EXTRACTION_ENGINE, "PDF_EXTRACT_IMAGES": request.app.state.config.PDF_EXTRACT_IMAGES, @@ -493,7 +493,7 @@ class ConfigForm(BaseModel): ENABLE_RAG_HYBRID_SEARCH: Optional[bool] = None TOP_K_RERANKER: Optional[int] = None RELEVANCE_THRESHOLD: Optional[float] = None - BM25_WEIGHT: Optional[float] = None + HYBRID_BM25_WEIGHT: Optional[float] = None # Content extraction settings CONTENT_EXTRACTION_ENGINE: Optional[str] = None @@ -580,10 +580,10 @@ async def update_rag_config( if form_data.RELEVANCE_THRESHOLD is not None else request.app.state.config.RELEVANCE_THRESHOLD ) - request.app.state.config.BM25_WEIGHT = ( - form_data.BM25_WEIGHT - if form_data.BM25_WEIGHT is not None - else request.app.state.config.BM25_WEIGHT + request.app.state.config.HYBRID_BM25_WEIGHT = ( + form_data.HYBRID_BM25_WEIGHT + if form_data.HYBRID_BM25_WEIGHT is not None + else request.app.state.config.HYBRID_BM25_WEIGHT ) # Content extraction settings @@ -844,7 +844,7 @@ async def update_rag_config( "ENABLE_RAG_HYBRID_SEARCH": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, "TOP_K_RERANKER": request.app.state.config.TOP_K_RERANKER, "RELEVANCE_THRESHOLD": request.app.state.config.RELEVANCE_THRESHOLD, - "BM25_WEIGHT": request.app.state.config.BM25_WEIGHT, + "HYBRID_BM25_WEIGHT": request.app.state.config.HYBRID_BM25_WEIGHT, # Content extraction settings "CONTENT_EXTRACTION_ENGINE": request.app.state.config.CONTENT_EXTRACTION_ENGINE, "PDF_EXTRACT_IMAGES": request.app.state.config.PDF_EXTRACT_IMAGES, @@ -1782,10 +1782,10 @@ def query_doc_handler( if form_data.r else request.app.state.config.RELEVANCE_THRESHOLD ), - bm25_weight=( - form_data.bm25_weight - if form_data.bm25_weight - else request.app.state.config.BM25_WEIGHT + hybrid_bm25_weight=( + form_data.hybrid_bm25_weight + if form_data.hybrid_bm25_weight + else request.app.state.config.HYBRID_BM25_WEIGHT ), user=user, ) @@ -1838,10 +1838,10 @@ def query_collection_handler( if form_data.r else request.app.state.config.RELEVANCE_THRESHOLD ), - bm25_weight=( - form_data.bm25_weight - if form_data.bm25_weight - else request.app.state.config.BM25_WEIGHT + hybrid_bm25_weight=( + form_data.hybrid_bm25_weight + if form_data.hybrid_bm25_weight + else request.app.state.config.HYBRID_BM25_WEIGHT ), ) else: diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index c0ce2f063..9fa513bf9 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -603,7 +603,7 @@ async def chat_completion_files_handler( reranking_function=request.app.state.rf, k_reranker=request.app.state.config.TOP_K_RERANKER, r=request.app.state.config.RELEVANCE_THRESHOLD, - bm25_weight=request.app.state.config.BM25_WEIGHT, + hybrid_bm25_weight=request.app.state.config.HYBRID_BM25_WEIGHT, hybrid_search=request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, full_context=request.app.state.config.RAG_FULL_CONTEXT, ), diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 6dacb3257..7de9e8261 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -773,14 +773,14 @@ {#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true}
-
{$i18n.t('BM25 Weight')}
+
{$i18n.t('Weight of BM25 Retrieval')}
Date: Fri, 23 May 2025 22:30:04 +0200 Subject: [PATCH 076/144] add missing locale string --- src/lib/i18n/locales/en-US/translation.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index ea3308b6c..d778adc87 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -1317,6 +1317,7 @@ "What’s New in": "", "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "", "wherever you are": "", + "Weight of BM25 Retrieval": "", "Whisper (Local)": "", "Why?": "", "Widescreen Mode": "", From baaa28553409a41f927fba0d7e12d53738565234 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 00:36:30 +0400 Subject: [PATCH 077/144] feat: user stt language --- backend/open_webui/routers/audio.py | 35 ++++++--- backend/open_webui/routers/files.py | 20 ++++- backend/open_webui/routers/images.py | 2 +- src/lib/apis/audio/index.ts | 5 +- src/lib/apis/files/index.ts | 6 +- .../components/channel/MessageInput.svelte | 15 +++- src/lib/components/chat/Chat.svelte | 13 +++- src/lib/components/chat/MessageInput.svelte | 14 +++- .../chat/MessageInput/CallOverlay.svelte | 6 +- .../chat/MessageInput/VoiceRecording.svelte | 6 +- src/lib/components/chat/Settings/Audio.svelte | 28 ++++++- .../components/layout/Help/HelpMenu.svelte | 73 ------------------- src/lib/components/notes/NoteEditor.svelte | 13 +++- .../workspace/Knowledge/KnowledgeBase.svelte | 16 +++- 14 files changed, 149 insertions(+), 103 deletions(-) delete mode 100644 src/lib/components/layout/Help/HelpMenu.svelte diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index a0f5af4fc..d337ece2e 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -8,6 +8,8 @@ from pathlib import Path from pydub import AudioSegment from pydub.silence import split_on_silence from concurrent.futures import ThreadPoolExecutor +from typing import Optional + import aiohttp import aiofiles @@ -18,6 +20,7 @@ from fastapi import ( Depends, FastAPI, File, + Form, HTTPException, Request, UploadFile, @@ -527,11 +530,13 @@ async def speech(request: Request, user=Depends(get_verified_user)): return FileResponse(file_path) -def transcription_handler(request, file_path): +def transcription_handler(request, file_path, metadata): filename = os.path.basename(file_path) file_dir = os.path.dirname(file_path) id = filename.split(".")[0] + metadata = metadata or {} + if request.app.state.config.STT_ENGINE == "": if request.app.state.faster_whisper_model is None: request.app.state.faster_whisper_model = set_faster_whisper_model( @@ -543,7 +548,7 @@ def transcription_handler(request, file_path): file_path, beam_size=5, vad_filter=request.app.state.config.WHISPER_VAD_FILTER, - language=WHISPER_LANGUAGE, + language=metadata.get("language") or WHISPER_LANGUAGE, ) log.info( "Detected language '%s' with probability %f" @@ -569,7 +574,14 @@ def transcription_handler(request, file_path): "Authorization": f"Bearer {request.app.state.config.STT_OPENAI_API_KEY}" }, files={"file": (filename, open(file_path, "rb"))}, - data={"model": request.app.state.config.STT_MODEL}, + data={ + "model": request.app.state.config.STT_MODEL, + **( + {"language": metadata.get("language")} + if metadata.get("language") + else {} + ), + }, ) r.raise_for_status() @@ -777,8 +789,8 @@ def transcription_handler(request, file_path): ) -def transcribe(request: Request, file_path): - log.info(f"transcribe: {file_path}") +def transcribe(request: Request, file_path: str, metadata: Optional[dict] = None): + log.info(f"transcribe: {file_path} {metadata}") if is_audio_conversion_required(file_path): file_path = convert_audio_to_mp3(file_path) @@ -804,7 +816,7 @@ def transcribe(request: Request, file_path): with ThreadPoolExecutor() as executor: # Submit tasks for each chunk_path futures = [ - executor.submit(transcription_handler, request, chunk_path) + executor.submit(transcription_handler, request, chunk_path, metadata) for chunk_path in chunk_paths ] # Gather results as they complete @@ -812,10 +824,9 @@ def transcribe(request: Request, file_path): try: results.append(future.result()) except Exception as transcribe_exc: - log.exception(f"Error transcribing chunk: {transcribe_exc}") raise HTTPException( status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Error during transcription.", + detail=f"Error transcribing chunk: {transcribe_exc}", ) finally: # Clean up only the temporary chunks, never the original file @@ -897,6 +908,7 @@ def split_audio(file_path, max_bytes, format="mp3", bitrate="32k"): def transcription( request: Request, file: UploadFile = File(...), + language: Optional[str] = Form(None), user=Depends(get_verified_user), ): log.info(f"file.content_type: {file.content_type}") @@ -926,7 +938,12 @@ def transcription( f.write(contents) try: - result = transcribe(request, file_path) + metadata = None + + if language: + metadata = {"language": language} + + result = transcribe(request, file_path, metadata) return { **result, diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 098fcc4d6..d80b59352 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -1,6 +1,7 @@ import logging import os import uuid +import json from fnmatch import fnmatch from pathlib import Path from typing import Optional @@ -10,6 +11,7 @@ from fastapi import ( APIRouter, Depends, File, + Form, HTTPException, Request, UploadFile, @@ -84,13 +86,23 @@ def has_access_to_file( def upload_file( request: Request, file: UploadFile = File(...), - user=Depends(get_verified_user), - metadata: dict = None, + metadata: Optional[dict | str] = Form(None), process: bool = Query(True), + internal: bool = False, + user=Depends(get_verified_user), ): log.info(f"file.content_type: {file.content_type}") + if isinstance(metadata, str): + try: + metadata = json.loads(metadata) + except json.JSONDecodeError: + raise HTTPException( + status_code=status.HTTP_400_BAD_REQUEST, + detail=ERROR_MESSAGES.DEFAULT("Invalid metadata format"), + ) file_metadata = metadata if metadata else {} + try: unsanitized_filename = file.filename filename = os.path.basename(unsanitized_filename) @@ -99,7 +111,7 @@ def upload_file( # Remove the leading dot from the file extension file_extension = file_extension[1:] if file_extension else "" - if not file_metadata and request.app.state.config.ALLOWED_FILE_EXTENSIONS: + if (not internal) and request.app.state.config.ALLOWED_FILE_EXTENSIONS: request.app.state.config.ALLOWED_FILE_EXTENSIONS = [ ext for ext in request.app.state.config.ALLOWED_FILE_EXTENSIONS if ext ] @@ -147,7 +159,7 @@ def upload_file( "video/webm" }: file_path = Storage.get_file(file_path) - result = transcribe(request, file_path) + result = transcribe(request, file_path, file_metadata) process_file( request, diff --git a/backend/open_webui/routers/images.py b/backend/open_webui/routers/images.py index c34ce48f0..464fbb315 100644 --- a/backend/open_webui/routers/images.py +++ b/backend/open_webui/routers/images.py @@ -460,7 +460,7 @@ def upload_image(request, image_data, content_type, metadata, user): "content-type": content_type, }, ) - file_item = upload_file(request, file, user, metadata=metadata) + file_item = upload_file(request, file, metadata=metadata, internal=True, user=user) url = request.app.url_path_for("get_file_content_by_id", id=file_item.id) return url diff --git a/src/lib/apis/audio/index.ts b/src/lib/apis/audio/index.ts index f6354da77..b2fed5739 100644 --- a/src/lib/apis/audio/index.ts +++ b/src/lib/apis/audio/index.ts @@ -64,9 +64,12 @@ export const updateAudioConfig = async (token: string, payload: OpenAIConfigForm return res; }; -export const transcribeAudio = async (token: string, file: File) => { +export const transcribeAudio = async (token: string, file: File, language?: string) => { const data = new FormData(); data.append('file', file); + if (language) { + data.append('language', language); + } let error = null; const res = await fetch(`${AUDIO_API_BASE_URL}/transcriptions`, { diff --git a/src/lib/apis/files/index.ts b/src/lib/apis/files/index.ts index 261fe56db..a58d7cb93 100644 --- a/src/lib/apis/files/index.ts +++ b/src/lib/apis/files/index.ts @@ -1,8 +1,12 @@ import { WEBUI_API_BASE_URL } from '$lib/constants'; -export const uploadFile = async (token: string, file: File) => { +export const uploadFile = async (token: string, file: File, metadata?: object | null) => { const data = new FormData(); data.append('file', file); + if (metadata) { + data.append('metadata', JSON.stringify(metadata)); + } + let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/files/`, { diff --git a/src/lib/components/channel/MessageInput.svelte b/src/lib/components/channel/MessageInput.svelte index 2ad4faa93..901e8d58f 100644 --- a/src/lib/components/channel/MessageInput.svelte +++ b/src/lib/components/channel/MessageInput.svelte @@ -17,7 +17,6 @@ import { WEBUI_API_BASE_URL } from '$lib/constants'; import FileItem from '../common/FileItem.svelte'; import Image from '../common/Image.svelte'; - import { transcribeAudio } from '$lib/apis/audio'; import FilesOverlay from '../chat/MessageInput/FilesOverlay.svelte'; export let placeholder = $i18n.t('Send a Message'); @@ -160,7 +159,19 @@ try { // During the file upload, file content is automatically extracted. - const uploadedFile = await uploadFile(localStorage.token, file); + + // If the file is an audio file, provide the language for STT. + let metadata = null; + if ( + (file.type.startsWith('audio/') || file.type.startsWith('video/')) && + $settings?.audio?.stt?.language + ) { + metadata = { + language: $settings?.audio?.stt?.language + }; + } + + const uploadedFile = await uploadFile(localStorage.token, file, metadata); if (uploadedFile) { console.info('File upload completed:', { diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index 787e046da..a37ce5be7 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -591,9 +591,20 @@ throw new Error('Created file is empty'); } + // If the file is an audio file, provide the language for STT. + let metadata = null; + if ( + (file.type.startsWith('audio/') || file.type.startsWith('video/')) && + $settings?.audio?.stt?.language + ) { + metadata = { + language: $settings?.audio?.stt?.language + }; + } + // Upload file to server console.log('Uploading file to server...'); - const uploadedFile = await uploadFile(localStorage.token, file); + const uploadedFile = await uploadFile(localStorage.token, file, metadata); if (!uploadedFile) { throw new Error('Server returned null response for file upload'); diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index c7e56c9b4..223ce536d 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -27,7 +27,6 @@ createMessagesList, extractCurlyBraceWords } from '$lib/utils'; - import { transcribeAudio } from '$lib/apis/audio'; import { uploadFile } from '$lib/apis/files'; import { generateAutoCompletion } from '$lib/apis'; import { deleteFileById } from '$lib/apis/files'; @@ -249,8 +248,19 @@ files = [...files, fileItem]; try { + // If the file is an audio file, provide the language for STT. + let metadata = null; + if ( + (file.type.startsWith('audio/') || file.type.startsWith('video/')) && + $settings?.audio?.stt?.language + ) { + metadata = { + language: $settings?.audio?.stt?.language + }; + } + // During the file upload, file content is automatically extracted. - const uploadedFile = await uploadFile(localStorage.token, file); + const uploadedFile = await uploadFile(localStorage.token, file, metadata); if (uploadedFile) { console.log('File upload completed:', { diff --git a/src/lib/components/chat/MessageInput/CallOverlay.svelte b/src/lib/components/chat/MessageInput/CallOverlay.svelte index c993681c5..ba7f5958c 100644 --- a/src/lib/components/chat/MessageInput/CallOverlay.svelte +++ b/src/lib/components/chat/MessageInput/CallOverlay.svelte @@ -153,7 +153,11 @@ await tick(); const file = blobToFile(audioBlob, 'recording.wav'); - const res = await transcribeAudio(localStorage.token, file).catch((error) => { + const res = await transcribeAudio( + localStorage.token, + file, + $settings?.audio?.stt?.language + ).catch((error) => { toast.error(`${error}`); return null; }); diff --git a/src/lib/components/chat/MessageInput/VoiceRecording.svelte b/src/lib/components/chat/MessageInput/VoiceRecording.svelte index d9bddf022..93867b80e 100644 --- a/src/lib/components/chat/MessageInput/VoiceRecording.svelte +++ b/src/lib/components/chat/MessageInput/VoiceRecording.svelte @@ -150,7 +150,11 @@ return; } - const res = await transcribeAudio(localStorage.token, file).catch((error) => { + const res = await transcribeAudio( + localStorage.token, + file, + $settings?.audio?.stt?.language + ).catch((error) => { toast.error(`${error}`); return null; }); diff --git a/src/lib/components/chat/Settings/Audio.svelte b/src/lib/components/chat/Settings/Audio.svelte index a24a25ace..24894c45b 100644 --- a/src/lib/components/chat/Settings/Audio.svelte +++ b/src/lib/components/chat/Settings/Audio.svelte @@ -9,6 +9,7 @@ import Switch from '$lib/components/common/Switch.svelte'; import { round } from '@huggingface/transformers'; import Spinner from '$lib/components/common/Spinner.svelte'; + import Tooltip from '$lib/components/common/Tooltip.svelte'; const dispatch = createEventDispatcher(); const i18n = getContext('i18n'); @@ -22,6 +23,7 @@ let nonLocalVoices = false; let STTEngine = ''; + let STTLanguage = ''; let TTSEngine = ''; let TTSEngineConfig = {}; @@ -89,6 +91,7 @@ responseAutoPlayback = $settings.responseAutoPlayback ?? false; STTEngine = $settings?.audio?.stt?.engine ?? ''; + STTLanguage = $settings?.audio?.stt?.language ?? ''; TTSEngine = $settings?.audio?.tts?.engine ?? ''; TTSEngineConfig = $settings?.audio?.tts?.engineConfig ?? {}; @@ -156,7 +159,8 @@ saveSettings({ audio: { stt: { - engine: STTEngine !== '' ? STTEngine : undefined + engine: STTEngine !== '' ? STTEngine : undefined, + language: STTLanguage !== '' ? STTLanguage : undefined }, tts: { engine: TTSEngine !== '' ? TTSEngine : undefined, @@ -189,6 +193,26 @@
+ +
+
{$i18n.t('Language')}
+ +
+ + + +
+
{/if}
@@ -269,7 +293,7 @@
{$i18n.t('Speech Playback Speed')}
-
+
- import { DropdownMenu } from 'bits-ui'; - import { getContext } from 'svelte'; - - import { showSettings } from '$lib/stores'; - import { flyAndScale } from '$lib/utils/transitions'; - - import Dropdown from '$lib/components/common/Dropdown.svelte'; - import QuestionMarkCircle from '$lib/components/icons/QuestionMarkCircle.svelte'; - import Keyboard from '$lib/components/icons/Keyboard.svelte'; - import Map from '$lib/components/icons/Map.svelte'; - - const i18n = getContext('i18n'); - - export let showDocsHandler: Function; - export let showShortcutsHandler: Function; - - export let onClose: Function = () => {}; - - - { - if (e.detail === false) { - onClose(); - } - }} -> - - -
- - { - window.open('https://docs.openwebui.com', '_blank'); - }} - > - -
{$i18n.t('Documentation')}
-
- - - { - window.open('https://github.com/open-webui/open-webui/releases', '_blank'); - }} - > - -
{$i18n.t('Releases')}
-
- - { - showShortcutsHandler(); - }} - > - -
{$i18n.t('Keyboard shortcuts')}
-
-
-
-
diff --git a/src/lib/components/notes/NoteEditor.svelte b/src/lib/components/notes/NoteEditor.svelte index a27c1ed8e..1971278ae 100644 --- a/src/lib/components/notes/NoteEditor.svelte +++ b/src/lib/components/notes/NoteEditor.svelte @@ -276,8 +276,19 @@ files = [...files, fileItem]; try { + // If the file is an audio file, provide the language for STT. + let metadata = null; + if ( + (file.type.startsWith('audio/') || file.type.startsWith('video/')) && + $settings?.audio?.stt?.language + ) { + metadata = { + language: $settings?.audio?.stt?.language + }; + } + // During the file upload, file content is automatically extracted. - const uploadedFile = await uploadFile(localStorage.token, file); + const uploadedFile = await uploadFile(localStorage.token, file, metadata); if (uploadedFile) { console.log('File upload completed:', { diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 7b318703b..600f5137c 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -26,10 +26,7 @@ updateFileFromKnowledgeById, updateKnowledgeById } from '$lib/apis/knowledge'; - - import { transcribeAudio } from '$lib/apis/audio'; import { blobToFile } from '$lib/utils'; - import { processFile } from '$lib/apis/retrieval'; import Spinner from '$lib/components/common/Spinner.svelte'; import Files from './KnowledgeBase/Files.svelte'; @@ -158,7 +155,18 @@ knowledge.files = [...(knowledge.files ?? []), fileItem]; try { - const uploadedFile = await uploadFile(localStorage.token, file).catch((e) => { + // If the file is an audio file, provide the language for STT. + let metadata = null; + if ( + (file.type.startsWith('audio/') || file.type.startsWith('video/')) && + $settings?.audio?.stt?.language + ) { + metadata = { + language: $settings?.audio?.stt?.language + }; + } + + const uploadedFile = await uploadFile(localStorage.token, file, metadata).catch((e) => { toast.error(`${e}`); return null; }); From a46765fd0ea200359f8915791d558628420fb273 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 00:43:02 +0400 Subject: [PATCH 078/144] refac --- .../components/workspace/Knowledge/KnowledgeBase.svelte | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index 600f5137c..ad4a1df47 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -9,7 +9,14 @@ import { goto } from '$app/navigation'; import { page } from '$app/stores'; - import { mobile, showSidebar, knowledge as _knowledge, config, user } from '$lib/stores'; + import { + mobile, + showSidebar, + knowledge as _knowledge, + config, + user, + settings + } from '$lib/stores'; import { updateFileDataContentById, From 8b5e89eada7e861db3962cab46d537267dc0c6eb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 00:43:38 +0400 Subject: [PATCH 079/144] chore: format --- .../open_webui/retrieval/loaders/mistral.py | 310 +++++++++++------- backend/open_webui/utils/middleware.py | 7 +- .../chat/Messages/CitationsModal.svelte | 7 +- src/lib/i18n/locales/ar-BH/translation.json | 3 + src/lib/i18n/locales/ar/translation.json | 3 + src/lib/i18n/locales/bg-BG/translation.json | 3 + src/lib/i18n/locales/bn-BD/translation.json | 3 + src/lib/i18n/locales/bo-TB/translation.json | 3 + src/lib/i18n/locales/ca-ES/translation.json | 3 + src/lib/i18n/locales/ceb-PH/translation.json | 3 + src/lib/i18n/locales/cs-CZ/translation.json | 3 + src/lib/i18n/locales/da-DK/translation.json | 3 + src/lib/i18n/locales/de-DE/translation.json | 3 + src/lib/i18n/locales/dg-DG/translation.json | 3 + src/lib/i18n/locales/el-GR/translation.json | 3 + src/lib/i18n/locales/en-GB/translation.json | 3 + src/lib/i18n/locales/en-US/translation.json | 3 + src/lib/i18n/locales/es-ES/translation.json | 3 + src/lib/i18n/locales/et-EE/translation.json | 3 + src/lib/i18n/locales/eu-ES/translation.json | 3 + src/lib/i18n/locales/fa-IR/translation.json | 3 + src/lib/i18n/locales/fi-FI/translation.json | 3 + src/lib/i18n/locales/fr-CA/translation.json | 3 + src/lib/i18n/locales/fr-FR/translation.json | 3 + src/lib/i18n/locales/he-IL/translation.json | 3 + src/lib/i18n/locales/hi-IN/translation.json | 3 + src/lib/i18n/locales/hr-HR/translation.json | 3 + src/lib/i18n/locales/hu-HU/translation.json | 3 + src/lib/i18n/locales/id-ID/translation.json | 3 + src/lib/i18n/locales/ie-GA/translation.json | 3 + src/lib/i18n/locales/it-IT/translation.json | 3 + src/lib/i18n/locales/ja-JP/translation.json | 3 + src/lib/i18n/locales/ka-GE/translation.json | 3 + src/lib/i18n/locales/ko-KR/translation.json | 3 + src/lib/i18n/locales/lt-LT/translation.json | 3 + src/lib/i18n/locales/ms-MY/translation.json | 3 + src/lib/i18n/locales/nb-NO/translation.json | 3 + src/lib/i18n/locales/nl-NL/translation.json | 3 + src/lib/i18n/locales/pa-IN/translation.json | 3 + src/lib/i18n/locales/pl-PL/translation.json | 3 + src/lib/i18n/locales/pt-BR/translation.json | 3 + src/lib/i18n/locales/pt-PT/translation.json | 3 + src/lib/i18n/locales/ro-RO/translation.json | 3 + src/lib/i18n/locales/ru-RU/translation.json | 3 + src/lib/i18n/locales/sk-SK/translation.json | 3 + src/lib/i18n/locales/sr-RS/translation.json | 3 + src/lib/i18n/locales/sv-SE/translation.json | 3 + src/lib/i18n/locales/th-TH/translation.json | 3 + src/lib/i18n/locales/tk-TW/translation.json | 3 + src/lib/i18n/locales/tr-TR/translation.json | 3 + src/lib/i18n/locales/uk-UA/translation.json | 3 + src/lib/i18n/locales/ur-PK/translation.json | 3 + src/lib/i18n/locales/vi-VN/translation.json | 3 + src/lib/i18n/locales/zh-CN/translation.json | 3 + src/lib/i18n/locales/zh-TW/translation.json | 3 + 55 files changed, 352 insertions(+), 128 deletions(-) diff --git a/backend/open_webui/retrieval/loaders/mistral.py b/backend/open_webui/retrieval/loaders/mistral.py index 2f0e2b8bb..67641d050 100644 --- a/backend/open_webui/retrieval/loaders/mistral.py +++ b/backend/open_webui/retrieval/loaders/mistral.py @@ -25,12 +25,12 @@ class MistralLoader: BASE_API_URL = "https://api.mistral.ai/v1" def __init__( - self, - api_key: str, + self, + api_key: str, file_path: str, timeout: int = 300, # 5 minutes default max_retries: int = 3, - enable_debug_logging: bool = False + enable_debug_logging: bool = False, ): """ Initializes the loader with enhanced features. @@ -52,14 +52,14 @@ class MistralLoader: self.timeout = timeout self.max_retries = max_retries self.debug = enable_debug_logging - + # Pre-compute file info for performance self.file_name = os.path.basename(file_path) self.file_size = os.path.getsize(file_path) - + self.headers = { "Authorization": f"Bearer {self.api_key}", - "User-Agent": "OpenWebUI-MistralLoader/2.0" + "User-Agent": "OpenWebUI-MistralLoader/2.0", } def _debug_log(self, message: str, *args) -> None: @@ -85,21 +85,25 @@ class MistralLoader: log.error(f"JSON decode error: {json_err} - Response: {response.text}") raise # Re-raise after logging - async def _handle_response_async(self, response: aiohttp.ClientResponse) -> Dict[str, Any]: + async def _handle_response_async( + self, response: aiohttp.ClientResponse + ) -> Dict[str, Any]: """Async version of response handling with better error info.""" try: response.raise_for_status() - + # Check content type - content_type = response.headers.get('content-type', '') - if 'application/json' not in content_type: + content_type = response.headers.get("content-type", "") + if "application/json" not in content_type: if response.status == 204: return {} text = await response.text() - raise ValueError(f"Unexpected content type: {content_type}, body: {text[:200]}...") - + raise ValueError( + f"Unexpected content type: {content_type}, body: {text[:200]}..." + ) + return await response.json() - + except aiohttp.ClientResponseError as e: error_text = await response.text() if response else "No response" log.error(f"HTTP {e.status}: {e.message} - Response: {error_text[:500]}") @@ -119,9 +123,11 @@ class MistralLoader: except (requests.exceptions.RequestException, Exception) as e: if attempt == self.max_retries - 1: raise - - wait_time = (2 ** attempt) + 0.5 - log.warning(f"Request failed (attempt {attempt + 1}/{self.max_retries}): {e}. Retrying in {wait_time}s...") + + wait_time = (2**attempt) + 0.5 + log.warning( + f"Request failed (attempt {attempt + 1}/{self.max_retries}): {e}. Retrying in {wait_time}s..." + ) time.sleep(wait_time) async def _retry_request_async(self, request_func, *args, **kwargs): @@ -132,9 +138,11 @@ class MistralLoader: except (aiohttp.ClientError, asyncio.TimeoutError) as e: if attempt == self.max_retries - 1: raise - - wait_time = (2 ** attempt) + 0.5 - log.warning(f"Request failed (attempt {attempt + 1}/{self.max_retries}): {e}. Retrying in {wait_time}s...") + + wait_time = (2**attempt) + 0.5 + log.warning( + f"Request failed (attempt {attempt + 1}/{self.max_retries}): {e}. Retrying in {wait_time}s..." + ) await asyncio.sleep(wait_time) def _upload_file(self) -> str: @@ -149,11 +157,11 @@ class MistralLoader: data = {"purpose": "ocr"} response = requests.post( - url, - headers=self.headers, - files=files, + url, + headers=self.headers, + files=files, data=data, - timeout=self.timeout + timeout=self.timeout, ) return self._handle_response(response) @@ -172,39 +180,45 @@ class MistralLoader: async def _upload_file_async(self, session: aiohttp.ClientSession) -> str: """Async file upload with streaming for better memory efficiency.""" url = f"{self.BASE_API_URL}/files" - + async def upload_request(): # Create multipart writer for streaming upload - writer = aiohttp.MultipartWriter('form-data') - + writer = aiohttp.MultipartWriter("form-data") + # Add purpose field - purpose_part = writer.append('ocr') - purpose_part.set_content_disposition('form-data', name='purpose') - + purpose_part = writer.append("ocr") + purpose_part.set_content_disposition("form-data", name="purpose") + # Add file part with streaming - file_part = writer.append_payload(aiohttp.streams.FilePayload( - self.file_path, - filename=self.file_name, - content_type='application/pdf' - )) - file_part.set_content_disposition('form-data', name='file', filename=self.file_name) - - self._debug_log(f"Uploading file: {self.file_name} ({self.file_size:,} bytes)") - + file_part = writer.append_payload( + aiohttp.streams.FilePayload( + self.file_path, + filename=self.file_name, + content_type="application/pdf", + ) + ) + file_part.set_content_disposition( + "form-data", name="file", filename=self.file_name + ) + + self._debug_log( + f"Uploading file: {self.file_name} ({self.file_size:,} bytes)" + ) + async with session.post( - url, - data=writer, + url, + data=writer, headers=self.headers, - timeout=aiohttp.ClientTimeout(total=self.timeout) + timeout=aiohttp.ClientTimeout(total=self.timeout), ) as response: return await self._handle_response_async(response) - + response_data = await self._retry_request_async(upload_request) - + file_id = response_data.get("id") if not file_id: raise ValueError("File ID not found in upload response.") - + log.info(f"File uploaded successfully. File ID: {file_id}") return file_id @@ -217,10 +231,7 @@ class MistralLoader: def url_request(): response = requests.get( - url, - headers=signed_url_headers, - params=params, - timeout=self.timeout + url, headers=signed_url_headers, params=params, timeout=self.timeout ) return self._handle_response(response) @@ -235,32 +246,31 @@ class MistralLoader: log.error(f"Failed to get signed URL: {e}") raise - async def _get_signed_url_async(self, session: aiohttp.ClientSession, file_id: str) -> str: + async def _get_signed_url_async( + self, session: aiohttp.ClientSession, file_id: str + ) -> str: """Async signed URL retrieval.""" url = f"{self.BASE_API_URL}/files/{file_id}/url" params = {"expiry": 1} - - headers = { - **self.headers, - "Accept": "application/json" - } - + + headers = {**self.headers, "Accept": "application/json"} + async def url_request(): self._debug_log(f"Getting signed URL for file ID: {file_id}") async with session.get( - url, - headers=headers, + url, + headers=headers, params=params, - timeout=aiohttp.ClientTimeout(total=self.timeout) + timeout=aiohttp.ClientTimeout(total=self.timeout), ) as response: return await self._handle_response_async(response) - + response_data = await self._retry_request_async(url_request) - + signed_url = response_data.get("url") if not signed_url: raise ValueError("Signed URL not found in response.") - + self._debug_log("Signed URL received successfully") return signed_url @@ -284,10 +294,7 @@ class MistralLoader: def ocr_request(): response = requests.post( - url, - headers=ocr_headers, - json=payload, - timeout=self.timeout + url, headers=ocr_headers, json=payload, timeout=self.timeout ) return self._handle_response(response) @@ -300,16 +307,18 @@ class MistralLoader: log.error(f"Failed during OCR processing: {e}") raise - async def _process_ocr_async(self, session: aiohttp.ClientSession, signed_url: str) -> Dict[str, Any]: + async def _process_ocr_async( + self, session: aiohttp.ClientSession, signed_url: str + ) -> Dict[str, Any]: """Async OCR processing with timing metrics.""" url = f"{self.BASE_API_URL}/ocr" - + headers = { **self.headers, "Content-Type": "application/json", "Accept": "application/json", } - + payload = { "model": "mistral-ocr-latest", "document": { @@ -318,24 +327,24 @@ class MistralLoader: }, "include_image_base64": False, } - + async def ocr_request(): log.info("Starting OCR processing via Mistral API") start_time = time.time() - + async with session.post( - url, - json=payload, + url, + json=payload, headers=headers, - timeout=aiohttp.ClientTimeout(total=self.timeout) + timeout=aiohttp.ClientTimeout(total=self.timeout), ) as response: ocr_response = await self._handle_response_async(response) - + processing_time = time.time() - start_time log.info(f"OCR processing completed in {processing_time:.2f}s") - + return ocr_response - + return await self._retry_request_async(ocr_request) def _delete_file(self, file_id: str) -> None: @@ -351,21 +360,26 @@ class MistralLoader: # Log error but don't necessarily halt execution if deletion fails log.error(f"Failed to delete file ID {file_id}: {e}") - async def _delete_file_async(self, session: aiohttp.ClientSession, file_id: str) -> None: + async def _delete_file_async( + self, session: aiohttp.ClientSession, file_id: str + ) -> None: """Async file deletion with error tolerance.""" try: + async def delete_request(): self._debug_log(f"Deleting file ID: {file_id}") async with session.delete( - url=f"{self.BASE_API_URL}/files/{file_id}", + url=f"{self.BASE_API_URL}/files/{file_id}", headers=self.headers, - timeout=aiohttp.ClientTimeout(total=30) # Shorter timeout for cleanup + timeout=aiohttp.ClientTimeout( + total=30 + ), # Shorter timeout for cleanup ) as response: return await self._handle_response_async(response) - + await self._retry_request_async(delete_request) self._debug_log(f"File {file_id} deleted successfully") - + except Exception as e: # Don't fail the entire process if cleanup fails log.warning(f"Failed to delete file ID {file_id}: {e}") @@ -379,13 +393,13 @@ class MistralLoader: ttl_dns_cache=300, # DNS cache TTL use_dns_cache=True, keepalive_timeout=30, - enable_cleanup_closed=True + enable_cleanup_closed=True, ) - + async with aiohttp.ClientSession( connector=connector, timeout=aiohttp.ClientTimeout(total=self.timeout), - headers={"User-Agent": "OpenWebUI-MistralLoader/2.0"} + headers={"User-Agent": "OpenWebUI-MistralLoader/2.0"}, ) as session: yield session @@ -394,31 +408,40 @@ class MistralLoader: pages_data = ocr_response.get("pages") if not pages_data: log.warning("No pages found in OCR response.") - return [Document(page_content="No text content found", metadata={"error": "no_pages"})] + return [ + Document( + page_content="No text content found", metadata={"error": "no_pages"} + ) + ] documents = [] total_pages = len(pages_data) skipped_pages = 0 - + for page_data in pages_data: page_content = page_data.get("markdown") page_index = page_data.get("index") # API uses 0-based index if page_content is not None and page_index is not None: # Clean up content efficiently - cleaned_content = page_content.strip() if isinstance(page_content, str) else str(page_content) - + cleaned_content = ( + page_content.strip() + if isinstance(page_content, str) + else str(page_content) + ) + if cleaned_content: # Only add non-empty pages documents.append( Document( page_content=cleaned_content, metadata={ "page": page_index, # 0-based index from API - "page_label": page_index + 1, # 1-based label for convenience + "page_label": page_index + + 1, # 1-based label for convenience "total_pages": total_pages, "file_name": self.file_name, "file_size": self.file_size, - "processing_engine": "mistral-ocr" + "processing_engine": "mistral-ocr", }, ) ) @@ -427,18 +450,24 @@ class MistralLoader: self._debug_log(f"Skipping empty page {page_index}") else: skipped_pages += 1 - self._debug_log(f"Skipping page due to missing 'markdown' or 'index'. Data: {page_data}") + self._debug_log( + f"Skipping page due to missing 'markdown' or 'index'. Data: {page_data}" + ) if skipped_pages > 0: - log.info(f"Processed {len(documents)} pages, skipped {skipped_pages} empty/invalid pages") + log.info( + f"Processed {len(documents)} pages, skipped {skipped_pages} empty/invalid pages" + ) if not documents: # Case where pages existed but none had valid markdown/index - log.warning("OCR response contained pages, but none had valid content/index.") + log.warning( + "OCR response contained pages, but none had valid content/index." + ) return [ Document( page_content="No valid text content found in document", - metadata={"error": "no_valid_pages", "total_pages": total_pages} + metadata={"error": "no_valid_pages", "total_pages": total_pages}, ) ] @@ -454,7 +483,7 @@ class MistralLoader: """ file_id = None start_time = time.time() - + try: # 1. Upload file file_id = self._upload_file() @@ -467,20 +496,29 @@ class MistralLoader: # 4. Process results documents = self._process_results(ocr_response) - + total_time = time.time() - start_time - log.info(f"Sync OCR workflow completed in {total_time:.2f}s, produced {len(documents)} documents") - + log.info( + f"Sync OCR workflow completed in {total_time:.2f}s, produced {len(documents)} documents" + ) + return documents except Exception as e: total_time = time.time() - start_time - log.error(f"An error occurred during the loading process after {total_time:.2f}s: {e}") + log.error( + f"An error occurred during the loading process after {total_time:.2f}s: {e}" + ) # Return an error document on failure - return [Document( - page_content=f"Error during processing: {e}", - metadata={"error": "processing_failed", "file_name": self.file_name} - )] + return [ + Document( + page_content=f"Error during processing: {e}", + metadata={ + "error": "processing_failed", + "file_name": self.file_name, + }, + ) + ] finally: # 5. Delete file (attempt even if prior steps failed after upload) if file_id: @@ -488,18 +526,20 @@ class MistralLoader: self._delete_file(file_id) except Exception as del_e: # Log deletion error, but don't overwrite original error if one occurred - log.error(f"Cleanup error: Could not delete file ID {file_id}. Reason: {del_e}") + log.error( + f"Cleanup error: Could not delete file ID {file_id}. Reason: {del_e}" + ) async def load_async(self) -> List[Document]: """ Asynchronous OCR workflow execution with optimized performance. - + Returns: A list of Document objects, one for each page processed. """ file_id = None start_time = time.time() - + try: async with self._get_session() as session: # 1. Upload file with streaming @@ -513,19 +553,26 @@ class MistralLoader: # 4. Process results documents = self._process_results(ocr_response) - + total_time = time.time() - start_time - log.info(f"Async OCR workflow completed in {total_time:.2f}s, produced {len(documents)} documents") - + log.info( + f"Async OCR workflow completed in {total_time:.2f}s, produced {len(documents)} documents" + ) + return documents except Exception as e: total_time = time.time() - start_time log.error(f"Async OCR workflow failed after {total_time:.2f}s: {e}") - return [Document( - page_content=f"Error during OCR processing: {e}", - metadata={"error": "processing_failed", "file_name": self.file_name} - )] + return [ + Document( + page_content=f"Error during OCR processing: {e}", + metadata={ + "error": "processing_failed", + "file_name": self.file_name, + }, + ) + ] finally: # 5. Cleanup - always attempt file deletion if file_id: @@ -536,40 +583,51 @@ class MistralLoader: log.error(f"Cleanup failed for file ID {file_id}: {cleanup_error}") @staticmethod - async def load_multiple_async(loaders: List['MistralLoader']) -> List[List[Document]]: + async def load_multiple_async( + loaders: List["MistralLoader"], + ) -> List[List[Document]]: """ Process multiple files concurrently for maximum performance. - + Args: loaders: List of MistralLoader instances - + Returns: List of document lists, one for each loader """ if not loaders: return [] - + log.info(f"Starting concurrent processing of {len(loaders)} files") start_time = time.time() - + # Process all files concurrently tasks = [loader.load_async() for loader in loaders] results = await asyncio.gather(*tasks, return_exceptions=True) - + # Handle any exceptions in results processed_results = [] for i, result in enumerate(results): if isinstance(result, Exception): log.error(f"File {i} failed: {result}") - processed_results.append([Document( - page_content=f"Error processing file: {result}", - metadata={"error": "batch_processing_failed", "file_index": i} - )]) + processed_results.append( + [ + Document( + page_content=f"Error processing file: {result}", + metadata={ + "error": "batch_processing_failed", + "file_index": i, + }, + ) + ] + ) else: processed_results.append(result) - + total_time = time.time() - start_time total_docs = sum(len(docs) for docs in processed_results) - log.info(f"Batch processing completed in {total_time:.2f}s, produced {total_docs} total documents") - + log.info( + f"Batch processing completed in {total_time:.2f}s, produced {total_docs} total documents" + ) + return processed_results diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 16ce553e6..6b629c12d 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -252,7 +252,12 @@ async def chat_completion_tools_handler( "name": (f"TOOL:{tool_name}"), }, "document": [tool_result], - "metadata": [{"source": (f"TOOL:{tool_name}"), "parameters": tool_function_params}], + "metadata": [ + { + "source": (f"TOOL:{tool_name}"), + "parameters": tool_function_params, + } + ], } ) else: diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index ed1fb95cd..48d77b0b7 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -121,7 +121,12 @@
{$i18n.t('Parameters')}
-
{JSON.stringify(document.metadata.parameters, null, 2)}
+
{JSON.stringify(
+										document.metadata.parameters,
+										null,
+										2
+									)}
{/if} {#if showRelevance}
diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 1fc0f8a58..313548984 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "الباسورد", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF ملف (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index a8bf1df4e..98942d6f7 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "مثال: 60", "e.g. A filter to remove profanity from text": "مثال: مرشح لإزالة الألفاظ النابية من النص", + "e.g. en": "", "e.g. My Filter": "مثال: مرشحي", "e.g. My Tools": "مثال: أدواتي", "e.g. my_filter": "مثال: my_filter", @@ -889,6 +890,7 @@ "Output format": "تنسيق الإخراج", "Overview": "نظرة عامة", "page": "صفحة", + "Parameters": "", "Password": "الباسورد", "Paste Large Text as File": "الصق نصًا كبيرًا كملف", "PDF document (.pdf)": "PDF ملف (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "يحدد حجم الدفعة عدد طلبات النصوص التي تتم معالجتها معًا. الحجم الأكبر يمكن أن يزيد الأداء والسرعة، ولكنه يحتاج أيضًا إلى ذاكرة أكبر.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "المطورون خلف هذا المكون الإضافي هم متطوعون شغوفون من المجتمع. إذا وجدت هذا المكون مفيدًا، فكر في المساهمة في تطويره.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "قائمة التقييم تعتمد على نظام Elo ويتم تحديثها في الوقت الفعلي.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "السمة LDAP التي تتوافق مع البريد الإلكتروني الذي يستخدمه المستخدمون لتسجيل الدخول.", "The LDAP attribute that maps to the username that users use to sign in.": "السمة LDAP التي تتوافق مع اسم المستخدم الذي يستخدمه المستخدمون لتسجيل الدخول.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "لوحة المتصدرين حالياً في وضع تجريبي، وقد نقوم بتعديل حسابات التصنيف أثناء تحسين الخوارزمية.", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index beaaff609..b02bcb72c 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "напр. Филтър за премахване на нецензурни думи от текста", + "e.g. en": "", "e.g. My Filter": "напр. Моят филтър", "e.g. My Tools": "напр. Моите инструменти", "e.g. my_filter": "напр. моят_филтър", @@ -889,6 +890,7 @@ "Output format": "Изходен формат", "Overview": "Преглед", "page": "страница", + "Parameters": "", "Password": "Парола", "Paste Large Text as File": "Поставете голям текст като файл", "PDF document (.pdf)": "PDF документ (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Разработчиците зад този плъгин са страстни доброволци от общността. Ако намирате този плъгин полезен, моля, обмислете да допринесете за неговото развитие.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Класацията за оценка се базира на рейтинговата система Elo и се обновява в реално време.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "LDAP атрибутът, който съответства на имейла, който потребителите използват за вписване.", "The LDAP attribute that maps to the username that users use to sign in.": "LDAP атрибутът, който съответства на потребителското име, което потребителите използват за вписване.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Класацията в момента е в бета версия и може да коригираме изчисленията на рейтинга, докато усъвършенстваме алгоритъма.", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index 9b679e53f..cb17797a2 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "পাসওয়ার্ড", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index b6248455a..285907783 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "དཔེར་ན། \"json\" ཡང་ན་ JSON གི་ schema", "e.g. 60": "དཔེར་ན། ༦༠", "e.g. A filter to remove profanity from text": "དཔེར་ན། ཡིག་རྐྱང་ནས་ཚིག་རྩུབ་འདོར་བྱེད་ཀྱི་འཚག་མ།", + "e.g. en": "", "e.g. My Filter": "དཔེར་ན། ངའི་འཚག་མ།", "e.g. My Tools": "དཔེར་ན། ངའི་ལག་ཆ།", "e.g. my_filter": "དཔེར་ན། my_filter", @@ -889,6 +890,7 @@ "Output format": "ཐོན་འབྲས་ཀྱི་བཀོད་པ།", "Overview": "སྤྱི་མཐོང་།", "page": "ཤོག་ངོས།", + "Parameters": "", "Password": "གསང་གྲངས།", "Paste Large Text as File": "ཡིག་རྐྱང་ཆེན་པོ་ཡིག་ཆ་ལྟར་སྦྱོར་བ།", "PDF document (.pdf)": "PDF ཡིག་ཆ། (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "ཚན་ཆུང་གི་ཆེ་ཆུང་གིས་ཡིག་རྐྱང་རེ་ཞུ་ག་ཚོད་མཉམ་དུ་ཐེངས་གཅིག་ལ་སྒྲུབ་དགོས་གཏན་འཁེལ་བྱེད། ཚན་ཆུང་ཆེ་བ་ཡིས་དཔེ་དབྱིབས་ཀྱི་ལས་ཆོད་དང་མྱུར་ཚད་མང་དུ་གཏོང་ཐུབ། འོན་ཀྱང་དེས་དྲན་ཤེས་མང་བ་དགོས།", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "plugin འདིའི་རྒྱབ་ཀྱི་གསར་སྤེལ་བ་དག་ནི་སྤྱི་ཚོགས་ནས་ཡིན་པའི་སེམས་ཤུགས་ཅན་གྱི་དང་བླངས་པ་ཡིན། གལ་ཏེ་ཁྱེད་ཀྱིས་ plugin འདི་ཕན་ཐོགས་ཡོད་པ་མཐོང་ན། དེའི་གསར་སྤེལ་ལ་ཞལ་འདེབས་གནང་བར་བསམ་ཞིབ་གནང་རོགས།", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "གདེང་འཇོག་འགྲན་རེས་རེའུ་མིག་དེ་ Elo སྐར་མ་སྤྲོད་པའི་མ་ལག་ལ་གཞི་བཅོལ་ཡོད། དེ་མིན་དུས་ཐོག་ཏུ་གསར་སྒྱུར་བྱེད་ཀྱི་ཡོད།", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "བེད་སྤྱོད་མཁན་ཚོས་ནང་འཛུལ་བྱེད་སྐབས་བེད་སྤྱོད་གཏོང་བའི་ཡིག་ཟམ་ལ་སྦྲེལ་བའི་ LDAP ཁྱད་ཆོས།", "The LDAP attribute that maps to the username that users use to sign in.": "བེད་སྤྱོད་མཁན་ཚོས་ནང་འཛུལ་བྱེད་སྐབས་བེད་སྤྱོད་གཏོང་བའི་བེད་སྤྱོད་མིང་ལ་སྦྲེལ་བའི་ LDAP ཁྱད་ཆོས།", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "འགྲན་རེས་རེའུ་མིག་དེ་ད་ལྟ་ Beta པར་གཞི་ཡིན། ང་ཚོས་ཨང་རྩིས་དེ་ཞིབ་ཚགས་སུ་གཏོང་སྐབས་སྐར་མའི་རྩིས་རྒྱག་ལེགས་སྒྲིག་བྱེད་སྲིད།", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 9d9c9f33f..c7541dbbc 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "p. ex. \"json\" o un esquema JSON", "e.g. 60": "p. ex. 60", "e.g. A filter to remove profanity from text": "p. ex. Un filtre per eliminar paraules malsonants del text", + "e.g. en": "", "e.g. My Filter": "p. ex. El meu filtre", "e.g. My Tools": "p. ex. Les meves eines", "e.g. my_filter": "p. ex. els_meus_filtres", @@ -889,6 +890,7 @@ "Output format": "Format de sortida", "Overview": "Vista general", "page": "pàgina", + "Parameters": "", "Password": "Contrasenya", "Paste Large Text as File": "Enganxa un text llarg com a fitxer", "PDF document (.pdf)": "Document PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "La mida del lot determina quantes sol·licituds de text es processen alhora. Una mida de lot més gran pot augmentar el rendiment i la velocitat del model, però també requereix més memòria.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Els desenvolupadors d'aquest complement són voluntaris apassionats de la comunitat. Si trobeu útil aquest complement, considereu contribuir al seu desenvolupament.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La classificació d'avaluació es basa en el sistema de qualificació Elo i s'actualitza en temps real.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "L'atribut LDAP que s'associa al correu que els usuaris utilitzen per iniciar la sessió.", "The LDAP attribute that maps to the username that users use to sign in.": "L'atribut LDAP que mapeja el nom d'usuari amb l'usuari que vol iniciar sessió", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "La classificació està actualment en versió beta i és possible que s'ajustin els càlculs de la puntuació a mesura que es perfeccioni l'algorisme.", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index a93358d1d..b2337fd18 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Password", "Paste Large Text as File": "", "PDF document (.pdf)": "", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 991708566..4aa181f92 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "Formát výstupu", "Overview": "Přehled", "page": "stránka", + "Parameters": "", "Password": "Heslo", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Vývojáři stojící za tímto pluginem jsou zapálení dobrovolníci z komunity. Pokud považujete tento plugin za užitečný, zvažte příspěvek k jeho vývoji.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Hodnotící žebříček je založen na systému hodnocení Elo a je aktualizován v reálném čase.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Žebříček je v současné době v beta verzi a můžeme upravit výpočty hodnocení, jak budeme zdokonalovat algoritmus.", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index 1e50c0215..60dc2620f 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "f.eks. \"json\" eller en JSON schema", "e.g. 60": "f.eks. 60", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "Outputformat", "Overview": "Oversigt", "page": "side", + "Parameters": "", "Password": "Adgangskode", "Paste Large Text as File": "Indsæt store tekster som fil", "PDF document (.pdf)": "PDF-dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Udviklerne bag dette plugin er passionerede frivillige fra fællesskabet. Hvis du finder dette plugin nyttigt, kan du overveje at bidrage til dets udvikling.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 3ecea28e0..a31823e70 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "z. B. \"json\" oder ein JSON-Schema", "e.g. 60": "z. B. 60", "e.g. A filter to remove profanity from text": "z. B. Ein Filter, um Schimpfwörter aus Text zu entfernen", + "e.g. en": "", "e.g. My Filter": "z. B. Mein Filter", "e.g. My Tools": "z. B. Meine Werkzeuge", "e.g. my_filter": "z. B. mein_filter", @@ -889,6 +890,7 @@ "Output format": "Ausgabeformat", "Overview": "Übersicht", "page": "Seite", + "Parameters": "", "Password": "Passwort", "Paste Large Text as File": "Großen Text als Datei einfügen", "PDF document (.pdf)": "PDF-Dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Die Entwickler hinter diesem Plugin sind leidenschaftliche Freiwillige aus der Community. Wenn Sie dieses Plugin hilfreich finden, erwägen Sie bitte, zu seiner Entwicklung beizutragen.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Die Bewertungs-Bestenliste basiert auf dem Elo-Bewertungssystem und wird in Echtzeit aktualisiert.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "Das LDAP-Attribut, das der Mail zugeordnet ist, die Benutzer zum Anmelden verwenden.", "The LDAP attribute that maps to the username that users use to sign in.": "Das LDAP-Attribut, das dem Benutzernamen zugeordnet ist, den Benutzer zum Anmelden verwenden.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Die Bestenliste befindet sich derzeit in der Beta-Phase, und es ist möglich, dass wir die Bewertungsberechnungen anpassen, während wir den Algorithmus verfeinern.", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 6eb4408c6..1bfb81a6a 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Barkword", "Paste Large Text as File": "", "PDF document (.pdf)": "", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index 7683cbe43..f1c7157bd 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "π.χ. Ένα φίλτρο για να αφαιρέσετε βρισιές από το κείμενο", + "e.g. en": "", "e.g. My Filter": "π.χ. Το Φίλτρου Μου", "e.g. My Tools": "π.χ. Τα Εργαλεία Μου", "e.g. my_filter": "π.χ. my_filter", @@ -889,6 +890,7 @@ "Output format": "Μορφή εξόδου", "Overview": "Επισκόπηση", "page": "σελίδα", + "Parameters": "", "Password": "Κωδικός", "Paste Large Text as File": "Επικόλληση Μεγάλου Κειμένου ως Αρχείο", "PDF document (.pdf)": "Έγγραφο PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Οι προγραμματιστές πίσω από αυτό το plugin είναι παθιασμένοι εθελοντές από την κοινότητα. Αν βρείτε αυτό το plugin χρήσιμο, παρακαλώ σκεφτείτε να συνεισφέρετε στην ανάπτυξή του.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Η κατάταξη αξιολόγησης βασίζεται στο σύστημα βαθμολόγησης Elo και ενημερώνεται σε πραγματικό χρόνο.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "Το χαρακτηριστικό LDAP που αντιστοιχεί στο όνομα χρήστη που χρησιμοποιούν οι χρήστες για να συνδεθούν.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Η κατάταξη είναι αυτή τη στιγμή σε beta, και ενδέχεται να προσαρμόσουμε τους υπολογισμούς βαθμολογίας καθώς βελτιώνουμε τον αλγόριθμο.", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index 0cae1e54c..df367d5c8 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "", "Paste Large Text as File": "", "PDF document (.pdf)": "", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 0cae1e54c..df367d5c8 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "", "Paste Large Text as File": "", "PDF document (.pdf)": "", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index f449676a2..ac6bed0cd 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "p.ej. \"json\" o un esquema JSON", "e.g. 60": "p.ej. 60", "e.g. A filter to remove profanity from text": "p.ej. Un filtro para eliminar malas palabras del texto", + "e.g. en": "", "e.g. My Filter": "p.ej. Mi Filtro", "e.g. My Tools": "p.ej. Mis Herramientas", "e.g. my_filter": "p.ej. mi_filtro", @@ -889,6 +890,7 @@ "Output format": "Formato de salida", "Overview": "Vista General", "page": "página", + "Parameters": "", "Password": "Contraseña", "Paste Large Text as File": "Pegar el Texto Largo como Archivo", "PDF document (.pdf)": "Documento PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "El tamaño de lote determina cuántas solicitudes de texto se procesan juntas de una vez. Un tamaño de lote más alto puede aumentar el rendimiento y la velocidad del modelo, pero también requiere más memoria.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Quienes desarollaron este complemento son apasionados voluntarios/as de la comunidad. Si este complemento te es útil, por favor considera contribuir a su desarrollo.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La tabla clasificatoria de evaluación se basa en el sistema de clasificación Elo y se actualiza en tiempo real.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "El atributo LDAP que mapea el correo que los usuarios utilizan para iniciar sesión.", "The LDAP attribute that maps to the username that users use to sign in.": "El atributo LDAP que mapea el nombre de usuario que los usuarios utilizan para iniciar sesión.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "La tabla clasificatoria está actualmente en beta, por lo que los cálculos de clasificación pueden reajustarse a medida que se refina el algoritmo.", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index 23103a5da..b68a49c57 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "nt 60", "e.g. A filter to remove profanity from text": "nt filter, mis eemaldab tekstist roppused", + "e.g. en": "", "e.g. My Filter": "nt Minu Filter", "e.g. My Tools": "nt Minu Tööriistad", "e.g. my_filter": "nt minu_filter", @@ -889,6 +890,7 @@ "Output format": "Väljundformaat", "Overview": "Ülevaade", "page": "leht", + "Parameters": "", "Password": "Parool", "Paste Large Text as File": "Kleebi suur tekst failina", "PDF document (.pdf)": "PDF dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Partii suurus määrab, mitu tekstipäringut töödeldakse korraga. Suurem partii suurus võib suurendada mudeli jõudlust ja kiirust, kuid see nõuab ka rohkem mälu.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Selle pistikprogrammi taga olevad arendajad on kogukonna pühendunud vabatahtlikud. Kui leiate, et see pistikprogramm on kasulik, palun kaaluge selle arendamise toetamist.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Hindamise edetabel põhineb Elo hindamissüsteemil ja seda uuendatakse reaalajas.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "LDAP atribuut, mis kaardistab e-posti, mida kasutajad kasutavad sisselogimiseks.", "The LDAP attribute that maps to the username that users use to sign in.": "LDAP atribuut, mis kaardistab kasutajanime, mida kasutajad kasutavad sisselogimiseks.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Edetabel on praegu beetaversioonina ja me võime kohandada hindamisarvutusi algoritmi täiustamisel.", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index 923bdd0f0..47b409748 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "adib. Testutik lizunkeriak kentzeko iragazki bat", + "e.g. en": "", "e.g. My Filter": "adib. Nire Iragazkia", "e.g. My Tools": "adib. Nire Tresnak", "e.g. my_filter": "adib. nire_iragazkia", @@ -889,6 +890,7 @@ "Output format": "Irteera formatua", "Overview": "Ikuspegi orokorra", "page": "orria", + "Parameters": "", "Password": "Pasahitza", "Paste Large Text as File": "Itsatsi testu luzea fitxategi gisa", "PDF document (.pdf)": "PDF dokumentua (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Plugin honen atzean dauden garatzaileak komunitateko boluntario sutsuak dira. Plugin hau baliagarria iruditzen bazaizu, mesedez kontuan hartu bere garapenean laguntzea.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Ebaluazio sailkapena Elo sailkapen sisteman oinarritzen da eta denbora errealean eguneratzen da.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "Erabiltzaileek saioa hasteko erabiltzen duten erabiltzaile-izenarekin mapeatzen den LDAP atributua.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Sailkapena beta fasean dago, eta balorazioen kalkuluak doitu ditzakegu algoritmoa fintzen dugun heinean.", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index f8e4a14a6..afc0fd95d 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "مثلا \"json\" یا یک طرح JSON", "e.g. 60": "مثلا 60", "e.g. A filter to remove profanity from text": "مثلا فیلتری برای حذف ناسزا از متن", + "e.g. en": "", "e.g. My Filter": "مثلا فیلتر من", "e.g. My Tools": "مثلا ابزارهای من", "e.g. my_filter": "مثلا my_filter", @@ -889,6 +890,7 @@ "Output format": "قالب خروجی", "Overview": "نمای کلی", "page": "صفحه", + "Parameters": "", "Password": "رمز عبور", "Paste Large Text as File": "چسباندن متن بزرگ به عنوان فایل", "PDF document (.pdf)": "PDF سند (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "اندازه دسته تعیین می\u200cکند که چند درخواست متنی همزمان پردازش می\u200cشوند. اندازه دسته بزرگتر می\u200cتواند عملکرد و سرعت مدل را افزایش دهد، اما به حافظه بیشتری نیاز دارد.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "توسعه\u200cدهندگان این افزونه داوطلبان مشتاق از جامعه هستند. اگر این افزونه را مفید می\u200cدانید، لطفاً در توسعه آن مشارکت کنید.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "تابلوی امتیازات ارزیابی بر اساس سیستم رتبه\u200cبندی Elo است و در زمان واقعی به\u200cروز می\u200cشود.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "ویژگی LDAP که به ایمیلی که کاربران برای ورود استفاده می\u200cکنند نگاشت می\u200cشود.", "The LDAP attribute that maps to the username that users use to sign in.": "ویژگی LDAP که به نام کاربری که کاربران برای ورود استفاده می\u200cکنند نگاشت می\u200cشود.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "تابلوی امتیازات در حال حاضر در نسخه بتا است و ممکن است محاسبات رتبه\u200cبندی را با بهبود الگوریتم تنظیم کنیم.", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index b7d111337..2c5a5e1c0 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "esim. \"json\" tai JSON kaava", "e.g. 60": "esim. 60", "e.g. A filter to remove profanity from text": "esim. suodatin, joka poistaa kirosanoja tekstistä", + "e.g. en": "", "e.g. My Filter": "esim. Oma suodatin", "e.g. My Tools": "esim. Omat työkalut", "e.g. my_filter": "esim. oma_suodatin", @@ -889,6 +890,7 @@ "Output format": "Tulosteen muoto", "Overview": "Yleiskatsaus", "page": "sivu", + "Parameters": "", "Password": "Salasana", "Paste Large Text as File": "Liitä suuri teksti tiedostona", "PDF document (.pdf)": "PDF-asiakirja (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Eräkoko määrittää, kuinka monta tekstipyyntöä käsitellään kerralla. Suurempi eräkoko voi parantaa mallin suorituskykyä ja nopeutta, mutta se vaatii myös enemmän muistia.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Tämän lisäosan takana olevat kehittäjät ovat intohimoisia vapaaehtoisyhteisöstä. Jos koet tämän lisäosan hyödylliseksi, harkitse sen kehittämisen tukemista.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Arviointitulosluettelo perustuu Elo-luokitusjärjestelmään ja päivittyy reaaliajassa.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "LDAP-määrite, joka yhdistää käyttäjien kirjautumiseen käyttämään sähköpostiin.", "The LDAP attribute that maps to the username that users use to sign in.": "LDAP-määrite, joka vastaa käyttäjien kirjautumiskäyttäjänimeä.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tulosluettelo on tällä hetkellä beta-vaiheessa, ja voimme säätää pisteytyksen laskentaa hienostaessamme algoritmia.", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index 10dad9566..35ebb41d7 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Mot de passe", "Paste Large Text as File": "", "PDF document (.pdf)": "Document au format PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index 1f03406c8..35ccaa647 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "par ex. \"json\" ou un schéma JSON", "e.g. 60": "par ex. 60", "e.g. A filter to remove profanity from text": "par ex. un filtre pour retirer les vulgarités du texte", + "e.g. en": "", "e.g. My Filter": "par ex. Mon Filtre", "e.g. My Tools": "par ex. Mes Outils", "e.g. my_filter": "par ex. mon_filtre", @@ -889,6 +890,7 @@ "Output format": "Format de sortie", "Overview": "Aperçu", "page": "page", + "Parameters": "", "Password": "Mot de passe", "Paste Large Text as File": "Coller un texte volumineux comme fichier", "PDF document (.pdf)": "Document au format PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "La taille du lot détermine combien de requêtes texte sont traitées simultanément. Une taille plus grande améliore les performances mais consomme plus de mémoire.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Les développeurs de ce plugin sont des bénévoles passionnés issus de la communauté. Si vous trouvez ce plugin utile, merci de contribuer à son développement.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Le classement d'évaluation est basé sur le système de notation Elo et est mis à jour en temps réel.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "L'attribut LDAP qui correspond à l'adresse e-mail que les utilisateurs utilisent pour se connecter.", "The LDAP attribute that maps to the username that users use to sign in.": "L'attribut LDAP qui correspond au nom d'utilisateur que les utilisateurs utilisent pour se connecter.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Le classement est actuellement en version bêta et nous pouvons ajuster les calculs de notation à mesure que nous peaufinons l'algorithme.", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index 209076c04..51b9cb50c 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "סיסמה", "Paste Large Text as File": "", "PDF document (.pdf)": "מסמך PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index 7a924b55a..4ccb6af4e 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "पासवर्ड", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF दस्तावेज़ (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index 7d8314f42..be9a6c228 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Lozinka", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 8884f2be0..a10c39361 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "pl. \"json\" vagy egy JSON séma", "e.g. 60": "pl. 60", "e.g. A filter to remove profanity from text": "pl. Egy szűrő a trágárság eltávolítására a szövegből", + "e.g. en": "", "e.g. My Filter": "pl. Az én szűrőm", "e.g. My Tools": "pl. Az én eszközeim", "e.g. my_filter": "pl. az_en_szűrőm", @@ -889,6 +890,7 @@ "Output format": "Kimeneti formátum", "Overview": "Áttekintés", "page": "oldal", + "Parameters": "", "Password": "Jelszó", "Paste Large Text as File": "Nagy szöveg beillesztése fájlként", "PDF document (.pdf)": "PDF dokumentum (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "A köteg méret meghatározza, hány szöveges kérést dolgoz fel egyszerre. Magasabb köteg méret növelheti a modell teljesítményét és sebességét, de több memóriát is igényel.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "A bővítmény fejlesztői lelkes önkéntesek a közösségből. Ha hasznosnak találja ezt a bővítményt, kérjük, fontolja meg a fejlesztéséhez való hozzájárulást.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Az értékelési ranglista az Elo értékelési rendszeren alapul és valós időben frissül.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "Az LDAP attribútum, amely a felhasználók bejelentkezéshez használt emailjéhez kapcsolódik.", "The LDAP attribute that maps to the username that users use to sign in.": "Az LDAP attribútum, amely a felhasználók bejelentkezéshez használt felhasználónevéhez kapcsolódik.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "A ranglista jelenleg béta verzióban van, és az algoritmus finomítása során módosíthatjuk az értékelési számításokat.", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 1d03ec0f7..8198bdc83 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Kata sandi", "Paste Large Text as File": "", "PDF document (.pdf)": "Dokumen PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index 510a777f1..40913d5ff 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "m.sh. \"json\" nó scéimre JSON", "e.g. 60": "m.sh. 60", "e.g. A filter to remove profanity from text": "m.h. Scagaire chun profanity a bhaint as téacs", + "e.g. en": "", "e.g. My Filter": "m.sh. Mo Scagaire", "e.g. My Tools": "m.sh. Mo Uirlisí", "e.g. my_filter": "m.sh. mo_scagaire", @@ -889,6 +890,7 @@ "Output format": "Formáid aschuir", "Overview": "Forbhreathnú", "page": "leathanach", + "Parameters": "", "Password": "Pasfhocal", "Paste Large Text as File": "Greamaigh Téacs Mór mar Chomhad", "PDF document (.pdf)": "Doiciméad PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Cinneann méid an bhaisc cé mhéad iarratas téacs a phróiseáiltear le chéile ag an am céanna. Is féidir le méid baisc níos airde feidhmíocht agus luas an mhúnla a mhéadú, ach éilíonn sé níos mó cuimhne freisin.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Is deonacha paiseanta ón bpobal iad na forbróirí taobh thiar den bhreiseán seo. Má aimsíonn an breiseán seo cabhrach leat, smaoinigh ar rannchuidiú lena fhorbairt.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Tá an clár ceannairí meastóireachta bunaithe ar chóras rátála Elo agus déantar é a nuashonrú i bhfíor-am.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "An tréith LDAP a mhapálann don ríomhphost a úsáideann úsáideoirí chun síniú isteach.", "The LDAP attribute that maps to the username that users use to sign in.": "An tréith LDAP a mhapálann don ainm úsáideora a úsáideann úsáideoirí chun síniú isteach.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tá an clár ceannairí i béite faoi láthair, agus d'fhéadfaimis na ríomhanna rátála a choigeartú de réir mar a dhéanfaimid an t-algartam a bheachtú.", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 504b633b5..253f4ddda 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "ad esempio \"json\" o uno schema JSON", "e.g. 60": "ad esempio 60", "e.g. A filter to remove profanity from text": "ad esempio un filtro per rimuovere le parolacce dal testo", + "e.g. en": "", "e.g. My Filter": "ad esempio il Mio Filtro", "e.g. My Tools": "ad esempio i Miei Tool", "e.g. my_filter": "ad esempio il mio_filtro", @@ -889,6 +890,7 @@ "Output format": "Formato di output", "Overview": "Panoramica", "page": "pagina", + "Parameters": "", "Password": "Password", "Paste Large Text as File": "Incolla Testo Grande come File", "PDF document (.pdf)": "Documento PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "La dimensione del batch determina quanti richieste di testo vengono elaborate insieme in una sola volta. Una dimensione del batch più alta può aumentare le prestazioni e la velocità del modello, ma richiede anche più memoria.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Gli sviluppatori dietro questo plugin sono volontari appassionati della comunità. Se trovi utile questo plugin, ti preghiamo di considerare di contribuire al suo sviluppo.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "La classifica di valutazione è basata sul sistema di rating Elo ed è aggiornata in tempo reale.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "L'attributo LDAP che mappa alla mail che gli utenti usano per accedere.", "The LDAP attribute that maps to the username that users use to sign in.": "L'attributo LDAP che mappa al nome utente che gli utenti usano per accedere.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "La classifica è attualmente in beta e potremmo regolare i calcoli dei punteggi mentre perfezioniamo l'algoritmo.", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index 2e26ad1e2..6234eaa40 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "出力形式", "Overview": "概要", "page": "ページ", + "Parameters": "", "Password": "パスワード", "Paste Large Text as File": "大きなテキストをファイルとして貼り付ける", "PDF document (.pdf)": "PDF ドキュメント (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "バッチサイズは一度に処理されるテキストリクエストの数を決定します。バッチサイズを高くすると、モデルのパフォーマンスと速度が向上しますが、メモリの使用量も増加します。", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "このプラグインはコミュニティの熱意のあるボランティアによって開発されています。このプラグインがお役に立った場合は、開発に貢献することを検討してください。", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "評価リーダーボードはElo評価システムに基づいており、実時間で更新されています。", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "ユーザーがサインインに使用するメールのLDAP属性。", "The LDAP attribute that maps to the username that users use to sign in.": "ユーザーがサインインに使用するユーザー名のLDAP属性。", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "リーダーボードは現在ベータ版であり、アルゴリズムを改善する際に評価計算を調整する場合があります。", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 6e897fb64..3fe199af1 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "მაგ: 60", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "მაგ: ჩემი ფილტრი", "e.g. My Tools": "მაგ: ჩემი ხელსაწყოები", "e.g. my_filter": "მაგ: ჩემი_ფილტრი", @@ -889,6 +890,7 @@ "Output format": "გამოტანის ფორმატი", "Overview": "მიმოხილვა", "page": "პანელი", + "Parameters": "", "Password": "პაროლი", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF დოკუმენტი (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index d0338310f..3bc64251f 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "예: \\\"json\\\" 또는 JSON 스키마", "e.g. 60": "예: 60", "e.g. A filter to remove profanity from text": "예: 텍스트에서 비속어를 제거하는 필터", + "e.g. en": "", "e.g. My Filter": "예: 내 필터", "e.g. My Tools": "예: 내 도구", "e.g. my_filter": "예: my_filter", @@ -889,6 +890,7 @@ "Output format": "출력 형식", "Overview": "개요", "page": "페이지", + "Parameters": "", "Password": "비밀번호", "Paste Large Text as File": "큰 텍스트를 파일로 붙여넣기", "PDF document (.pdf)": "PDF 문서(.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "배치 크기에 따라 한 번에 처리되는 텍스트 요청의 수가 결정됩니다. 배치 크기가 크면 모델의 성능과 속도가 향상될 수 있지만 더 많은 메모리가 필요하기도 합니다.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "이 플러그인은 커뮤니티의 열정적인 자원봉사자들이 개발했습니다. 유용하게 사용하셨다면 개발에 기여해 주시는 것도 고려해 주세요.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "평가 리더보드는 Elo 평가 시스템을 기반으로 하고 실시간으로 업데이트됩니다", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "사용자가 로그인하는 데 사용하는 메일에 매핑되는 LDAP 속성입니다.", "The LDAP attribute that maps to the username that users use to sign in.": "사용자가 로그인할 때 사용하는 사용자 이름에 매핑되는 LDAP 속성입니다.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "리더보드는 현재 베타 버전이며, 알고리즘 개선에 따라 평가 방식이 변경될 수 있습니다.", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 9f0b60815..9ab06b94e 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Slaptažodis", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF dokumentas (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Šis modulis kuriamas savanorių. Palaikykite jų darbus finansiškai arba prisidėdami kodu.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index acb7cad43..8b2735cd8 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Kata Laluan", "Paste Large Text as File": "", "PDF document (.pdf)": "Dokumen PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Pembangun di sebalik 'plugin' ini adalah sukarelawan yang bersemangat daripada komuniti. Jika anda mendapati 'plugin' ini membantu, sila pertimbangkan untuk menyumbang kepada pembangunannya.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index f2698d016..9ce14c62f 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "f.eks. 60", "e.g. A filter to remove profanity from text": "f.eks. et filter for å fjerne banning fra tekst", + "e.g. en": "", "e.g. My Filter": "f.eks. Mitt filter", "e.g. My Tools": "f.eks. Mine verktøy", "e.g. my_filter": "f.eks. mitt_filter", @@ -889,6 +890,7 @@ "Output format": "Format på utdata", "Overview": "Oversikt", "page": "side", + "Parameters": "", "Password": "Passord", "Paste Large Text as File": "Lim inn mye tekst som fil", "PDF document (.pdf)": "PDF-dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Utviklerne bak denne utvidelsen er lidenskapelige frivillige fra fellesskapet. Hvis du finner denne utvidelsen nyttig, vennligst vurder å bidra til utviklingen.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Ledertavlens over evalueringer er basert på Elo-rangeringssystemet, og oppdateres i sanntid.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "LDAP-attributtet som tilsvarer e-posten som brukerne bruker for å logge på.", "The LDAP attribute that maps to the username that users use to sign in.": "LDAP-attributtet som tilsvarer brukernavnet som brukerne bruker for å logge på.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Ledertavlen er for øyeblikket i betaversjon, og vi kommer kanskje til å justere beregningene etter hvert som vi forbedrer algoritmen.", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 0e1d06eba..c22d90a42 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "bijv. \"json\" of een JSON-schema", "e.g. 60": "bijv. 60", "e.g. A filter to remove profanity from text": "bijv. Een filter om gevloek uit tekst te verwijderen", + "e.g. en": "", "e.g. My Filter": "bijv. Mijn filter", "e.g. My Tools": "bijv. Mijn gereedschappen", "e.g. my_filter": "bijv. mijn_filter", @@ -889,6 +890,7 @@ "Output format": "Uitvoerformaat", "Overview": "Overzicht", "page": "pagina", + "Parameters": "", "Password": "Wachtwoord", "Paste Large Text as File": "Plak grote tekst als bestand", "PDF document (.pdf)": "PDF document (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "De batchgrootte bepaalt hoeveel tekstverzoeken tegelijk worden verwerkt. Een hogere batchgrootte kan de prestaties en snelheid van het model verhogen, maar vereist ook meer geheugen.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "De ontwikkelaars achter deze plugin zijn gepassioneerde vrijwilligers uit de gemeenschap. Als je deze plugin nuttig vindt, overweeg dan om bij te dragen aan de ontwikkeling ervan.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Het beoordelingsklassement is gebaseerd op het Elo-classificatiesysteem en wordt in realtime bijgewerkt.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "Het LDAP-attribuut dat verwijst naar de e-mail waarmee gebruikers zich aanmelden.", "The LDAP attribute that maps to the username that users use to sign in.": "Het LDAP-attribuut dat verwijst naar de gebruikersnaam die gebruikers gebruiken om in te loggen.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Het leaderboard is momenteel in bèta en we kunnen de ratingberekeningen aanpassen naarmate we het algoritme verfijnen.", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index b963d2d77..79fb95d0e 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "ਪਾਸਵਰਡ", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF ਡਾਕੂਮੈਂਟ (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 8cd28593c..e7c5197d2 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "np. Filtr do usuwania wulgaryzmów z tekstu", + "e.g. en": "", "e.g. My Filter": "np. Mój filtr", "e.g. My Tools": "np. Moje narzędzia", "e.g. my_filter": "np. moj_filtr", @@ -889,6 +890,7 @@ "Output format": "Format wyjściowy", "Overview": "Przegląd", "page": "strona", + "Parameters": "", "Password": "Hasło", "Paste Large Text as File": "Wklej duży tekst jako plik", "PDF document (.pdf)": "Dokument PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Twórcy tego wtyczki to entuzjaści, którzy działają jako wolontariusze ze społeczności. Jeśli uważasz, że ta wtyczka jest pomocna, rozważ wsparcie jej rozwoju.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Tablica wyników oceny opiera się na systemie rankingu Elo i jest aktualizowana w czasie rzeczywistym.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "Atrybut LDAP, który mapuje się na adres e-mail używany przez użytkowników do logowania.", "The LDAP attribute that maps to the username that users use to sign in.": "Atrybut LDAP, który mapuje się na nazwę użytkownika, którą użytkownicy używają do logowania.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Tablica wyników jest w wersji beta, więc w miarę udoskonalania algorytmu możemy jeszcze modyfikować sposób obliczania ocen.", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 8baf35ee3..52022e7af 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "Exemplo: Um filtro para remover palavrões do texto", + "e.g. en": "", "e.g. My Filter": "Exemplo: Meu Filtro", "e.g. My Tools": "Exemplo: Minhas Ferramentas", "e.g. my_filter": "Exemplo: my_filter", @@ -889,6 +890,7 @@ "Output format": "Formato de saída", "Overview": "Visão Geral", "page": "página", + "Parameters": "", "Password": "Senha", "Paste Large Text as File": "Cole Textos Longos como Arquivo", "PDF document (.pdf)": "Documento PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Os desenvolvedores por trás deste plugin são voluntários apaixonados da comunidade. Se você achar este plugin útil, considere contribuir para o seu desenvolvimento.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "A evolução do ranking de avaliação é baseada no sistema Elo e será atualizada em tempo real.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "O atributo LDAP que mapeia para o nome de usuário que os usuários usam para fazer login.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "O ranking atual está em beta, e podemos ajustar as contas de avaliação como refinamos o algoritmo.", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index e87bad854..91b00ec34 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Senha", "Paste Large Text as File": "", "PDF document (.pdf)": "Documento PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 04b55b641..53665304f 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "Formatul de ieșire", "Overview": "Privire de ansamblu", "page": "pagina", + "Parameters": "", "Password": "Parolă", "Paste Large Text as File": "", "PDF document (.pdf)": "Document PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Dezvoltatorii din spatele acestui plugin sunt voluntari pasionați din comunitate. Dacă considerați acest plugin util, vă rugăm să luați în considerare contribuția la dezvoltarea sa.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Clasamentul de evaluare se bazează pe sistemul de rating Elo și este actualizat în timp real.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Clasamentul este în prezent în versiune beta și este posibil să ajustăm calculul evaluărilor pe măsură ce rafinăm algoritmul.", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 61ad2c824..5e8ffbcb9 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "например, \"json\" или схему JSON", "e.g. 60": "например, 60", "e.g. A filter to remove profanity from text": "например, фильтр для удаления ненормативной лексики из текста", + "e.g. en": "", "e.g. My Filter": "например, мой фильтр", "e.g. My Tools": "например, мой инструмент", "e.g. my_filter": "например, мой_фильтр", @@ -889,6 +890,7 @@ "Output format": "Формат вывода", "Overview": "Обзор", "page": "страница", + "Parameters": "", "Password": "Пароль", "Paste Large Text as File": "Вставить большой текст как файл", "PDF document (.pdf)": "PDF-документ (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Размер пакета определяет, сколько текстовых запросов обрабатывается одновременно. Больший размер пакета может повысить производительность и быстродействие модели, но также требует больше памяти.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Разработчики этого плагина - увлеченные волонтеры из сообщества. Если вы считаете этот плагин полезным, пожалуйста, подумайте о том, чтобы внести свой вклад в его разработку.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Таблица лидеров оценки основана на рейтинговой системе Elo и обновляется в режиме реального времени.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "Атрибут LDAP, который сопоставляется с почтой, используемой пользователями для входа в систему.", "The LDAP attribute that maps to the username that users use to sign in.": "Атрибут LDAP, который сопоставляется с именем пользователя, используемым пользователями для входа в систему.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "В настоящее время таблица лидеров находится в стадии бета-тестирования, и мы можем скорректировать расчеты рейтинга по мере доработки алгоритма.", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index e562be7b1..552f31507 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "Formát výstupu", "Overview": "Prehľad", "page": "stránka", + "Parameters": "", "Password": "Heslo", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Vývojári stojaci za týmto pluginom sú zapálení dobrovoľníci z komunity. Ak považujete tento plugin za užitočný, zvážte príspevok na jeho vývoj.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Hodnotiaca tabuľka je založená na systéme hodnotenia Elo a aktualizuje sa v reálnom čase.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Hodnotiaca tabuľka je momentálne v beta verzii a môžeme upraviť výpočty hodnotenia, ako budeme zdokonaľovať algoritmus.", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 3b39a14d1..2af2a8399 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "Формат излаза", "Overview": "Преглед", "page": "страница", + "Parameters": "", "Password": "Лозинка", "Paste Large Text as File": "Убаци велики текст као датотеку", "PDF document (.pdf)": "PDF документ (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index c630447b2..7989fa602 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "Lösenord", "Paste Large Text as File": "", "PDF document (.pdf)": "PDF-dokument (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Utvärderingens topplista är baserad på Elo-betygssystemet och uppdateras i realtid", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 7f13c2b3e..9d3df4229 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "รหัสผ่าน", "Paste Large Text as File": "", "PDF document (.pdf)": "เอกสาร PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "นักพัฒนาที่อยู่เบื้องหลังปลั๊กอินนี้เป็นอาสาสมัครที่มีชื่นชอบการแบ่งบัน หากคุณพบว่าปลั๊กอินนี้มีประโยชน์ โปรดพิจารณาสนับสนุนการพัฒนาของเขา", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index 70902637d..835e024c1 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "", "Overview": "", "page": "", + "Parameters": "", "Password": "", "Paste Large Text as File": "", "PDF document (.pdf)": "", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index e00c65c04..37a4b0b13 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "örn. \"json\" veya JSON şablonu", "e.g. 60": "örn. 60", "e.g. A filter to remove profanity from text": "örn. Metinden küfürleri kaldırmak için bir filtre", + "e.g. en": "", "e.g. My Filter": "örn. Benim Filtrem", "e.g. My Tools": "örn. Benim Araçlarım", "e.g. my_filter": "örn. benim_filtrem", @@ -889,6 +890,7 @@ "Output format": "Çıktı formatı", "Overview": "Genel Bakış", "page": "sayfa", + "Parameters": "", "Password": "Parola", "Paste Large Text as File": "Büyük Metni Dosya Olarak Yapıştır", "PDF document (.pdf)": "PDF belgesi (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Bu eklentinin arkasındaki geliştiriciler topluluktan tutkulu gönüllülerdir. Bu eklentinin yararlı olduğunu düşünüyorsanız, gelişimine katkıda bulunmayı düşünün.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 5eebeb7b0..40c63189c 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "напр., \"json\" або схема JSON", "e.g. 60": "напр. 60", "e.g. A filter to remove profanity from text": "напр., фільтр для видалення нецензурної лексики з тексту", + "e.g. en": "", "e.g. My Filter": "напр., Мій фільтр", "e.g. My Tools": "напр., Мої інструменти", "e.g. my_filter": "напр., my_filter", @@ -889,6 +890,7 @@ "Output format": "Формат відповіді", "Overview": "Огляд", "page": "сторінка", + "Parameters": "", "Password": "Пароль", "Paste Large Text as File": "Вставити великий текст як файл", "PDF document (.pdf)": "PDF документ (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Розмір пакету визначає, скільки текстових запитів обробляється одночасно. Більший розмір пакету може підвищити продуктивність і швидкість моделі, але також вимагає більше пам'яті.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Розробники цього плагіна - пристрасні волонтери зі спільноти. Якщо ви вважаєте цей плагін корисним, будь ласка, зробіть свій внесок у його розвиток.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Таблиця лідерів оцінки базується на системі рейтингу Ело і оновлюється в реальному часі.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "LDAP-атрибут, який відповідає за пошту, яку користувачі використовують для входу.", "The LDAP attribute that maps to the username that users use to sign in.": "LDAP-атрибут, який відповідає за ім'я користувача, яке використовують користувачі для входу.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Таблиця лідерів наразі в бета-версії, і ми можемо коригувати розрахунки рейтингів у міру вдосконалення алгоритму.", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index 651f03864..956e24f75 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "", "e.g. 60": "", "e.g. A filter to remove profanity from text": "", + "e.g. en": "", "e.g. My Filter": "", "e.g. My Tools": "", "e.g. my_filter": "", @@ -889,6 +890,7 @@ "Output format": "آؤٹ پٹ فارمیٹ", "Overview": "جائزہ", "page": "صفحہ", + "Parameters": "", "Password": "پاس ورڈ", "Paste Large Text as File": "", "PDF document (.pdf)": "پی ڈی ایف دستاویز (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "اس پلگ ان کے پیچھے موجود ڈویلپرز کمیونٹی کے پرجوش رضاکار ہیں اگر آپ کو یہ پلگ ان مددگار لگتا ہے تو برائے مہربانی اس کی ترقی میں اپنا حصہ ڈالنے پر غور کریں", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "تشخیصی لیڈربورڈ ایلو ریٹنگ سسٹم پر مبنی ہے اور یہ حقیقی وقت میں اپ ڈیٹ ہوتا ہے", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "", "The LDAP attribute that maps to the username that users use to sign in.": "", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "لیڈر بورڈ اس وقت بیٹا مرحلے میں ہے، اور جیسے جیسے ہم الگورتھم کو بہتر بنائیں گے ہم ریٹنگ کیلکولیشن کو ایڈجسٹ کرسکتے ہیں", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index 53c652d82..89ddc3123 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "ví dụ: \"json\" hoặc một lược đồ JSON", "e.g. 60": "vd: 60", "e.g. A filter to remove profanity from text": "vd: Bộ lọc để loại bỏ từ ngữ tục tĩu khỏi văn bản", + "e.g. en": "", "e.g. My Filter": "vd: Bộ lọc của tôi", "e.g. My Tools": "vd: Công cụ của tôi", "e.g. my_filter": "vd: bo_loc_cua_toi", @@ -889,6 +890,7 @@ "Output format": "Định dạng đầu ra", "Overview": "Tổng quan", "page": "trang", + "Parameters": "", "Password": "Mật khẩu", "Paste Large Text as File": "Dán Văn bản Lớn dưới dạng Tệp", "PDF document (.pdf)": "Tập tin PDF (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "Kích thước lô xác định có bao nhiêu yêu cầu văn bản được xử lý cùng một lúc. Kích thước lô cao hơn có thể tăng hiệu suất và tốc độ của mô hình, nhưng nó cũng đòi hỏi nhiều bộ nhớ hơn.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "Các nhà phát triển đằng sau plugin này là những tình nguyện viên nhiệt huyết của cộng đồng. Nếu bạn thấy plugin này hữu ích, vui lòng cân nhắc đóng góp cho sự phát triển của nó.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Bảng xếp hạng đánh giá dựa trên hệ thống xếp hạng Elo và được cập nhật theo thời gian thực.", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "Thuộc tính LDAP ánh xạ tới mail mà người dùng sử dụng để đăng nhập.", "The LDAP attribute that maps to the username that users use to sign in.": "Thuộc tính LDAP ánh xạ tới tên người dùng mà người dùng sử dụng để đăng nhập.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Bảng xếp hạng hiện đang trong giai đoạn beta và chúng tôi có thể điều chỉnh các tính toán xếp hạng khi chúng tôi tinh chỉnh thuật toán.", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index e60c64973..f83297428 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "例如:\"json\" 或一个 JSON schema", "e.g. 60": "例如:'60'", "e.g. A filter to remove profanity from text": "例如:一个用于过滤文本中不当内容的过滤器", + "e.g. en": "", "e.g. My Filter": "例如:我的过滤器", "e.g. My Tools": "例如:我的工具", "e.g. my_filter": "例如:my_filter", @@ -889,6 +890,7 @@ "Output format": "输出格式", "Overview": "概述", "page": "页", + "Parameters": "", "Password": "密码", "Paste Large Text as File": "粘贴大文本为文件", "PDF document (.pdf)": "PDF 文档 (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批处理大小决定了一次可以处理多少个文本请求。更高的批处理大小可以提高模型的性能和速度,但也需要更多内存。", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "本插件的背后开发者是社区中热情的志愿者。如果此插件有帮助到您,烦请考虑一下为它的开发做出贡献。", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "排行榜基于 Elo 评级系统并实时更新。", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "映射到用户登录时使用的邮箱的 LDAP 属性。", "The LDAP attribute that maps to the username that users use to sign in.": "映射到用户登录时使用的用户名的 LDAP 属性。", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "排行榜目前处于 Beta 测试阶段,我们可能会在完善算法后调整评分计算方法。", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 2356b0558..57cbccd23 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -374,6 +374,7 @@ "e.g. \"json\" or a JSON schema": "範例:\"json\" 或一個 JSON schema", "e.g. 60": "例如:60", "e.g. A filter to remove profanity from text": "例如:用來移除不雅詞彙的過濾器", + "e.g. en": "", "e.g. My Filter": "例如:我的篩選器", "e.g. My Tools": "例如:我的工具", "e.g. my_filter": "例如:my_filter", @@ -889,6 +890,7 @@ "Output format": "輸出格式", "Overview": "概覽", "page": "頁面", + "Parameters": "", "Password": "密碼", "Paste Large Text as File": "將大型文字以檔案貼上", "PDF document (.pdf)": "PDF 檔案 (.pdf)", @@ -1140,6 +1142,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批次大小決定一次處理多少文字請求。較高的批次大小可以提高模型的效能和速度,但也需要更多記憶體。", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "這個外掛背後的開發者是來自社群的熱情志願者。如果您覺得這個外掛很有幫助,請考慮為其開發做出貢獻。", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "評估排行榜基於 Elo 評分系統,並即時更新。", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", "The LDAP attribute that maps to the mail that users use to sign in.": "對映到使用者用於登入的使用者郵箱的 LDAP 屬性。", "The LDAP attribute that maps to the username that users use to sign in.": "對映到使用者用於登入的使用者名稱的 LDAP 屬性。", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "排行榜目前處於測試階段,我們可能會在改進演算法時調整評分計算方式。", From 80eaa24ca8a30fac27fc95db560c4e72e64f53d1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 00:52:09 +0400 Subject: [PATCH 080/144] enh: provide source name in context if available --- backend/open_webui/utils/middleware.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 6b629c12d..564b7aab6 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -919,6 +919,7 @@ async def process_chat_payload(request, form_data, user, metadata, model): for doc_context, doc_meta in zip( source["document"], source["metadata"] ): + source_name = source.get("source", {}).get("name", None) citation_id = ( doc_meta.get("source", None) or source.get("source", {}).get("id", None) @@ -926,7 +927,11 @@ async def process_chat_payload(request, form_data, user, metadata, model): ) if citation_id not in citation_idx: citation_idx[citation_id] = len(citation_idx) + 1 - context_string += f'{doc_context}\n' + context_string += ( + f'{doc_context}\n" + ) context_string = context_string.strip() prompt = get_last_user_message(form_data["messages"]) From bf97dbe05271f61e18bf85abe68d333a87052a12 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 01:12:11 +0400 Subject: [PATCH 081/144] refac --- backend/open_webui/utils/middleware.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 564b7aab6..2d519ad9c 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -427,6 +427,7 @@ async def chat_web_search_handler( "name": ", ".join(queries), "type": "web_search", "urls": results["filenames"], + "queries": queries, } ) elif results.get("docs"): @@ -438,6 +439,7 @@ async def chat_web_search_handler( "name": ", ".join(queries), "type": "web_search", "urls": results["filenames"], + "queries": queries, } ) From 17aca908c5dffdda217b85d5efa8d19f7843b063 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 01:36:53 +0400 Subject: [PATCH 082/144] refac: styling --- src/lib/components/layout/Sidebar.svelte | 36 ++++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index 2de1e3510..b4f31af64 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -545,6 +545,24 @@
{/if} --> +
+ +
+ {#if ($config?.features?.enable_notes ?? false) && ($user?.role === 'admin' || ($user?.permissions?.features?.notes ?? true))}
-
+
-
+
{#if filteredPrompts.length > 0} {#each filteredPrompts as prompt, idx (prompt.id || prompt.content)}
-
+
{#if models[selectedModelIdx]?.name} {models[selectedModelIdx]?.name} {:else} diff --git a/src/lib/components/chat/Suggestions.svelte b/src/lib/components/chat/Suggestions.svelte index f0afef047..9511a4803 100644 --- a/src/lib/components/chat/Suggestions.svelte +++ b/src/lib/components/chat/Suggestions.svelte @@ -81,39 +81,41 @@ {/if}
-
+
{#if filteredPrompts.length > 0} - {#each filteredPrompts as prompt, idx (prompt.id || prompt.content)} - - {/each} + style="animation-delay: {idx * 60}ms" + on:click={() => dispatch('select', prompt.content)} + > +
+ {#if prompt.title && prompt.title[0] !== ''} +
+ {prompt.title[0]} +
+
+ {prompt.title[1]} +
+ {:else} +
+ {prompt.content} +
+
+ {$i18n.t('Prompt')} +
+ {/if} +
+ + {/each} +
{/if}
From 29d08c2a1683591819855d8d86567041e539f2e0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 24 May 2025 02:12:44 +0400 Subject: [PATCH 086/144] refac: styling --- src/lib/components/chat/MessageInput.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index cbad0f7e7..d1e2b0bb0 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -675,7 +675,7 @@
{#if $settings?.richTextInput ?? true}
Date: Sat, 24 May 2025 02:13:46 +0400 Subject: [PATCH 087/144] chore: format --- src/lib/components/admin/Settings/Documents.svelte | 4 +++- src/lib/i18n/locales/ar-BH/translation.json | 4 ++++ src/lib/i18n/locales/ar/translation.json | 4 ++++ src/lib/i18n/locales/bg-BG/translation.json | 4 ++++ src/lib/i18n/locales/bn-BD/translation.json | 4 ++++ src/lib/i18n/locales/bo-TB/translation.json | 4 ++++ src/lib/i18n/locales/ca-ES/translation.json | 4 ++++ src/lib/i18n/locales/ceb-PH/translation.json | 4 ++++ src/lib/i18n/locales/cs-CZ/translation.json | 4 ++++ src/lib/i18n/locales/da-DK/translation.json | 4 ++++ src/lib/i18n/locales/de-DE/translation.json | 4 ++++ src/lib/i18n/locales/dg-DG/translation.json | 4 ++++ src/lib/i18n/locales/el-GR/translation.json | 4 ++++ src/lib/i18n/locales/en-GB/translation.json | 4 ++++ src/lib/i18n/locales/en-US/translation.json | 4 +++- src/lib/i18n/locales/es-ES/translation.json | 4 ++++ src/lib/i18n/locales/et-EE/translation.json | 4 ++++ src/lib/i18n/locales/eu-ES/translation.json | 4 ++++ src/lib/i18n/locales/fa-IR/translation.json | 4 ++++ src/lib/i18n/locales/fi-FI/translation.json | 4 ++++ src/lib/i18n/locales/fr-CA/translation.json | 4 ++++ src/lib/i18n/locales/fr-FR/translation.json | 4 ++++ src/lib/i18n/locales/he-IL/translation.json | 4 ++++ src/lib/i18n/locales/hi-IN/translation.json | 4 ++++ src/lib/i18n/locales/hr-HR/translation.json | 4 ++++ src/lib/i18n/locales/hu-HU/translation.json | 4 ++++ src/lib/i18n/locales/id-ID/translation.json | 4 ++++ src/lib/i18n/locales/ie-GA/translation.json | 4 ++++ src/lib/i18n/locales/it-IT/translation.json | 4 ++++ src/lib/i18n/locales/ja-JP/translation.json | 4 ++++ src/lib/i18n/locales/ka-GE/translation.json | 4 ++++ src/lib/i18n/locales/ko-KR/translation.json | 4 ++++ src/lib/i18n/locales/lt-LT/translation.json | 4 ++++ src/lib/i18n/locales/ms-MY/translation.json | 4 ++++ src/lib/i18n/locales/nb-NO/translation.json | 4 ++++ src/lib/i18n/locales/nl-NL/translation.json | 4 ++++ src/lib/i18n/locales/pa-IN/translation.json | 4 ++++ src/lib/i18n/locales/pl-PL/translation.json | 4 ++++ src/lib/i18n/locales/pt-BR/translation.json | 4 ++++ src/lib/i18n/locales/pt-PT/translation.json | 4 ++++ src/lib/i18n/locales/ro-RO/translation.json | 4 ++++ src/lib/i18n/locales/ru-RU/translation.json | 4 ++++ src/lib/i18n/locales/sk-SK/translation.json | 4 ++++ src/lib/i18n/locales/sr-RS/translation.json | 4 ++++ src/lib/i18n/locales/sv-SE/translation.json | 4 ++++ src/lib/i18n/locales/th-TH/translation.json | 4 ++++ src/lib/i18n/locales/tk-TW/translation.json | 4 ++++ src/lib/i18n/locales/tr-TR/translation.json | 4 ++++ src/lib/i18n/locales/uk-UA/translation.json | 4 ++++ src/lib/i18n/locales/ur-PK/translation.json | 4 ++++ src/lib/i18n/locales/vi-VN/translation.json | 4 ++++ src/lib/i18n/locales/zh-CN/translation.json | 4 ++++ src/lib/i18n/locales/zh-TW/translation.json | 4 ++++ 53 files changed, 210 insertions(+), 2 deletions(-) diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 1d4723081..4144004fb 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -774,7 +774,9 @@ {#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true}
-
{$i18n.t('Weight of BM25 Retrieval')}
+
+ {$i18n.t('Weight of BM25 Retrieval')} +
Date: Sat, 24 May 2025 02:13:54 +0400 Subject: [PATCH 088/144] chore: format --- backend/open_webui/retrieval/utils.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index b7b4912ac..97a89880c 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -134,16 +134,16 @@ def query_doc_with_hybrid_search( if hybrid_bm25_weight <= 0: ensemble_retriever = EnsembleRetriever( - retrievers=[vector_search_retriever], weights=[1.] + retrievers=[vector_search_retriever], weights=[1.0] ) elif hybrid_bm25_weight >= 1: ensemble_retriever = EnsembleRetriever( - retrievers=[bm25_retriever], weights=[1.] + retrievers=[bm25_retriever], weights=[1.0] ) else: ensemble_retriever = EnsembleRetriever( retrievers=[bm25_retriever, vector_search_retriever], - weights=[hybrid_bm25_weight, 1. - hybrid_bm25_weight] + weights=[hybrid_bm25_weight, 1.0 - hybrid_bm25_weight], ) compressor = RerankCompressor( From 3c828f7828970351e97de048dda0f461de7d69e2 Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Sat, 24 May 2025 08:30:09 +0800 Subject: [PATCH 089/144] i18n: Update & Improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 78 ++++++++++----------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 0efa742f1..85dc3c7b3 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -129,7 +129,7 @@ "Autocomplete Generation": "输入框内容自动补全", "Autocomplete Generation Input Max Length": "输入框内容自动补全输入最大长度", "Automatic1111": "Automatic1111", - "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api 鉴权字符串", + "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 API 鉴权字符串", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 URL", "AUTOMATIC1111 Base URL is required.": "需要 AUTOMATIC1111 URL", "Available list": "可用列表", @@ -141,7 +141,7 @@ "Back": "返回", "Bad Response": "点踩此回答", "Banners": "公告横幅", - "Base Model (From)": "基础模型 (来自)", + "Base Model (From)": "基础模型(来自)", "before": "对话", "Being lazy": "懒惰", "Beta": "Beta", @@ -194,7 +194,7 @@ "Click here for help.": "点击这里获取帮助", "Click here to": "点击", "Click here to download user import template file.": "点击此处下载用户导入所需的模板文件", - "Click here to learn more about faster-whisper and see the available models.": "点击此处了解更多关于faster-whisper的信息,并查看可用的模型。", + "Click here to learn more about faster-whisper and see the available models.": "点击此处了解更多关于faster-whisper的信息,并查看可用的模型", "Click here to see available models.": "单击此处查看可用模型", "Click here to select": "点击这里选择", "Click here to select a csv file.": "点击此处选择 csv 文件", @@ -261,7 +261,7 @@ "Copy Link": "复制链接", "Copy to clipboard": "复制到剪贴板", "Copying to clipboard was successful!": "成功复制到剪贴板!", - "CORS must be properly configured by the provider to allow requests from Open WebUI.": "提供商必须正确配置 CORS 以允许来自 Open WebUI 的请求。", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "提供商必须正确配置 CORS 以允许来自 Open WebUI 的请求", "Create": "创建", "Create a knowledge base": "创建知识库", "Create a model": "创建一个模型", @@ -288,7 +288,7 @@ "December": "十二月", "Default": "默认", "Default (Open AI)": "默认 (OpenAI)", - "Default (SentenceTransformers)": "默认(SentenceTransformers)", + "Default (SentenceTransformers)": "默认 (SentenceTransformers)", "Default mode works with a wider range of models by calling tools once before execution. Native mode leverages the model’s built-in tool-calling capabilities, but requires the model to inherently support this feature.": "默认模式通过在执行前调用一次工具,能够兼容更广泛的模型。原生模式利用模型内置的工具调用能力,但需要模型本身具备该功能的原生支持。", "Default Model": "默认模型", "Default model updated": "默认模型已更新", @@ -298,7 +298,7 @@ "Default Prompt Suggestions": "默认提示词建议", "Default to 389 or 636 if TLS is enabled": "如果启用 TLS,则默认为 389 或 636", "Default to ALL": "默认为 ALL", - "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "默认进行分段检索以提取重点和相关内容 (推荐)", + "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "默认进行分段检索以提取重点和相关内容(推荐)", "Default User Role": "默认用户角色", "Delete": "删除", "Delete a model": "删除一个模型", @@ -324,11 +324,11 @@ "Describe your knowledge base and objectives": "描述您的知识库和目标", "Description": "描述", "Detect Artifacts Automatically": "自动检测 Artifacts", - "Dictate": "", + "Dictate": "听写", "Didn't fully follow instructions": "没有完全遵照指示", "Direct": "直接", "Direct Connections": "直接连接", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户接入自有的 OpenAI 兼容的 API 端点", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "直接连接允许用户连接自有的 OpenAI 兼容的 API 端点", "Direct Connections settings updated": "直接连接设置已更新", "Direct Tool Servers": "直接连接工具服务器", "Disabled": "禁用", @@ -375,7 +375,7 @@ "e.g. \"json\" or a JSON schema": "例如:\"json\" 或一个 JSON schema", "e.g. 60": "例如:'60'", "e.g. A filter to remove profanity from text": "例如:一个用于过滤文本中不当内容的过滤器", - "e.g. en": "", + "e.g. en": "例如:en", "e.g. My Filter": "例如:我的过滤器", "e.g. My Tools": "例如:我的工具", "e.g. my_filter": "例如:my_filter", @@ -393,7 +393,7 @@ "Edit Memory": "编辑记忆", "Edit User": "编辑用户", "Edit User Group": "编辑用户组", - "Eject": "", + "Eject": "弹出", "ElevenLabs": "ElevenLabs", "Email": "电子邮箱", "Embark on adventures": "踏上冒险之旅", @@ -407,8 +407,8 @@ "Enable Code Execution": "启用代码执行", "Enable Code Interpreter": "启用代码解释器", "Enable Community Sharing": "启用分享至社区", - "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "启用内存锁定(mlock)以防止模型数据被交换出RAM。此选项将模型的工作集页面锁定在RAM中,确保它们不会被交换到磁盘。这可以通过避免页面错误和确保快速数据访问来帮助维持性能。", - "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "启用内存映射(mmap)以加载模型数据。此选项允许系统通过将磁盘文件视为在RAM中来使用磁盘存储作为RAM的扩展。这可以通过更快的数据访问来提高模型性能。然而,它可能无法在所有系统上正常工作,并且可能会消耗大量磁盘空间。", + "Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "启用内存锁定 (mlock) 以防止模型数据被交换出RAM。此选项将模型的工作集页面锁定在RAM中,确保它们不会被交换到磁盘。这可以通过避免页面错误和确保快速数据访问来帮助维持性能。", + "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "启用内存映射 (mmap) 以加载模型数据。此选项允许系统通过将磁盘文件视为在RAM中来使用磁盘存储作为RAM的扩展。这可以通过更快的数据访问来提高模型性能。然而,它可能无法在所有系统上正常工作,并且可能会消耗大量磁盘空间。", "Enable Message Rating": "启用回复评价", "Enable Mirostat sampling for controlling perplexity.": "启用 Mirostat 采样以控制困惑度", "Enable New Sign Ups": "允许新用户注册", @@ -421,16 +421,16 @@ "Enter a detail about yourself for your LLMs to recall": "输入一个关于你自己的详细信息,方便你的大语言模型记住这些内容。", "Enter a title for the pending user info overlay. Leave empty for default.": "输入用户待激活界面的标题。留空使用默认", "Enter a watermark for the response. Leave empty for none.": "输入回复水印。留空则不添加", - "Enter api auth string (e.g. username:password)": "输入 api 鉴权路径 (例如:用户名:密码)", + "Enter api auth string (e.g. username:password)": "输入 API 鉴权路径(例如:用户名:密码)", "Enter Application DN": "输入 Application DN", "Enter Application DN Password": "输入 Application DN 密码", "Enter Bing Search V7 Endpoint": "输入 Bing Search V7 端点", "Enter Bing Search V7 Subscription Key": "输入 Bing Search V7 订阅密钥", - "Enter BM25 Weight": "", + "Enter BM25 Weight": "输入 BM25 权重", "Enter Bocha Search API Key": "输入 Bocha Search API 密钥", "Enter Brave Search API Key": "输入 Brave Search API 密钥", "Enter certificate path": "输入证书路径", - "Enter CFG Scale (e.g. 7.0)": "输入 CFG Scale (例如:7.0)", + "Enter CFG Scale (e.g. 7.0)": "输入 CFG Scale(例如:7.0)", "Enter Chunk Overlap": "输入块重叠 (Chunk Overlap)", "Enter Chunk Size": "输入块大小 (Chunk Size)", "Enter comma-separated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "输入以逗号分隔的“token:bias_value”对(例如:5432:100, 413:-100)", @@ -441,7 +441,7 @@ "Enter Docling Server URL": "输入 Docling 服务器 URL", "Enter Document Intelligence Endpoint": "输入 Document Intelligence 端点", "Enter Document Intelligence Key": "输入 Document Intelligence 密钥", - "Enter domains separated by commas (e.g., example.com,site.org)": "输入以逗号分隔的域名(例如:example.com,site.org)", + "Enter domains separated by commas (e.g., example.com,site.org)": "输入域名,多个域名用逗号分隔(例如:example.com,site.org)", "Enter Exa API Key": "输入 Exa API 密钥", "Enter External Document Loader API Key": "输入外部文档加载器 API 密钥", "Enter External Document Loader URL": "输入外部文档加载器 URL", @@ -454,7 +454,7 @@ "Enter Github Raw URL": "输入 Github Raw 地址", "Enter Google PSE API Key": "输入 Google PSE API 密钥", "Enter Google PSE Engine Id": "输入 Google PSE 引擎 ID", - "Enter Image Size (e.g. 512x512)": "输入图像分辨率 (例如:512x512)", + "Enter Image Size (e.g. 512x512)": "输入图像分辨率(例如:512x512)", "Enter Jina API Key": "输入 Jina API 密钥", "Enter Jupyter Password": "输入 Jupyter 密码", "Enter Jupyter Token": "输入 Jupyter 令牌", @@ -464,17 +464,17 @@ "Enter language codes": "输入语言代码", "Enter Mistral API Key": "输入 Mistral API 密钥", "Enter Model ID": "输入模型 ID", - "Enter model tag (e.g. {{modelTag}})": "输入模型标签 (例如:{{modelTag}})", + "Enter model tag (e.g. {{modelTag}})": "输入模型标签(例如:{{modelTag}})", "Enter Mojeek Search API Key": "输入 Mojeek Search API 密钥", "Enter New Password": "输入新密码", - "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps) (例如:50)", + "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps)(例如:50)", "Enter Perplexity API Key": "输入 Perplexity API 密钥", "Enter Playwright Timeout": "输入 Playwright 超时时间", "Enter Playwright WebSocket URL": "输入 Playwright WebSocket URL", - "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理 URL (例如:https://用户名:密码@主机名:端口)", + "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理 URL(例如:https://用户名:密码@主机名:端口)", "Enter reasoning effort": "设置推理努力", - "Enter Sampler (e.g. Euler a)": "输入 Sampler (例如:Euler a)", - "Enter Scheduler (e.g. Karras)": "输入 Scheduler (例如:Karras)", + "Enter Sampler (e.g. Euler a)": "输入 Sampler(例如:Euler a)", + "Enter Scheduler (e.g. Karras)": "输入 Scheduler(例如:Karras)", "Enter Score": "输入评分", "Enter SearchApi API Key": "输入 SearchApi API 密钥", "Enter SearchApi Engine": "输入 SearchApi 引擎", @@ -501,8 +501,8 @@ "Enter to Send": "Enter 键发送", "Enter Top K": "输入 Top K", "Enter Top K Reranker": "输入 Top K Reranker", - "Enter URL (e.g. http://127.0.0.1:7860/)": "输入地址 (例如:http://127.0.0.1:7860/)", - "Enter URL (e.g. http://localhost:11434)": "输入地址 (例如:http://localhost:11434)", + "Enter URL (e.g. http://127.0.0.1:7860/)": "输入地址(例如:http://127.0.0.1:7860/)", + "Enter URL (e.g. http://localhost:11434)": "输入地址(例如:http://localhost:11434)", "Enter Yacy Password": "输入 Yacy 密码", "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "输入 Yacy URL(例如:http://yacy.example.com:8090)", "Enter Yacy Username": "输入 Yacy 用户名", @@ -522,7 +522,7 @@ "Error accessing Google Drive: {{error}}": "访问 Google 云端硬盘 出错:{{error}}", "Error accessing media devices.": "访问媒体设备时出错。", "Error starting recording.": "开始录制时出错。", - "Error unloading model: {{error}}": "", + "Error unloading model: {{error}}": "卸载模型时出错:{{error}}", "Error uploading file: {{error}}": "上传文件时出错:{{error}}", "Evaluations": "竞技场评估", "Exa API Key": "Exa API 密钥", @@ -800,7 +800,7 @@ "Model not selected": "未选择模型", "Model Params": "模型参数", "Model Permissions": "模型权限", - "Model unloaded successfully": "", + "Model unloaded successfully": "模型卸载成功", "Model updated successfully": "模型更新成功", "Model(s) do not support file upload": "模型不支持文件上传", "Modelfile Content": "模型文件内容", @@ -875,7 +875,7 @@ "Open in full screen": "全屏打开", "Open new chat": "打开新对话", "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI 可使用任何 OpenAPI 服务器提供的工具。", - "Open WebUI uses faster-whisper internally.": "Open WebUI 使用内置 faster-whisper。", + "Open WebUI uses faster-whisper internally.": "Open WebUI 使用内置 faster-whisper", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI 使用 SpeechT5 和 CMU Arctic speaker embedding。", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "当前 Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低于所需的版本 (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", @@ -892,11 +892,11 @@ "Output format": "输出格式", "Overview": "概述", "page": "页", - "Parameters": "", + "Parameters": "参数", "Password": "密码", "Paste Large Text as File": "粘贴大文本为文件", "PDF document (.pdf)": "PDF 文档 (.pdf)", - "PDF Extract Images (OCR)": "PDF 图像处理 (使用 OCR)", + "PDF Extract Images (OCR)": "PDF 图像处理(使用 OCR)", "pending": "待激活", "Pending User Overlay Content": "用户待激活界面内容", "Pending User Overlay Title": "用户待激活界面标题", @@ -1061,9 +1061,9 @@ "Set CFG Scale": "设置 CFG Scale", "Set Default Model": "设置默认模型", "Set embedding model": "设置语义向量模型", - "Set embedding model (e.g. {{model}})": "设置语义向量模型 (例如:{{model}})", + "Set embedding model (e.g. {{model}})": "设置语义向量模型(例如:{{model}})", "Set Image Size": "设置图片分辨率", - "Set reranking model (e.g. {{model}})": "设置重排模型 (例如:{{model}})", + "Set reranking model (e.g. {{model}})": "设置重排序模型(例如:{{model}})", "Set Sampler": "设置 Sampler", "Set Scheduler": "设置 Scheduler", "Set Steps": "设置步骤", @@ -1144,13 +1144,13 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批处理大小决定了一次可以处理多少个文本请求。更高的批处理大小可以提高模型的性能和速度,但也需要更多内存。", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "本插件的背后开发者是社区中热情的志愿者。如果此插件有帮助到您,烦请考虑一下为它的开发做出贡献。", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "排行榜基于 Elo 评级系统并实时更新。", - "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "输入音频的语言。以 ISO-639-1 格式(例如:en)指定输入语言可提高准确性和响应速度。留空则自动检测语言。", "The LDAP attribute that maps to the mail that users use to sign in.": "映射到用户登录时使用的邮箱的 LDAP 属性。", "The LDAP attribute that maps to the username that users use to sign in.": "映射到用户登录时使用的用户名的 LDAP 属性。", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "排行榜目前处于 Beta 测试阶段,我们可能会在完善算法后调整评分计算方法。", - "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "最大文件大小(MB)。如果文件大小超过此限制,则无法上传该文件。", + "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "最大文件大小 (MB)。如果文件大小超过此限制,则无法上传该文件。", "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "在单次对话中可以使用的最大文件数。如果文件数超过此限制,则文件不会上传。", - "The score should be a value between 0.0 (0%) and 1.0 (100%).": "分值应介于 0.0(0%)和 1.0(100%)之间。", + "The score should be a value between 0.0 (0%) and 1.0 (100%).": "分值应介于 0.0 (0%) 和 1.0 (100%) 之间。", "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "模型的温度。增加温度将使模型的回答更有创意。", "Theme": "主题", "Thinking...": "正在思考...", @@ -1228,7 +1228,7 @@ "Unarchive All": "取消所有存档", "Unarchive All Archived Chats": "取消所有已存档的对话", "Unarchive Chat": "取消存档当前对话", - "Unloads {{FROM_NOW}}": "", + "Unloads {{FROM_NOW}}": "{{FROM_NOW}} 后卸载", "Unlock mysteries": "揭开神秘面纱", "Unpin": "取消置顶", "Unravel secrets": "解开秘密", @@ -1283,7 +1283,7 @@ "Vision": "视觉", "Voice": "语音", "Voice Input": "语音输入", - "Voice mode": "", + "Voice mode": "语音模式", "Warning": "警告", "Warning:": "警告:", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "警告:启用此功能将允许用户在服务器上上传任意代码", @@ -1302,7 +1302,7 @@ "WebUI will make requests to \"{{url}}\"": "WebUI 将向 \"{{url}}\" 发出请求", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 将向 \"{{url}}/api/chat\" 发出请求", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 将向 \"{{url}}/chat/completions\" 发出请求", - "Weight of BM25 Retrieval": "", + "Weight of BM25 Retrieval": "BM25 检索权重", "What are you trying to achieve?": "你想要达到什么目标?", "What are you working on?": "你在忙于什么?", "What’s New in": "最近更新内容于", @@ -1315,7 +1315,7 @@ "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "与 top-k 配合使用。较高的值(例如 0.95)将产生更加多样化的文本,而较低的值(例如 0.5)将产生更加集中和保守的文本。", "Workspace": "工作空间", "Workspace Permissions": "工作空间权限", - "Write": "写作", + "Write": "写入", "Write a prompt suggestion (e.g. Who are you?)": "写一个提示词建议(例如:你是谁?)", "Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]", "Write something...": "单击以键入内容...", @@ -1332,7 +1332,7 @@ "You do not have permission to upload files.": "你没有上传文件的权限", "You have no archived conversations.": "没有已归档的对话", "You have shared this chat": "此对话已经分享过", - "You're a helpful assistant.": "你是一个有帮助的助手", + "You're a helpful assistant.": "你是一个乐于助人的助手", "You're now logged in.": "已登录", "Your account status is currently pending activation.": "您的账号当前状态为待激活", "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.": "您的全部捐款将直接给到插件开发者,Open WebUI 不会收取任何比例。但众筹平台可能会有服务费、抽成。", From adefc811c7309b84fe1586599349d2bb084712a5 Mon Sep 17 00:00:00 2001 From: qingchun <96961592+qingchunnh@users.noreply.github.com> Date: Sat, 24 May 2025 09:18:18 +0800 Subject: [PATCH 090/144] i18n: Update & Improve zh-CN --- src/lib/i18n/locales/zh-CN/translation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 85dc3c7b3..665f44a58 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -651,7 +651,7 @@ "Home": "主页", "Host": "主机", "How can I help you today?": "有什么我能帮您的吗?", - "How would you rate this response?": "您如何评价这个回应?", + "How would you rate this response?": "您如何评价这个回答?", "Hybrid Search": "混合搜索", "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.": "我已阅读并理解我的行为所带来的影响,明白执行任意代码所涉及的风险。且我已验证代码来源可信度。", "ID": "ID", @@ -963,7 +963,7 @@ "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "降低生成无意义内容的概率。较高的值(如100)将产生更多样化的回答,而较低的值(如10)则更加保守。", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "使用\"User\" (用户) 来指代自己(例如:“User 正在学习西班牙语”)", "References from": "来自", - "Refused when it shouldn't have": "无理拒绝", + "Refused when it shouldn't have": "操作被意外拒绝", "Regenerate": "重新生成", "Reindex": "重建索引", "Reindex Knowledge Base Vectors": "重建知识库向量", @@ -1315,7 +1315,7 @@ "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "与 top-k 配合使用。较高的值(例如 0.95)将产生更加多样化的文本,而较低的值(例如 0.5)将产生更加集中和保守的文本。", "Workspace": "工作空间", "Workspace Permissions": "工作空间权限", - "Write": "写入", + "Write": "读写", "Write a prompt suggestion (e.g. Who are you?)": "写一个提示词建议(例如:你是谁?)", "Write a summary in 50 words that summarizes [topic or keyword].": "用 50 个字写一个总结 [主题或关键词]", "Write something...": "单击以键入内容...", From bc7853d6a4501c1b9c8190d76bd81ff38e6680f1 Mon Sep 17 00:00:00 2001 From: Tiancong Li Date: Sat, 24 May 2025 13:38:32 +0800 Subject: [PATCH 091/144] i18n: update zh-TW --- src/lib/i18n/locales/zh-TW/translation.json | 22 ++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 371ec80bb..db03d9d85 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -324,7 +324,7 @@ "Describe your knowledge base and objectives": "描述您的知識庫和目標", "Description": "描述", "Detect Artifacts Automatically": "自動偵測 Artifacts", - "Dictate": "", + "Dictate": "聽寫", "Didn't fully follow instructions": "未完全遵循指示", "Direct": "直接", "Direct Connections": "直接連線", @@ -375,7 +375,7 @@ "e.g. \"json\" or a JSON schema": "範例:\"json\" 或一個 JSON schema", "e.g. 60": "例如:60", "e.g. A filter to remove profanity from text": "例如:用來移除不雅詞彙的過濾器", - "e.g. en": "", + "e.g. en": "例如:en", "e.g. My Filter": "例如:我的篩選器", "e.g. My Tools": "例如:我的工具", "e.g. my_filter": "例如:my_filter", @@ -393,7 +393,7 @@ "Edit Memory": "編輯記憶", "Edit User": "編輯使用者", "Edit User Group": "編輯使用者群組", - "Eject": "", + "Eject": "卸載", "ElevenLabs": "ElevenLabs", "Email": "Email", "Embark on adventures": "展開探險之旅", @@ -426,7 +426,7 @@ "Enter Application DN Password": "輸入應用程式 DN 密碼", "Enter Bing Search V7 Endpoint": "輸入 Bing 搜尋 V7 端點", "Enter Bing Search V7 Subscription Key": "輸入 Bing 搜尋 V7 訂閱金鑰", - "Enter BM25 Weight": "", + "Enter BM25 Weight": "輸入 BM25 權重", "Enter Bocha Search API Key": "輸入 Bocha 搜尋 API 金鑰", "Enter Brave Search API Key": "輸入 Brave 搜尋 API 金鑰", "Enter certificate path": "輸入憑證路徑", @@ -522,7 +522,7 @@ "Error accessing Google Drive: {{error}}": "存取 Google Drive 時發生錯誤:{{error}}", "Error accessing media devices.": "存取媒體裝置時發生錯誤。", "Error starting recording.": "啟動錄製時發生錯誤。", - "Error unloading model: {{error}}": "", + "Error unloading model: {{error}}": "卸載模型錯誤:{{error}}", "Error uploading file: {{error}}": "上傳檔案時發生錯誤:{{error}}", "Evaluations": "評估", "Exa API Key": "Exa API 金鑰", @@ -800,7 +800,7 @@ "Model not selected": "未選取模型", "Model Params": "模型參數", "Model Permissions": "模型權限", - "Model unloaded successfully": "", + "Model unloaded successfully": "模型卸載成功", "Model updated successfully": "成功更新模型", "Model(s) do not support file upload": "當前模型不支援檔案上傳", "Modelfile Content": "模型檔案內容", @@ -892,7 +892,7 @@ "Output format": "輸出格式", "Overview": "概覽", "page": "頁面", - "Parameters": "", + "Parameters": "參數", "Password": "密碼", "Paste Large Text as File": "將大型文字以檔案貼上", "PDF document (.pdf)": "PDF 檔案 (.pdf)", @@ -1144,7 +1144,7 @@ "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批次大小決定一次處理多少文字請求。較高的批次大小可以提高模型的效能和速度,但也需要更多記憶體。", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "這個外掛背後的開發者是來自社群的熱情志願者。如果您覺得這個外掛很有幫助,請考慮為其開發做出貢獻。", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "評估排行榜基於 Elo 評分系統,並即時更新。", - "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "", + "The language of the input audio. Supplying the input language in ISO-639-1 (e.g. en) format will improve accuracy and latency. Leave blank to automatically detect the language.": "輸入音訊的語言。以 ISO-639-1 格式(例如:en)提供輸入語言將提高準確性和減少延遲。留空則自動偵測語言。", "The LDAP attribute that maps to the mail that users use to sign in.": "對映到使用者用於登入的使用者郵箱的 LDAP 屬性。", "The LDAP attribute that maps to the username that users use to sign in.": "對映到使用者用於登入的使用者名稱的 LDAP 屬性。", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "排行榜目前處於測試階段,我們可能會在改進演算法時調整評分計算方式。", @@ -1228,7 +1228,7 @@ "Unarchive All": "解除封存全部", "Unarchive All Archived Chats": "解除封存全部已封存對話", "Unarchive Chat": "解除封存對話", - "Unloads {{FROM_NOW}}": "", + "Unloads {{FROM_NOW}}": "於 {{FROM_NOW}} 後卸載", "Unlock mysteries": "解鎖謎題", "Unpin": "取消釘選", "Unravel secrets": "揭開秘密", @@ -1283,7 +1283,7 @@ "Vision": "視覺", "Voice": "語音", "Voice Input": "語音輸入", - "Voice mode": "", + "Voice mode": "語音模式", "Warning": "警告", "Warning:": "警告:", "Warning: Enabling this will allow users to upload arbitrary code on the server.": "警告:啟用此功能將允許使用者在伺服器上上傳任意程式碼。", @@ -1302,7 +1302,7 @@ "WebUI will make requests to \"{{url}}\"": "WebUI 將向 \"{{url}}\" 傳送請求", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 將向 \"{{url}}/api/chat\" 傳送請求", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 將向 \"{{url}}/chat/completions\" 傳送請求", - "Weight of BM25 Retrieval": "", + "Weight of BM25 Retrieval": "BM25 檢索權重", "What are you trying to achieve?": "您正在試圖完成什麼?", "What are you working on?": "您現在的工作是什麼?", "What’s New in": "新功能", From 9bd031dae31d8cf5d334df45c181336673b1580f Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Sat, 24 May 2025 13:33:49 +0200 Subject: [PATCH 092/144] Update AddMemoryModal.svelte --- .../chat/Settings/Personalization/AddMemoryModal.svelte | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte b/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte index 4854f48cd..a5bdb4bfc 100644 --- a/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte +++ b/src/lib/components/chat/Settings/Personalization/AddMemoryModal.svelte @@ -70,8 +70,9 @@