From e214d59d109a11eb61bad1a58208d6ae89d66a5b Mon Sep 17 00:00:00 2001 From: Andrew Baek Date: Wed, 27 Aug 2025 01:04:27 +0900 Subject: [PATCH 001/378] Update groups.py fix issue #16870 --- backend/open_webui/models/groups.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index 6615f95142..1c84f4c1ae 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -12,6 +12,7 @@ from open_webui.models.files import FileMetadataResponse from pydantic import BaseModel, ConfigDict from sqlalchemy import BigInteger, Column, String, Text, JSON, func +from sqlalchemy.ext.mutable import MutableList log = logging.getLogger(__name__) @@ -35,7 +36,7 @@ class Group(Base): meta = Column(JSON, nullable=True) permissions = Column(JSON, nullable=True) - user_ids = Column(JSON, nullable=True) + user_ids = Column(MutableList.as_mutable(JSON), nullable=True) created_at = Column(BigInteger) updated_at = Column(BigInteger) From ceaafbbfd21dc3ab766066a1b6253f05560361b1 Mon Sep 17 00:00:00 2001 From: Andrew Baek Date: Wed, 27 Aug 2025 03:22:34 +0900 Subject: [PATCH 002/378] Update groups.py --- backend/open_webui/models/groups.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/open_webui/models/groups.py b/backend/open_webui/models/groups.py index 4c636b4f0f..a09b2b73f9 100644 --- a/backend/open_webui/models/groups.py +++ b/backend/open_webui/models/groups.py @@ -12,7 +12,6 @@ from open_webui.models.files import FileMetadataResponse from pydantic import BaseModel, ConfigDict from sqlalchemy import BigInteger, Column, String, Text, JSON, func -from sqlalchemy.ext.mutable import MutableList log = logging.getLogger(__name__) @@ -36,7 +35,7 @@ class Group(Base): meta = Column(JSON, nullable=True) permissions = Column(JSON, nullable=True) - user_ids = Column(MutableList.as_mutable(JSON), nullable=True) + user_ids = Column(JSON, nullable=True) created_at = Column(BigInteger) updated_at = Column(BigInteger) From b50ae5bf694a070147ea770e27bb1c146dbfacdf Mon Sep 17 00:00:00 2001 From: Andrew Baek Date: Sun, 31 Aug 2025 14:48:37 +0900 Subject: [PATCH 003/378] Update MessageInput.svelte --- src/lib/components/chat/MessageInput.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index adea345ed0..407cb2262f 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1051,6 +1051,7 @@
{#if files.length > 0}
From 7c0bf59c7c42d882edd9ed001949c65def889945 Mon Sep 17 00:00:00 2001 From: Aleix Dorca Date: Fri, 5 Sep 2025 17:17:20 +0200 Subject: [PATCH 004/378] Update catalan translation.json --- src/lib/i18n/locales/ca-ES/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index d83fd1c8c4..0915b05f0a 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -237,7 +237,7 @@ "Clear memory": "Esborrar la memòria", "Clear Memory": "Esborrar la memòria", "click here": "prem aquí", - "Click here for filter guides.": "Clica aquí per filtrar les guies.", + "Click here for filter guides.": "Clica aquí per l'ajuda dels filtres.", "Click here for help.": "Clica aquí per obtenir ajuda.", "Click here to": "Clic aquí per", "Click here to download user import template file.": "Fes clic aquí per descarregar l'arxiu de plantilla d'importació d'usuaris", From 041a89ef5c8171704460d361cb0cf883988e0401 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:35:06 +0000 Subject: [PATCH 005/378] build(deps): bump actions/setup-node from 4 to 5 Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4 to 5. - [Release notes](https://github.com/actions/setup-node/releases) - [Commits](https://github.com/actions/setup-node/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/setup-node dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/format-build-frontend.yaml | 4 ++-- .github/workflows/release-pypi.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/format-build-frontend.yaml b/.github/workflows/format-build-frontend.yaml index df961ca3f5..eaa1072fbc 100644 --- a/.github/workflows/format-build-frontend.yaml +++ b/.github/workflows/format-build-frontend.yaml @@ -27,7 +27,7 @@ jobs: uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22' @@ -54,7 +54,7 @@ jobs: uses: actions/checkout@v5 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v5 with: node-version: '22' diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index c4ae97422d..7755bed203 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -21,7 +21,7 @@ jobs: fetch-depth: 0 - name: Install Git run: sudo apt-get update && sudo apt-get install -y git - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v5 with: node-version: 22 - uses: actions/setup-python@v5 From 3ff8deeea8e4cbc1ecc9a62f684119be56f6ce05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:35:10 +0000 Subject: [PATCH 006/378] build(deps): bump actions/setup-python from 5 to 6 Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5 to 6. - [Release notes](https://github.com/actions/setup-python/releases) - [Commits](https://github.com/actions/setup-python/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/setup-python dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/format-backend.yaml | 2 +- .github/workflows/release-pypi.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/format-backend.yaml b/.github/workflows/format-backend.yaml index 56074a84f4..562e6aa1c1 100644 --- a/.github/workflows/format-backend.yaml +++ b/.github/workflows/format-backend.yaml @@ -33,7 +33,7 @@ jobs: - uses: actions/checkout@v5 - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: '${{ matrix.python-version }}' diff --git a/.github/workflows/release-pypi.yml b/.github/workflows/release-pypi.yml index c4ae97422d..ffa6fb3777 100644 --- a/.github/workflows/release-pypi.yml +++ b/.github/workflows/release-pypi.yml @@ -24,7 +24,7 @@ jobs: - uses: actions/setup-node@v4 with: node-version: 22 - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: 3.11 - name: Build From d863fd3626f706db4d90cf5cf4294da9a4e0e593 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:35:13 +0000 Subject: [PATCH 007/378] build(deps): bump actions/github-script from 7 to 8 Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/build-release.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 7d5e30e23e..019fbb6bae 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -36,7 +36,7 @@ jobs: echo "::set-output name=content::$CHANGELOG_ESCAPED" - name: Create GitHub release - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | @@ -61,7 +61,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Trigger Docker build workflow - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | github.rest.actions.createWorkflowDispatch({ From 202eada74f210df5cc056dfcc5b738edd2e500a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:35:17 +0000 Subject: [PATCH 008/378] build(deps): bump elasticsearch from 9.0.1 to 9.1.0 in /backend Bumps [elasticsearch](https://github.com/elastic/elasticsearch-py) from 9.0.1 to 9.1.0. - [Release notes](https://github.com/elastic/elasticsearch-py/releases) - [Commits](https://github.com/elastic/elasticsearch-py/compare/v9.0.1...v9.1.0) --- updated-dependencies: - dependency-name: elasticsearch dependency-version: 9.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 9df7fe0ce6..bcc90cf702 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -56,7 +56,7 @@ pymilvus==2.5.0 qdrant-client==1.14.3 opensearch-py==2.8.0 playwright==1.49.1 # Caution: version must match docker-compose.playwright.yaml -elasticsearch==9.0.1 +elasticsearch==9.1.0 pinecone==6.0.2 oracledb==3.2.0 From edd65feff5e664b96aa835dccc2937af098e5051 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:35:32 +0000 Subject: [PATCH 009/378] build(deps): bump googleapis-common-protos in /backend Bumps [googleapis-common-protos](https://github.com/googleapis/google-cloud-python) from 1.63.2 to 1.70.0. - [Release notes](https://github.com/googleapis/google-cloud-python/releases) - [Changelog](https://github.com/googleapis/google-cloud-python/blob/main/packages/google-cloud-documentai/CHANGELOG.md) - [Commits](https://github.com/googleapis/google-cloud-python/commits/googleapis-common-protos-v1.70.0) --- updated-dependencies: - dependency-name: googleapis-common-protos dependency-version: 1.70.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 9df7fe0ce6..987287e84a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -118,7 +118,7 @@ docker~=7.1.0 pytest~=8.4.1 pytest-docker~=3.1.1 -googleapis-common-protos==1.63.2 +googleapis-common-protos==1.70.0 google-cloud-storage==2.19.0 azure-identity==1.23.0 From 5af4714bf0dc3ae396322dcbdd241bd350ae7ff3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:35:35 +0000 Subject: [PATCH 010/378] build(deps): bump pgvector from 0.4.0 to 0.4.1 in /backend Bumps [pgvector](https://github.com/pgvector/pgvector-python) from 0.4.0 to 0.4.1. - [Changelog](https://github.com/pgvector/pgvector-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgvector/pgvector-python/compare/v0.4.0...v0.4.1) --- updated-dependencies: - dependency-name: pgvector dependency-version: 0.4.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 9df7fe0ce6..a68869e789 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -21,7 +21,7 @@ alembic==1.14.0 peewee==3.18.1 peewee-migrate==1.12.2 psycopg2-binary==2.9.9 -pgvector==0.4.0 +pgvector==0.4.1 PyMySQL==1.1.1 bcrypt==4.3.0 From 5ad93b6fc9c9ef7b9c585f674863372993c92d59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Sep 2025 14:47:37 +0000 Subject: [PATCH 011/378] build(deps): bump psycopg2-binary from 2.9.9 to 2.9.10 in /backend Bumps [psycopg2-binary](https://github.com/psycopg/psycopg2) from 2.9.9 to 2.9.10. - [Changelog](https://github.com/psycopg/psycopg2/blob/master/NEWS) - [Commits](https://github.com/psycopg/psycopg2/compare/2.9.9...2.9.10) --- updated-dependencies: - dependency-name: psycopg2-binary dependency-version: 2.9.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index a06a5b828a..364cf794a5 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -20,7 +20,7 @@ sqlalchemy==2.0.38 alembic==1.14.0 peewee==3.18.1 peewee-migrate==1.12.2 -psycopg2-binary==2.9.9 +psycopg2-binary==2.9.10 pgvector==0.4.1 PyMySQL==1.1.1 bcrypt==4.3.0 From 774c0056bde88ed4831422efa81506488e3d6641 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 9 Sep 2025 19:00:01 +0400 Subject: [PATCH 012/378] refac: tool server data handling --- backend/open_webui/utils/tools.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 0ef0cf47fb..bc90dd9d74 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -538,12 +538,23 @@ async def get_tool_server_data(token: str, url: str) -> Dict[str, Any]: error_body = await response.json() raise Exception(error_body) + text_content = None + # Check if URL ends with .yaml or .yml to determine format if url.lower().endswith((".yaml", ".yml")): text_content = await response.text() res = yaml.safe_load(text_content) else: - res = await response.json() + text_content = await response.text() + + try: + res = json.loads(text_content) + except json.JSONDecodeError: + try: + res = yaml.safe_load(text_content) + except Exception as e: + raise e + except Exception as err: log.exception(f"Could not fetch tool server spec from {url}") if isinstance(err, dict) and "detail" in err: From f2a09c71499489ee71599af4a179e7518aaf658b Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 9 Sep 2025 19:01:39 +0400 Subject: [PATCH 013/378] fix: model command filter --- src/lib/components/chat/MessageInput/Commands/Models.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/MessageInput/Commands/Models.svelte b/src/lib/components/chat/MessageInput/Commands/Models.svelte index 7f87164111..5163d850fb 100644 --- a/src/lib/components/chat/MessageInput/Commands/Models.svelte +++ b/src/lib/components/chat/MessageInput/Commands/Models.svelte @@ -29,12 +29,12 @@ }), { keys: ['value', 'tags', 'modelName'], - threshold: 0.3 + threshold: 0.5 } ); $: filteredItems = command.slice(1) - ? fuse.search(command).map((e) => { + ? fuse.search(command.slice(1)).map((e) => { return e.item; }) : $models.filter((model) => !model?.info?.meta?.hidden); From 23990276cb769e09aba5a8b902c3f36f519ada08 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 9 Sep 2025 19:13:41 +0400 Subject: [PATCH 014/378] chore: bump chroma --- backend/requirements.txt | 3 +-- pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index db1c3802dc..5871015075 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -50,8 +50,7 @@ langchain==0.3.26 langchain-community==0.3.27 fake-useragent==2.2.0 -chromadb==0.6.3 -posthog==5.4.0 +chromadb==1.0.20 pymilvus==2.5.0 qdrant-client==1.14.3 opensearch-py==2.8.0 diff --git a/pyproject.toml b/pyproject.toml index 336ef15ac9..af69b86cec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -55,7 +55,7 @@ dependencies = [ "langchain-community==0.3.27", "fake-useragent==2.2.0", - "chromadb==0.6.3", + "chromadb==1.0.20", "pymilvus==2.5.0", "qdrant-client==1.14.3", "opensearch-py==2.8.0", @@ -124,7 +124,6 @@ dependencies = [ "tencentcloud-sdk-python==3.0.1336", "oracledb>=3.2.0", - "posthog==5.4.0", ] readme = "README.md" From b35b56394a25e041b031b4e6dfbb2f5f168f5d6a Mon Sep 17 00:00:00 2001 From: joaoback <156559121+joaoback@users.noreply.github.com> Date: Tue, 9 Sep 2025 15:25:07 -0300 Subject: [PATCH 015/378] Update translation.json (pt-BR) I added some translations of new items --- src/lib/i18n/locales/pt-BR/translation.json | 48 ++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 8e4ecba280..9f592085d2 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -11,16 +11,16 @@ "{{ models }}": "{{ models }}", "{{COUNT}} Available Tools": "{{COUNT}} Ferramentas disponíveis", "{{COUNT}} characters": "{{COUNT}} caracteres", - "{{COUNT}} extracted lines": "", + "{{COUNT}} extracted lines": "{{COUNT}} linhas extraídas", "{{COUNT}} hidden lines": "{{COUNT}} linhas ocultas", "{{COUNT}} Replies": "{{COUNT}} Respostas", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} Origens", "{{COUNT}} words": "{{COUNT}} palavras", "{{model}} download has been canceled": "O download do {{model}} foi cancelado", "{{user}}'s Chats": "Chats de {{user}}", "{{webUIName}} Backend Required": "Backend {{webUIName}} necessário", "*Prompt node ID(s) are required for image generation": "*Prompt node ID(s) são obrigatórios para gerar imagens", - "1 Source": "", + "1 Source": "1 Origem", "A new version (v{{LATEST_VERSION}}) is now available.": "Um nova versão (v{{LATEST_VERSION}}) está disponível.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao realizar tarefas como gerar títulos para chats e consultas de pesquisa na web", "a user": "um usuário", @@ -31,7 +31,7 @@ "Accessible to all users": "Acessível para todos os usuários", "Account": "Conta", "Account Activation Pending": "Ativação da Conta Pendente", - "accurate": "", + "accurate": "preciso", "Accurate information": "Informações precisas", "Action": "Ação", "Action not found": "Ação não encontrada", @@ -503,7 +503,7 @@ "Enable New Sign Ups": "Ativar Novos Cadastros", "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", "Enabled": "Ativado", - "End Tag": "", + "End Tag": "Tag final", "Endpoint URL": "", "Enforce Temporary Chat": "Aplicar chat temporário", "Enhance": "Melhorar", @@ -665,7 +665,7 @@ "External": "Externo", "External Document Loader URL required.": "URL do carregador de documentos externo necessária.", "External Task Model": "Modelo de Tarefa Externa", - "External Tools": "", + "External Tools": "Ferramentas Externas", "External Web Loader API Key": "Chave de API do carregador da Web externo", "External Web Loader URL": "URL do carregador da Web externo", "External Web Search API Key": "Chave de API de pesquisa na Web externa", @@ -689,7 +689,7 @@ "Failed to save models configuration": "Falha ao salvar a configuração dos modelos", "Failed to update settings": "Falha ao atualizar as configurações", "Failed to upload file.": "Falha ao carregar o arquivo.", - "fast": "", + "fast": "rápido", "Features": "Funcionalidades", "Features Permissions": "Permissões das Funcionalidades", "February": "Fevereiro", @@ -734,8 +734,8 @@ "Format Lines": "Formatar linhas", "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formata as linhas na saída. O padrão é Falso. Se definido como Verdadeiro, as linhas serão formatadas para detectar matemática e estilos embutidos.", "Format your variables using brackets like this:": "Formate suas variáveis usando colchetes como este:", - "Formatting may be inconsistent from source.": "", - "Forwards system user OAuth access token to authenticate": "", + "Formatting may be inconsistent from source.": "A formatação pode ser inconsistente em relação à fonte.", + "Forwards system user OAuth access token to authenticate": "Encaminha o token de acesso OAuth do usuário do sistema para autenticação", "Forwards system user session credentials to authenticate": "Encaminha as credenciais da sessão do usuário do sistema para autenticação", "Full Context Mode": "Modo de contexto completo", "Function": "Função", @@ -831,7 +831,7 @@ "Import Prompts": "Importar Prompts", "Import Tools": "Importar Ferramentas", "Important Update": "Atualização importante", - "In order to force OCR, performing OCR must be enabled.": "", + "In order to force OCR, performing OCR must be enabled.": "Para forçar o OCR, a execução do OCR deve estar habilitada.", "Include": "Incluir", "Include `--api-auth` flag when running stable-diffusion-webui": "Incluir a flag `--api-auth` ao executar stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Incluir a flag `--api` ao executar stable-diffusion-webui", @@ -847,7 +847,7 @@ "Insert": "Inserir", "Insert Follow-Up Prompt to Input": "Inserir prompt de acompanhamento para entrada", "Insert Prompt as Rich Text": "Inserir prompt como texto enriquecido", - "Insert Suggestion Prompt to Input": "", + "Insert Suggestion Prompt to Input": "Inserir prompt de sugestão para entrada", "Install from Github URL": "Instalar da URL do Github", "Instant Auto-Send After Voice Transcription": "Envio Automático Instantâneo Após Transcrição de Voz", "Integration": "Integração", @@ -1014,7 +1014,7 @@ "New Tool": "Nova Ferrameta", "new-channel": "novo-canal", "Next message": "Próxima mensagem", - "No authentication": "", + "No authentication": "Sem autenticação", "No chats found": "Nenhum chat encontrado", "No chats found for this user.": "Nenhum chat encontrado para este usuário.", "No chats found.": "Nenhum chat encontrado.", @@ -1039,7 +1039,7 @@ "No results found": "Nenhum resultado encontrado", "No search query generated": "Nenhuma consulta de pesquisa gerada", "No source available": "Nenhuma fonte disponível", - "No sources found": "", + "No sources found": "Nenhuma fonte encontrada", "No suggestion prompts": "Sem prompts sugeridos", "No users were found.": "Nenhum usuário foi encontrado.", "No valves": "Sem configurações", @@ -1119,7 +1119,7 @@ "Pending": "Pendente", "Pending User Overlay Content": "Conteúdo de sobreposição de usuário pendente", "Pending User Overlay Title": "Título de sobreposição de usuário pendente", - "Perform OCR": "", + "Perform OCR": "Executar OCR", "Permission denied when accessing media devices": "Permissão negada ao acessar dispositivos de mídia", "Permission denied when accessing microphone": "Permissão negada ao acessar o microfone", "Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}", @@ -1180,13 +1180,13 @@ "Prompts": "Prompts", "Prompts Access": "Acessar prompts", "Prompts Public Sharing": "Compartilhamento Público dos Prompts", - "Provider Type": "", + "Provider Type": "Tipo de provedor", "Public": "Público", "Pull \"{{searchValue}}\" from Ollama.com": "Obter \"{{searchValue}}\" de Ollama.com", "Pull a model from Ollama.com": "Obter um modelo de Ollama.com", "pypdfium2": "", "Query Generation Prompt": "Prompt de Geração de Consulta", - "Querying": "", + "Querying": "Consultando", "Quick Actions": "Ações rápidas", "RAG Template": "Modelo RAG", "Rating": "Avaliação", @@ -1237,11 +1237,11 @@ "RESULT": "Resultado", "Retrieval": "Recuperação", "Retrieval Query Generation": "Geração de Consulta de Recuperação", - "Retrieved {{count}} sources": "", + "Retrieved {{count}} sources": "{{count}} fontes recuperadas", "Retrieved {{count}} sources_one": "", "Retrieved {{count}} sources_many": "", "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", + "Retrieved 1 source": "1 fonte recuperada", "Rich Text Input for Chat": "Entrada de rich text para o chat", "RK": "", "Role": "Função", @@ -1285,7 +1285,7 @@ "SearchApi API Key": "Chave API SearchApi", "SearchApi Engine": "Motor SearchApi", "Searched {{count}} sites": "{{count}} sites pesquisados", - "Searching": "", + "Searching": "Pesquisando", "Searching \"{{searchQuery}}\"": "Pesquisando \"{{searchQuery}}\"", "Searching Knowledge for \"{{searchQuery}}\"": "Buscando conhecimento para \"{{searchQuery}}\"", "Searching the web": "Pesquisando na Internet...", @@ -1316,7 +1316,7 @@ "Select an engine": "Selecione um motor", "Select an Ollama instance": "Selecione uma instância do Ollama", "Select an output format": "Selecione um formato de saída", - "Select dtype": "", + "Select dtype": "Selecionar dtype", "Select Engine": "Selecionar Motor", "Select how to split message text for TTS requests": "Selecione como dividir o texto da mensagem para solicitações TTS", "Select Knowledge": "Selecionar Conhecimento", @@ -1360,7 +1360,7 @@ "Share": "Compartilhar", "Share Chat": "Compartilhar Chat", "Share to Open WebUI Community": "Compartilhar com a Comunidade OpenWebUI", - "Share your background and interests": "", + "Share your background and interests": "Fale sobre você e seus interesses", "Sharing Permissions": "Permissões de compartilhamento", "Shortcuts with an asterisk (*) are situational and only active under specific conditions.": "Atalhos com um asterisco (*) são situacionais e só estão ativos em condições específicas.", "Show": "Mostrar", @@ -1401,8 +1401,8 @@ "Speech-to-Text Engine": "Motor de Transcrição de Fala", "standard": "", "Start of the channel": "Início do canal", - "Start Tag": "", - "Status Updates": "", + "Start Tag": "Tag inicial", + "Status Updates": "Atualizações de status", "STDOUT/STDERR": "STDOUT/STDERR", "Stop": "Parar", "Stop Generating": "Pare de gerar", @@ -1410,7 +1410,7 @@ "Stream Chat Response": "Stream Resposta do Chat", "Stream Delta Chunk Size": "", "Strikethrough": "Tachado", - "Strip Existing OCR": "", + "Strip Existing OCR": "Remover OCR existente", "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "Remove o texto OCR existente do PDF e executa o OCR novamente. Ignorado se a opção Forçar OCR estiver habilitada. O padrão é Falso.", "STT Model": "Modelo STT", "STT Settings": "Configurações STT", From 86f191d015cf700c544ab47be8775bdd308bb01d Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Wed, 10 Sep 2025 07:39:15 +0000 Subject: [PATCH 016/378] i18n: Update translations in zh-CN locale --- src/lib/i18n/locales/zh-CN/translation.json | 66 ++++++++++----------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index b8244049ef..25e22da339 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -14,13 +14,13 @@ "{{COUNT}} extracted lines": "已提取 {{COUNT}} 行", "{{COUNT}} hidden lines": "{{COUNT}} 行被隐藏", "{{COUNT}} Replies": "{{COUNT}} 条回复", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} 个引用来源", "{{COUNT}} words": "{{COUNT}} 个字", "{{model}} download has been canceled": "已取消模型 {{model}} 的下载", "{{user}}'s Chats": "{{user}} 的对话记录", "{{webUIName}} Backend Required": "{{webUIName}} 需要后端服务", "*Prompt node ID(s) are required for image generation": "*图片生成需要提示词节点 ID", - "1 Source": "", + "1 Source": "1 个引用来源", "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": "用户", @@ -31,7 +31,7 @@ "Accessible to all users": "对所有用户开放", "Account": "账号", "Account Activation Pending": "账号待激活", - "accurate": "", + "accurate": "准确", "Accurate information": "信息准确", "Action": "操作", "Action not found": "找不到对应的操作项", @@ -177,7 +177,7 @@ "Banners": "公告横幅", "Base Model (From)": "基础模型(来自)", "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "仅在启动或保存设置时获取基础模型列表以提升访问速度,但显示的模型列表可能不是最新的。", - "Bearer": "Bearer(使用 API 密钥)", + "Bearer": "密钥(Bearer)", "before": "之前", "Being lazy": "回答不完整或敷衍了事", "Beta": "Beta", @@ -189,7 +189,7 @@ "Bocha Search API Key": "Bocha Search API 密钥", "Bold": "粗体", "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 引擎和所需语言,或者都留空。", + "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "必需同时提供 Docling 文字识别引擎和所需语言,或者都留空。", "Brave Search API Key": "Brave Search API 密钥", "Bullet List": "无序列表", "Button ID": "按钮 ID", @@ -428,9 +428,9 @@ "Displays citations in the response": "在回答中显示引用来源", "Displays status updates (e.g., web search progress) in the response": "在回答中显示实时状态信息(例如:网络搜索进度)", "Dive into knowledge": "纵览知识", - "dlparse_v1": "", - "dlparse_v2": "", - "dlparse_v4": "", + "dlparse_v1": "dlparse_v1", + "dlparse_v2": "dlparse_v2", + "dlparse_v4": "dlparse_v4", "Do not install functions from sources you do not fully trust.": "切勿安装不可信来源的函数", "Do not install tools from sources you do not fully trust.": "切勿安装不可信来源的工具", "Docling": "Docling", @@ -530,8 +530,8 @@ "Enter Datalab Marker API Base URL": "输入 Datalab Marker API 请求 URL", "Enter Datalab Marker API Key": "输入 Datalab Marker API 密钥", "Enter description": "输入简介描述", - "Enter Docling OCR Engine": "输入 Docling OCR Engine", - "Enter Docling OCR Language(s)": "输入 Docling OCR 语言", + "Enter Docling OCR Engine": "输入 Docling 文字识别引擎", + "Enter Docling OCR Language(s)": "输入 Docling 文字识别语言", "Enter Docling Server URL": "输入 Docling 服务器 URL", "Enter Document Intelligence Endpoint": "输入 Document Intelligence 端点", "Enter Document Intelligence Key": "输入 Document Intelligence 密钥", @@ -689,7 +689,7 @@ "Failed to save models configuration": "保存模型配置失败", "Failed to update settings": "更新设置失败", "Failed to upload file.": "上传文件失败", - "fast": "", + "fast": "快速", "Features": "功能", "Features Permissions": "功能权限", "February": "二月", @@ -727,8 +727,8 @@ "Follow Up Generation Prompt": "追问生成提示词", "Follow-Up Auto-Generation": "自动生成追问", "Followed instructions perfectly": "完全遵循指令", - "Force OCR": "强制 OCR 识别", - "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "强制对 PDF 所有页面执行 OCR 识别。若 PDF 中包含纯文本内容,该功能可能会降低识别准确率。默认为关闭", + "Force OCR": "强制文字识别", + "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "强制识别 PDF 所有的页面文字。若 PDF 中包含清晰且可直接复制的文本内容,该功能可能会降低识别准确率。默认为关闭", "Forge new paths": "开辟新境", "Form": "手动创建", "Format Lines": "行内容格式化", @@ -831,7 +831,7 @@ "Import Prompts": "导入提示词", "Import Tools": "导入工具", "Important Update": "重要更新", - "In order to force OCR, performing OCR must be enabled.": "", + "In order to force OCR, performing OCR must be enabled.": "开启“强制文字识别”选项需要先开启“文字识别“选项。", "Include": "包括", "Include `--api-auth` flag when running stable-diffusion-webui": "运行 stable-diffusion-webui 时包含 `--api-auth` 参数", "Include `--api` flag when running stable-diffusion-webui": "运行 stable-diffusion-webui 时包含 `--api` 参数", @@ -869,7 +869,7 @@ "June": "六月", "Jupyter Auth": "Jupyter 身份验证", "Jupyter URL": "Jupyter URL", - "JWT Expiration": "JWT 过期", + "JWT Expiration": "JWT 过期时间", "JWT Token": "JWT 令牌", "Kagi Search API Key": "Kagi 搜索 API 密钥", "Keep Follow-Up Prompts in Chat": "在对话中保留追问提示词", @@ -1112,14 +1112,14 @@ "Password": "密码", "Passwords do not match.": "两次输入的密码不一致。", "Paste Large Text as File": "粘贴大文本为文件", - "PDF Backend": "", + "PDF Backend": "PDF 解析器后端", "PDF document (.pdf)": "PDF 文档 (.pdf)", - "PDF Extract Images (OCR)": "PDF 图像处理(使用 OCR)", + "PDF Extract Images (OCR)": "PDF 图像提取(使用文字识别)", "pending": "待激活", "Pending": "待激活", - "Pending User Overlay Content": "用户待激活界面内容", - "Pending User Overlay Title": "用户待激活界面标题", - "Perform OCR": "", + "Pending User Overlay Content": "待激活用户界面内容", + "Pending User Overlay Title": "待激活用户界面标题", + "Perform OCR": "文字识别", "Permission denied when accessing media devices": "申请媒体设备权限被拒绝", "Permission denied when accessing microphone": "申请麦克风权限被拒绝", "Permission denied when accessing microphone: {{error}}": "申请麦克风权限被拒绝:{{error}}", @@ -1135,7 +1135,7 @@ "Pinned": "已置顶", "Pioneer insights": "洞悉未来", "Pipe": "Pipe", - "Pipeline": "", + "Pipeline": "处理管线", "Pipeline deleted successfully": "Pipeline 删除成功", "Pipeline downloaded successfully": "Pipeline 下载成功", "Pipelines": "Pipeline", @@ -1180,11 +1180,11 @@ "Prompts": "提示词", "Prompts Access": "访问提示词", "Prompts Public Sharing": "提示词公开共享", - "Provider Type": "服务提供商", + "Provider Type": "服务提供商类型", "Public": "公共", "Pull \"{{searchValue}}\" from Ollama.com": "从 Ollama.com 拉取“{{searchValue}}”", "Pull a model from Ollama.com": "从 Ollama.com 拉取一个模型", - "pypdfium2": "", + "pypdfium2": "pypdfium2", "Query Generation Prompt": "查询生成提示词", "Querying": "查询中", "Quick Actions": "快捷操作", @@ -1237,10 +1237,10 @@ "RESULT": "结果", "Retrieval": "检索", "Retrieval Query Generation": "检索查询生成", - "Retrieved {{count}} sources": "", - "Retrieved {{count}} sources_other": "检索到 {{count}} 个来源", - "Retrieved 1 source": "检索到 1 个来源", - "Rich Text Input for Chat": "对话富文本输入", + "Retrieved {{count}} sources": "检索到 {{count}} 个引用来源", + "Retrieved {{count}} sources_other": "检索到 {{count}} 个引用来源", + "Retrieved 1 source": "检索到 1 个引用来源", + "Rich Text Input for Chat": "富文本对话框", "RK": "排名", "Role": "角色", "Rosé Pine": "玫瑰松木", @@ -1363,7 +1363,7 @@ "Shortcuts with an asterisk (*) are situational and only active under specific conditions.": "带星号 (*) 的快捷键受场景限制,仅在特定条件下生效。", "Show": "显示", "Show \"What's New\" modal on login": "在登录时显示“更新内容”弹窗", - "Show Admin Details in Account Pending Overlay": "在用户待激活界面中显示管理员邮箱等详细信息", + "Show Admin Details in Account Pending Overlay": "在待激活用户的界面中显示管理员邮箱等详细信息", "Show All": "显示全部", "Show Formatting Toolbar": "显示文本格式工具栏", "Show image preview": "显示图像预览", @@ -1397,7 +1397,7 @@ "Speech recognition error: {{error}}": "语音识别错误:{{error}}", "Speech-to-Text": "语音转文本", "Speech-to-Text Engine": "语音转文本引擎", - "standard": "", + "standard": "标准", "Start of the channel": "频道起点", "Start Tag": "起始标签", "Status Updates": "显示实时回答状态", @@ -1408,8 +1408,8 @@ "Stream Chat Response": "流式对话响应 (Stream Chat Response)", "Stream Delta Chunk Size": "流式增量输出的分块大小(Stream Delta Chunk Size)", "Strikethrough": "删除线", - "Strip Existing OCR": "清除现有 OCR 文本", - "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "清除 PDF 中现有的 OCR 文本并重新执行 OCR 识别。若启用“强制 OCR 识别”则此设置无效。默认为关闭", + "Strip Existing OCR": "清除现有文字识别内容", + "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "清除 PDF 中现有的文字识别内容并重新识别文字。若启用“强制文字识别”则此设置无效。默认为关闭", "STT Model": "语音转文本模型", "STT Settings": "语音转文本设置", "Stylized PDF Export": "风格化 PDF 导出", @@ -1426,7 +1426,7 @@ "System": "系统", "System Instructions": "系统指令", "System Prompt": "系统提示词", - "Table Mode": "", + "Table Mode": "表格模式", "Tags": "标签", "Tags Generation": "标签生成", "Tags Generation Prompt": "标签生成提示词", @@ -1609,7 +1609,7 @@ "View Result from **{{NAME}}**": "查看来自 **{{NAME}}** 的结果", "Visibility": "可见性", "Vision": "视觉", - "vlm": "", + "vlm": "视觉语言模型(VLM)", "Voice": "语音", "Voice Input": "语音输入", "Voice mode": "语音模式", From d5b903234df23cd4692f972b340ea690e6c5e382 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 10 Sep 2025 12:57:13 +0400 Subject: [PATCH 017/378] chore: PR template Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com> --- .github/pull_request_template.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 7f603cb10c..3d8b516ede 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -73,4 +73,4 @@ ### Contributor License Agreement -By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms. +By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](https://github.com/open-webui/open-webui/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms. \ No newline at end of file From 956cb7beaa743a4d4038ab3b6b8778c9ce538246 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 10 Sep 2025 13:49:19 +0400 Subject: [PATCH 018/378] fix: openai connections key --- src/lib/components/admin/Settings/Connections.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/admin/Settings/Connections.svelte b/src/lib/components/admin/Settings/Connections.svelte index 03897accc6..91926dd6a3 100644 --- a/src/lib/components/admin/Settings/Connections.svelte +++ b/src/lib/components/admin/Settings/Connections.svelte @@ -262,7 +262,7 @@ {#each OPENAI_API_BASE_URLS as url, idx} { From d5cb65527eaa4831459a4c7dbf187daa9c0525ae Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 10 Sep 2025 13:52:34 +0400 Subject: [PATCH 019/378] fix: prompt template --- src/lib/components/chat/MessageInput.svelte | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index dbac52ad59..046085beb3 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -385,6 +385,9 @@ } await tick(); + text = await inputVariableHandler(text); + await tick(); + const chatInputContainer = document.getElementById('chat-input-container'); if (chatInputContainer) { chatInputContainer.scrollTop = chatInputContainer.scrollHeight; From c51a65173e8425efa4461311448f46a16e3a6cf3 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Wed, 10 Sep 2025 13:55:29 +0400 Subject: [PATCH 020/378] enh: folder modal focus title --- .../layout/Sidebar/Folders/FolderModal.svelte | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/lib/components/layout/Sidebar/Folders/FolderModal.svelte b/src/lib/components/layout/Sidebar/Folders/FolderModal.svelte index f6e4a523ca..4b62edb0d5 100644 --- a/src/lib/components/layout/Sidebar/Folders/FolderModal.svelte +++ b/src/lib/components/layout/Sidebar/Folders/FolderModal.svelte @@ -1,5 +1,5 @@ - +
@@ -54,7 +56,7 @@
-
+
{#if changelog} {#each Object.keys(changelog) as version} @@ -66,7 +68,7 @@
{#each Object.keys(changelog[version]).filter((section) => section !== 'date') as section} -
+
- {#each Object.keys(changelog[version][section]) as item} -
-
- {changelog[version][section][item].title} -
-
{changelog[version][section][item].content}
+
+ {#each changelog[version][section] as entry} +
+ {@html DOMPurify.sanitize(entry?.raw)}
{/each}
From 4ca43004edcb47332aac3dad3817df967ee5817a Mon Sep 17 00:00:00 2001 From: Jesper Kristensen Date: Fri, 5 Sep 2025 12:50:27 +0200 Subject: [PATCH 028/378] feat: Added support for redis as session storage --- backend/open_webui/main.py | 48 ++++++++++++++++++++++++++++++++------ backend/requirements.txt | 1 + 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index a5d55f75ab..1153692fb3 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -50,6 +50,11 @@ from starlette.middleware.sessions import SessionMiddleware from starlette.responses import Response, StreamingResponse from starlette.datastructures import Headers +from starsessions import ( + SessionMiddleware as StarSessionsMiddleware, + SessionAutoloadMiddleware, +) +from starsessions.stores.redis import RedisStore from open_webui.utils import logger from open_webui.utils.audit import AuditLevel, AuditLoggingMiddleware @@ -1897,13 +1902,42 @@ async def get_current_usage(user=Depends(get_verified_user)): # SessionMiddleware is used by authlib for oauth if len(OAUTH_PROVIDERS) > 0: - app.add_middleware( - SessionMiddleware, - secret_key=WEBUI_SECRET_KEY, - session_cookie="oui-session", - same_site=WEBUI_SESSION_COOKIE_SAME_SITE, - https_only=WEBUI_SESSION_COOKIE_SECURE, - ) + try: + # Try to create Redis store for sessions + if REDIS_URL: + redis_session_store = RedisStore( + url=REDIS_URL, + prefix=( + f"{REDIS_KEY_PREFIX}:session:" if REDIS_KEY_PREFIX else "session:" + ), + ) + + # Add SessionAutoloadMiddleware first to handle session loading + app.add_middleware(SessionAutoloadMiddleware) + + app.add_middleware( + StarSessionsMiddleware, + store=redis_session_store, + cookie_name="oui-session", + cookie_same_site=WEBUI_SESSION_COOKIE_SAME_SITE, + cookie_https_only=WEBUI_SESSION_COOKIE_SECURE, + ) + log.info("Using StarSessions with Redis for session management") + else: + raise ValueError("Redis URL not configured") + + except Exception as e: + log.warning( + f"Failed to initialize Redis sessions, falling back to cookie based sessions: {e}" + ) + # Fallback to existing SessionMiddleware + app.add_middleware( + SessionMiddleware, + secret_key=WEBUI_SECRET_KEY, + session_cookie="oui-session", + same_site=WEBUI_SESSION_COOKIE_SAME_SITE, + https_only=WEBUI_SESSION_COOKIE_SECURE, + ) @app.get("/oauth/{provider}/login") diff --git a/backend/requirements.txt b/backend/requirements.txt index 5871015075..f712423631 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -15,6 +15,7 @@ aiocache aiofiles starlette-compress==1.6.0 httpx[socks,http2,zstd,cli,brotli]==0.28.1 +starsessions[redis]==2.2.1 sqlalchemy==2.0.38 alembic==1.14.0 From 3802ab9fd189ae9b0062b40c9f0d454ef57f2e62 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Wed, 10 Sep 2025 15:01:06 +0200 Subject: [PATCH 029/378] translate '*required' string in prompts modal + added german translations --- .../chat/MessageInput/InputVariablesModal.svelte | 2 +- src/lib/i18n/locales/de-DE/translation.json | 11 ++++++----- src/lib/i18n/locales/en-US/translation.json | 1 + 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/lib/components/chat/MessageInput/InputVariablesModal.svelte b/src/lib/components/chat/MessageInput/InputVariablesModal.svelte index b507c3ff2d..53f4ec02dc 100644 --- a/src/lib/components/chat/MessageInput/InputVariablesModal.svelte +++ b/src/lib/components/chat/MessageInput/InputVariablesModal.svelte @@ -85,7 +85,7 @@ {variable} {#if variables[variable]?.required ?? true} - *required + *{$i18n.t('required')} {/if}
diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index df41572b82..0825e2a8a0 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -526,7 +526,7 @@ "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 Config in JSON format": "Konfiguration in JSON Format eingeben", "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 coordinates (e.g. 51.505, -0.09)": "", + "Enter coordinates (e.g. 51.505, -0.09)": "Geben Sie Koordinaten ein (z. B. 51.505, -0.09)", "Enter Datalab Marker API Base URL": "", "Enter Datalab Marker API Key": "", "Enter description": "Geben Sie eine Beschreibung ein", @@ -549,7 +549,7 @@ "Enter Github Raw URL": "Geben Sie die Github Raw-URL ein", "Enter Google PSE API Key": "Geben Sie den Google PSE-API-Schlüssel ein", "Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein", - "Enter hex color (e.g. #FF0000)": "", + "Enter hex color (e.g. #FF0000)": "Geben Sie eine Hex-Farbe ein (z. B. #FF0000)", "Enter ID": "", "Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)", "Enter Jina API Key": "Geben Sie den Jina-API-Schlüssel ein", @@ -604,8 +604,8 @@ "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 value": "", - "Enter value (true/false)": "", + "Enter value": "Geben Sie einen Wert ein", + "Enter value (true/false)": "Geben Sie einen Wert ein (true/false)", "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", @@ -1221,6 +1221,7 @@ "Rename": "Umbenennen", "Reorder Models": "Modelle neu anordnen", "Reply in Thread": "Im Thread antworten", + "required": "benötigt", "Reranking Engine": "Reranking-Engine", "Reranking Model": "Reranking-Modell", "Reset": "Zurücksetzen", @@ -1508,7 +1509,7 @@ "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Um auf das WebUI zugreifen zu können, wenden Sie sich bitte an einen Administrator. Administratoren können den Benutzerstatus über das Admin-Panel verwalten.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Um Wissensdatenbanken hier anzuhängen, fügen Sie sie zunächst dem Arbeitsbereich \"Wissen\" hinzu.", "To learn more about available endpoints, visit our documentation.": "Um mehr über verfügbare Endpunkte zu erfahren, besuchen Sie unsere Dokumentation.", - "To learn more about powerful prompt variables, click here": "", + "To learn more about powerful prompt variables, click here": "Um mehr über Prompt-Variablen zu erfahren, klicken Sie hier", "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.": "Um Ihre Privatsphäre zu schützen, werden nur Bewertungen, Modell-IDs, Tags und Metadaten aus Ihrem Feedback geteilt – Ihre Chats bleiben privat und werden nicht einbezogen.", "To select actions here, add them to the \"Functions\" workspace first.": "Um Aktionen auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.", "To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 8f98767009..e9f9105be8 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -1221,6 +1221,7 @@ "Rename": "", "Reorder Models": "", "Reply in Thread": "", + "required": "", "Reranking Engine": "", "Reranking Model": "", "Reset": "", From d6668515f6331c90679a233bff62112acd7be387 Mon Sep 17 00:00:00 2001 From: ButterflyOfFire Date: Wed, 10 Sep 2025 17:56:01 +0100 Subject: [PATCH 030/378] i18n: update kabyle translation Hi, Added Kabyle translation progress : 88% --- src/lib/i18n/locales/kab-DZ/translation.json | 176 +++++++++---------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/src/lib/i18n/locales/kab-DZ/translation.json b/src/lib/i18n/locales/kab-DZ/translation.json index 3dd186d9a7..0efcacc66c 100644 --- a/src/lib/i18n/locales/kab-DZ/translation.json +++ b/src/lib/i18n/locales/kab-DZ/translation.json @@ -14,13 +14,13 @@ "{{COUNT}} extracted lines": "", "{{COUNT}} hidden lines": "{{COUNT}} n yizirigen yeffren", "{{COUNT}} Replies": "{{COUNT}} n tririyin", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} n yiɣbula", "{{COUNT}} words": "{{COUNT}} n wawalen", "{{model}} download has been canceled": "", "{{user}}'s Chats": "Asqerdec n {{user}}", "{{webUIName}} Backend Required": "", "*Prompt node ID(s) are required for image generation": "", - "1 Source": "", + "1 Source": "1 n weɣbalu", "A new version (v{{LATEST_VERSION}}) is now available.": "Lqem amaynut n (v{{LATEST_VERSION}}), yella akka tura.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "Tamudemt n temsekra tettuseqdec mi ara tgeḍ timsekra am usirew n yizwal i yidiwenniyen akked tuttriwin n unadi deg web", "a user": "aseqdac", @@ -34,7 +34,7 @@ "accurate": "", "Accurate information": "Talɣut tusdidt", "Action": "Tigawt", - "Action not found": "", + "Action not found": "Tigawt ulac-itt", "Action Required for Chat Log Storage": "Isefk tigawt i usekles n uɣmis n udiwenni", "Actions": "Tigawin", "Activate": "Sermed", @@ -51,7 +51,7 @@ "Add content here": "Rnu agbur da", "Add Custom Parameter": "Rnu aɣewwar udmawan", "Add custom prompt": "Rnu aneftaɣ udmawan", - "Add Details": "", + "Add Details": "Rnu talqayt", "Add Files": "Rnu ifuyla", "Add Group": "Rnu agraw", "Add Memory": "Rnu cfawat", @@ -62,7 +62,7 @@ "Add text content": "Rnu agbur aḍrisan", "Add User": "Rnu aseqdac", "Add User Group": "Rnu agraw n iseqdacen", - "Additional Config": "", + "Additional Config": "Tawila tamernant", "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "", "Adjusting these settings will apply changes universally to all users.": "Aswati n yiɣewwaren-a ad yessuter ibeddilen s wudem ameɣradan i yiseqdacen akk.", "admin": "anedbal", @@ -87,7 +87,7 @@ "Allow Chat System Prompt": "Sireg aneftaɣ n unagraw n udiwenni", "Allow Chat Valves": "", "Allow Continue Response": "", - "Allow Delete Messages": "", + "Allow Delete Messages": "Sireg tukksa n yiznan", "Allow File Upload": "Sireg asali n yifuyla", "Allow Multiple Models in Chat": "Sireg ugar n timudmiwin deg usqerdec", "Allow non-local voices": "Sireg tuɣac tirdiganin", @@ -126,7 +126,7 @@ "API Key Endpoint Restrictions": "Agaz n ugaz n tsarut API", "API keys": "Tisura API", "API Version": "Lqem n API", - "API Version is required": "", + "API Version is required": "Lqem n API yettwasra", "Application DN": "DN n wesnas", "Application DN Password": "Awal n uɛeddi n DN n usnas", "applies to all users with the \"user\" role": "yeɛna akk iseqdacen yesɛan tamlilt \"user\"", @@ -183,8 +183,8 @@ "Beta": "Biṭa", "Bing Search V7 Endpoint": "", "Bing Search V7 Subscription Key": "Tasarut n umulteɣ Bing Search V7", - "Bio": "", - "Birth Date": "", + "Bio": "Tameddurt", + "Birth Date": "Azemz n tlalit", "BM25 Weight": "", "Bocha Search API Key": "Tasarut API n Bocha Search", "Bold": "Azuran", @@ -192,9 +192,9 @@ "Both Docling OCR Engine and Language(s) must be provided or both left empty.": "", "Brave Search API Key": "Tasarut API n Brave Search", "Bullet List": "Tabdart s tlilac", - "Button ID": "", - "Button Label": "", - "Button Prompt": "", + "Button ID": "Asulay ID n tqeffalt", + "Button Label": "Tabzimt n tqeffalt", + "Button Prompt": "Taqeffalt Aneftaɣ", "By {{name}}": "S-ɣur {{name}}", "Bypass Embedding and Retrieval": "Zgel ajmak akked tririt", "Bypass Web Loader": "Zgel asalay Web", @@ -220,10 +220,10 @@ "Chat Background Image": "Tugna n ugilal n udiwenni", "Chat Bubble UI": "Agrudem n tembulin n udiwenni", "Chat Controls": "Isenqaden n udiwenni", - "Chat Conversation": "", + "Chat Conversation": "Asqerdec n udiwenni", "Chat direction": "Tanila n udiwenni", - "Chat ID": "", - "Chat moved successfully": "", + "Chat ID": "Asulay ID n udiwenni", + "Chat moved successfully": "Yettwankez udiwenni akken iwata", "Chat Overview": "Taskant n udiwenni", "Chat Permissions": "Isumar n yidiwenniyen", "Chat Tags Auto-Generation": "Asirew awurman n tebzimin", @@ -287,7 +287,7 @@ "Completions": "Tisemdiyin", "Compress Images in Channels": "Skussem tugniwin deg Yibuda", "Concurrent Requests": "Tuttriwin timiranin", - "Config imported successfully": "", + "Config imported successfully": "Tawila tettwakekter-d akken iwata", "Configure": "Swel", "Confirm": "Sentem", "Confirm Password": "Sentem awal n uɛeddi", @@ -314,7 +314,7 @@ "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.": "Ssenqed amek ara tɛawdeḍ ad d-tɛawdeḍ tiseddarin n usekkil deg uḍris-nni i d-yettwalalen. Azal ɛlayen (amedya, 1.5) ad iɛawed ad iɛawed ad iɛawed ad iɛeddi s lǧehd, ma d azal n wadda (amedya, 1.1) ad yili d win yettɛeddin ugar. Ɣef 1, d ameɛdur.", "Controls": "Isenqaden", "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Ssneqdet amnekni garkoerenza d tanḍa n tuffɣa. Azal n wadda ad d-yeglu s wugar n tmuɣli d uḍris udwis.", - "Conversation saved successfully": "", + "Conversation saved successfully": "Yettwasekles udiwenni akken iwata", "Copied": "Yettwanɣel", "Copied link to clipboard": "Aseɣwen yettwanɣel ɣer tecfawt", "Copied shared chat URL to clipboard!": "Nɣel tansa URL n udiwenni yebḍan ɣef afus!", @@ -359,7 +359,7 @@ "Datalab Marker API Key required.": "API n isefkalab Marker Tesri tasarut.", "DD/MM/YYYY": "JJ/MM/AAAA", "December": "Duǧambeṛ", - "Deepgram": "", + "Deepgram": "Deepgram", "Default": "Amezwer", "Default (Open AI)": "Amezwer (Open AI)", "Default (SentenceTransformers)": "S wudem amezwar (SentenceTransformers)", @@ -428,9 +428,9 @@ "Displays citations in the response": "Yeskan tibdarin deg tririt", "Displays status updates (e.g., web search progress) in the response": "", "Dive into knowledge": "Kcem daxel n tmussniwin", - "dlparse_v1": "", - "dlparse_v2": "", - "dlparse_v4": "", + "dlparse_v1": "dlparse_v1", + "dlparse_v2": "dlparse_v2", + "dlparse_v4": "dlparse_v4", "Do not install functions from sources you do not fully trust.": "Ur sebdad ara tisɣunin seg iɣbula ur tettamneḍ ara akken iwata.", "Do not install tools from sources you do not fully trust.": "Ur srusuy ara ifecka seg iɣbula ur tettamneḍ ara akken iwata.", "Docling": "Docling", @@ -550,10 +550,10 @@ "Enter Google PSE API Key": "Sekcem tasarut API n Google PSE", "Enter Google PSE Engine Id": "Sekcem Google PSE Engine Id", "Enter hex color (e.g. #FF0000)": "", - "Enter ID": "", + "Enter ID": "Sekcem-d asulay ID", "Enter Image Size (e.g. 512x512)": "Sekcem tugna Size (amedya 512x512)", "Enter Jina API Key": "Sekcem tasarut API n Jina", - "Enter JSON config (e.g., {\"disable_links\": true})": "", + "Enter JSON config (e.g., {\"disable_links\": true})": "Sekcem-d tawila JSON (amedya, {\"disable_links\": true})", "Enter Jupyter Password": "Sekcem-d awal n uɛeddi n Jupyter", "Enter Jupyter Token": "Sekcem-d ajiṭun n Jupyter", "Enter Jupyter URL": "Sekcem URL n Jupyter", @@ -604,7 +604,7 @@ "Enter Top K Reranker": "Kcem ɣer Top K Reranker", "Enter URL (e.g. http://127.0.0.1:7860/)": "Sekcem tansa URL (amedya. http://127.0.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Sekcem tansa URL (amedya. http://localhost:11434)", - "Enter value": "", + "Enter value": "Sekcem-d azal", "Enter value (true/false)": "", "Enter Yacy Password": "Sekcem-d awal n uɛeddi n Yacy", "Enter Yacy URL (e.g. http://yacy.example.com:8090)": "Sekcem tansa URL n Yacy (amedya. http://yacy.example.com:8090)", @@ -624,7 +624,7 @@ "Enter your webhook URL": "Sekcem tansa URL n webhook-ik", "Error": "Tuccḍa", "ERROR": "TUCCḌA", - "Error accessing directory": "", + "Error accessing directory": "Tuccḍa deg unekcum ɣer ukaram", "Error accessing Google Drive: {{error}}": "Tuccḍa Google Drive: {{error}}", "Error accessing media devices.": "Tuccḍa deg unekcum ɣer yibenkan n yiẓeḍwa.", "Error starting recording.": "Tuccḍa deg beddu n usekles.", @@ -665,7 +665,7 @@ "External": "Azɣaray", "External Document Loader URL required.": "URL n uslay n yisemli azɣaray, yettwasra.", "External Task Model": "Tamudemt n temsekrit tazɣarayt", - "External Tools": "", + "External Tools": "Ifecka uffiɣen", "External Web Loader API Key": "API n isebtar web imeṛṛa Tasarut", "External Web Loader URL": "Tansa URL tuffiɣt", "External Web Search API Key": "Tasarut API n unadi yeffɣen ɣef Web", @@ -682,14 +682,14 @@ "Failed to generate title": "Ur yessaweḍ ara ad d-yawi azwel", "Failed to load chat preview": "Yecceḍ usali n teskant n udiwenni", "Failed to load file content.": "Ur yessaweḍ ara ad d-yessali agbur n yifuyla.", - "Failed to move chat": "", + "Failed to move chat": "Tuccḍa deg unkaz n udiwenni", "Failed to read clipboard contents": "Ur yessaweḍ ara ad iɣer agbur n tfelwit", "Failed to save connections": "Yecceḍ uklas n tuqqniwin", "Failed to save conversation": "Yecceḍ uklas n udiwenni", "Failed to save models configuration": "Ur yessaweḍ ara ad d-yessukkes tamudemt n usneftaɣ", "Failed to update settings": "Yecceḍ uleqqem n yiɣewwaren", "Failed to upload file.": "Yecceḍ uzdam n ufaylu.", - "fast": "", + "fast": "d arurad", "Features": "Timahilin", "Features Permissions": "Tisirag n tmehilin", "February": "Fuṛaṛ", @@ -697,7 +697,7 @@ "Feedback History": "Azray n tamawin", "Feedbacks": "Timuɣliwin", "Feel free to add specific details": "Ur ttkukru ara ad ternuḍ ttfaṣil ulmisen", - "Female": "", + "Female": "Tawtemt", "File": "Afaylu", "File added successfully.": "Afaylu yettwarna akken iwata.", "File content updated successfully.": "Agbur n ufaylu yettwaleqqem akken iwata.", @@ -771,7 +771,7 @@ "Google Drive": "Google Drive", "Google PSE API Key": "Tasarut API n Google PSE", "Google PSE Engine Id": "Asulay n umsadday n unadi PSE n Google", - "Gravatar": "", + "Gravatar": "Gravatar", "Group": "Agraw", "Group created successfully": "Agraw yennulfa-d akken iwata", "Group deleted successfully": "Agraw yettwakkes akken iwata", @@ -783,7 +783,7 @@ "H2": "H2", "H3": "H3", "Haptic Feedback": "", - "Height": "", + "Height": "Teɣzi", "Hello, {{name}}": "Azul a {{name}}", "Help": "Tallalt", "Help us create the best community leaderboard by sharing your feedback history!": "", @@ -875,15 +875,15 @@ "Keep Follow-Up Prompts in Chat": "Kemmel tiwsatin n uḍfaṛ-Up deg Chat", "Keep in Sidebar": "Senṭeḍ-it deg ufeggag n yidis", "Key": "Tasarutt", - "Key is required": "", + "Key is required": "Tlaq tsarut", "Keyboard shortcuts": "Inegzumen n unasiw", "Knowledge": "Tamusni", "Knowledge Access": "Anekcum ɣer tmussni", "Knowledge Base": "Taffa n tmusni", "Knowledge created successfully.": "Tamussni tennulfa-d akken iwata.", "Knowledge deleted successfully.": "Tamussni tettwakkes akken iwata.", - "Knowledge Description": "", - "Knowledge Name": "", + "Knowledge Description": "Aglam n tmessunt", + "Knowledge Name": "Isem n tmessunt", "Knowledge Public Sharing": "Beṭṭu azayaz n tmussniwin", "Knowledge reset successfully.": "Tamussni tettuwennez akken iwata.", "Knowledge updated successfully": "Timussniwin ttwaleqqment akken iwata", @@ -929,7 +929,7 @@ "Make password visible in the user interface": "Sken-d awal n uɛeddi deg ugrudem n useqdac", "Make sure to enclose them with": "Ur ttettu ara ad ten-tɣunzuḍ", "Make sure to export a workflow.json file as API format from ComfyUI.": "Ur ttettumt ara ad tessiǧwemt aman n umahil. afaylu json d amasal API seg ComfyUI.", - "Male": "", + "Male": "Awtem", "Manage": "Sefrek", "Manage Direct Connections": "Sefrek tuqqniwin tusridin", "Manage Models": "Sefrek timudmiwin", @@ -938,7 +938,7 @@ "Manage OpenAI API Connections": "Sefrek tuqqniwin API n OpenAI", "Manage Pipelines": "Sefrek iseldayen", "Manage Tool Servers": "Sefrek iqeddacen n ifecka", - "Manage your account information.": "", + "Manage your account information.": "Sefrek ilɣa-inek·inem n umiḍan.", "March": "Meɣres", "Markdown": "Markdown", "Markdown (Header)": "Ticreḍt (Aqerru)", @@ -983,7 +983,7 @@ "Model ID is required.": "Asulay n timudemt yettwasra.", "Model IDs": "Isulayen n tmudmiwin", "Model Name": "Isem n tmudemt", - "Model name already exists, please choose a different one": "", + "Model name already exists, please choose a different one": "Yella yakan yisem n tmudemt, ma ulac aɣilif fren wayeḍ yemwalafen", "Model Name is required.": "Isem n timudemt yettwasra.", "Model not selected": "Ur tettwafran ara tmudemt", "Model Params": "Iɣewwaren n timudemt", @@ -998,9 +998,9 @@ "Models Public Sharing": "Beṭṭu azayaz n tmudmiwin", "Mojeek Search API Key": "Tasarut API n Mojeek", "More": "Ugar", - "More Concise": "", + "More Concise": "Awezlan ugar", "More Options": "Ugar n textiṛiyin", - "Move": "", + "Move": "Senkez", "Name": "Isem", "Name and ID are required, please fill them out": "", "Name your knowledge base": "Mudd isem i taffa-k⋅m n tmussniwin", @@ -1014,7 +1014,7 @@ "New Tool": "Afecku amaynut", "new-channel": "abadu amaynut", "Next message": "Izen uḍfir", - "No authentication": "", + "No authentication": "Ulac asesteb", "No chats found": "Ulac idiwenniyen", "No chats found for this user.": "Ulac adiwenni i useqdac-a.", "No chats found.": "Ulac kra n usqerdec.", @@ -1022,7 +1022,7 @@ "No content found": "Ulac agbur yettwafen", "No content found in file.": "Ulac agbur yettwafen sdaxel ufaylu.", "No content to speak": "Ulac ara d-yettwabedren", - "No conversation to save": "", + "No conversation to save": "Ulac adiwenni i usekles", "No distance available": "Ulac ameccaq yettwafen", "No feedbacks found": "Ulac awennit i yettwafen", "No file selected": "Ulac afaylu i yettwafernen", @@ -1039,7 +1039,7 @@ "No results found": "Ulac igmaḍ yettwafen", "No search query generated": "Ulac tuttra n unadi yettusirwen", "No source available": "Ulac aɣbalu yettwafen", - "No sources found": "", + "No sources found": "Ulac iɣbula yettwafen", "No suggestion prompts": "Ulac isumar n prompt", "No users were found.": "Ulac aqeddac i yettwafen.", "No valves": "", @@ -1055,7 +1055,7 @@ "Notification Webhook": "Webhook n ulɣu", "Notifications": "Tilɣa", "November": "Wambeṛ", - "OAuth": "", + "OAuth": "OAuth", "OAuth ID": "Asulay OAuth", "October": "Tubeṛ", "Off": "Yensa", @@ -1095,8 +1095,8 @@ "OpenAI API Key is required.": "Tasarut API n OpenAI tettwasra.", "OpenAI API settings updated": "Iɣewwaṛen n API OpenAI", "OpenAI URL/Key required.": "URL/Tasarut OpenAI tettwasra.", - "openapi.json URL or Path": "", - "Optional": "", + "openapi.json URL or Path": "URL n openapi.json neɣ abrid-is", + "Optional": "D afrayan", "Options for running a local vision-language model in the picture description. The parameters refer to a model hosted on Hugging Face. This parameter is mutually exclusive with picture_description_api.": "", "or": "neɣ", "Ordered List": "Tabdart n usmizwer", @@ -1135,7 +1135,7 @@ "Pinned": "Yettwasenteḍ", "Pioneer insights": "", "Pipe": "Aselda", - "Pipeline": "", + "Pipeline": "Aselda", "Pipeline deleted successfully": "Aselda yettwakkes akken iwata", "Pipeline downloaded successfully": "Aselda yettuzdem-d akken iwata", "Pipelines": "Iseldayen", @@ -1149,7 +1149,7 @@ "Playwright WebSocket URL": "URL n websocket Playwright", "Please carefully review the following warnings:": "", "Please do not close the settings page while loading the model.": "", - "Please enter a message or attach a file.": "", + "Please enter a message or attach a file.": "Ttxil-k·m sekcem-d izen neɣ seddu afaylu.", "Please enter a prompt": "Ttxil-k·m, sekcem-d aneftaɣ", "Please enter a valid path": "Ttxil-k·m, sekcem-d abrid iṣeḥḥan", "Please enter a valid URL": "Ma ulac aɣilif, sekcem URL tameɣtut", @@ -1157,10 +1157,10 @@ "Please select a model first.": "Ttxil-k·m, fren tamudemt di tazwara.", "Please select a model.": "Ttxil-k, fren tamudemt.", "Please select a reason": "Ma ulac aɣilif ini-d acuɣeṛ", - "Please wait until all files are uploaded.": "", + "Please wait until all files are uploaded.": "Ttxil-k·m, ṛǧu alamma ulin-d akk ifuyla.", "Port": "Tawwurt", "Positive attitude": "", - "Prefer not to say": "", + "Prefer not to say": "Smenyafeɣ ur d-qqareɣ ara", "Prefix ID": "", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Asulay n uzwir yettusexdem i wakken ur d-yettili ara umennuɣ akked tuqqna-nniḍen s tmerna n usewgelhen i yimuhal n tmudemt - eǧǧ-iten d ilmawen i tukksa n tuqqna", "Prevent file creation": "Gmen timerna n ufaylu", @@ -1180,11 +1180,11 @@ "Prompts": "Ineftaɣen", "Prompts Access": "Anekcum ɣer yineftaɣen", "Prompts Public Sharing": "Beṭṭu azayaz n yineftaɣen", - "Provider Type": "", + "Provider Type": "Tawsit n usaǧǧaw", "Public": "Azayaz", "Pull \"{{searchValue}}\" from Ollama.com": "Awway n \"{{searchValue}}\" seg Ollama.com", "Pull a model from Ollama.com": "Zdem-d tamudemt seg Ollama.com", - "pypdfium2": "", + "pypdfium2": "pypdfium2", "Query Generation Prompt": "Aneftaɣ n usirew n tuttra", "Querying": "", "Quick Actions": "Tigawin tiruradin", @@ -1198,7 +1198,7 @@ "Reasoning Tags": "", "Record": "Aklas", "Record voice": "Sekles taɣect", - "Redirecting you to Open WebUI Community": "", + "Redirecting you to Open WebUI Community": "Aseḍfeṛ ar Temɣiwant n Open WebUI", "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.": "", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Err iman-ik d \"Aseqdac\" (amedya, \"Aseqdac ilemmed taspenyulit\")", "Refused when it shouldn't have": "", @@ -1237,14 +1237,14 @@ "RESULT": "Agmuḍ", "Retrieval": "Anadi", "Retrieval Query Generation": "Asirew n tuttra n RAG", - "Retrieved {{count}} sources": "", + "Retrieved {{count}} sources": "Yufa-d {{count}} n yiɣbula", "Retrieved {{count}} sources_one": "", "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", + "Retrieved 1 source": "Yufa-d 1 n uɣbalu", "Rich Text Input for Chat": "Aḍris anesbaɣur", "RK": "RK", "Role": "Tamlilt", - "Rosé Pine": "", + "Rosé Pine": "Pin rosé", "Rosé Pine Dawn": "Rosé Pine Dawn", "RTL": "RTL", "Run": "Selkem", @@ -1254,14 +1254,14 @@ "Save & Create": "Sekles rnu snulfu-d", "Save & Update": "Sekles rnu leqqem", "Save As Copy": "Sekles d anɣal", - "Save Chat": "", + "Save Chat": "Sekles asqerdec", "Save Tag": "Sekles tabzimt", "Saved": "Yettwasekles", "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": "", "Scroll On Branch Change": "Abeddel n Branch", "Search": "Nadi", "Search a model": "Nadi tamudemt", - "Search all emojis": "", + "Search all emojis": "Nadi akk imujiten", "Search Base": "Taffa n unadi", "Search Chats": "Nadi idiwenniyen", "Search Collection": "Nadi talkensit", @@ -1284,42 +1284,42 @@ "SearchApi API Key": "Tasarut API n SearchApi", "SearchApi Engine": "Amsadday n unadi SearchApi", "Searched {{count}} sites": "Inuda deg {{count}} n yismal web", - "Searching": "", + "Searching": "Anadi", "Searching \"{{searchQuery}}\"": "Anadi ɣef \"{{searchQuery}}\"", "Searching Knowledge for \"{{searchQuery}}\"": "Anadi n tmessunin ɣef \"{{searchQuery}}\"", - "Searching the web": "Anadi deg web…", + "Searching the web": "Anadi deg web", "Searxng Query URL": "URL n unadi Searxng", "See readme.md for instructions": "Ẓer taɣuṛi i lewṣaya", "See what's new": "Wali d acu i yellan d amaynut", "Seed": "Seed", - "Select": "", + "Select": "Fren", "Select a base model": "Fren tamudemt azadur", - "Select a base model (e.g. llama3, gpt-4o)": "", + "Select a base model (e.g. llama3, gpt-4o)": "Fren tamudemt n taffa (amedya, llama3, gpt-4o)", "Select a conversation to preview": "Fren adiwenni i teskant", "Select a engine": "Fren amsedday", "Select a function": "Fren tasɣent", "Select a group": "Fren agraw", - "Select a language": "", - "Select a mode": "", + "Select a language": "Fren tutlayt", + "Select a mode": "Fren askar", "Select a model": "Fren tamudemt", - "Select a model (optional)": "", + "Select a model (optional)": "Fren tamudemt (afrayan)", "Select a pipeline": "Fren aselda", "Select a pipeline url": "Fren tansa URL n uselda", "Select a reranking model engine": "", - "Select a role": "", - "Select a theme": "", + "Select a role": "Fren tamlilt", + "Select a theme": "Fren asentel", "Select a tool": "Fren afecku", - "Select a voice": "", + "Select a voice": "Fren taɣect", "Select an auth method": "Fren tarrayt n diri", "Select an embedding model engine": "", - "Select an engine": "", + "Select an engine": "Fren amsedday", "Select an Ollama instance": "Fren amedya Ollama", - "Select an output format": "", - "Select dtype": "", + "Select an output format": "Fren amasal n tuffɣa", + "Select dtype": "Fren dtype", "Select Engine": "Fren amsadday", "Select how to split message text for TTS requests": "", "Select Knowledge": "Fren tamusni", - "Select only one model to call": "", + "Select only one model to call": "Fren yiwet kan n tmudemt i wara d-siwleḍ", "Selected model(s) do not support image inputs": "Ammud(s) yettwafernen ur yessefrak ara inekcamen n tugniwin yettwafernen", "semantic": "tasnamekt", "Send": "Tuzna", @@ -1333,7 +1333,7 @@ "Serply API Key": "Tasarut API n Serply", "Serpstack API Key": "Tasarut API n Serpstack", "Server connection verified": "Tuqqna ɣer uqeddac, tettwasenqed", - "Session": "", + "Session": "Tiɣimit", "Set as default": "Sbadu-t d amezwaru", "Set CFG Scale": "Sbadu asefran CFG", "Set Default Model": "Sbadu tamudemt tamezwart", @@ -1385,12 +1385,12 @@ "sk-1234": "sk-1234", "Skip Cache": "Ur sseqdac ara tuffirt", "Skip the cache and re-run the inference. Defaults to False.": "Seqcer aṭaksi-nni, tɛawdeḍ-as assefreg. Imezwura ɣer False.", - "Something went wrong :/": "", - "Sonar": "", - "Sonar Deep Research": "", - "Sonar Pro": "", + "Something went wrong :/": "Yella wayen ur neddi ara :/", + "Sonar": "Sonar", + "Sonar Deep Research": "Sonar Deep Research", + "Sonar Pro": "Sonar Pro", "Sonar Reasoning": "", - "Sonar Reasoning Pro": "", + "Sonar Reasoning Pro": "Sonar Reasoning Pro", "Sougou Search API sID": "Asulay API n Sougou Search (sID)", "Sougou Search API SK": "Tasarut tuffirt n API Sougou Search (SK)", "Source": "Aɣbalu", @@ -1398,7 +1398,7 @@ "Speech recognition error: {{error}}": "Tuccḍa n uɛqal n wawal: {{error}}", "Speech-to-Text": "Aɛqal n taɣect", "Speech-to-Text Engine": "Amsadday n uɛqal n taɣect", - "standard": "", + "standard": "aslugan", "Start of the channel": "Tazwara n wabadu", "Start Tag": "", "Status Updates": "", @@ -1442,7 +1442,7 @@ "Tell us more:": "Ini-aɣ-d ugar:", "Temperature": "Tazɣelt", "Temporary Chat": "Asqerdec akudan", - "Temporary Chat by Default": "", + "Temporary Chat by Default": "Asqerdec uɛḍil s wudem amezwer", "Text Splitter": "", "Text-to-Speech": "Aḍris-ɣer-taɣect", "Text-to-Speech Engine": "Amsadday n TTS", @@ -1461,7 +1461,7 @@ "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Tiddi n ufaylu afellay deg MB. Ma yella teɣzi n ufaylu tɛedda i talast-a, afaylu ur yettali ara.", "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.": "Amḍan afellay n yifuyla i izemren ad ttwasqedcen ɣef tikkelt deg udiwenni. Ma yella amḍan n yifuyla iɛedda i talast-a, ifuyla ur ttalin ara.", "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "Amasal n tuffɣa i uḍris. Tzemreḍ ad tiliḍ d 'json', d 'markdown' neɣ d 'html'. Imezwura ɣer 'markdown'.", - "The passwords you entered don't quite match. Please double-check and try again.": "", + "The passwords you entered don't quite match. Please double-check and try again.": "Awalen uffiren i teskecmeḍ ur mwatan ara mliḥ. Ttxil-k·m, ssefqed snat n tikkal yernu ɛreḍ tikkelt nniḍen.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "", "The stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "", "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "Taẓɣelt n tmudemt. Asenqes n teẓɣelt ad yerr tamudemt d tiririt s tesɣent ugar.", @@ -1530,7 +1530,7 @@ "Tool Servers": "Iqeddacen n ifecka", "Tool updated successfully": "Afecku yettwaleqqem akken iwata", "Tools": "Ifecka", - "Tools Access": "", + "Tools Access": "Addaf ar ifecka", "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.": "", @@ -1546,7 +1546,7 @@ "TTS Voice": "Taɣect n TTS", "Type": "Anaw", "Type Hugging Face Resolve (Download) URL": "Anaw n usefres n wudem amezwer (Download) URL", - "Uh-oh! There was an issue with the response.": "", + "Uh-oh! There was an issue with the response.": "Uh! Tella-d tuccḍa akked tririt-nni.", "UI": "Agrudem n useqdac", "Unarchive All": "", "Unarchive All Archived Chats": "", @@ -1577,7 +1577,7 @@ "Upload Progress": "", "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "", "URL": "URL", - "URL is required": "", + "URL is required": "Tlaq tansa URL", "URL Mode": "Askar n URL", "Usage": "Aseqdec", "Use '#' in the prompt input to load and include your knowledge.": "", @@ -1587,7 +1587,7 @@ "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "Seqdec proxy i d-yesnulfa http_proxy akked https_proxy environment variables to fetch page contents.", "user": "aseqdac", "User": "Aseqdac", - "User Groups": "", + "User Groups": "Agraw n iseqdacen", "User location successfully retrieved.": "", "User menu": "Umuɣ n useqdac", "User Webhooks": "Webhooks n yiseqdacen", @@ -1597,7 +1597,7 @@ "Using Focused Retrieval": "Aseqdec n Retrieval yeslummes", "Using the default arena model with all models. Click the plus button to add custom models.": "Aseqdec n tmudemt n uzna amezwer s yal timudmin. Tekki ɣef tqeffalt-nni n tmerniwt akken ad ternuḍ timudmin tinsayanin.", "Valid time units:": "Tigget n wakud ameɣtu:", - "Validate certificate": "", + "Validate certificate": "Seɣbel aselkin", "Valves": "", "Valves updated": "", "Valves updated successfully": "Valves ttwaleqmen akken iwata", @@ -1610,7 +1610,7 @@ "View Result from **{{NAME}}**": "Tamuɣli i d-yettuɣalen seg tazwara **{NAME}}**", "Visibility": "Tametwalant", "Vision": "Vision", - "vlm": "", + "vlm": "vlm", "Voice": "Taɣect", "Voice Input": "Anekcam s taɣect", "Voice mode": "Askar n taɣect", @@ -1641,7 +1641,7 @@ "Whisper (Local)": "Whisper (adigan)", "Why?": "Ayɣer?", "Widescreen Mode": "Askar n ugdil aččuran", - "Width": "", + "Width": "Tehri", "Won": "Yerbaḥ", "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.": "", "Workspace": "Tamnaḍṭ n umahil", @@ -1665,7 +1665,7 @@ "You have shared this chat": "Tebḍiḍ aqesosoer-a", "You're a helpful assistant.": "Kečč d amalal yettallen.", "You're now logged in.": "Aql-ik teqqned imir-a.", - "Your Account": "", + "Your Account": "Amiḍan-ik·im", "Your account status is currently pending activation.": "Addad-nnem n umiḍan atan yettṛaju armad.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "", "Youtube": "YouTube", From 932f7594105c07306e2112c618850429d15552e5 Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Thu, 11 Sep 2025 15:45:55 +0800 Subject: [PATCH 031/378] feat: add text truncation to ChatItem title display --- src/lib/components/layout/Sidebar/ChatItem.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/layout/Sidebar/ChatItem.svelte b/src/lib/components/layout/Sidebar/ChatItem.svelte index 494fb7ba9c..c9168b637c 100644 --- a/src/lib/components/layout/Sidebar/ChatItem.svelte +++ b/src/lib/components/layout/Sidebar/ChatItem.svelte @@ -429,7 +429,7 @@ draggable="false" >
-
+
{title}
From cf72f5503f39834b9da44ebbb426a3674dad0caa Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 12:26:25 +0400 Subject: [PATCH 032/378] refac --- 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 ae2c96c6da..3dfbb38ae5 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -2042,7 +2042,7 @@ async def process_chat_response( ) usage = data.get("usage", {}) usage.update( - data.get("timing", {}) + data.get("timings", {}) ) # llama.cpp if usage: From bbe6564bfd6aea4fe7907963fc416875bd4b631d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 17:31:28 +0400 Subject: [PATCH 033/378] refac --- .../Messages/ResponseMessage/StatusHistory/StatusItem.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/chat/Messages/ResponseMessage/StatusHistory/StatusItem.svelte b/src/lib/components/chat/Messages/ResponseMessage/StatusHistory/StatusItem.svelte index 6b6422f32a..da234b64a2 100644 --- a/src/lib/components/chat/Messages/ResponseMessage/StatusHistory/StatusItem.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage/StatusHistory/StatusItem.svelte @@ -22,7 +22,7 @@ - {#if status?.description.includes('{{count}}')} + {#if status?.description?.includes('{{count}}')} {$i18n.t(status?.description, { count: (status?.urls || status?.items).length })} From bf3a140254dd0f073377e60cec45900f531b9fe0 Mon Sep 17 00:00:00 2001 From: _00_ <131402327+rgaricano@users.noreply.github.com> Date: Thu, 11 Sep 2025 17:31:35 +0200 Subject: [PATCH 034/378] UPD: i18n- Translation es-ES v0.6.28 --- src/lib/i18n/locales/es-ES/translation.json | 64 ++++++++++----------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 7b9cd03088..67e7ca29af 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -14,13 +14,13 @@ "{{COUNT}} extracted lines": "{{COUNT}} líneas extraidas", "{{COUNT}} hidden lines": "{{COUNT}} líneas ocultas", "{{COUNT}} Replies": "{{COUNT}} Respuestas", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} Fuentes", "{{COUNT}} words": "{{COUNT}} palabras", "{{model}} download has been canceled": "La descarga de {{model}} ha sido cancelada", "{{user}}'s Chats": "Chats de {{user}}", "{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido", "*Prompt node ID(s) are required for image generation": "Los ID de nodo son requeridos para la generación de imágenes", - "1 Source": "", + "1 Source": "1 Fuente", "A new version (v{{LATEST_VERSION}}) is now available.": "Nueva versión (v{{LATEST_VERSION}}) disponible.", "A task model is used when performing tasks such as generating titles for chats and web search queries": "El modelo de tareas realiza tareas como la generación de títulos para chats y consultas de búsqueda web", "a user": "un usuario", @@ -31,7 +31,7 @@ "Accessible to all users": "Accesible para todos los usuarios", "Account": "Cuenta", "Account Activation Pending": "Activación de cuenta Pendiente", - "accurate": "", + "accurate": "precisión", "Accurate information": "Información precisa", "Action": "Acción", "Action not found": "Acción no encontrada", @@ -426,11 +426,11 @@ "Display Multi-model Responses in Tabs": "Mostrar Respuestas de MultiModelos Tabuladas", "Display the username instead of You in the Chat": "Mostrar en el chat el nombre de usuario en lugar del genérico Tu", "Displays citations in the response": "Mostrar citas en la respuesta", - "Displays status updates (e.g., web search progress) in the response": "", + "Displays status updates (e.g., web search progress) in the response": "Muestra actualizaciones de estado (p.ej., progreso de la búsqueda web) en la respuesta", "Dive into knowledge": "Sumérgete en el conocimiento", - "dlparse_v1": "", - "dlparse_v2": "", - "dlparse_v4": "", + "dlparse_v1": "dlparse_v1", + "dlparse_v2": "dlparse_v2", + "dlparse_v4": "dlparse_v4", "Do not install functions from sources you do not fully trust.": "¡No instalar funciones de fuentes en las que que no se confíe totalmente!", "Do not install tools from sources you do not fully trust.": "¡No instalar herramientas de fuentes en las que no se confíe totalmente!", "Docling": "Docling", @@ -501,7 +501,7 @@ "Enable Message Rating": "Habilitar Calificación de los Mensajes", "Enable Mirostat sampling for controlling perplexity.": "Algoritmo de decodificación de texto neuronal que controla activamente el proceso generativo para mantener la perplejidad del texto generado en un valor deseado. Previene las trampas de aburrimiento (por excesivas repeticiones) y de incoherencia (por generación de excesivo texto).", "Enable New Sign Ups": "Habilitar Registros de Nuevos Usuarios", - "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", + "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "Habilite, deshabilite o personalice las etiquetas de razonamiento utilizadas por el modelo. \"HAbilitado\" usa etiquetas predeterminadas, \"Deshabilitado\" desactiva las etiquetas de razonamiento y \"Personalizado\" le permite especificar sus propias etiquetas de inicio y fin.", "Enabled": "Habilitado", "End Tag": "Etiqueta de Fin", "Endpoint URL": "Endpoint URL", @@ -665,7 +665,7 @@ "External": "Externo", "External Document Loader URL required.": "LA URL del Cargador Externo de Documentos es requerida.", "External Task Model": "Modelo Externo de Herramientas", - "External Tools": "", + "External Tools": "Herramientas Externas", "External Web Loader API Key": "Clave API del Cargador Web Externo", "External Web Loader URL": "URL del Cargador Web Externo", "External Web Search API Key": "Clave API del Buscador Web Externo", @@ -689,7 +689,7 @@ "Failed to save models configuration": "Fallo al guardar la configuración de los modelos", "Failed to update settings": "Fallo al actualizar los ajustes", "Failed to upload file.": "Fallo al subir el archivo.", - "fast": "", + "fast": "rápido", "Features": "Características", "Features Permissions": "Permisos de las Características", "February": "Febrero", @@ -735,7 +735,7 @@ "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Formatear las lineas en la salida. Por defecto, False. Si la opción es True, las líneas se formatearán detectando estilos e 'inline math'", "Format your variables using brackets like this:": "Formatea tus variables usando corchetes así:", "Formatting may be inconsistent from source.": "El formato puede ser inconsistente con el original", - "Forwards system user OAuth access token to authenticate": "", + "Forwards system user OAuth access token to authenticate": "Reenvía el token de acceso OAuth del usuario del sistema para autenticarse", "Forwards system user session credentials to authenticate": "Reenvío de las credenciales de la sesión del usuario del sistema para autenticación", "Full Context Mode": "Modo Contexto Completo", "Function": "Función", @@ -831,7 +831,7 @@ "Import Prompts": "Importar Indicadores", "Import Tools": "Importar Herramientas", "Important Update": "Actualización importante", - "In order to force OCR, performing OCR must be enabled.": "", + "In order to force OCR, performing OCR must be enabled.": "Para forzar OCR, la opción para realizar OCR debe estar habilitada.", "Include": "Incluir", "Include `--api-auth` flag when running stable-diffusion-webui": "Incluir el señalizador `--api-auth` al ejecutar stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Incluir el señalizador `--api` al ejecutar stable-diffusion-webui", @@ -847,7 +847,7 @@ "Insert": "Insertar", "Insert Follow-Up Prompt to Input": "Insertar Sugerencia de Indicador a la Entrada", "Insert Prompt as Rich Text": "Insertar Indicador como Texto Enriquecido", - "Insert Suggestion Prompt to Input": "", + "Insert Suggestion Prompt to Input": "Insertar Indicador Sugerido a la Entrada", "Install from Github URL": "Instalar desde la URL de Github", "Instant Auto-Send After Voice Transcription": "AutoEnvio Instantaneo tras la Transcripción de Voz", "Integration": "Integración", @@ -1014,7 +1014,7 @@ "New Tool": "Nueva Herramienta", "new-channel": "nuevo-canal", "Next message": "Siguiente mensaje", - "No authentication": "", + "No authentication": "Sin Autentificación", "No chats found": "No se encontró ningún chat", "No chats found for this user.": "No se encontró ningún chat de este usuario", "No chats found.": "No se encontró ningún chat", @@ -1039,7 +1039,7 @@ "No results found": "No se encontraron resultados", "No search query generated": "No se generó ninguna consulta de búsqueda", "No source available": "No hay fuente disponible", - "No sources found": "", + "No sources found": "No se han encontrado fuentes", "No suggestion prompts": "Sin prompts sugeridos", "No users were found.": "No se encontraron usuarios.", "No valves": "No hay válvulas", @@ -1055,7 +1055,7 @@ "Notification Webhook": "Notificación Enganchada (webhook)", "Notifications": "Notificaciones", "November": "Noviembre", - "OAuth": "", + "OAuth": "OAuth", "OAuth ID": "OAuth ID", "October": "Octubre", "Off": "Desactivado", @@ -1112,14 +1112,14 @@ "Password": "Contraseña", "Passwords do not match.": "Las contraseñas no coinciden", "Paste Large Text as File": "Pegar el Texto Largo como Archivo", - "PDF Backend": "", + "PDF Backend": "Backend PDF", "PDF document (.pdf)": "Documento PDF (.pdf)", "PDF Extract Images (OCR)": "Extraer imágenes del PDF (OCR)", "pending": "pendiente", "Pending": "Pendiente", "Pending User Overlay Content": "Contenido de la SobreCapa Usuario Pendiente", "Pending User Overlay Title": "Título de la SobreCapa Usuario Pendiente", - "Perform OCR": "", + "Perform OCR": "Realizar OCR", "Permission denied when accessing media devices": "Permiso denegado accediendo a los dispositivos", "Permission denied when accessing microphone": "Permiso denegado accediendo al micrófono", "Permission denied when accessing microphone: {{error}}": "Permiso denegado accediendo al micrófono: {{error}}", @@ -1135,7 +1135,7 @@ "Pinned": "Fijado", "Pioneer insights": "Descubrir nuevas perspectivas", "Pipe": "Tubo", - "Pipeline": "", + "Pipeline": "Tubería", "Pipeline deleted successfully": "Tubería borrada correctamente", "Pipeline downloaded successfully": "Tubería descargada correctamente", "Pipelines": "Tuberías", @@ -1180,13 +1180,13 @@ "Prompts": "Indicadores", "Prompts Access": "Acceso a Indicadores", "Prompts Public Sharing": "Compartir Indicadores Públicamente", - "Provider Type": "", + "Provider Type": "Tipo de Proveedor", "Public": "Público", "Pull \"{{searchValue}}\" from Ollama.com": "Extraer \"{{searchValue}}\" desde Ollama.com", "Pull a model from Ollama.com": "Extraer un modelo desde Ollama.com", - "pypdfium2": "", + "pypdfium2": "pypdfium2", "Query Generation Prompt": "Indicador para la Consulta de Generación", - "Querying": "", + "Querying": "Consultando", "Quick Actions": "Acciones Rápida", "RAG Template": "Plantilla del RAG", "Rating": "Calificación", @@ -1237,11 +1237,11 @@ "RESULT": "Resultado", "Retrieval": "Recuperación", "Retrieval Query Generation": "Consulta de Generación de Recuperación", - "Retrieved {{count}} sources": "", - "Retrieved {{count}} sources_one": "", - "Retrieved {{count}} sources_many": "", - "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", + "Retrieved {{count}} sources": "Recuperadas {{count}} fuentes", + "Retrieved {{count}} sources_one": "Recuperadas {{count}} fuentes únicas", + "Retrieved {{count}} sources_many": "Recuperadas {{count}} fuentes múltiples", + "Retrieved {{count}} sources_other": "Recuperadas {{count}} otras fuentes", + "Retrieved 1 source": "Recuperada una fuente", "Rich Text Input for Chat": "Entrada de Texto Enriquecido para el Chat", "RK": "RK", "Role": "Rol", @@ -1285,7 +1285,7 @@ "SearchApi API Key": "Clave API de SearchApi", "SearchApi Engine": "Motor SearchApi", "Searched {{count}} sites": "{{count}} sitios buscados", - "Searching": "", + "Searching": "Buscando", "Searching \"{{searchQuery}}\"": "Buscando \"{{searchQuery}}\"", "Searching Knowledge for \"{{searchQuery}}\"": "Buscando \"{{searchQuery}}\" en Conocimiento", "Searching the web": "Buscando en la web...", @@ -1399,10 +1399,10 @@ "Speech recognition error: {{error}}": "Error en reconocimiento de voz: {{error}}", "Speech-to-Text": "Voz a Texto", "Speech-to-Text Engine": "Motor Voz a Texto(STT)", - "standard": "", + "standard": "standard", "Start of the channel": "Inicio del canal", "Start Tag": "Etiqueta de Inicio", - "Status Updates": "", + "Status Updates": "Actualizaciones de Estado", "STDOUT/STDERR": "STDOUT/STDERR", "Stop": "Detener", "Stop Generating": "Detener la Generación", @@ -1428,7 +1428,7 @@ "System": "Sistema", "System Instructions": "Instrucciones del sistema", "System Prompt": "Indicador del sistema", - "Table Mode": "", + "Table Mode": "Modo de Tabla", "Tags": "Etiquetas", "Tags Generation": "Generación de Etiquetas", "Tags Generation Prompt": "Indicador para la Generación de Etiquetas", @@ -1611,7 +1611,7 @@ "View Result from **{{NAME}}**": "Ver Resultado desde **{{NAME}}**", "Visibility": "Visibilidad", "Vision": "Visión", - "vlm": "", + "vlm": "vlm", "Voice": "Voz", "Voice Input": "Entrada de Voz", "Voice mode": "Modo de Voz", From 2185fc61c0d2f9aee876b8ea48cc25bae0c4bfdf Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 21:29:56 +0400 Subject: [PATCH 035/378] refac --- backend/open_webui/retrieval/utils.py | 13 +++++++------ backend/open_webui/routers/retrieval.py | 9 ++++++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index dead8458cb..b3dc52d7b2 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -432,13 +432,14 @@ def get_embedding_function( if isinstance(query, list): embeddings = [] for i in range(0, len(query), embedding_batch_size): - embeddings.extend( - func( - query[i : i + embedding_batch_size], - prefix=prefix, - user=user, - ) + batch_embeddings = func( + query[i : i + embedding_batch_size], + prefix=prefix, + user=user, ) + + if isinstance(batch_embeddings, list): + embeddings.extend(batch_embeddings) return embeddings else: return func(query, prefix, user) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index dd5e2d5bc4..9c3566ab2b 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1334,7 +1334,7 @@ def save_docs_to_vector_db( ) return True - log.info(f"adding to collection {collection_name}") + log.info(f"generating embeddings for {collection_name}") embedding_function = get_embedding_function( request.app.state.config.RAG_EMBEDDING_ENGINE, request.app.state.config.RAG_EMBEDDING_MODEL, @@ -1381,11 +1381,18 @@ def save_docs_to_vector_db( for idx, text in enumerate(texts) ] + log.info(f"adding to collection {collection_name}") VECTOR_DB_CLIENT.insert( collection_name=collection_name, items=items, ) + # Validate the number of items inserted + result = VECTOR_DB_CLIENT.query( + collection_name=collection_name, + filter={"metadata": metadata} if metadata else None, + ) + return True except Exception as e: log.exception(e) From a6f25b99f9e4d736bf0f105ac3c4140a6e9254ba Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 21:34:40 +0400 Subject: [PATCH 036/378] 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 e0b9a0a3c0..faf4b30861 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1667,7 +1667,7 @@ (model) => $models.find((m) => m.id === model)?.info?.meta?.capabilities?.web_search ?? true ).length === currentModels.length ) { - if (($settings?.webSearch ?? false) === 'always') { + if ($config?.features?.enable_web_search && ($settings?.webSearch ?? false) === 'always') { features = { ...features, web_search: true }; } } From edc056351d8119da51b3a2704cb2548535292eb6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 21:38:01 +0400 Subject: [PATCH 037/378] refac --- backend/open_webui/routers/retrieval.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 9c3566ab2b..10c0221b01 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1387,12 +1387,6 @@ def save_docs_to_vector_db( items=items, ) - # Validate the number of items inserted - result = VECTOR_DB_CLIENT.query( - collection_name=collection_name, - filter={"metadata": metadata} if metadata else None, - ) - return True except Exception as e: log.exception(e) From 6c0a5fa91cdbf6ffb74667ee61ca96bebfdfbc50 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 21:56:59 +0400 Subject: [PATCH 038/378] refac --- backend/open_webui/functions.py | 9 +++++---- backend/open_webui/main.py | 8 -------- backend/open_webui/routers/openai.py | 9 +++++---- backend/open_webui/utils/middleware.py | 18 ++++++++++-------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/backend/open_webui/functions.py b/backend/open_webui/functions.py index 4122cbbe0d..7224d28113 100644 --- a/backend/open_webui/functions.py +++ b/backend/open_webui/functions.py @@ -221,10 +221,11 @@ async def generate_function_chat_completion( oauth_token = None try: - oauth_token = request.app.state.oauth_manager.get_oauth_token( - user.id, - request.cookies.get("oauth_session_id", None), - ) + if request.cookies.get("oauth_session_id", None): + oauth_token = request.app.state.oauth_manager.get_oauth_token( + user.id, + request.cookies.get("oauth_session_id", None), + ) except Exception as e: log.error(f"Error getting OAuth token: {e}") diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index a5d55f75ab..6b536c78bc 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1418,14 +1418,6 @@ async def chat_completion( model_item = form_data.pop("model_item", {}) tasks = form_data.pop("background_tasks", None) - oauth_token = None - try: - oauth_token = request.app.state.oauth_manager.get_oauth_token( - user.id, request.cookies.get("oauth_session_id", None) - ) - except Exception as e: - log.error(f"Error getting OAuth token: {e}") - metadata = {} try: if not model_item.get("direct", False): diff --git a/backend/open_webui/routers/openai.py b/backend/open_webui/routers/openai.py index 184f47038d..8d8883a02c 100644 --- a/backend/open_webui/routers/openai.py +++ b/backend/open_webui/routers/openai.py @@ -171,10 +171,11 @@ def get_headers_and_cookies( oauth_token = None try: - oauth_token = request.app.state.oauth_manager.get_oauth_token( - user.id, - request.cookies.get("oauth_session_id", None), - ) + if request.cookies.get("oauth_session_id", None): + oauth_token = request.app.state.oauth_manager.get_oauth_token( + user.id, + request.cookies.get("oauth_session_id", None), + ) except Exception as e: log.error(f"Error getting OAuth token: {e}") diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 3dfbb38ae5..42e413afaf 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -817,10 +817,11 @@ async def process_chat_payload(request, form_data, user, metadata, model): oauth_token = None try: - oauth_token = request.app.state.oauth_manager.get_oauth_token( - user.id, - request.cookies.get("oauth_session_id", None), - ) + if request.cookies.get("oauth_session_id", None): + oauth_token = request.app.state.oauth_manager.get_oauth_token( + user.id, + request.cookies.get("oauth_session_id", None), + ) except Exception as e: log.error(f"Error getting OAuth token: {e}") @@ -1496,10 +1497,11 @@ async def process_chat_response( oauth_token = None try: - oauth_token = request.app.state.oauth_manager.get_oauth_token( - user.id, - request.cookies.get("oauth_session_id", None), - ) + if request.cookies.get("oauth_session_id", None): + oauth_token = request.app.state.oauth_manager.get_oauth_token( + user.id, + request.cookies.get("oauth_session_id", None), + ) except Exception as e: log.error(f"Error getting OAuth token: {e}") From 051b6daa8299fd332503bd584563556e2ae6adab Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 11 Sep 2025 22:29:02 +0400 Subject: [PATCH 039/378] refac/fix: large file upload --- backend/open_webui/routers/retrieval.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 10c0221b01..1f32791ba6 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -1370,6 +1370,7 @@ def save_docs_to_vector_db( prefix=RAG_EMBEDDING_CONTENT_PREFIX, user=user, ) + log.info(f"embeddings generated {len(embeddings)} for {len(texts)} items") items = [ { @@ -1387,6 +1388,7 @@ def save_docs_to_vector_db( items=items, ) + log.info(f"added {len(items)} items to collection {collection_name}") return True except Exception as e: log.exception(e) @@ -1545,13 +1547,20 @@ def process_file( log.debug(f"text_content: {text_content}") Files.update_file_data_by_id( file.id, - {"status": "completed", "content": text_content}, + {"content": text_content}, ) - hash = calculate_sha256_string(text_content) Files.update_file_hash_by_id(file.id, hash) - if not request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL: + if request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL: + Files.update_file_data_by_id(file.id, {"status": "completed"}) + return { + "status": True, + "collection_name": None, + "filename": file.filename, + "content": text_content, + } + else: try: result = save_docs_to_vector_db( request, @@ -1565,6 +1574,7 @@ def process_file( add=(True if form_data.collection_name else False), user=user, ) + log.info(f"added {len(docs)} items to collection {collection_name}") if result: Files.update_file_metadata_by_id( @@ -1582,13 +1592,6 @@ def process_file( } except Exception as e: raise e - else: - return { - "status": True, - "collection_name": None, - "filename": file.filename, - "content": text_content, - } except Exception as e: log.exception(e) From fcd3c7a10f8a521b23d414a1c44921f9ab949ebd Mon Sep 17 00:00:00 2001 From: silentoplayz Date: Fri, 12 Sep 2025 00:47:54 -0400 Subject: [PATCH 040/378] fix: spelling --- tailwind.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tailwind.config.js b/tailwind.config.js index 9171dc760b..c79b4ef2f3 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,5 +1,5 @@ import typography from '@tailwindcss/typography'; -import containerQuries from '@tailwindcss/container-queries'; +import containerQueries from '@tailwindcss/container-queries'; /** @type {import('tailwindcss').Config} */ export default { @@ -42,5 +42,5 @@ export default { } } }, - plugins: [typography, containerQuries] + plugins: [typography, containerQueries] }; From ee82439e6773e4173b6a20dbd60436f1d62599e4 Mon Sep 17 00:00:00 2001 From: Xie Yanbo Date: Wed, 30 Jul 2025 16:00:15 +0800 Subject: [PATCH 041/378] feat: add Feishu OAuth integration Implement Feishu OAuth provider using standard client: - Set up Feishu-specific endpoints for authorization, token, and userinfo - Use user_id as sub claim for Feishu user identification - Extract correct user information from nested 'data' field in Feishu responses Configuration requirements: - Set FEISHU_CLIENT_ID and FEISHU_CLIENT_SECRET environment variables to enable Feishu OAuth - Set ENABLE_OAUTH_SIGNUP=true to allow automatic user creation after OAuth login - Set DEFAULT_USER_ROLE=user to grant immediate access after OAuth registration - Set OAUTH_MERGE_ACCOUNTS_BY_EMAIL=true to enable merging of existing user accounts with matching emails --- backend/dev.sh | 2 +- backend/open_webui/config.py | 52 +++++++++++++++++++++++++++++++ backend/open_webui/utils/oauth.py | 2 ++ src/routes/auth/+page.svelte | 10 ++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/backend/dev.sh b/backend/dev.sh index 504b8f7554..042fbd9efa 100755 --- a/backend/dev.sh +++ b/backend/dev.sh @@ -1,3 +1,3 @@ -export CORS_ALLOW_ORIGIN="http://localhost:5173" +export CORS_ALLOW_ORIGIN="http://localhost:5173;http://localhost:8080" PORT="${PORT:-8080}" uvicorn open_webui.main:app --port $PORT --host 0.0.0.0 --forwarded-allow-ips '*' --reload diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 069faab439..efa37a0142 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -513,6 +513,30 @@ OAUTH_GROUPS_CLAIM = PersistentConfig( os.environ.get("OAUTH_GROUPS_CLAIM", os.environ.get("OAUTH_GROUP_CLAIM", "groups")), ) +FEISHU_CLIENT_ID = PersistentConfig( + "FEISHU_CLIENT_ID", + "oauth.feishu.client_id", + os.environ.get("FEISHU_CLIENT_ID", ""), +) + +FEISHU_CLIENT_SECRET = PersistentConfig( + "FEISHU_CLIENT_SECRET", + "oauth.feishu.client_secret", + os.environ.get("FEISHU_CLIENT_SECRET", ""), +) + +FEISHU_OAUTH_SCOPE = PersistentConfig( + "FEISHU_OAUTH_SCOPE", + "oauth.feishu.scope", + os.environ.get("FEISHU_OAUTH_SCOPE", "contact:user.base:readonly"), +) + +FEISHU_REDIRECT_URI = PersistentConfig( + "FEISHU_REDIRECT_URI", + "oauth.feishu.redirect_uri", + os.environ.get("FEISHU_REDIRECT_URI", ""), +) + ENABLE_OAUTH_ROLE_MANAGEMENT = PersistentConfig( "ENABLE_OAUTH_ROLE_MANAGEMENT", "oauth.enable_role_mapping", @@ -705,6 +729,32 @@ def load_oauth_providers(): "register": oidc_oauth_register, } + if FEISHU_CLIENT_ID.value and FEISHU_CLIENT_SECRET.value: + def feishu_oauth_register(client: OAuth): + client.register( + name="feishu", + client_id=FEISHU_CLIENT_ID.value, + client_secret=FEISHU_CLIENT_SECRET.value, + access_token_url="https://open.feishu.cn/open-apis/authen/v2/oauth/token", + authorize_url="https://accounts.feishu.cn/open-apis/authen/v1/authorize", + api_base_url="https://open.feishu.cn/open-apis", + userinfo_endpoint="https://open.feishu.cn/open-apis/authen/v1/user_info", + client_kwargs={ + "scope": FEISHU_OAUTH_SCOPE.value, + **( + {"timeout": int(OAUTH_TIMEOUT.value)} + if OAUTH_TIMEOUT.value + else {} + ), + }, + redirect_uri=FEISHU_REDIRECT_URI.value, + ) + + OAUTH_PROVIDERS["feishu"] = { + "register": feishu_oauth_register, + "sub_claim": "user_id", + } + configured_providers = [] if GOOGLE_CLIENT_ID.value: configured_providers.append("Google") @@ -712,6 +762,8 @@ def load_oauth_providers(): configured_providers.append("Microsoft") if GITHUB_CLIENT_ID.value: configured_providers.append("GitHub") + if FEISHU_CLIENT_ID.value: + configured_providers.append("Feishu") if configured_providers and not OPENID_PROVIDER_URL.value: provider_list = ", ".join(configured_providers) diff --git a/backend/open_webui/utils/oauth.py b/backend/open_webui/utils/oauth.py index 7eedc30c31..f48a1756b7 100644 --- a/backend/open_webui/utils/oauth.py +++ b/backend/open_webui/utils/oauth.py @@ -602,6 +602,8 @@ class OAuthManager: or (auth_manager_config.OAUTH_USERNAME_CLAIM not in user_data) ): user_data: UserInfo = await client.userinfo(token=token) + if provider == "feishu" and isinstance(user_data, dict) and "data" in user_data: + user_data = user_data["data"] if not user_data: log.warning(f"OAuth callback failed, user data is missing: {token}") raise HTTPException(400, detail=ERROR_MESSAGES.INVALID_CRED) diff --git a/src/routes/auth/+page.svelte b/src/routes/auth/+page.svelte index 68c0df81ea..62eb47e6b0 100644 --- a/src/routes/auth/+page.svelte +++ b/src/routes/auth/+page.svelte @@ -523,6 +523,16 @@ > {/if} + {#if $config?.oauth?.providers?.feishu} + + {/if}
{/if} From c9e69fb2f4d19bc39b9060f0a3b9afdf10eeff36 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Fri, 12 Sep 2025 10:36:37 +0200 Subject: [PATCH 042/378] 100% german translation (~ 250 strings added/changed) --- src/lib/i18n/locales/de-DE/translation.json | 498 ++++++++++---------- 1 file changed, 249 insertions(+), 249 deletions(-) diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index 0825e2a8a0..8f7edf901d 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -5,22 +5,22 @@ "(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)", "(latest)": "(neueste)", "(leave blank for to use commercial endpoint)": "(leer lassen, um kommerziellen Endpunkt zu verwenden)", - "[Last] dddd [at] h:mm A": "", - "[Today at] h:mm A": "", - "[Yesterday at] h:mm A": "", + "[Last] dddd [at] h:mm A": "[Zuletzt] dddd [um] h:mm A", + "[Today at] h:mm A": "[Heute um] h:mm A", + "[Yesterday at] h:mm A": "[Gestern um] h:mm A", "{{ models }}": "{{ Modelle }}", "{{COUNT}} Available Tools": "{{COUNT}} verfügbare Werkzeuge", "{{COUNT}} characters": "{{COUNT}} Zeichen", - "{{COUNT}} extracted lines": "", + "{{COUNT}} extracted lines": "{{COUNT}} extrahierte Zeilen", "{{COUNT}} hidden lines": "{{COUNT}} versteckte Zeilen", "{{COUNT}} Replies": "{{COUNT}} Antworten", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} Quellen", "{{COUNT}} words": "{{COUNT}} Wörter", - "{{model}} download has been canceled": "", + "{{model}} download has been canceled": "Der Download von {{model}} wurde abgebrochen", "{{user}}'s Chats": "{{user}}s Chats", "{{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", - "1 Source": "", + "1 Source": "1 Quelle", "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 werden beispielsweise zur Generierung von Chat-Titeln oder Websuchanfragen verwendet", "a user": "ein Benutzer", @@ -31,10 +31,10 @@ "Accessible to all users": "Für alle Benutzer zugänglich", "Account": "Konto", "Account Activation Pending": "Kontoaktivierung ausstehend", - "accurate": "", + "accurate": "präzise", "Accurate information": "Präzise Information(en)", "Action": "Aktion", - "Action not found": "", + "Action not found": "Aktion nicht gefunden", "Action Required for Chat Log Storage": "Aktion erforderlich für die Speicherung des Chat-Protokolls", "Actions": "Aktionen", "Activate": "Aktivieren", @@ -62,8 +62,8 @@ "Add text content": "Textinhalt hinzufügen", "Add User": "Benutzer hinzufügen", "Add User Group": "Benutzergruppe hinzufügen", - "Additional Config": "", - "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "", + "Additional Config": "Zusätzliche Konfiguration", + "Additional configuration options for marker. This should be a JSON string with key-value pairs. For example, '{\"key\": \"value\"}'. Supported keys include: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level": "Zusätzliche Konfigurationsoptionen für den Marker. Dies sollte eine JSON-Zeichenfolge mit Schlüssel-Wert-Paaren sein. Zum Beispiel '{\"key\": \"value\"}'. Unterstützte Schlüssel sind: disable_links, keep_pageheader_in_output, keep_pagefooter_in_output, filter_blank_pages, drop_repeated_text, layout_coverage_threshold, merge_threshold, height_tolerance, gap_threshold, image_threshold, min_line_length, level_count, default_level", "Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wird Änderungen universell auf alle Benutzer anwenden.", "admin": "Administrator", "Admin": "Administrator", @@ -82,17 +82,17 @@ "Allow Chat Deletion": "Löschen von Chats erlauben", "Allow Chat Edit": "Bearbeiten von Chats erlauben", "Allow Chat Export": "Erlaube Chat Export", - "Allow Chat Params": "", + "Allow Chat Params": "Parameter für Chats erlauben", "Allow Chat Share": "Erlaube Chat teilen", "Allow Chat System Prompt": "Erlaube Chat System Prompt", "Allow Chat Valves": "Erlaube Chat Valves", - "Allow Continue Response": "", - "Allow Delete Messages": "", + "Allow Continue Response": "Erlaube fortgesetzte Antwort", + "Allow Delete Messages": "Löschen von Nachrichten erlauben", "Allow File Upload": "Hochladen von Dateien erlauben", "Allow Multiple Models in Chat": "Multiple Modelle in Chat erlauben", "Allow non-local voices": "Nicht-lokale Stimmen erlauben", - "Allow Rate Response": "", - "Allow Regenerate Response": "", + "Allow Rate Response": "Erlaube Bewertung der Antwort", + "Allow Regenerate Response": "Antwort neu generieren erlauben", "Allow Speech to Text": "Sprache zu Text erlauben", "Allow Temporary Chat": "Temporäre Chats erlauben", "Allow Text to Speech": "Text zu Sprache erlauben", @@ -102,15 +102,15 @@ "Allowed File Extensions": "Erlaubte Dateiendungen", "Allowed file extensions for upload. Separate multiple extensions with commas. Leave empty for all file types.": "Erlaubte Dateiendungen für den Upload. Trennen Sie mehrere Erweiterungen mit Kommas. Leer lassen, um alle Dateiendungen 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 Token. 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.", + "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 Token. 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": "Benachrichtungston immer abspielen", "Amazing": "Fantastisch", "an assistant": "ein Assistent", - "An error occurred while fetching the explanation": "", - "Analytics": "", + "An error occurred while fetching the explanation": "Ein Fehler ist beim Abrufen der Erklärung aufgetreten", + "Analytics": "Analyse", "Analyzed": "Analysiert", "Analyzing...": "Analysiere...", "and": "und", @@ -119,14 +119,14 @@ "Android": "Android", "API": "API", "API Base URL": "API-Basis-URL", - "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "", - "API details for using a vision-language model in the picture description. This parameter is mutually exclusive with picture_description_local.": "", + "API Base URL for Datalab Marker service. Defaults to: https://www.datalab.to/api/v1/marker": "API-Basis-URL für den Datalab-Marker-Dienst. Standardwert: https://www.datalab.to/api/v1/marker", + "API details for using a vision-language model in the picture description. This parameter is mutually exclusive with picture_description_local.": "API-Details zur Verwendung eines Vision-Language-Modells in der Bildbeschreibung. Dieser Parameter schließt sich mit picture_description_local gegenseitig aus.", "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 is required": "", + "API Version is required": "API-Version ist erforderlich", "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\"", @@ -176,28 +176,28 @@ "Bad Response": "Schlechte Antwort", "Banners": "Banner", "Base Model (From)": "Basismodell (From)", - "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "", - "Bearer": "", + "Base Model List Cache speeds up access by fetching base models only at startup or on settings save—faster, but may not show recent base model changes.": "Die Cache-Liste der Basismodelle beschleunigt den Zugriff, indem Basismodelle nur beim Start oder beim Speichern der Einstellungen abgerufen werden – schneller, zeigt aber möglicherweise keine aktuellen Änderungen an Basismodellen an.", + "Bearer": "Bearer", "before": "bereits geteilt", "Being lazy": "Faulheit", "Beta": "Beta", "Bing Search V7 Endpoint": "Bing Search V7-Endpunkt", "Bing Search V7 Subscription Key": "Bing Search V7-Abonnement-Schlüssel", - "Bio": "", - "Birth Date": "", - "BM25 Weight": "", + "Bio": "Biografie", + "Birth Date": "Geburtsdatum", + "BM25 Weight": "BM25-Gewichtung", "Bocha Search API Key": "Bocha Search API-Schlüssel", "Bold": "Fett", "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 Token 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", "Bullet List": "Aufzählungsliste", - "Button ID": "", - "Button Label": "", - "Button Prompt": "", + "Button ID": "Schaltflächen-ID", + "Button Label": "Schaltflächenbeschriftung", + "Button Prompt": "Schaltflächen-Prompt", "By {{name}}": "Von {{name}}", "Bypass Embedding and Retrieval": "Embedding und Retrieval umgehen", - "Bypass Web Loader": "", + "Bypass Web Loader": "Web-Loader umgehen", "Cache Base Model List": "Basis Modell-Liste cachen", "Calendar": "Kalender", "Call": "Anrufen", @@ -209,9 +209,9 @@ "Capture Audio": "Audio aufzeichnen", "Certificate Path": "Zertifikatpfad", "Change Password": "Passwort ändern", - "Channel deleted successfully": "", + "Channel deleted successfully": "Kanal erfolgreich gelöscht", "Channel Name": "Kanalname", - "Channel updated successfully": "", + "Channel updated successfully": "Kanal erfolgreich aktualisiert", "Channels": "Kanäle", "Character": "Zeichen", "Character limit for autocomplete generation input": "Zeichenlimit für die Eingabe der automatischen Vervollständigung", @@ -220,10 +220,10 @@ "Chat Background Image": "Hintergrundbild des Chat-Fensters", "Chat Bubble UI": "Sprechblasen-Layout", "Chat Controls": "Chat-Steuerung", - "Chat Conversation": "", + "Chat Conversation": "Chat-Unterhaltung", "Chat direction": "Textrichtung", - "Chat ID": "", - "Chat moved successfully": "", + "Chat ID": "Chat-ID", + "Chat moved successfully": "Chat erfolgreich verschoben", "Chat Overview": "Chat-Übersicht", "Chat Permissions": "Chat-Berechtigungen", "Chat Tags Auto-Generation": "Automatische Generierung von Chat-Tags", @@ -258,11 +258,11 @@ "Clone of {{TITLE}}": "Klon von {{TITLE}}", "Close": "Schließen", "Close Banner": "Banner schließen", - "Close Configure Connection Modal": "", - "Close modal": "", - "Close settings modal": "", + "Close Configure Connection Modal": "Konfigurationsfenster für Verbindung schließen", + "Close modal": "Modal schließen", + "Close settings modal": "Einstellungsfenster schließen", "Close Sidebar": "Seitenleiste schließen", - "CMU ARCTIC speaker embedding name": "", + "CMU ARCTIC speaker embedding name": "Name des CMU ARCTIC Sprecher-Embeddings", "Code Block": "Codeblock", "Code execution": "Codeausführung", "Code Execution": "Codeausführung", @@ -281,13 +281,13 @@ "ComfyUI Base URL is required.": "ComfyUI-Basis-URL wird benötigt.", "ComfyUI Workflow": "ComfyUI-Workflow", "ComfyUI Workflow Nodes": "ComfyUI-Workflow-Knoten", - "Comma separated Node Ids (e.g. 1 or 1,2)": "", + "Comma separated Node Ids (e.g. 1 or 1,2)": "Durch Komma getrennte Knoten-IDs (z. B. 1 oder 1,2)", "Command": "Befehl", "Comment": "Kommentar", "Completions": "Vervollständigungen", - "Compress Images in Channels": "", + "Compress Images in Channels": "Bilder in Kanälen komprimieren", "Concurrent Requests": "Anzahl gleichzeitiger Anfragen", - "Config imported successfully": "", + "Config imported successfully": "Konfiguration erfolgreich importiert", "Configure": "Konfigurieren", "Confirm": "Bestätigen", "Confirm Password": "Passwort bestätigen", @@ -304,17 +304,17 @@ "Connections settings updated": "Verbindungseinstellungen aktualisiert", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Beschränkt den reasoning effort für Reasoning-Modelle. Nur anwendbar auf Reasoning-Modelle von spezifischen Anbietern, die den reasoning effort Parameter unterstützen.", "Contact Admin for WebUI Access": "Kontaktieren Sie den Administrator für den Zugriff auf die Weboberfläche", - "Content": "", - "Content Extraction Engine": "", + "Content": "Inhalt", + "Content Extraction Engine": "Inhalts-Extraktions-Engine", "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.": "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.", + "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.": "", - "Conversation saved successfully": "", + "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.", + "Conversation saved successfully": "Unterhaltung erfolgreich gespeichert", "Copied": "Kopiert", "Copied link to clipboard": "Link in Zwischenablage kopiert", "Copied shared chat URL to clipboard!": "Freigabelink in die Zwischenablage kopiert!", @@ -334,7 +334,7 @@ "Create Account": "Konto erstellen", "Create Admin Account": "Administrator-Account erstellen", "Create Channel": "Kanal erstellen", - "Create Folder": "", + "Create Folder": "Ordner erstellen", "Create Group": "Gruppe erstellen", "Create Knowledge": "Wissen erstellen", "Create new key": "Neuen Schlüssel erstellen", @@ -355,15 +355,15 @@ "Danger Zone": "Gefahrenzone", "Dark": "Dunkel", "Database": "Datenbank", - "Datalab Marker API": "", - "Datalab Marker API Key required.": "", + "Datalab Marker API": "Datalab Marker API", + "Datalab Marker API Key required.": "Datalab Marker API-Schlüssel erforderlich.", "DD/MM/YYYY": "TT/MM/JJJJ", "December": "Dezember", - "Deepgram": "", + "Deepgram": "Deepgram", "Default": "Standard", "Default (Open AI)": "Standard (Open AI)", "Default (SentenceTransformers)": "Standard (SentenceTransformers)", - "Default action buttons will be used.": "", + "Default action buttons will be used.": "Es werden Standard-Aktionsschaltflächen verwendet.", "Default description enabled": "Standard Beschreibung aktiviert", "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.": "Der Standardmodus funktioniert mit einer breiteren Auswahl von Modellen, indem er Werkzeuge einmal vor der Ausführung aufruft. Der native Modus nutzt die integrierten Tool-Aufrufmöglichkeiten des Modells, erfordert jedoch, dass das Modell diese Funktion von Natur aus unterstützt.", "Default Model": "Standardmodell", @@ -406,10 +406,10 @@ "Direct Connections": "Direktverbindungen", "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Direktverbindungen ermöglichen es Benutzern, sich mit ihren eigenen OpenAI-kompatiblen API-Endpunkten zu verbinden.", "Direct Tool Servers": "Direkt verbundene Werkzeug-Server", - "Directory selection was cancelled": "", + "Directory selection was cancelled": "Die Verzeichnisauswahl wurde abgebrochen", "Disable Code Interpreter": "Deaktivierte Code Interpreter", "Disable Image Extraction": "Deaktivierte Bildextraktion", - "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "", + "Disable image extraction from the PDF. If Use LLM is enabled, images will be automatically captioned. Defaults to False.": "Bildextraktion aus dem PDF deaktivieren. Wenn \"LLM verwenden\" aktiviert ist, werden Bilder automatisch beschriftet. Standardmäßig auf False gesetzt.", "Disabled": "Deaktiviert", "Discover a function": "Entdecken Sie weitere Funktionen", "Discover a model": "Entdecken Sie weitere Modelle", @@ -423,21 +423,21 @@ "Discover, download, and explore model presets": "Entdecken und beziehen Sie benutzerdefinierte Modellvorlagen", "Display": "Anzeigen", "Display Emoji in Call": "Emojis im Anruf anzeigen", - "Display Multi-model Responses in Tabs": "", + "Display Multi-model Responses in Tabs": "Multi-Modell-Antworten in Tabs anzeigen", "Display the username instead of You in the Chat": "Soll \"Sie\" durch Ihren Benutzernamen ersetzt werden?", "Displays citations in the response": "Zeigt Zitate in der Antwort an", - "Displays status updates (e.g., web search progress) in the response": "", + "Displays status updates (e.g., web search progress) in the response": "Zeigt Statusaktualisierungen (z. B. Fortschritt der Websuche) in der Antwort an", "Dive into knowledge": "Tauchen Sie in das Wissen ein", - "dlparse_v1": "", - "dlparse_v2": "", - "dlparse_v4": "", + "dlparse_v1": "dlparse_v1", + "dlparse_v2": "dlparse_v2", + "dlparse_v4": "dlparse_v4", "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", "Docling Server URL required.": "Docling Server URL erforderlich", "Document": "Dokument", - "Document Intelligence": "", - "Document Intelligence endpoint required.": "", + "Document Intelligence": "Dokumentenintelligenz", + "Document Intelligence endpoint required.": "Dokumentenintelligenz-Endpunkt 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.", @@ -468,7 +468,7 @@ "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)": "z. B. 3, 4, 5 (leer lassen für Standard)", - "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "", + "e.g., audio/wav,audio/mpeg,video/* (leave blank for defaults)": "z. B. audio/wav,audio/mpeg,video/* (leer lassen für Standardwerte)", "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)": "z. B. westus (leer lassen für eastus)", "Edit": "Bearbeiten", @@ -499,11 +499,11 @@ "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.": "", + "Enable Mirostat sampling for controlling perplexity.": "Mirostat-Sampling zur Kontrolle der Perplexity aktivieren.", "Enable New Sign Ups": "Registrierung erlauben", - "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "", + "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "Aktivieren, deaktivieren oder anpassen der vom Modell verwendeten Reasoning-Tags. \"Aktiviert\" verwendet Standard-Tags, \"Deaktiviert\" schaltet die Reasoning-Tags aus, und \"Benutzerdefiniert\" ermöglicht es Ihnen, eigene Start- und End-Tags festzulegen.", "Enabled": "Aktiviert", - "End Tag": "", + "End Tag": "End-Tag", "Endpoint URL": "Endpunkt-URL", "Enforce Temporary Chat": "Temporären Chat erzwingen", "Enhance": "Verbessern", @@ -527,14 +527,14 @@ "Enter Config in JSON format": "Konfiguration in JSON Format eingeben", "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 coordinates (e.g. 51.505, -0.09)": "Geben Sie Koordinaten ein (z. B. 51.505, -0.09)", - "Enter Datalab Marker API Base URL": "", - "Enter Datalab Marker API Key": "", + "Enter Datalab Marker API Base URL": "Geben Sie die Basis-URL für die Datalab Marker API ein", + "Enter Datalab Marker API Key": "Geben Sie den Datalab Marker API-Schlüssel ein", "Enter description": "Geben Sie eine Beschreibung ein", "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 Document Intelligence Endpoint": "Endpunkt für Document Intelligence eingeben", + "Enter Document Intelligence Key": "Schlüssel für Document Intelligence 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": "API-Schlüssel für externen Dokumenten-Loader eingeben", @@ -550,10 +550,10 @@ "Enter Google PSE API Key": "Geben Sie den Google PSE-API-Schlüssel ein", "Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein", "Enter hex color (e.g. #FF0000)": "Geben Sie eine Hex-Farbe ein (z. B. #FF0000)", - "Enter ID": "", + "Enter ID": "ID eingeben", "Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)", "Enter Jina API Key": "Geben Sie den Jina-API-Schlüssel ein", - "Enter JSON config (e.g., {\"disable_links\": true})": "", + "Enter JSON config (e.g., {\"disable_links\": true})": "Geben Sie die JSON-Konfiguration ein (z. B. {\"disable_links\": true})", "Enter Jupyter Password": "Geben Sie das Jupyter-Passwort ein", "Enter Jupyter Token": "Geben Sie den Jupyter-Token ein", "Enter Jupyter URL": "Geben Sie die Jupyter-URL ein", @@ -571,7 +571,7 @@ "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", + "Enter reasoning effort": "Geben Sie den Reasoning Effort ein", "Enter Sampler (e.g. Euler a)": "Geben Sie den Sampler ein (z. B. Euler a)", "Enter Scheduler (e.g. Karras)": "Geben Sie den Scheduler ein (z. B. Karras)", "Enter Score": "Punktzahl eingeben", @@ -613,7 +613,7 @@ "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 gender": "", + "Enter your gender": "Geben Sie Ihr Geschlecht ein", "Enter your message": "Geben Sie Ihre Nachricht ein", "Enter your name": "Geben Sie Ihren Namen ein", "Enter Your Name": "Geben Sie Ihren Namen ein", @@ -624,16 +624,16 @@ "Enter your webhook URL": "Geben Sie Ihre Webhook-URL ein", "Error": "Fehler", "ERROR": "FEHLER", - "Error accessing directory": "", + "Error accessing directory": "Fehler beim Zugriff auf das Verzeichnis", "Error accessing Google Drive: {{error}}": "Fehler beim Zugriff auf Google Drive: {{error}}", "Error accessing media devices.": "Fehler beim Zugreifen auf Mediengeräte", "Error starting recording.": "Fehler beim Starten der Aufnahme", - "Error unloading model: {{error}}": "", + "Error unloading model: {{error}}": "Fehler beim Entladen des Modells: {{error}}", "Error uploading file: {{error}}": "Fehler beim Hochladen der Datei: {{error}}", - "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "", - "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "", + "Error: A model with the ID '{{modelId}}' already exists. Please select a different ID to proceed.": "Fehler: Ein Modell mit der ID '{{modelId}}' existiert bereits. Bitte wählen Sie eine andere ID, um fortzufahren.", + "Error: Model ID cannot be empty. Please enter a valid ID to proceed.": "Fehler: Die Modell-ID darf nicht leer sein. Bitte geben Sie eine gültige ID ein, um fortzufahren.", "Evaluations": "Evaluationen", - "Everyone": "", + "Everyone": "Jeder", "Exa API Key": "Exa-API-Schlüssel", "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Beispiel: (&(objectClass=inetOrgPerson)(uid=%s))", "Example: ALL": "Beispiel: ALL", @@ -657,20 +657,20 @@ "Export Functions": "Funktionen exportieren", "Export Models": "Modelle exportieren", "Export Presets": "Voreinstellungen exportieren", - "Export Prompt Suggestions": "Prompt Vorschläge exportieren", + "Export Prompt Suggestions": "Prompt-Vorschläge exportieren", "Export Prompts": "Prompts exportieren", "Export to CSV": "Als CSV exportieren", "Export Tools": "Werkzeuge exportieren", - "Export Users": "", + "Export Users": "Benutzer exportieren", "External": "Extern", "External Document Loader URL required.": "URL für externen Dokumenten-Loader erforderlich.", "External Task Model": "Externes Aufgabenmodell", - "External Tools": "", + "External Tools": "Externe Werkzeuge", "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", - "Fade Effect for Streaming Text": "", + "Fade Effect for Streaming Text": "Überblendeffekt für Text-Streaming", "Failed to add file.": "Fehler beim Hinzufügen der Datei.", "Failed to connect to {{URL}} OpenAPI tool server": "Verbindung zum OpenAPI-Toolserver {{URL}} fehlgeschlagen", "Failed to copy link": "Fehler beim kopieren des Links", @@ -680,24 +680,24 @@ "Failed to extract content from the file.": "Fehler beim extrahieren des Inhalts aus der Datei.", "Failed to fetch models": "Fehler beim Abrufen der Modelle", "Failed to generate title": "Fehler beim generieren des Titels", - "Failed to load chat preview": "", + "Failed to load chat preview": "Chat-Vorschau konnte nicht geladen werden", "Failed to load file content.": "Fehler beim Laden des Dateiinhalts.", - "Failed to move chat": "", + "Failed to move chat": "Chat konnte nicht verschoben werden", "Failed to read clipboard contents": "Fehler beim Lesen des Inhalts der Zwischenablage.", "Failed to save connections": "Verbindungen konnten nicht gespeichert werden", "Failed to save conversation": "Unterhaltung konnte 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.", - "fast": "", + "fast": "schnell", "Features": "Funktionalitäten", "Features Permissions": "Funktionen-Berechtigungen", "February": "Februar", - "Feedback Details": "", + "Feedback Details": "Feedback-Details", "Feedback History": "Feedback-Verlauf", "Feedbacks": "Feedbacks", "Feel free to add specific details": "Fühlen Sie sich frei, spezifische Details hinzuzufügen", - "Female": "", + "Female": "Weiblich", "File": "Datei", "File added successfully.": "Datei erfolgreich hinzugefügt.", "File content updated successfully.": "Dateiinhalt erfolgreich aktualisiert.", @@ -715,7 +715,7 @@ "Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Fingerabdruck-Spoofing erkannt: Initialen können nicht als Avatar verwendet werden. Standard-Avatar wird verwendet.", "Firecrawl API Base URL": "Firecrawl API Basis-URL", "Firecrawl API Key": "Firecrawl API-Schlüssel", - "Floating Quick Actions": "", + "Floating Quick Actions": "Schnellaktionen", "Focus chat input": "Chat-Eingabe fokussieren", "Folder deleted successfully": "Ordner erfolgreich gelöscht", "Folder Name": "Ordner-Name", @@ -728,14 +728,14 @@ "Follow-Up Auto-Generation": "Auto-Generierung für Folgefragen", "Followed instructions perfectly": "Anweisungen perfekt befolgt", "Force OCR": "OCR erzwingen", - "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "", + "Force OCR on all pages of the PDF. This can lead to worse results if you have good text in your PDFs. Defaults to False.": "OCR für alle Seiten des PDF erzwingen. Dies kann zu schlechteren Ergebnissen führen, wenn bereits guter Text in Ihren PDFs vorhanden ist. Standardwert ist False.", "Forge new paths": "Neue Wege beschreiten", "Form": "Formular", - "Format Lines": "", - "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "", + "Format Lines": "Zeilen formatieren", + "Format the lines in the output. Defaults to False. If set to True, the lines will be formatted to detect inline math and styles.": "Zeilen in der Ausgabe formatieren. Standardwert ist False. Wenn auf True gesetzt, werden die Zeilen formatiert, um mathematische Formeln und Stile zu erkennen.", "Format your variables using brackets like this:": "Formatieren Sie Ihre Variablen mit Klammern, wie hier:", - "Formatting may be inconsistent from source.": "", - "Forwards system user OAuth access token to authenticate": "", + "Formatting may be inconsistent from source.": "Die Formatierung kann inkonsistent mit der Quelle sein.", + "Forwards system user OAuth access token to authenticate": "Leitet OAuth-Zugriffstoken des Systembenutzers zur Authentifizierung weiter", "Forwards system user session credentials to authenticate": "Leitet Anmeldedaten der user session zur Authentifizierung weiter", "Full Context Mode": "Voll-Kontext Modus", "Function": "Funktion", @@ -755,7 +755,7 @@ "Gemini": "Gemini", "Gemini API Config": "Gemini API-Konfiguration", "Gemini API Key is required.": "Gemini API-Schlüssel ist erforderlich.", - "Gender": "", + "Gender": "Geschlecht", "General": "Allgemein", "Generate": "Generieren", "Generate an image": "Bild erzeugen", @@ -763,7 +763,7 @@ "Generate prompt pair": "Prompt-Paar generieren", "Generating search query": "Suchanfrage wird erstellt", "Generating...": "Generiere...", - "Get information on {{name}} in the UI": "", + "Get information on {{name}} in the UI": "Informationen zu {{name}} in der Benutzeroberfläche abrufen", "Get started": "Loslegen", "Get started with {{WEBUI_NAME}}": "Loslegen mit {{WEBUI_NAME}}", "Global": "Global", @@ -771,7 +771,7 @@ "Google Drive": "Google Drive", "Google PSE API Key": "Google PSE-API-Schlüssel", "Google PSE Engine Id": "Google PSE-Engine-ID", - "Gravatar": "", + "Gravatar": "Gravatar", "Group": "Gruppe", "Group created successfully": "Gruppe erfolgreich erstellt", "Group deleted successfully": "Gruppe erfolgreich gelöscht", @@ -779,9 +779,9 @@ "Group Name": "Gruppenname", "Group updated successfully": "Gruppe erfolgreich aktualisiert", "Groups": "Gruppen", - "H1": "", - "H2": "", - "H3": "", + "H1": "Überschrift 1", + "H2": "Überschrift 2", + "H3": "Überschrift 3", "Haptic Feedback": "Haptisches Feedback", "Height": "Höhe", "Hello, {{name}}": "Hallo, {{name}}", @@ -792,7 +792,7 @@ "Hide": "Verbergen", "Hide from Sidebar": "Von Seitenleiste entfernen", "Hide Model": "Modell verstecken", - "High": "", + "High": "Hoch", "High Contrast Mode": "Modus für hohen Kontrast", "Home": "Startseite", "Host": "Host", @@ -827,27 +827,27 @@ "Import Models": "Modelle importieren", "Import Notes": "Notizen importieren", "Import Presets": "Voreinstellungen importieren", - "Import Prompt Suggestions": "Prompt Vorschläge importieren", + "Import Prompt Suggestions": "Prompt-Vorschläge importieren", "Import Prompts": "Prompts importieren", "Import Tools": "Werkzeuge importieren", "Important Update": "Wichtiges Update", - "In order to force OCR, performing OCR must be enabled.": "", + "In order to force OCR, performing OCR must be enabled.": "Um die OCR erzwingen zu können, muss die Durchführung der OCR aktiviert sein.", "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", "Includes SharePoint": "Enthält SharePoint", "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", - "Initials": "", + "Initials": "Initialen", "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": "Eingabe", "Input commands": "Eingabebefehle", - "Input Key (e.g. text, unet_name, steps)": "", + "Input Key (e.g. text, unet_name, steps)": "Eingabe Schlüssel (z.B. text, unet_name, steps)", "Input Variables": "Eingabe Variablen", "Insert": "Einfügen", - "Insert Follow-Up Prompt to Input": "", + "Insert Follow-Up Prompt to Input": "Folgefrage in Eingabe einfügen", "Insert Prompt as Rich Text": "Prompt als Rich Text einfügen", - "Insert Suggestion Prompt to Input": "", + "Insert Suggestion Prompt to Input": "Prompt-Vorschlag in Eingabe einfügen", "Install from Github URL": "Von GitHub-URL installieren", "Instant Auto-Send After Voice Transcription": "Spracherkennung direkt absenden", "Integration": "Integration", @@ -855,8 +855,8 @@ "Invalid file content": "Ungültiger Dateiinhalt", "Invalid file format.": "Ungültiges Dateiformat.", "Invalid JSON file": "Ungültige JSON Datei", - "Invalid JSON format for ComfyUI Workflow.": "", - "Invalid JSON format in Additional Config": "", + "Invalid JSON format for ComfyUI Workflow.": "Ungültiges JSON-Format für ComfyUI-Workflow.", + "Invalid JSON format in Additional Config": "Ungültiges JSON-Format in der zusätzlichen Konfiguration", "Invalid Tag": "Ungültiger Tag", "is typing...": "schreibt ...", "Italic": "Kursiv", @@ -872,34 +872,34 @@ "JWT Expiration": "JWT-Ablauf", "JWT Token": "JWT-Token", "Kagi Search API Key": "Kagi Search API-Schlüssel", - "Keep Follow-Up Prompts in Chat": "", + "Keep Follow-Up Prompts in Chat": "Folgefragen im Chat behalten", "Keep in Sidebar": "In Seitenleiste anzeigen", "Key": "Schlüssel", - "Key is required": "", + "Key is required": "Schlüssel ist erforderlich", "Keyboard shortcuts": "Tastenkombinationen", "Knowledge": "Wissen", "Knowledge Access": "Wissenszugriff", "Knowledge Base": "Wissensdatenbank", "Knowledge created successfully.": "Wissen erfolgreich erstellt.", "Knowledge deleted successfully.": "Wissen erfolgreich gelöscht.", - "Knowledge Description": "", - "Knowledge Name": "", + "Knowledge Description": "Wissensbeschreibung", + "Knowledge Name": "Wissensname", "Knowledge Public Sharing": "Öffentliche Freigabe von Wissen", "Knowledge reset successfully.": "Wissen erfolgreich zurückgesetzt.", "Knowledge updated successfully": "Wissen erfolgreich aktualisiert", - "Kokoro.js (Browser)": "", - "Kokoro.js Dtype": "", + "Kokoro.js (Browser)": "Kokoro.js (Browser)", + "Kokoro.js Dtype": "Kokoro.js Dtype", "Label": "Label", "Landing Page Mode": "Startseitenmodus", "Language": "Sprache", - "Language Locales": "", + "Language Locales": "Sprach-Locales", "Last Active": "Zuletzt aktiv", "Last Modified": "Zuletzt bearbeitet", "Last reply": "Letzte Antwort", "LDAP": "LDAP", "LDAP server updated": "LDAP-Server aktualisiert", "Leaderboard": "Bestenliste", - "Learn More": "", + "Learn More": "Mehr erfahren", "Learn more about OpenAPI tool servers.": "Erfahren Sie mehr über OpenAPI-Toolserver.", "Leave empty for no compression": "Leer lassen für keine Kompression", "Leave empty for unlimited": "Leer lassen für unbegrenzt", @@ -909,27 +909,27 @@ "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.", - "lexical": "", + "lexical": "lexikalisch", "License": "Lizenz", - "Lift List": "", + "Lift List": "Liste anheben", "Light": "Hell", "Listening...": "Höre zu...", "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "LLMs können Fehler machen. Überprüfen Sie wichtige Informationen.", - "Loader": "", + "Loader": "Loader", "Loading Kokoro.js...": "Lade Kokoro.js...", "Loading...": "Lade...", "Local": "Lokal", "Local Task Model": "Lokales Aufgabenmodell", "Location access not allowed": "Standortzugriff nicht erlaubt", "Lost": "Verloren", - "Low": "", + "Low": "Niedrig", "LTR": "LTR", "Made by Open WebUI Community": "Von der OpenWebUI-Community", "Make password visible in the user interface": "Passwort im Benutzerinterface sichtbar machen", "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.", - "Male": "", + "Male": "Männlich", "Manage": "Verwalten", "Manage Direct Connections": "Direkte Verbindungen verwalten", "Manage Models": "Modelle verwalten", @@ -938,16 +938,16 @@ "Manage OpenAI API Connections": "OpenAI-API-Verbindungen verwalten", "Manage Pipelines": "Pipelines verwalten", "Manage Tool Servers": "Tool Server verwalten", - "Manage your account information.": "", + "Manage your account information.": "Verwalten Sie Ihre Kontoinformationen.", "March": "März", "Markdown": "Markdown", - "Markdown (Header)": "", - "Max Speakers": "", + "Markdown (Header)": "Markdown (Überschrift)", + "Max Speakers": "Maximale Anzahl der Sprecher", "Max Upload Count": "Maximale Anzahl der Uploads", "Max Upload Size": "Maximale Uploadgröße", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Es können maximal 3 Modelle gleichzeitig heruntergeladen werden. Bitte versuchen Sie es später erneut.", "May": "Mai", - "Medium": "", + "Medium": "Mittel", "Memories accessible by LLMs will be shown here.": "Erinnerungen, die für Modelle zugänglich sind, werden hier angezeigt.", "Memory": "Erinnerungen", "Memory added successfully": "Erinnerung erfolgreich hinzugefügt", @@ -958,10 +958,10 @@ "Merged Response": "Zusammengeführte Antwort", "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": "Microsoft OneDrive", "Microsoft OneDrive (personal)": "Microsoft OneDrive (persönlich)", "Microsoft OneDrive (work/school)": "Microsoft OneDrive (Arbeit/Schule)", - "Mistral OCR": "", + "Mistral OCR": "Mistral OCR", "Mistral OCR API Key required.": "Mistral OCR API-Schlüssel erforderlich.", "Model": "Modell", "Model '{{modelName}}' has been successfully downloaded.": "Modell '{{modelName}}' wurde erfolgreich heruntergeladen.", @@ -980,15 +980,15 @@ "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", "Model ID": "Modell-ID", - "Model ID is required.": "", + "Model ID is required.": "Modell-ID ist erforderlich.", "Model IDs": "Modell-IDs", "Model Name": "Modell-Name", - "Model name already exists, please choose a different one": "", - "Model Name is required.": "", + "Model name already exists, please choose a different one": "Modellname existiert bereits, bitte wählen Sie einen anderen", + "Model Name is required.": "Modellname ist erforderlich.", "Model not selected": "Modell nicht ausgewählt", "Model Params": "Modell-Parameter", "Model Permissions": "Modellberechtigungen", - "Model unloaded successfully": "", + "Model unloaded successfully": "Modell erfolgreich entladen", "Model updated successfully": "Modell erfolgreich aktualisiert", "Model(s) do not support file upload": "Modell(e) unterstützen keinen Dateiupload", "Modelfile Content": "Modelfile-Inhalt", @@ -1000,9 +1000,9 @@ "More": "Mehr", "More Concise": "Kürzer", "More Options": "Mehr Optionen", - "Move": "", + "Move": "Verschieben", "Name": "Name", - "Name and ID are required, please fill them out": "", + "Name and ID are required, please fill them out": "Name und ID sind erforderlich, bitte füllen Sie diese aus", "Name your knowledge base": "Benennen Sie Ihren Wissensspeicher", "Native": "Nativ", "New Button": "Neuer Button", @@ -1014,7 +1014,7 @@ "New Tool": "Neues Werkzeug", "new-channel": "neuer-kanal", "Next message": "Nächste Nachricht", - "No authentication": "", + "No authentication": "Keine Authentifizierung", "No chats found": "Keine Chats gefunden", "No chats found for this user.": "Keine Chats für diesen Nutzer gefunden.", "No chats found.": "Keine Chats gefunden.", @@ -1022,7 +1022,7 @@ "No content found": "Kein Inhalt gefunden", "No content found in file.": "Kein Inhalt in Datei gefunden.", "No content to speak": "Kein Inhalt zum Vorlesen", - "No conversation to save": "", + "No conversation to save": "Keine Unterhaltung zum Speichern vorhanden", "No distance available": "Keine Distanz verfügbar", "No feedbacks found": "Kein Feedback gefunden", "No file selected": "Keine Datei ausgewählt", @@ -1039,12 +1039,12 @@ "No results found": "Keine Ergebnisse gefunden", "No search query generated": "Keine Suchanfrage generiert", "No source available": "Keine Quelle verfügbar", - "No sources found": "", + "No sources found": "Keine Quellen gefunden", "No suggestion prompts": "Keine Vorschlags-Prompts", "No users were found.": "Keine Benutzer gefunden.", "No valves": "Keine Valves", "No valves to update": "Keine Valves zum Aktualisieren", - "Node Ids": "", + "Node Ids": "Knoten-IDs", "None": "Nichts", "Not factually correct": "Nicht sachlich korrekt", "Not helpful": "Nicht hilfreich", @@ -1055,7 +1055,7 @@ "Notification Webhook": "Benachrichtigungs-Webhook", "Notifications": "Benachrichtigungen", "November": "November", - "OAuth": "", + "OAuth": "OAuth", "OAuth ID": "OAuth-ID", "October": "Oktober", "Off": "Aus", @@ -1080,14 +1080,14 @@ "Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Hoppla! Sie verwenden eine nicht unterstützte Methode (nur Frontend). Bitte stellen Sie die WebUI vom Backend bereit.", "Open file": "Datei öffnen", "Open in full screen": "Im Vollbildmodus öffnen", - "Open modal to configure connection": "", - "Open Modal To Manage Floating Quick Actions": "", + "Open modal to configure connection": "Modal öffnen, um die Verbindung zu konfigurieren", + "Open Modal To Manage Floating Quick Actions": "Modal öffnen, um Schnellaktionen zu verwalten", "Open new chat": "Neuen Chat öffnen", "Open Sidebar": "Seitenleiste öffnen", - "Open User Profile Menu": "", + "Open User Profile Menu": "Benutzerprofilmenü öffnen", "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI kann Werkzeuge verwenden, die von irgendeinem 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 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}})", "OpenAI": "OpenAI", "OpenAI API": "OpenAI-API", @@ -1095,9 +1095,9 @@ "OpenAI API Key is required.": "OpenAI-API-Schlüssel erforderlich.", "OpenAI API settings updated": "OpenAI-API-Einstellungen aktualisiert", "OpenAI URL/Key required.": "OpenAI-URL/Schlüssel erforderlich.", - "openapi.json URL or Path": "", - "Optional": "", - "Options for running a local vision-language model in the picture description. The parameters refer to a model hosted on Hugging Face. This parameter is mutually exclusive with picture_description_api.": "", + "openapi.json URL or Path": "openapi.json-URL oder Pfad", + "Optional": "Optional", + "Options for running a local vision-language model in the picture description. The parameters refer to a model hosted on Hugging Face. This parameter is mutually exclusive with picture_description_api.": "Optionen zum Ausführen eines lokalen Vision-Language-Modells in der Bildbeschreibung. Die Parameter beziehen sich auf ein Modell, das auf Hugging Face gehostet wird. Dieser Parameter ist gegenseitig ausschließend mit picture_description_api.", "or": "oder", "Ordered List": "Geordnete Liste", "Organize your users": "Organisieren Sie Ihre Benutzer", @@ -1107,35 +1107,35 @@ "Output Format": "Ausgabe Format", "Overview": "Übersicht", "page": "Seite", - "Paginate": "", + "Paginate": "Paginieren", "Parameters": "Parameter", "Password": "Passwort", - "Passwords do not match.": "", + "Passwords do not match.": "Die Passwörter stimmen nicht überein.", "Paste Large Text as File": "Großen Text als Datei einfügen", - "PDF Backend": "", + "PDF Backend": "PDF-Backend", "PDF document (.pdf)": "PDF-Dokument (.pdf)", "PDF Extract Images (OCR)": "Text von Bildern aus PDFs extrahieren (OCR)", "pending": "ausstehend", "Pending": "Ausstehend", "Pending User Overlay Content": "Inhalt des Overlays 'Ausstehende Kontoaktivierung'", "Pending User Overlay Title": "Titel des Overlays 'Ausstehende Kontoaktivierung'", - "Perform OCR": "", + "Perform OCR": "OCR durchführen", "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}}", "Permissions": "Berechtigungen", "Perplexity API Key": "Perplexity API-Schlüssel", "Perplexity Model": "Perplexity Modell", - "Perplexity Search Context Usage": "", + "Perplexity Search Context Usage": "Perplexity-Suchkontextnutzung", "Personalization": "Personalisierung", - "Picture Description API Config": "", - "Picture Description Local Config": "", - "Picture Description Mode": "", + "Picture Description API Config": "Konfiguration der Bildbeschreibungs-API", + "Picture Description Local Config": "Lokale Konfiguration der Bildbeschreibung", + "Picture Description Mode": "Modus der Bildbeschreibung", "Pin": "Anheften", "Pinned": "Angeheftet", "Pioneer insights": "Bahnbrechende Erkenntnisse", - "Pipe": "", - "Pipeline": "", + "Pipe": "Pipe", + "Pipeline": "Pipeline", "Pipeline deleted successfully": "Pipeline erfolgreich gelöscht", "Pipeline downloaded successfully": "Pipeline erfolgreich heruntergeladen", "Pipelines": "Pipelines", @@ -1149,7 +1149,7 @@ "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 message or attach a file.": "", + "Please enter a message or attach a file.": "Bitte geben Sie eine Nachricht ein oder hängen Sie eine Datei an.", "Please enter a prompt": "Bitte geben Sie einen Prompt ein", "Please enter a valid path": "Bitte geben Sie einen gültigen Pfad ein", "Please enter a valid URL": "Bitte geben Sie eine gültige URL ein", @@ -1157,10 +1157,10 @@ "Please select a model first.": "Bitte wählen Sie zuerst ein Modell aus.", "Please select a model.": "Bitte wählen Sie ein Modell aus.", "Please select a reason": "Bitte wählen Sie einen Grund aus", - "Please wait until all files are uploaded.": "", + "Please wait until all files are uploaded.": "Bitte warten Sie, bis alle Dateien hochgeladen sind.", "Port": "Port", "Positive attitude": "Positive Einstellung", - "Prefer not to say": "", + "Prefer not to say": "Keine Angabe", "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", "Prevent file creation": "Dateierstellung verhindern", @@ -1180,37 +1180,37 @@ "Prompts": "Prompts", "Prompts Access": "Prompt-Zugriff", "Prompts Public Sharing": "Öffentliche Freigabe von Prompts", - "Provider Type": "", + "Provider Type": "Anbietertyp", "Public": "Öffentlich", "Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com beziehen", "Pull a model from Ollama.com": "Modell von Ollama.com beziehen", - "pypdfium2": "", + "pypdfium2": "pypdfium2", "Query Generation Prompt": "Abfragegenerierungsprompt", - "Querying": "", - "Quick Actions": "", + "Querying": "Suche...", + "Quick Actions": "Schnellaktionen", "RAG Template": "RAG-Vorlage", "Rating": "Bewertung", "Re-rank models by topic similarity": "Modelle nach thematischer Ähnlichkeit neu ordnen", "Read": "Lesen", "Read Aloud": "Vorlesen", "Reason": "Nachdenken", - "Reasoning Effort": "Nachdenk-Aufwand", - "Reasoning Tags": "", + "Reasoning Effort": "Reasoning Effort", + "Reasoning Tags": "Reasoning Tags", "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.": "Verringert die Wahrscheinlichkeit, Unsinn zu generieren. Ein höherer Wert (z. B. 100) führt zu vielfältigeren Antworten, während ein niedrigerer Wert (z. B. 10) konservativer ist.", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Beziehen Sie sich auf sich selbst als \"Benutzer\" (z. B. \"Benutzer lernt Spanisch\")", "Refused when it shouldn't have": "Abgelehnt, obwohl es nicht hätte abgelehnt werden sollen", "Regenerate": "Neu generieren", - "Regenerate Menu": "", + "Regenerate Menu": "Menü neu generieren", "Reindex": "Neu indexieren", "Reindex Knowledge Base Vectors": "Vektoren der Wissensdatenbank neu indizieren", "Release Notes": "Veröffentlichungshinweise", "Releases": "Versionen", "Relevance": "Relevanz", "Relevance Threshold": "Relevanzschwelle", - "Remember Dismissal": "", + "Remember Dismissal": "Ablehnung merken", "Remove": "Entfernen", "Remove {{MODELID}} from list.": "{{MODELID}} von der Liste entfernen.", "Remove file": "Datei entfernen", @@ -1236,12 +1236,12 @@ "Response Watermark": "Antwort Wasserzeichen", "Result": "Ergebnis", "RESULT": "Ergebnis", - "Retrieval": "", + "Retrieval": "Abruf", "Retrieval Query Generation": "Abfragegenerierung", - "Retrieved {{count}} sources": "", - "Retrieved {{count}} sources_one": "", - "Retrieved {{count}} sources_other": "", - "Retrieved 1 source": "", + "Retrieved {{count}} sources": "{{count}} Quellen abgerufen", + "Retrieved {{count}} sources_one": "{{count}} Quelle abgerufen", + "Retrieved {{count}} sources_other": "{{count}} Quellen abgerufen", + "Retrieved 1 source": "1 Quelle abgerufen", "Rich Text Input for Chat": "Rich-Text-Eingabe für Chats", "RK": "RK", "Role": "Rolle", @@ -1255,25 +1255,25 @@ "Save & Create": "Erstellen", "Save & Update": "Aktualisieren", "Save As Copy": "Als Kopie speichern", - "Save Chat": "", + "Save Chat": "Chat speichern", "Save Tag": "Tag speichern", "Saved": "Gespeichert", "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": "Das direkte Speichern von Chats im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Chats zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Chats problemlos über das Backend wieder importieren.", - "Scroll On Branch Change": "", + "Scroll On Branch Change": "Beim Wechseln des Zweigs scrollen", "Search": "Suchen", "Search a model": "Modell suchen", - "Search all emojis": "", + "Search all emojis": "Alle Emojis durchsuchen", "Search Base": "Suchbasis", "Search Chats": "Chats durchsuchen...", "Search Collection": "Sammlung durchsuchen", "Search Filters": "Suchfilter", - "search for archived chats": "", - "search for folders": "", - "search for pinned chats": "", - "search for shared chats": "", + "search for archived chats": "nach archivierten Chats suchen", + "search for folders": "nach Ordnern suchen", + "search for pinned chats": "nach angehefteten Chats suchen", + "search for shared chats": "nach geteilten Chats suchen", "search for tags": "nach Tags suchen", "Search Functions": "Funktionen durchsuchen...", - "Search In Models": "", + "Search In Models": "In Modellen suchen...", "Search Knowledge": "Wissen durchsuchen", "Search Models": "Modelle durchsuchen...", "Search Notes": "Notizen durchsuchen...", @@ -1285,7 +1285,7 @@ "SearchApi API Key": "SearchApi-API-Schlüssel", "SearchApi Engine": "SearchApi-Engine", "Searched {{count}} sites": "{{count}} Websites durchsucht", - "Searching": "", + "Searching": "Suche...", "Searching \"{{searchQuery}}\"": "Suche nach \"{{searchQuery}}\"", "Searching Knowledge for \"{{searchQuery}}\"": "Suche im Wissen nach \"{{searchQuery}}\"", "Searching the web": "Durchsuche das Web...", @@ -1295,34 +1295,34 @@ "Seed": "Seed", "Select": "Auswählen", "Select a base model": "Wählen Sie ein Basismodell", - "Select a base model (e.g. llama3, gpt-4o)": "", - "Select a conversation to preview": "", + "Select a base model (e.g. llama3, gpt-4o)": "Wählen Sie ein Basismodell (z. B. llama3, gpt-4o)", + "Select a conversation to preview": "Wählen Sie eine Unterhaltung zur Vorschau aus", "Select a engine": "Wählen Sie eine Engine", "Select a function": "Wählen Sie eine Funktion", "Select a group": "Wählen Sie eine Gruppe", "Select a language": "Wählen Sie eine Sprache", - "Select a mode": "", + "Select a mode": "Wählen Sie einen Modus", "Select a model": "Wählen Sie ein Modell", - "Select a model (optional)": "", + "Select a model (optional)": "Wählen Sie ein Modell (optional)", "Select a pipeline": "Wählen Sie eine Pipeline", "Select a pipeline url": "Wählen Sie eine Pipeline-URL", - "Select a reranking model engine": "", + "Select a reranking model engine": "Wählen Sie eine Reranking-Modell-Engine", "Select a role": "Wählen Sie eine Rolle", "Select a theme": "Wählen Sie ein Design", "Select a tool": "Wählen Sie ein Werkzeug", "Select a voice": "Wählen Sie eine Stimme", "Select an auth method": "Wählen Sie eine Authentifizierungsmethode", - "Select an embedding model engine": "", - "Select an engine": "", + "Select an embedding model engine": "Wählen Sie eine Embedding-Modell-Engine aus", + "Select an engine": "Engine auswählen", "Select an Ollama instance": "Wählen Sie eine Ollama-Instanz", - "Select an output format": "", - "Select dtype": "", + "Select an output format": "Wählen Sie ein Ausgabeformat aus", + "Select dtype": "Wählen Sie dtype aus", "Select Engine": "Engine auswählen", - "Select how to split message text for TTS requests": "", + "Select how to split message text for TTS requests": "Wählen Sie, wie der Nachrichtentext für TTS-Anfragen aufgeteilt werden soll", "Select Knowledge": "Wissensdatenbank auswählen", "Select only one model to call": "Wählen Sie nur ein Modell zum Anrufen aus", "Selected model(s) do not support image inputs": "Ihre ausgewählten Modelle unterstützen keine Bildeingaben", - "semantic": "", + "semantic": "semantisch", "Send": "Senden", "Send a Message": "Eine Nachricht senden", "Send message": "Nachricht senden", @@ -1349,10 +1349,10 @@ "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, kann aber mehr CPU-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 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 festen Bias gegen Token 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 die Funktion 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 Token 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 die Funktion 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 verhindern.", + "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 Startwert für die Zufallszahlengenerierung fest. Wenn dieser auf eine bestimmte Zahl gesetzt wird, erzeugt das Modell für denselben Prompt immer denselben Text.", "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 Token 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", @@ -1360,14 +1360,14 @@ "Share": "Teilen", "Share Chat": "Chat teilen", "Share to Open WebUI Community": "Mit OpenWebUI Community teilen", - "Share your background and interests": "", + "Share your background and interests": "Teilen Sie Ihren Hintergrund und Ihre Interessen", "Sharing Permissions": "Berechtigungen teilen", - "Shortcuts with an asterisk (*) are situational and only active under specific conditions.": "", + "Shortcuts with an asterisk (*) are situational and only active under specific conditions.": "Tastenkürzel mit einem Sternchen (*) sind situationsbedingt und nur unter bestimmten Bedingungen aktiv.", "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": "Alle anzeigen", - "Show Formatting Toolbar": "", + "Show Formatting Toolbar": "Formatierungsleiste anzeigen", "Show image preview": "Bildvorschau anzeigen", "Show Less": "Weniger anzeigen", "Show Model": "Modell anzeigen", @@ -1380,18 +1380,18 @@ "Sign Out": "Abmelden", "Sign up": "Registrieren", "Sign up to {{WEBUI_NAME}}": "Bei {{WEBUI_NAME}} registrieren", - "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "", + "Significantly improves accuracy by using an LLM to enhance tables, forms, inline math, and layout detection. Will increase latency. Defaults to False.": "Verbessert die Genauigkeit erheblich, indem ein LLM zur Verbesserung von Tabellen, Formularen, mathematischen Formeln und Layout-Erkennung verwendet wird. Erhöht die Latenz. Standardmäßig deaktiviert.", "Signing in to {{WEBUI_NAME}}": "Wird bei {{WEBUI_NAME}} angemeldet", - "Sink List": "", + "Sink List": "Senkenliste", "sk-1234": "sk-1234", - "Skip Cache": "Cache überspringen", - "Skip the cache and re-run the inference. Defaults to False.": "", + "Skip Cache": "Cache ignorieren", + "Skip the cache and re-run the inference. Defaults to False.": "Cache ignorieren und die Inferenz erneut ausführen. Standardmäßig deaktiviert.", "Something went wrong :/": "Etwas ist schief gelaufen :/", - "Sonar": "", - "Sonar Deep Research": "", - "Sonar Pro": "", - "Sonar Reasoning": "", - "Sonar Reasoning Pro": "", + "Sonar": "Sonar", + "Sonar Deep Research": "Sonar Deep Research", + "Sonar Pro": "Sonar Pro", + "Sonar Reasoning": "Sonar Reasoning", + "Sonar Reasoning Pro": "Sonar Reasoning Pro", "Sougou Search API sID": "Sougou Search API sID", "Sougou Search API SK": "Sougou Search API SK", "Source": "Quelle", @@ -1399,36 +1399,36 @@ "Speech recognition error: {{error}}": "Spracherkennungsfehler: {{error}}", "Speech-to-Text": "Sprache-zu-Text", "Speech-to-Text Engine": "Sprache-zu-Text-Engine", - "standard": "", + "standard": "Standard", "Start of the channel": "Beginn des Kanals", - "Start Tag": "", - "Status Updates": "", + "Start Tag": "Start-Tag", + "Status Updates": "Statusaktualisierungen", "STDOUT/STDERR": "STDOUT/STDERR", "Stop": "Stop", "Stop Generating": "Generierung stoppen", "Stop Sequence": "Stop-Sequenz", "Stream Chat Response": "Chat-Antwort streamen", - "Stream Delta Chunk Size": "", + "Stream Delta Chunk Size": "Stream-Delta-Chunk-Größe", "Strikethrough": "Durchgestrichen", - "Strip Existing OCR": "", - "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "", + "Strip Existing OCR": "Vorhandenes OCR entfernen", + "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "Vorhandenen OCR-Text aus der PDF entfernen und OCR erneut ausführen. Wird ignoriert, wenn OCR erzwingen aktiviert ist. Standardmäßig deaktiviert.", "STT Model": "STT-Modell", "STT Settings": "STT-Einstellungen", "Stylized PDF Export": "Stilisierter PDF-Export", "Subtitle (e.g. about the Roman Empire)": "Untertitel (z. B. über das Römische Reich)", "Success": "Erfolg", - "Successfully imported {{userCount}} users.": "", + "Successfully imported {{userCount}} users.": "Erfolgreich {{userCount}} Benutzer importiert.", "Successfully updated.": "Erfolgreich aktualisiert.", "Suggest a change": "Eine Änderung vorschlagen", "Suggested": "Vorgeschlagen", "Support": "Unterstützung", "Support this plugin:": "Unterstützen Sie dieses Plugin:", - "Supported MIME Types": "", + "Supported MIME Types": "Unterstützte MIME-Typen", "Sync directory": "Verzeichnis synchronisieren", "System": "System", "System Instructions": "Systemanweisungen", "System Prompt": "System-Prompt", - "Table Mode": "", + "Table Mode": "Tabellenmodus", "Tags": "Tags", "Tags Generation": "Tag-Generierung", "Tags Generation Prompt": "Prompt für Tag-Generierung", @@ -1443,43 +1443,43 @@ "Tell us more:": "Erzählen Sie uns mehr:", "Temperature": "Temperatur", "Temporary Chat": "Temporäre Unterhaltung", - "Temporary Chat by Default": "", + "Temporary Chat by Default": "Temporäre Unterhaltung standardmäßig", "Text Splitter": "Text-Splitter", "Text-to-Speech": "Text-zu-Sprache", "Text-to-Speech Engine": "Text-zu-Sprache-Engine", "Thanks for your feedback!": "Danke für Ihr Feedback!", "The Application Account DN you bind with for search": "Der Anwendungs-Konto-DN, mit dem Sie für die Suche binden", "The base to search for users": "Die Basis, in der nach Benutzern gesucht wird", - "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.": "Die Batch-Größe bestimmt, wie viele Textanfragen gleichzeitig zusammen verarbeitet werden. Eine höhere Batch-Größe kann die Leistung und Geschwindigkeit des Modells erhöhen, erfordert jedoch auch mehr Speicher.", "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 format to return a response in. Format can be json or a JSON schema.": "", - "The height in pixels to compress images to. Leave empty for no compression.": "", - "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 format to return a response in. Format can be json or a JSON schema.": "Das Format, in dem eine Antwort zurückgegeben wird. Das Format kann JSON oder ein JSON-Schema sein.", + "The height in pixels to compress images to. Leave empty for no compression.": "Die Höhe in Pixeln, auf die Bilder komprimiert werden sollen. Leer lassen, um keine Komprimierung durchzuführen.", + "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.": "Die Sprache des Eingangsaudios. Die Angabe der Eingangssprache im ISO-639-1-Format (z. B. en) verbessert die Genauigkeit und verringert die Latenz. Leer lassen, um die Sprache automatisch zu erkennen.", "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.", "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 output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "", - "The passwords you entered don't quite match. Please double-check and try again.": "", - "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 stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "", + "The output format for the text. Can be 'json', 'markdown', or 'html'. Defaults to 'markdown'.": "Das Ausgabeformat für den Text. Kann 'json', 'markdown' oder 'html' sein. Standardmäßig auf 'markdown' gesetzt.", + "The passwords you entered don't quite match. Please double-check and try again.": "Die eingegebenen Passwörter stimmen nicht überein. Bitte überprüfen Sie sie erneut und versuchen Sie es noch einmal.", + "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 stream delta chunk size for the model. Increasing the chunk size will make the model respond with larger pieces of text at once.": "Die Stream-Delta-Chunk-Größe für das Modell. Eine Erhöhung der Chunk-Größe führt dazu, dass das Modell mit größeren Textabschnitten auf einmal antwortet.", "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.", - "The Weight of BM25 Hybrid Search. 0 more lexical, 1 more semantic. Default 0.5": "", - "The width in pixels to compress images to. Leave empty for no compression.": "", + "The Weight of BM25 Hybrid Search. 0 more lexical, 1 more semantic. Default 0.5": "Das Gewicht der BM25-Hybridsuche. 0 stärker lexikalisch, 1 stärker semantisch. Standardwert 0.5", + "The width in pixels to compress images to. Leave empty for no compression.": "Die Breite in Pixeln, auf die Bilder komprimiert werden sollen. Leer lassen, um keine Komprimierung durchzuführen.", "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 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 feature is experimental and may be modified or discontinued without notice.": "", + "This feature is experimental and may be modified or discontinued without notice.": "Diese Funktion ist experimentell und kann ohne Ankündigung geändert oder entfernt werden.", "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.": "Dieses Modell ist nicht öffentlich verfügbar. Bitte wählen Sie ein anderes Modell aus.", - "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "", + "This option controls how long the model will stay loaded into memory following the request (default: 5m)": "Diese Option steuert, wie lange das Modell nach der Anfrage im Speicher verbleibt (Standard: 5m)", "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 Token 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 enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "", + "This option enables or disables the use of the reasoning feature in Ollama, which allows the model to think before generating a response. When enabled, the model can take a moment to process the conversation context and generate a more thoughtful response.": "Diese Option aktiviert oder deaktiviert die Verwendung der Reasoning-Funktion in Ollama, wodurch das Modell vor der Erstellung einer Antwort nachdenken kann. Wenn aktiviert, kann das Modell einen Moment benötigen, um den Gesprächskontext zu verarbeiten und eine durchdachtere Antwort zu generieren.", "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 Token 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", @@ -1511,15 +1511,15 @@ "To learn more about available endpoints, visit our documentation.": "Um mehr über verfügbare Endpunkte zu erfahren, besuchen Sie unsere Dokumentation.", "To learn more about powerful prompt variables, click here": "Um mehr über Prompt-Variablen zu erfahren, klicken Sie hier", "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.": "Um Ihre Privatsphäre zu schützen, werden nur Bewertungen, Modell-IDs, Tags und Metadaten aus Ihrem Feedback geteilt – Ihre Chats bleiben privat und werden nicht einbezogen.", - "To select actions here, add them to the \"Functions\" workspace first.": "Um Aktionen auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.", - "To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.", - "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.", + "To select actions here, add them to the \"Functions\" workspace first.": "Um Aktionen auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich \"Funktionen\" hinzu.", + "To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich \"Funktionen\" hinzu.", + "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": "Suche umschalten", "Toggle settings": "Einstellungen umschalten", "Toggle sidebar": "Seitenleiste umschalten", - "Toggle whether current connection is active.": "", + "Toggle whether current connection is active.": "Aktuelle Verbindung umschalten.", "Token": "Token", "Too verbose": "Zu ausführlich", "Tool created successfully": "Werkzeug erfolgreich erstellt", @@ -1541,7 +1541,7 @@ "Transformers": "Transformers", "Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?", "Trust Proxy Environment": "Proxy-Umgebung vertrauen", - "Try Again": "", + "Try Again": "Erneut versuchen", "TTS Model": "TTS-Modell", "TTS Settings": "TTS-Einstellungen", "TTS Voice": "TTS-Stimme", @@ -1553,11 +1553,11 @@ "Unarchive All Archived Chats": "Alle archivierten Chats wiederherstellen", "Unarchive Chat": "Chat wiederherstellen", "Underline": "Unterstreichen", - "Unloads {{FROM_NOW}}": "", + "Unloads {{FROM_NOW}}": "Entlädt {{FROM_NOW}}", "Unlock mysteries": "Geheimnisse entsperren", "Unpin": "Lösen", "Unravel secrets": "Geheimnisse lüften", - "Unsupported file type.": "", + "Unsupported file type.": "Nicht unterstützter Dateityp.", "Untagged": "Ungetaggt", "Untitled": "Unbenannt", "Update": "Aktualisieren", @@ -1575,8 +1575,8 @@ "Upload files": "Dateien hochladen", "Upload Files": "Datei(en) hochladen", "Upload Pipeline": "Pipeline hochladen", - "Upload Progress": "Hochladefortschritt", - "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "", + "Upload Progress": "Fortschritt", + "Upload Progress: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)": "Fortschritt: {{uploadedFiles}}/{{totalFiles}} ({{percentage}}%)", "URL": "URL", "URL is required": "URL wird benötigt", "URL Mode": "URL-Modus", @@ -1594,11 +1594,11 @@ "User Webhooks": "Benutzer Webhooks", "Username": "Benutzername", "Users": "Benutzer", - "Using Entire Document": "", - "Using Focused Retrieval": "", + "Using Entire Document": "Verwendung des gesamten Dokuments", + "Using Focused Retrieval": "Verwendung relevanter Abschnitte", "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.", "Valid time units:": "Gültige Zeiteinheiten:", - "Validate certificate": "", + "Validate certificate": "Zertifikat überprüfen", "Valves": "Valves", "Valves updated": "Valves aktualisiert", "Valves updated successfully": "Valves erfolgreich aktualisiert", @@ -1611,7 +1611,7 @@ "View Result from **{{NAME}}**": "Ergebnis von **{{NAME}}** anzeigen", "Visibility": "Sichtbarkeit", "Vision": "Bilderkennung", - "vlm": "", + "vlm": "vlm", "Voice": "Stimme", "Voice Input": "Spracheingabe", "Voice mode": "Sprachmodus", @@ -1622,7 +1622,7 @@ "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-Loader-Engine", "Web Search": "Websuche", "Web Search Engine": "Suchmaschine", "Web Search in Chat": "Websuche im Chat", @@ -1638,13 +1638,13 @@ "What's New in": "Neuigkeiten von", "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.": "Wenn aktiviert, antwortet das Modell in Echtzeit auf jede Chat-Nachricht und generiert eine Antwort, sobald der Benutzer eine Nachricht sendet. Dieser Modus ist nützlich für Live-Chat-Anwendungen, kann jedoch die Leistung auf langsamerer Hardware beeinträchtigen.", "wherever you are": "wo immer Sie sind", - "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "", + "Whether to paginate the output. Each page will be separated by a horizontal rule and page number. Defaults to False.": "Ob die Ausgabe paginiert werden soll. Jede Seite wird durch eine horizontale Linie und eine Seitenzahl getrennt. Standardmäßig deaktiviert.", "Whisper (Local)": "Whisper (lokal)", "Why?": "Warum?", "Widescreen Mode": "Breitbildmodus", "Width": "Breite", "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.": "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.", + "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", @@ -1666,7 +1666,7 @@ "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.", - "Your Account": "", + "Your Account": "Ihr Konto", "Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "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", From ff8100dc6f0f015f79d969d720379fd1dea23e97 Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Fri, 12 Sep 2025 16:54:24 +0800 Subject: [PATCH 043/378] feat: improve zh-CN translation --- src/lib/i18n/locales/zh-CN/translation.json | 48 ++++++++++----------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 25e22da339..06ccabed15 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -96,7 +96,7 @@ "Allow Speech to Text": "允许语音转文本", "Allow Temporary Chat": "允许临时对话", "Allow Text to Speech": "允许文本转语音", - "Allow User Location": "允许获取您的位置", + "Allow User Location": "获取您的位置", "Allow Voice Interruption in Call": "允许语音通话时打断对话", "Allowed Endpoints": "允许的 API 端点", "Allowed File Extensions": "允许的文件扩展名", @@ -218,10 +218,10 @@ "Chart new frontiers": "开辟前沿", "Chat": "对话", "Chat Background Image": "对话背景图片", - "Chat Bubble UI": "对话气泡样式", + "Chat Bubble UI": "以聊天气泡的形式显示对话内容", "Chat Controls": "对话高级设置", "Chat Conversation": "对话内容", - "Chat direction": "对话样式方向", + "Chat direction": "对话显示方向", "Chat ID": "对话 ID", "Chat moved successfully": "移动对话成功", "Chat Overview": "对话概述", @@ -320,7 +320,7 @@ "Copied shared chat URL to clipboard!": "已复制对话的分享链接到剪贴板!", "Copied to clipboard": "已复制到剪贴板", "Copy": "复制", - "Copy Formatted Text": "复制格式化文本", + "Copy Formatted Text": "复制文本时包含特殊格式", "Copy last code block": "复制最后一个代码块中的代码", "Copy last response": "复制最后一次回复内容", "Copy link": "复制链接", @@ -422,7 +422,7 @@ "Discover, download, and explore custom tools": "发现、下载并探索更多自定义工具", "Discover, download, and explore model presets": "发现、下载并探索更多模型预设", "Display": "显示", - "Display Emoji in Call": "在通话中显示 Emoji 表情符号", + "Display Emoji in Call": "在通话中显示 Emoji", "Display Multi-model Responses in Tabs": "以标签页的形式展示多个模型的回答", "Display the username instead of You in the Chat": "在对话中显示用户名而不是“你”", "Displays citations in the response": "在回答中显示引用来源", @@ -498,7 +498,7 @@ "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),防止模型数据被移出内存。此选项将模型的工作集页面锁定在内存中,确保它们不会被交换到磁盘,避免页面错误,确保快速数据访问,从而维持性能。", "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) 加载模型数据。此选项将磁盘文件视作内存中的数据,允许系统使用磁盘存储作为内存的扩展,通过更快的数据访问来提高模型性能。然而,它可能无法在所有系统上正常工作,并且可能会消耗大量磁盘空间。", - "Enable Message Rating": "启用回复评价", + "Enable Message Rating": "启用模型回答结果评价", "Enable Mirostat sampling for controlling perplexity.": "启用 Mirostat 采样以控制困惑度", "Enable New Sign Ups": "允许新用户注册", "Enable, disable, or customize the reasoning tags used by the model. \"Enabled\" uses default tags, \"Disabled\" turns off reasoning tags, and \"Custom\" lets you specify your own start and end tags.": "启用、禁用或自定义模型使用的推理过程标签。“启用”表示使用默认标签,“禁用”将不识别推理标签,“自定义”可指定起始和闭合标签。", @@ -670,7 +670,7 @@ "External Web Loader URL": "外部网页加载器 URL", "External Web Search API Key": "外部联网搜索 API 密钥", "External Web Search URL": "外部联网搜索 URL", - "Fade Effect for Streaming Text": "流式文本淡入效果", + "Fade Effect for Streaming Text": "流式输出内容时启用动态渐显效果", "Failed to add file.": "添加文件失败", "Failed to connect to {{URL}} OpenAPI tool server": "连接到 {{URL}} OpenAPI 工具服务器失败", "Failed to copy link": "复制链接失败", @@ -806,15 +806,15 @@ "iframe Sandbox Allow Same Origin": "iframe 沙盒允许同源访问", "Ignite curiosity": "点燃求知", "Image": "图像生成", - "Image Compression": "图像压缩", - "Image Compression Height": "图片压缩高度", - "Image Compression Width": "图片压缩宽度", + "Image Compression": "压缩图像", + "Image Compression Height": "压缩图像高度", + "Image Compression Width": "压缩图像宽度", "Image Generation": "图像生成", "Image Generation (Experimental)": "图像生成(实验性)", "Image Generation Engine": "图像生成引擎", - "Image Max Compression Size": "图像压缩后最大分辨率", - "Image Max Compression Size height": "图片最大压缩尺寸高度", - "Image Max Compression Size width": "图片最大压缩尺寸宽度", + "Image Max Compression Size": "压缩图像后最大分辨率", + "Image Max Compression Size height": "压缩图像最大尺寸高度", + "Image Max Compression Size width": "压缩图像最大尺寸宽度", "Image Prompt Generation": "图像提示词生成", "Image Prompt Generation Prompt": "用于生成图像提示词的提示词", "Image Settings": "图像设置", @@ -846,7 +846,7 @@ "Input Variables": "插入变量", "Insert": "插入", "Insert Follow-Up Prompt to Input": "回填追问提示词到输入框", - "Insert Prompt as Rich Text": "以富文本的格式回填提示词", + "Insert Prompt as Rich Text": "以富文本的形式回填提示词", "Insert Suggestion Prompt to Input": "回填推荐提示词到输入框", "Install from Github URL": "从 Github URL 安装", "Instant Auto-Send After Voice Transcription": "语音转录文字后即时自动发送", @@ -1144,7 +1144,7 @@ "Pipelines Valves": "Pipeline 配置项", "Plain text (.md)": "纯文本文档(.md)", "Plain text (.txt)": "纯文本文档 (.txt)", - "Playground": "AI 对话游乐场", + "Playground": "AI 对话探索区", "Playwright Timeout (ms)": "Playwright 超时时间 (ms)", "Playwright WebSocket URL": "Playwright WebSocket URL", "Please carefully review the following warnings:": "请仔细阅读以下警告信息:", @@ -1172,7 +1172,7 @@ "Profile": "个人资料", "Prompt": "提示词", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "提示词(例如:给我讲一则罗马帝国的趣事)", - "Prompt Autocompletion": "提示词自动补全", + "Prompt Autocompletion": "自动补全提示词", "Prompt Content": "提示词内容", "Prompt created successfully": "提示词创建成功", "Prompt suggestions": "提示词建议", @@ -1203,7 +1203,7 @@ "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "使用\"User\" (用户) 来指代自己(例如:“User 正在学习西班牙语”)", "Refused when it shouldn't have": "拒绝了我的要求", "Regenerate": "重新生成", - "Regenerate Menu": "重新生成前显示菜单", + "Regenerate Menu": "显示重新生成选项菜单", "Reindex": "重建索引", "Reindex Knowledge Base Vectors": "重建知识库向量索引", "Release Notes": "更新日志", @@ -1257,10 +1257,10 @@ "Save Tag": "保存标签", "Saved": "已保存", "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": "我们不再支持将对话记录直接保存到浏览器的存储空间。请点击下面的按钮下载并删除您的对话记录。别担心,您可以轻松将对话记录重新导入到后台。", - "Scroll On Branch Change": "切换对话分支时滚动到最新回复", + "Scroll On Branch Change": "切换对话分支时滚动到最新回答", "Search": "搜索", "Search a model": "搜索模型", - "Search all emojis": "搜索 Emoji 表情符号", + "Search all emojis": "搜索 Emoji", "Search Base": "搜索库", "Search Chats": "搜索对话", "Search Collection": "搜索内容", @@ -1362,7 +1362,7 @@ "Sharing Permissions": "共享权限", "Shortcuts with an asterisk (*) are situational and only active under specific conditions.": "带星号 (*) 的快捷键受场景限制,仅在特定条件下生效。", "Show": "显示", - "Show \"What's New\" modal on login": "在登录时显示“更新内容”弹窗", + "Show \"What's New\" modal on login": "版本更新后首次登录时显示“新功能介绍”弹窗", "Show Admin Details in Account Pending Overlay": "在待激活用户的界面中显示管理员邮箱等详细信息", "Show All": "显示全部", "Show Formatting Toolbar": "显示文本格式工具栏", @@ -1412,7 +1412,7 @@ "Strip existing OCR text from the PDF and re-run OCR. Ignored if Force OCR is enabled. Defaults to False.": "清除 PDF 中现有的文字识别内容并重新识别文字。若启用“强制文字识别”则此设置无效。默认为关闭", "STT Model": "语音转文本模型", "STT Settings": "语音转文本设置", - "Stylized PDF Export": "风格化 PDF 导出", + "Stylized PDF Export": "美化 PDF 导出", "Subtitle (e.g. about the Roman Empire)": "副标题(例如:聊聊罗马帝国)", "Success": "成功", "Successfully imported {{userCount}} users.": "成功导入 {{userCount}} 个用户。", @@ -1469,7 +1469,7 @@ "Theme": "主题", "Thinking...": "正在思考...", "This action cannot be undone. Do you wish to continue?": "此操作无法撤销。您确认要继续吗?", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "此频道创建于{{createdAt}},这里是{{channelName}}频道的开始", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "欢迎来到 {{channelName}},本频道创建于 {{createdAt}}。", "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 feature is experimental and may be modified or discontinued without notice.": "此功能为实验性功能,可能会在未经通知的情况下修改或停用。", @@ -1512,7 +1512,7 @@ "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": "更新后弹窗提示更新内容", + "Toast notifications for new updates": "检测到新版本时显示更新通知", "Today": "今天", "Toggle search": "切换搜索", "Toggle settings": "切换设置", @@ -1623,7 +1623,7 @@ "Web Loader Engine": "网页加载引擎", "Web Search": "联网搜索", "Web Search Engine": "联网搜索引擎", - "Web Search in Chat": "对话中的联网搜索", + "Web Search in Chat": "在对话时进行联网搜索", "Web Search Query Generation": "联网搜索关键词生成", "Webhook URL": "Webhook URL", "WebUI Settings": "WebUI 设置", From cba2e44de4b067a56d2451dca78e8ddd43cf0696 Mon Sep 17 00:00:00 2001 From: Shirasawa <764798966@qq.com> Date: Fri, 12 Sep 2025 17:01:08 +0800 Subject: [PATCH 044/378] i18n: improve zh-TW translation --- src/lib/i18n/locales/zh-TW/translation.json | 32 ++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 220cedfb18..0a5b4c39bc 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -14,13 +14,13 @@ "{{COUNT}} extracted lines": "已擷取 {{COUNT}} 行", "{{COUNT}} hidden lines": "已隱藏 {{COUNT}} 行", "{{COUNT}} Replies": "{{COUNT}} 回覆", - "{{COUNT}} Sources": "", + "{{COUNT}} Sources": "{{COUNT}} 個來源", "{{COUNT}} words": "{{COUNT}} 個詞", "{{model}} download has been canceled": "已取消模型 {{model}} 的下載", "{{user}}'s Chats": "{{user}} 的對話", "{{webUIName}} Backend Required": "需要提供 {{webUIName}} 後端", "*Prompt node ID(s) are required for image generation": "* 圖片生成需要提示詞節點 ID", - "1 Source": "", + "1 Source": "1 個來源", "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": "使用者", @@ -31,7 +31,7 @@ "Accessible to all users": "所有使用者皆可存取", "Account": "帳號", "Account Activation Pending": "帳號待啟用", - "accurate": "", + "accurate": "準確", "Accurate information": "準確資訊", "Action": "操作", "Action not found": "找不到對應的操作項目", @@ -428,9 +428,9 @@ "Displays citations in the response": "在回應中顯示引用", "Displays status updates (e.g., web search progress) in the response": "在回應中顯示進度狀態(例如:網路搜尋進度)", "Dive into knowledge": "挖掘知識", - "dlparse_v1": "", - "dlparse_v2": "", - "dlparse_v4": "", + "dlparse_v1": "dlparse_v1", + "dlparse_v2": "dlparse_v2", + "dlparse_v4": "dlparse_v4", "Do not install functions from sources you do not fully trust.": "請勿從您無法完全信任的來源安裝函式。", "Do not install tools from sources you do not fully trust.": "請勿從您無法完全信任的來源安裝工具。", "Docling": "Docling", @@ -689,7 +689,7 @@ "Failed to save models configuration": "儲存模型設定失敗", "Failed to update settings": "更新設定失敗", "Failed to upload file.": "上傳檔案失敗。", - "fast": "", + "fast": "快速", "Features": "功能", "Features Permissions": "功能權限", "February": "2 月", @@ -831,7 +831,7 @@ "Import Prompts": "匯入提示詞", "Import Tools": "匯入工具", "Important Update": "重要更新", - "In order to force OCR, performing OCR must be enabled.": "", + "In order to force OCR, performing OCR must be enabled.": "要啟用「強制執行 OCR」,必須先啟用「執行 OCR」。", "Include": "包含", "Include `--api-auth` flag when running stable-diffusion-webui": "執行 stable-diffusion-webui 時包含 `--api-auth` 參數", "Include `--api` flag when running stable-diffusion-webui": "執行 stable-diffusion-webui 時包含 `--api` 參數", @@ -1112,14 +1112,14 @@ "Password": "密碼", "Passwords do not match.": "兩次輸入的密碼不一致。", "Paste Large Text as File": "將大型文字以檔案貼上", - "PDF Backend": "", + "PDF Backend": "PDF 解析器後端", "PDF document (.pdf)": "PDF 檔案 (.pdf)", "PDF Extract Images (OCR)": "PDF 影像擷取(OCR 光學文字辨識)", "pending": "待處理", "Pending": "待處理", "Pending User Overlay Content": "待處理的使用者訊息覆蓋層內容", "Pending User Overlay Title": "待處理的使用者訊息覆蓋層標題", - "Perform OCR": "", + "Perform OCR": "執行 OCR", "Permission denied when accessing media devices": "存取媒體裝置時權限遭拒", "Permission denied when accessing microphone": "存取麥克風時權限遭拒", "Permission denied when accessing microphone: {{error}}": "存取麥克風時權限遭拒:{{error}}", @@ -1135,7 +1135,7 @@ "Pinned": "已釘選", "Pioneer insights": "先驅見解", "Pipe": "Pipe", - "Pipeline": "", + "Pipeline": "管線", "Pipeline deleted successfully": "成功刪除管線", "Pipeline downloaded successfully": "成功下載管線", "Pipelines": "管線", @@ -1184,7 +1184,7 @@ "Public": "公開", "Pull \"{{searchValue}}\" from Ollama.com": "從 Ollama.com 下載「{{searchValue}}」", "Pull a model from Ollama.com": "從 Ollama.com 下載模型", - "pypdfium2": "", + "pypdfium2": "pypdfium2", "Query Generation Prompt": "查詢生成提示詞", "Querying": "查詢中", "Quick Actions": "快速操作", @@ -1237,7 +1237,7 @@ "RESULT": "結果", "Retrieval": "檢索", "Retrieval Query Generation": "檢索查詢生成", - "Retrieved {{count}} sources": "", + "Retrieved {{count}} sources": "搜尋到 {{count}} 個來源", "Retrieved {{count}} sources_other": "搜索到 {{count}} 個來源", "Retrieved 1 source": "搜索到 1 個來源", "Rich Text Input for Chat": "使用富文字輸入對話", @@ -1397,7 +1397,7 @@ "Speech recognition error: {{error}}": "語音辨識錯誤:{{error}}", "Speech-to-Text": "語音轉文字 (STT) ", "Speech-to-Text Engine": "語音轉文字 (STT) 引擎", - "standard": "", + "standard": "標準", "Start of the channel": "頻道起點", "Start Tag": "起始標籤", "Status Updates": "顯示實時回答狀態", @@ -1426,7 +1426,7 @@ "System": "系統", "System Instructions": "系統指令", "System Prompt": "系統提示詞", - "Table Mode": "", + "Table Mode": "表格模式", "Tags": "標籤", "Tags Generation": "標籤生成", "Tags Generation Prompt": "標籤生成提示詞", @@ -1609,7 +1609,7 @@ "View Result from **{{NAME}}**": "檢視來自 **{{NAME}}** 的結果", "Visibility": "可見度", "Vision": "視覺", - "vlm": "", + "vlm": "視覺語言模型(VLM)", "Voice": "語音", "Voice Input": "語音輸入", "Voice mode": "語音模式", From fbf9b3f1bbed4d29fd2b6ad6be4a708fdc9b219a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 12 Sep 2025 13:38:02 +0400 Subject: [PATCH 045/378] refac: styling --- src/lib/components/chat/MessageInput.svelte | 3 ++- src/lib/components/icons/Photo.svelte | 27 +++++++++++++-------- src/lib/components/icons/Terminal.svelte | 23 ++++++++++++++++++ 3 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 src/lib/components/icons/Terminal.svelte diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 046085beb3..e2fd03d8a5 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -70,6 +70,7 @@ import InputVariablesModal from './MessageInput/InputVariablesModal.svelte'; import Voice from '../icons/Voice.svelte'; import { getSessionUser } from '$lib/apis/auths'; + import Terminal from '../icons/Terminal.svelte'; const i18n = getContext('i18n'); export let onChange: Function = () => {}; @@ -1848,7 +1849,7 @@ ? 'm-1' : 'focus:outline-hidden rounded-full'}" > - + + > diff --git a/src/lib/components/icons/Terminal.svelte b/src/lib/components/icons/Terminal.svelte new file mode 100644 index 0000000000..be4c5d02d9 --- /dev/null +++ b/src/lib/components/icons/Terminal.svelte @@ -0,0 +1,23 @@ + + + From 042191372a52123fbe40c0d35fac946fc8a6c964 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 12 Sep 2025 13:49:53 +0400 Subject: [PATCH 046/378] refac: styling --- .../components/chat/Messages/Citations.svelte | 52 +++++++++++++++---- 1 file changed, 43 insertions(+), 9 deletions(-) diff --git a/src/lib/components/chat/Messages/Citations.svelte b/src/lib/components/chat/Messages/Citations.svelte index f234b52d4c..8360fb0c95 100644 --- a/src/lib/components/chat/Messages/Citations.svelte +++ b/src/lib/components/chat/Messages/Citations.svelte @@ -1,6 +1,6 @@ - @@ -111,7 +119,7 @@
{/if} + +{#if showCitations} +
+
+ {#each citations as citation, idx} + + {/each} +
+
+{/if} From a68342d5a887e36695e21f8c2aec593b159654ff Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 12 Sep 2025 15:05:37 +0400 Subject: [PATCH 047/378] refac: input menu --- src/lib/components/chat/MessageInput.svelte | 245 ++++++++------ .../chat/MessageInput/InputMenu.svelte | 194 +++++------ .../chat/MessageInput/OptionsMenu.svelte | 309 ++++++++++++++++++ src/lib/components/icons/Camera.svelte | 22 ++ src/lib/components/icons/Clip.svelte | 18 + src/lib/components/icons/Component.svelte | 22 ++ src/lib/components/icons/Grid.svelte | 22 ++ src/lib/components/icons/PlusAlt.svelte | 15 + src/lib/components/icons/Union.svelte | 22 ++ 9 files changed, 646 insertions(+), 223 deletions(-) create mode 100644 src/lib/components/chat/MessageInput/OptionsMenu.svelte create mode 100644 src/lib/components/icons/Camera.svelte create mode 100644 src/lib/components/icons/Clip.svelte create mode 100644 src/lib/components/icons/Component.svelte create mode 100644 src/lib/components/icons/Grid.svelte create mode 100644 src/lib/components/icons/PlusAlt.svelte create mode 100644 src/lib/components/icons/Union.svelte diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index e2fd03d8a5..7e1a765750 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -71,6 +71,9 @@ import Voice from '../icons/Voice.svelte'; import { getSessionUser } from '$lib/apis/auths'; import Terminal from '../icons/Terminal.svelte'; + import OptionsMenu from './MessageInput/OptionsMenu.svelte'; + import Component from '../icons/Component.svelte'; + import PlusAlt from '../icons/PlusAlt.svelte'; const i18n = getContext('i18n'); export let onChange: Function = () => {}; @@ -1657,7 +1660,6 @@
- +
- {#if $_user && (showToolsButton || (toggleFilters && toggleFilters.length > 0) || showWebSearchButton || showImageGenerationButton || showCodeInterpreterButton)} +
+ + { + await tick(); + + const chatInput = document.getElementById('chat-input'); + chatInput?.focus(); + }} + >
+ class="bg-transparent hover:bg-gray-100 text-gray-700 dark:text-white dark:hover:bg-gray-800 rounded-full size-8 flex justify-center items-center outline-hidden focus:outline-hidden" + > + +
+
-
- {#if showToolsButton} - + {#if showToolsButton} + + - - {/if} + + {toolServers.length + selectedToolIds.length} + + + + {/if} - {#each toggleFilters as filter, filterIdx (filter.id)} + {#each selectedFilterIds as filterId} + {@const filter = toggleFilters.find((f) => f.id === filterId)} + {#if filter} - - {/each} - {#if showWebSearchButton} - - {/if} + {/each} - {#if showImageGenerationButton} - - - - {/if} - {#if showCodeInterpreterButton} - - + + {/if} + + {#if imageGenerationEnabled} + + - - {/if} -
- {/if} + + + + + {/if} + + {#if codeInterpreterEnabled} + + + + {/if} +
diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte index 351c882388..6192e22180 100644 --- a/src/lib/components/chat/MessageInput/InputMenu.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu.svelte @@ -10,14 +10,10 @@ import Dropdown from '$lib/components/common/Dropdown.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; - import DocumentArrowUpSolid from '$lib/components/icons/DocumentArrowUpSolid.svelte'; - import Switch from '$lib/components/common/Switch.svelte'; - import GlobeAltSolid from '$lib/components/icons/GlobeAltSolid.svelte'; - import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte'; - import CameraSolid from '$lib/components/icons/CameraSolid.svelte'; - import PhotoSolid from '$lib/components/icons/PhotoSolid.svelte'; - import CommandLineSolid from '$lib/components/icons/CommandLineSolid.svelte'; - import Spinner from '$lib/components/common/Spinner.svelte'; + import DocumentArrowUp from '$lib/components/icons/DocumentArrowUp.svelte'; + import Camera from '$lib/components/icons/Camera.svelte'; + import Note from '$lib/components/icons/Note.svelte'; + import Clip from '$lib/components/icons/Clip.svelte'; const i18n = getContext('i18n'); @@ -35,34 +31,13 @@ export let onClose: Function; - let tools = null; let show = false; - let showAllTools = false; - - $: if (show) { - init(); - } let fileUploadEnabled = true; $: fileUploadEnabled = fileUploadCapableModels.length === selectedModels.length && ($user?.role === 'admin' || $user?.permissions?.chat?.file_upload); - const init = async () => { - await _tools.set(await getTools(localStorage.token)); - if ($_tools) { - tools = $_tools.reduce((a, tool, i, arr) => { - a[tool.id] = { - name: tool.name, - description: tool.meta.description, - enabled: selectedToolIds.includes(tool.id) - }; - return a; - }, {}); - selectedToolIds = selectedToolIds.filter((id) => $_tools?.some((tool) => tool.id === id)); - } - }; - const detectMobile = () => { const userAgent = navigator.userAgent || navigator.vendor || window.opera; return /android|iphone|ipad|ipod|windows phone/i.test(userAgent); @@ -101,86 +76,36 @@
- {#if tools} - {#if Object.keys(tools).length > 0} -
- {#each Object.keys(tools) as toolId} - - {/each} -
- {#if Object.keys(tools).length > 3} - - {/if} -
- {/if} - {:else} -
- -
- -
- {/if} +
{$i18n.t('Upload Files')}
+ + { @@ -208,7 +133,7 @@ } }} > - +
{$i18n.t('Capture')}
@@ -222,24 +147,63 @@ className="w-full" > { if (fileUploadEnabled) { - uploadFilesHandler(); + if (!detectMobile()) { + screenCaptureHandler(); + } else { + const cameraInputElement = document.getElementById('camera-input'); + + if (cameraInputElement) { + cameraInputElement.click(); + } + } } }} > - -
{$i18n.t('Upload Files')}
+ +
{$i18n.t('Attach Notes')}
+
+ + + + { + if (fileUploadEnabled) { + if (!detectMobile()) { + screenCaptureHandler(); + } else { + const cameraInputElement = document.getElementById('camera-input'); + + if (cameraInputElement) { + cameraInputElement.click(); + } + } + } + }} + > + +
{$i18n.t('Attach Knowledge')}
{#if fileUploadEnabled} {#if $config?.features?.enable_google_drive_integration} { uploadGoogleDriveHandler(); }} @@ -277,7 +241,7 @@ {#if $config?.features?.enable_onedrive_integration} { uploadOneDriveHandler('personal'); }} @@ -381,7 +345,7 @@
{$i18n.t('Microsoft OneDrive (personal)')}
{ uploadOneDriveHandler('organizations'); }} diff --git a/src/lib/components/chat/MessageInput/OptionsMenu.svelte b/src/lib/components/chat/MessageInput/OptionsMenu.svelte new file mode 100644 index 0000000000..d1928c913c --- /dev/null +++ b/src/lib/components/chat/MessageInput/OptionsMenu.svelte @@ -0,0 +1,309 @@ + + + { + if (e.detail === false) { + onClose(); + } + }} +> + + + + +
+ + {#if toggleFilters && toggleFilters.length > 0} + {#each toggleFilters as filter, filterIdx (filter.id)} + + + + {/each} + {/if} + + {#if showWebSearchButton} + + + + {/if} + + {#if showImageGenerationButton} + + + + {/if} + + {#if showCodeInterpreterButton} + + + + {/if} + + {#if tools} +
+ + {#if Object.keys(tools).length > 0} +
+ {#each Object.keys(tools) as toolId} + + {/each} +
+ {#if Object.keys(tools).length > 3} + + {/if} + {/if} + {:else} +
+ +
+ {/if} +
+
+
diff --git a/src/lib/components/icons/Camera.svelte b/src/lib/components/icons/Camera.svelte new file mode 100644 index 0000000000..a553475fa1 --- /dev/null +++ b/src/lib/components/icons/Camera.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/icons/Clip.svelte b/src/lib/components/icons/Clip.svelte new file mode 100644 index 0000000000..d3c89be163 --- /dev/null +++ b/src/lib/components/icons/Clip.svelte @@ -0,0 +1,18 @@ + + + diff --git a/src/lib/components/icons/Component.svelte b/src/lib/components/icons/Component.svelte new file mode 100644 index 0000000000..cafc7058ec --- /dev/null +++ b/src/lib/components/icons/Component.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/icons/Grid.svelte b/src/lib/components/icons/Grid.svelte new file mode 100644 index 0000000000..8846f03107 --- /dev/null +++ b/src/lib/components/icons/Grid.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/icons/PlusAlt.svelte b/src/lib/components/icons/PlusAlt.svelte new file mode 100644 index 0000000000..895fe0b763 --- /dev/null +++ b/src/lib/components/icons/PlusAlt.svelte @@ -0,0 +1,15 @@ + + + diff --git a/src/lib/components/icons/Union.svelte b/src/lib/components/icons/Union.svelte new file mode 100644 index 0000000000..71953329f4 --- /dev/null +++ b/src/lib/components/icons/Union.svelte @@ -0,0 +1,22 @@ + + + From ca853ca4656180487afcd84230d214f91db52533 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 12 Sep 2025 15:06:11 +0400 Subject: [PATCH 048/378] refac/enh: sort toggle filter by default --- src/lib/components/chat/MessageInput/OptionsMenu.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/chat/MessageInput/OptionsMenu.svelte b/src/lib/components/chat/MessageInput/OptionsMenu.svelte index d1928c913c..cd9587a9ee 100644 --- a/src/lib/components/chat/MessageInput/OptionsMenu.svelte +++ b/src/lib/components/chat/MessageInput/OptionsMenu.svelte @@ -88,7 +88,7 @@ transition={flyAndScale} > {#if toggleFilters && toggleFilters.length > 0} - {#each toggleFilters as filter, filterIdx (filter.id)} + {#each toggleFilters.sort( (a, b) => a.name.localeCompare( b.name, undefined, { sensitivity: 'base' } ) ) as filter, filterIdx (filter.id)} @@ -1770,7 +1770,7 @@ {#each selectedFilterIds as filterId} {@const filter = toggleFilters.find((f) => f.id === filterId)} {#if filter} - + + {:else} +
+ +
+ {/if} + + {#if showAllTools} + {#each Object.keys(tools) as toolId} + + {/each} + {:else} + {#if toggleFilters && toggleFilters.length > 0} + {#each toggleFilters.sort( (a, b) => a.name.localeCompare( b.name, undefined, { sensitivity: 'base' } ) ) as filter, filterIdx (filter.id)} + + + + {/each} + {/if} + + {#if showWebSearchButton} + + + {/if} + + {#if showImageGenerationButton} + + + + {/if} + + {#if showCodeInterpreterButton} + + - {/each} - {/if} - - {#if showWebSearchButton} - - - - {/if} - - {#if showImageGenerationButton} - - - - {/if} - - {#if showCodeInterpreterButton} - - - - {/if} - - {#if tools} -
- - {#if Object.keys(tools).length > 0} -
- {#each Object.keys(tools) as toolId} - - {/each} -
- {#if Object.keys(tools).length > 3} - - {/if} {/if} - {:else} -
- -
{/if}
From 136972ccf077998ab33e9b8d734a4ebf3c15fcdc Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 12 Sep 2025 15:54:42 +0400 Subject: [PATCH 051/378] refac: styling --- .../chat/MessageInput/InputMenu.svelte | 16 ++++++------- .../chat/MessageInput/OptionsMenu.svelte | 12 +++++----- src/lib/components/common/Switch.svelte | 4 ++-- src/lib/components/icons/Keyboard.svelte | 12 ++++------ .../components/layout/Sidebar/ChatMenu.svelte | 24 +++++++++---------- .../components/layout/Sidebar/UserMenu.svelte | 20 ++++++++-------- 6 files changed, 43 insertions(+), 45 deletions(-) diff --git a/src/lib/components/chat/MessageInput/InputMenu.svelte b/src/lib/components/chat/MessageInput/InputMenu.svelte index 6192e22180..2a58fffa9d 100644 --- a/src/lib/components/chat/MessageInput/InputMenu.svelte +++ b/src/lib/components/chat/MessageInput/InputMenu.svelte @@ -92,7 +92,7 @@ className="w-full" > { @@ -116,7 +116,7 @@ className="w-full" > { @@ -147,7 +147,7 @@ className="w-full" > { @@ -178,7 +178,7 @@ className="w-full" > { @@ -203,7 +203,7 @@ {#if fileUploadEnabled} {#if $config?.features?.enable_google_drive_integration} { uploadGoogleDriveHandler(); }} @@ -241,7 +241,7 @@ {#if $config?.features?.enable_onedrive_integration} { uploadOneDriveHandler('personal'); }} @@ -345,7 +345,7 @@
{$i18n.t('Microsoft OneDrive (personal)')}
{ uploadOneDriveHandler('organizations'); }} diff --git a/src/lib/components/chat/MessageInput/OptionsMenu.svelte b/src/lib/components/chat/MessageInput/OptionsMenu.svelte index f650dddf9a..3345e96687 100644 --- a/src/lib/components/chat/MessageInput/OptionsMenu.svelte +++ b/src/lib/components/chat/MessageInput/OptionsMenu.svelte @@ -93,7 +93,7 @@ > {#if tools} + {/if} + + {/if} {:else}
From 6b69c4da0fb9329ccf7024483960e070cf52ccab Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 12 Sep 2025 20:31:57 +0400 Subject: [PATCH 054/378] refac/enh: commands ui --- package-lock.json | 12 +- package.json | 1 + .../components/channel/MessageInput.svelte | 49 +- src/lib/components/chat/Chat.svelte | 1 - src/lib/components/chat/MessageInput.svelte | 699 +++++++++--------- .../MessageInput/CommandSuggestionList.svelte | 163 ++++ .../MessageInput/Commands/Knowledge.svelte | 341 ++++----- .../chat/MessageInput/Commands/Models.svelte | 117 +-- .../chat/MessageInput/Commands/Prompts.svelte | 153 ++-- src/lib/components/chat/Navbar.svelte | 45 +- src/lib/components/common/FileItem.svelte | 34 +- .../components/common/RichTextInput.svelte | 44 +- .../RichTextInput/FormattingButtons.svelte | 2 +- .../common/RichTextInput/MentionList.svelte | 85 +++ .../common/RichTextInput/commands.ts | 26 + .../common/RichTextInput/suggestions.ts | 69 ++ src/lib/components/icons/Database.svelte | 16 + src/lib/components/icons/DocumentPage.svelte | 26 + src/lib/components/icons/Youtube.svelte | 16 + 19 files changed, 1052 insertions(+), 847 deletions(-) create mode 100644 src/lib/components/chat/MessageInput/CommandSuggestionList.svelte create mode 100644 src/lib/components/common/RichTextInput/MentionList.svelte create mode 100644 src/lib/components/common/RichTextInput/commands.ts create mode 100644 src/lib/components/common/RichTextInput/suggestions.ts create mode 100644 src/lib/components/icons/Database.svelte create mode 100644 src/lib/components/icons/DocumentPage.svelte create mode 100644 src/lib/components/icons/Youtube.svelte diff --git a/package-lock.json b/package-lock.json index 48122812b8..d2fd62c282 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,6 +37,7 @@ "@tiptap/extensions": "^3.0.7", "@tiptap/pm": "^3.0.7", "@tiptap/starter-kit": "^3.0.7", + "@tiptap/suggestion": "^3.4.2", "@xyflow/svelte": "^0.1.19", "async": "^3.2.5", "bits-ui": "^0.21.15", @@ -3856,18 +3857,17 @@ } }, "node_modules/@tiptap/suggestion": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.0.9.tgz", - "integrity": "sha512-irthqfUybezo3IwR6AXvyyTOtkzwfvvst58VXZtTnR1nN6NEcrs3TQoY3bGKGbN83bdiquKh6aU2nLnZfAhoXg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@tiptap/suggestion/-/suggestion-3.4.2.tgz", + "integrity": "sha512-sljtfiDtdAsbPOwrXrFGf64D6sXUjeU3Iz5v3TvN7TVJKozkZ/gaMkPRl+WC1CGwC6BnzQVDBEEa1e+aApV0mA==", "license": "MIT", - "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "^3.0.9", - "@tiptap/pm": "^3.0.9" + "@tiptap/core": "^3.4.2", + "@tiptap/pm": "^3.4.2" } }, "node_modules/@tiptap/y-tiptap": { diff --git a/package.json b/package.json index 054baf39c6..19c897cb48 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "@tiptap/extensions": "^3.0.7", "@tiptap/pm": "^3.0.7", "@tiptap/starter-kit": "^3.0.7", + "@tiptap/suggestion": "^3.4.2", "@xyflow/svelte": "^0.1.19", "async": "^3.2.5", "bits-ui": "^0.21.15", diff --git a/src/lib/components/channel/MessageInput.svelte b/src/lib/components/channel/MessageInput.svelte index fc85ea2aa1..c7ca93b902 100644 --- a/src/lib/components/channel/MessageInput.svelte +++ b/src/lib/components/channel/MessageInput.svelte @@ -753,53 +753,10 @@ e = e.detail.event; const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac - const commandsContainerElement = document.getElementById('commands-container'); + const suggestionsContainerElement = + document.getElementById('suggestions-container'); - if (commandsContainerElement) { - if (commandsContainerElement && e.key === 'ArrowUp') { - e.preventDefault(); - commandsElement.selectUp(); - - const commandOptionButton = [ - ...document.getElementsByClassName('selected-command-option-button') - ]?.at(-1); - commandOptionButton.scrollIntoView({ block: 'center' }); - } - - if (commandsContainerElement && e.key === 'ArrowDown') { - e.preventDefault(); - commandsElement.selectDown(); - - const commandOptionButton = [ - ...document.getElementsByClassName('selected-command-option-button') - ]?.at(-1); - commandOptionButton.scrollIntoView({ block: 'center' }); - } - - if (commandsContainerElement && e.key === 'Tab') { - e.preventDefault(); - - const commandOptionButton = [ - ...document.getElementsByClassName('selected-command-option-button') - ]?.at(-1); - - commandOptionButton?.click(); - } - - if (commandsContainerElement && e.key === 'Enter') { - e.preventDefault(); - - const commandOptionButton = [ - ...document.getElementsByClassName('selected-command-option-button') - ]?.at(-1); - - if (commandOptionButton) { - commandOptionButton?.click(); - } else { - document.getElementById('send-message-button')?.click(); - } - } - } else { + if (!suggestionsContainerElement) { if ( !$mobile || !( diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index faf4b30861..fd64c0226a 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -2259,7 +2259,6 @@ bind:selectedModels shareEnabled={!!history.currentId} {initNewChat} - showBanners={!showCommands} archiveChatHandler={() => {}} {moveChatHandler} onSaveTempChat={async () => { diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 28128d5433..d24c5a5d2b 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -76,6 +76,10 @@ import { KokoroWorker } from '$lib/workers/KokoroWorker'; + import { getSuggestionRenderer } from '../common/RichTextInput/suggestions'; + import MentionList from '../common/RichTextInput/MentionList.svelte'; + import CommandSuggestionList from './MessageInput/CommandSuggestionList.svelte'; + const i18n = getContext('i18n'); export let onChange: Function = () => {}; @@ -428,9 +432,9 @@ }; let command = ''; - export let showCommands = false; $: showCommands = ['/', '#', '@'].includes(command?.charAt(0)) || '\\#' === command?.slice(0, 2); + let suggestions = null; let showTools = false; @@ -845,6 +849,115 @@ }; onMount(async () => { + suggestions = [ + { + char: '@', + render: getSuggestionRenderer(CommandSuggestionList, { + i18n, + onSelect: (e) => { + const { type, data } = e; + + if (type === 'model') { + atSelectedModel = data; + } + + document.getElementById('chat-input')?.focus(); + }, + + insertTextHandler: insertTextAtCursor, + onUpload: (e) => { + const { type, data } = e; + + if (type === 'file') { + if (files.find((f) => f.id === data.id)) { + return; + } + files = [ + ...files, + { + ...data, + status: 'processed' + } + ]; + } else { + dispatch('upload', e); + } + } + }) + }, + { + char: '/', + render: getSuggestionRenderer(CommandSuggestionList, { + i18n, + onSelect: (e) => { + const { type, data } = e; + + if (type === 'model') { + atSelectedModel = data; + } + + document.getElementById('chat-input')?.focus(); + }, + + insertTextHandler: insertTextAtCursor, + onUpload: (e) => { + const { type, data } = e; + + if (type === 'file') { + if (files.find((f) => f.id === data.id)) { + return; + } + files = [ + ...files, + { + ...data, + status: 'processed' + } + ]; + } else { + dispatch('upload', e); + } + } + }) + }, + { + char: '#', + render: getSuggestionRenderer(CommandSuggestionList, { + i18n, + onSelect: (e) => { + const { type, data } = e; + + if (type === 'model') { + atSelectedModel = data; + } + + document.getElementById('chat-input')?.focus(); + }, + + insertTextHandler: insertTextAtCursor, + onUpload: (e) => { + const { type, data } = e; + + if (type === 'file') { + if (files.find((f) => f.id === data.id)) { + return; + } + files = [ + ...files, + { + ...data, + status: 'processed' + } + ]; + } else { + dispatch('upload', e); + } + } + }) + } + ]; + + console.log(suggestions); loaded = true; window.setTimeout(() => { @@ -929,78 +1042,6 @@
{/if}
- -
- {#if atSelectedModel !== undefined} -
-
-
- model profile model.id === atSelectedModel.id)?.info?.meta - ?.profile_image_url ?? - ($i18n.language === 'dg-DG' - ? `${WEBUI_BASE_URL}/doge.png` - : `${WEBUI_BASE_URL}/static/favicon.png`)} - /> -
- {$i18n.t('Talk to model')}: - {atSelectedModel.name} -
-
-
- -
-
-
- {/if} - - { - const { type, data } = e; - - if (type === 'file') { - if (files.find((f) => f.id === data.id)) { - return; - } - files = [ - ...files, - { - ...data, - status: 'processed' - } - ]; - } else { - dispatch('upload', e); - } - }} - onSelect={(e) => { - const { type, data } = e; - - if (type === 'model') { - atSelectedModel = data; - } - - document.getElementById('chat-input')?.focus(); - }} - /> -
@@ -1066,6 +1107,38 @@ class="flex-1 flex flex-col relative w-full shadow-lg rounded-3xl border border-gray-50 dark:border-gray-850 hover:border-gray-100 focus-within:border-gray-100 hover:dark:border-gray-800 focus-within:dark:border-gray-800 transition px-1 bg-white/90 dark:bg-gray-400/5 dark:text-gray-100" dir={$settings?.chatDirection ?? 'auto'} > + {#if atSelectedModel !== undefined} +
+
+
+ model profile model.id === atSelectedModel.id)?.info?.meta + ?.profile_image_url ?? + ($i18n.language === 'dg-DG' + ? `${WEBUI_BASE_URL}/doge.png` + : `${WEBUI_BASE_URL}/static/favicon.png`)} + /> +
+ {atSelectedModel.name} +
+
+
+ +
+
+
+ {/if} + {#if files.length > 0}
{#each files as file, fileIdx} @@ -1075,7 +1148,7 @@ {#if atSelectedModel ? visionCapableModels.length === 0 : selectedModels.length !== visionCapableModels.length} { // Remove from UI state @@ -1161,250 +1235,201 @@ class="scrollbar-hidden rtl:text-right ltr:text-left bg-transparent dark:text-gray-100 outline-hidden w-full pt-2.5 pb-[5px] px-1 resize-none h-fit max-h-80 overflow-auto" id="chat-input-container" > - {#key $settings?.showFormattingToolbar ?? false} - { - prompt = e.md; - command = getCommand(); - }} - json={true} - messageInput={true} - showFormattingToolbar={$settings?.showFormattingToolbar ?? false} - floatingMenuPlacement={'top-start'} - insertPromptAsRichText={$settings?.insertPromptAsRichText ?? false} - shiftEnter={!($settings?.ctrlEnterToSend ?? false) && - (!$mobile || - !( - 'ontouchstart' in window || - navigator.maxTouchPoints > 0 || - navigator.msMaxTouchPoints > 0 - ))} - placeholder={placeholder ? placeholder : $i18n.t('Send a Message')} - largeTextAsFile={($settings?.largeTextAsFile ?? false) && !shiftKey} - autocomplete={$config?.features?.enable_autocomplete_generation && - ($settings?.promptAutocomplete ?? false)} - generateAutoCompletion={async (text) => { - if (selectedModelIds.length === 0 || !selectedModelIds.at(0)) { - toast.error($i18n.t('Please select a model first.')); - } - - const res = await generateAutoCompletion( - localStorage.token, - selectedModelIds.at(0), - text, - history?.currentId - ? createMessagesList(history, history.currentId) - : null - ).catch((error) => { - console.log(error); - - return null; - }); - - console.log(res); - return res; - }} - oncompositionstart={() => (isComposing = true)} - oncompositionend={(e) => { - compositionEndedAt = e.timeStamp; - isComposing = false; - }} - on:keydown={async (e) => { - e = e.detail.event; - - const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac - const commandsContainerElement = - document.getElementById('commands-container'); - - if (e.key === 'Escape') { - stopResponse(); - } - - // Command/Ctrl + Shift + Enter to submit a message pair - if (isCtrlPressed && e.key === 'Enter' && e.shiftKey) { - e.preventDefault(); - createMessagePair(prompt); - } - - // Check if Ctrl + R is pressed - if (prompt === '' && isCtrlPressed && e.key.toLowerCase() === 'r') { - e.preventDefault(); - console.log('regenerate'); - - const regenerateButton = [ - ...document.getElementsByClassName('regenerate-response-button') - ]?.at(-1); - - regenerateButton?.click(); - } - - if (prompt === '' && e.key == 'ArrowUp') { - e.preventDefault(); - - const userMessageElement = [ - ...document.getElementsByClassName('user-message') - ]?.at(-1); - - if (userMessageElement) { - userMessageElement.scrollIntoView({ block: 'center' }); - const editButton = [ - ...document.getElementsByClassName('edit-user-message-button') - ]?.at(-1); - - editButton?.click(); - } - } - - if (commandsContainerElement) { - if (commandsContainerElement && e.key === 'ArrowUp') { - e.preventDefault(); - commandsElement.selectUp(); - - const commandOptionButton = [ - ...document.getElementsByClassName( - 'selected-command-option-button' - ) - ]?.at(-1); - commandOptionButton.scrollIntoView({ block: 'center' }); - } - - if (commandsContainerElement && e.key === 'ArrowDown') { - e.preventDefault(); - commandsElement.selectDown(); - - const commandOptionButton = [ - ...document.getElementsByClassName( - 'selected-command-option-button' - ) - ]?.at(-1); - commandOptionButton.scrollIntoView({ block: 'center' }); - } - - if (commandsContainerElement && e.key === 'Tab') { - e.preventDefault(); - - const commandOptionButton = [ - ...document.getElementsByClassName( - 'selected-command-option-button' - ) - ]?.at(-1); - - commandOptionButton?.click(); - } - - if (commandsContainerElement && e.key === 'Enter') { - e.preventDefault(); - - const commandOptionButton = [ - ...document.getElementsByClassName( - 'selected-command-option-button' - ) - ]?.at(-1); - - if (commandOptionButton) { - commandOptionButton?.click(); - } else { - document.getElementById('send-message-button')?.click(); - } - } - } else { - if ( - !$mobile || + {#if suggestions} + {#key $settings?.showFormattingToolbar ?? false} + { + prompt = e.md; + command = getCommand(); + }} + json={true} + messageInput={true} + showFormattingToolbar={$settings?.showFormattingToolbar ?? false} + floatingMenuPlacement={'top-start'} + insertPromptAsRichText={$settings?.insertPromptAsRichText ?? false} + shiftEnter={!($settings?.ctrlEnterToSend ?? false) && + (!$mobile || !( 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0 - ) - ) { - if (inOrNearComposition(e)) { - return; - } + ))} + placeholder={placeholder ? placeholder : $i18n.t('Send a Message')} + largeTextAsFile={($settings?.largeTextAsFile ?? false) && !shiftKey} + autocomplete={$config?.features?.enable_autocomplete_generation && + ($settings?.promptAutocomplete ?? false)} + generateAutoCompletion={async (text) => { + if (selectedModelIds.length === 0 || !selectedModelIds.at(0)) { + toast.error($i18n.t('Please select a model first.')); + } - // Uses keyCode '13' for Enter key for chinese/japanese keyboards. - // - // Depending on the user's settings, it will send the message - // either when Enter is pressed or when Ctrl+Enter is pressed. - const enterPressed = - ($settings?.ctrlEnterToSend ?? false) - ? (e.key === 'Enter' || e.keyCode === 13) && isCtrlPressed - : (e.key === 'Enter' || e.keyCode === 13) && !e.shiftKey; + const res = await generateAutoCompletion( + localStorage.token, + selectedModelIds.at(0), + text, + history?.currentId + ? createMessagesList(history, history.currentId) + : null + ).catch((error) => { + console.log(error); - if (enterPressed) { - e.preventDefault(); - if (prompt !== '' || files.length > 0) { - dispatch('submit', prompt); - } + return null; + }); + + console.log(res); + return res; + }} + {suggestions} + oncompositionstart={() => (isComposing = true)} + oncompositionend={(e) => { + compositionEndedAt = e.timeStamp; + isComposing = false; + }} + on:keydown={async (e) => { + e = e.detail.event; + + const isCtrlPressed = e.ctrlKey || e.metaKey; // metaKey is for Cmd key on Mac + const suggestionsContainerElement = + document.getElementById('suggestions-container'); + + if (e.key === 'Escape') { + stopResponse(); + } + + // Command/Ctrl + Shift + Enter to submit a message pair + if (isCtrlPressed && e.key === 'Enter' && e.shiftKey) { + e.preventDefault(); + createMessagePair(prompt); + } + + // Check if Ctrl + R is pressed + if (prompt === '' && isCtrlPressed && e.key.toLowerCase() === 'r') { + e.preventDefault(); + console.log('regenerate'); + + const regenerateButton = [ + ...document.getElementsByClassName('regenerate-response-button') + ]?.at(-1); + + regenerateButton?.click(); + } + + if (prompt === '' && e.key == 'ArrowUp') { + e.preventDefault(); + + const userMessageElement = [ + ...document.getElementsByClassName('user-message') + ]?.at(-1); + + if (userMessageElement) { + userMessageElement.scrollIntoView({ block: 'center' }); + const editButton = [ + ...document.getElementsByClassName('edit-user-message-button') + ]?.at(-1); + + editButton?.click(); } } - } - if (e.key === 'Escape') { - console.log('Escape'); - atSelectedModel = undefined; - selectedToolIds = []; - selectedFilterIds = []; - - webSearchEnabled = false; - imageGenerationEnabled = false; - codeInterpreterEnabled = false; - } - }} - on:paste={async (e) => { - e = e.detail.event; - console.log(e); - - const clipboardData = e.clipboardData || window.clipboardData; - - if (clipboardData && clipboardData.items) { - for (const item of clipboardData.items) { - if (item.type.indexOf('image') !== -1) { - const blob = item.getAsFile(); - const reader = new FileReader(); - - reader.onload = function (e) { - files = [ - ...files, - { - type: 'image', - url: `${e.target.result}` - } - ]; - }; - - reader.readAsDataURL(blob); - } else if (item?.kind === 'file') { - const file = item.getAsFile(); - if (file) { - const _files = [file]; - await inputFilesHandler(_files); - e.preventDefault(); + if (!suggestionsContainerElement) { + if ( + !$mobile || + !( + 'ontouchstart' in window || + navigator.maxTouchPoints > 0 || + navigator.msMaxTouchPoints > 0 + ) + ) { + if (inOrNearComposition(e)) { + return; } - } else if (item.type === 'text/plain') { - if (($settings?.largeTextAsFile ?? false) && !shiftKey) { - const text = clipboardData.getData('text/plain'); - if (text.length > PASTED_TEXT_CHARACTER_LIMIT) { - e.preventDefault(); - const blob = new Blob([text], { type: 'text/plain' }); - const file = new File( - [blob], - `Pasted_Text_${Date.now()}.txt`, - { - type: 'text/plain' - } - ); + // Uses keyCode '13' for Enter key for chinese/japanese keyboards. + // + // Depending on the user's settings, it will send the message + // either when Enter is pressed or when Ctrl+Enter is pressed. + const enterPressed = + ($settings?.ctrlEnterToSend ?? false) + ? (e.key === 'Enter' || e.keyCode === 13) && isCtrlPressed + : (e.key === 'Enter' || e.keyCode === 13) && !e.shiftKey; - await uploadFileHandler(file, true); + if (enterPressed) { + e.preventDefault(); + if (prompt !== '' || files.length > 0) { + dispatch('submit', prompt); } } } } - } - }} - /> - {/key} + + if (e.key === 'Escape') { + console.log('Escape'); + atSelectedModel = undefined; + selectedToolIds = []; + selectedFilterIds = []; + + webSearchEnabled = false; + imageGenerationEnabled = false; + codeInterpreterEnabled = false; + } + }} + on:paste={async (e) => { + e = e.detail.event; + console.log(e); + + const clipboardData = e.clipboardData || window.clipboardData; + + if (clipboardData && clipboardData.items) { + for (const item of clipboardData.items) { + if (item.type.indexOf('image') !== -1) { + const blob = item.getAsFile(); + const reader = new FileReader(); + + reader.onload = function (e) { + files = [ + ...files, + { + type: 'image', + url: `${e.target.result}` + } + ]; + }; + + reader.readAsDataURL(blob); + } else if (item?.kind === 'file') { + const file = item.getAsFile(); + if (file) { + const _files = [file]; + await inputFilesHandler(_files); + e.preventDefault(); + } + } else if (item.type === 'text/plain') { + if (($settings?.largeTextAsFile ?? false) && !shiftKey) { + const text = clipboardData.getData('text/plain'); + + if (text.length > PASTED_TEXT_CHARACTER_LIMIT) { + e.preventDefault(); + const blob = new Blob([text], { type: 'text/plain' }); + const file = new File( + [blob], + `Pasted_Text_${Date.now()}.txt`, + { + type: 'text/plain' + } + ); + + await uploadFileHandler(file, true); + } + } + } + } + } + }} + /> + {/key} + {/if}
{:else}