From b1cba685f47e737b23069614b4b4443df1c2d5aa Mon Sep 17 00:00:00 2001 From: _00_ <131402327+rgaricano@users.noreply.github.com> Date: Sat, 13 Sep 2025 00:04:30 +0200 Subject: [PATCH 001/139] UPD: i18n es-ES Translation - dev_v0.6.28 ### UPD: i18n es-ES Translation - dev_v0.6.28 - Translated added strings. --- src/lib/i18n/locales/es-ES/translation.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index a952fc60fe..04167e0c77 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -16,7 +16,7 @@ "{{COUNT}} Replies": "{{COUNT}} Respuestas", "{{COUNT}} Sources": "{{COUNT}} Fuentes", "{{COUNT}} words": "{{COUNT}} palabras", - "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "", + "{{LOCALIZED_DATE}} at {{LOCALIZED_TIME}}": "{{LOCALIZED_DATE}} a las {{LOCALIZED_TIME}}", "{{model}} download has been canceled": "La descarga de {{model}} ha sido cancelada", "{{user}}'s Chats": "Chats de {{user}}", "{{webUIName}} Backend Required": "{{webUIName}} Servidor Requerido", @@ -147,8 +147,8 @@ "Ask a question": "Haz una pregunta", "Assistant": "Asistente", "Attach file from knowledge": "Adjuntar archivo desde conocimiento", - "Attach Knowledge": "", - "Attach Notes": "", + "Attach Knowledge": "Adjuntar Conocimiento", + "Attach Notes": "Adjuntar Notas", "Attention to detail": "Atención al detalle", "Attribute for Mail": "Atributo para Correo", "Attribute for Username": "Atributo para Nombre de Usuario", @@ -854,7 +854,7 @@ "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", - "Integrations": "", + "Integrations": "Integraciones", "Interface": "Interfaz", "Invalid file content": "Contenido de archivo inválido", "Invalid file format.": "Formato de archivo inválido.", @@ -913,7 +913,7 @@ "Leave empty to include all models or select specific models": "Dejar vacío para incluir todos los modelos o Seleccionar modelos específicos", "Leave empty to use the default prompt, or enter a custom prompt": "Dejar vacío para usar el indicador predeterminado, o Ingresar un indicador personalizado", "Leave model field empty to use the default model.": "Dejar vacío el campo modelo para usar el modelo predeterminado.", - "Legacy": "", + "Legacy": "Heredado", "lexical": "léxica", "License": "Licencia", "Lift List": "Desplegar Lista", @@ -1226,7 +1226,7 @@ "Rename": "Renombrar", "Reorder Models": "Reordenar Modelos", "Reply in Thread": "Responder en Hilo", - "required": "", + "required": "requerido", "Reranking Engine": "Motor de Reclasificación", "Reranking Model": "Modelo de Reclasificación", "Reset": "Reiniciar", @@ -1519,7 +1519,7 @@ "To select toolkits here, add them to the \"Tools\" workspace first.": "Para seleccionar herramientas aquí, primero añadelas a \"Herramientas\" en el área de trabajo.", "Toast notifications for new updates": "Notificaciones emergentes para nuevas actualizaciones", "Today": "Hoy", - "Today at {{LOCALIZED_TIME}}": "", + "Today at {{LOCALIZED_TIME}}": "Hoy a las {{LOCALIZED_TIME}}", "Toggle search": "Alternar busqueda", "Toggle settings": "Alternar Ajustes", "Toggle sidebar": "Alternar Barra Lateral", @@ -1660,7 +1660,7 @@ "Yacy Password": "Contraseña de Yacy", "Yacy Username": "Usuario de Yacy", "Yesterday": "Ayer", - "Yesterday at {{LOCALIZED_TIME}}": "", + "Yesterday at {{LOCALIZED_TIME}}": "Ayer a las {{LOCALIZED_TIME}}", "You": "Tu", "You are currently using a trial license. Please contact support to upgrade your license.": "Actualmente estás utilizando una licencia de prueba. Por favor, para actualizar su licencia contacta con soporte.", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Solo puedes chatear con un máximo de {{maxCount}} archivo(s) a la vez.", From 7f41bb6118e8529fd03dcfd6d12b73a835bc7e8e Mon Sep 17 00:00:00 2001 From: _00_ <131402327+rgaricano@users.noreply.github.com> Date: Sat, 13 Sep 2025 00:23:53 +0200 Subject: [PATCH 002/139] Update translation.json --- src/lib/i18n/locales/es-ES/translation.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index 04167e0c77..7f4d57478f 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -367,7 +367,9 @@ "Default (Open AI)": "Predeterminado (Open AI)", "Default (SentenceTransformers)": "Predeterminado (SentenceTransformers)", "Default action buttons will be used.": "Se usara la acción predeterminada para el botón", - "Default description enabled": "Descripción por defecto activada", + "Default description enabled": "Descripción predeterminada activada", + "Default Features": "Características Predeterminadas", + "Default Filters": "Filtros Predeterminados", "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.": "El modo predeterminado trabaja con un amplio rango de modelos, llamando a las herramientas una vez antes de la ejecución. El modo nativo aprovecha las capacidades de llamada de herramientas integradas del modelo, pero requiere que el modelo admita inherentemente esta función.", "Default Model": "Modelo Predeterminado", "Default model updated": "El modelo Predeterminado ha sido actualizado", From d5824b1b495fcf86e57171769bcec2a0f698b070 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 15 Sep 2025 11:18:31 -0500 Subject: [PATCH 003/139] refac: prompt template variable made not required by default --- .../MessageInput/InputVariablesModal.svelte | 30 +++++++------- src/lib/utils/index.ts | 41 +++++++++++++------ 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/src/lib/components/chat/MessageInput/InputVariablesModal.svelte b/src/lib/components/chat/MessageInput/InputVariablesModal.svelte index 53f4ec02dc..4554ea72d3 100644 --- a/src/lib/components/chat/MessageInput/InputVariablesModal.svelte +++ b/src/lib/components/chat/MessageInput/InputVariablesModal.svelte @@ -84,7 +84,7 @@
{variable} - {#if variables[variable]?.required ?? true} + {#if variables[variable]?.required ?? false} *{$i18n.t('required')} {/if}
@@ -134,7 +134,7 @@ placeholder={$i18n.t('Enter value (true/false)')} bind:value={variableValues[variable]} autocomplete="off" - required + required={variables[variable]?.required ?? false} /> {:else if variables[variable]?.type === 'color'} @@ -159,7 +159,7 @@ placeholder={$i18n.t('Enter hex color (e.g. #FF0000)')} bind:value={variableValues[variable]} autocomplete="off" - required + required={variables[variable]?.required ?? false} /> {:else if variables[variable]?.type === 'date'} @@ -170,7 +170,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'datetime-local'} @@ -181,7 +181,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'email'} @@ -192,7 +192,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'month'} @@ -203,7 +203,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'number'} @@ -214,7 +214,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'range'} @@ -235,7 +235,7 @@ placeholder={$i18n.t('Enter value')} bind:value={variableValues[variable]} autocomplete="off" - required + required={variables[variable]?.required ?? false} /> @@ -256,7 +256,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'text'} @@ -267,7 +267,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'time'} @@ -278,7 +278,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'url'} @@ -289,7 +289,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} {...variableAttributes} /> {:else if variables[variable]?.type === 'map'} @@ -311,7 +311,7 @@ placeholder={$i18n.t('Enter coordinates (e.g. 51.505, -0.09)')} bind:value={variableValues[variable]} autocomplete="off" - required + required={variables[variable]?.required ?? false} /> {:else} @@ -321,7 +321,7 @@ bind:value={variableValues[variable]} autocomplete="off" id="input-variable-{idx}" - required + required={variables[variable]?.required ?? false} /> {/if} diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index 85e41d3c38..09bab3cf56 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -1408,24 +1408,39 @@ export const parseVariableDefinition = (definition: string): Record // Parse type (explicit or implied) const type = firstPart.startsWith('type=') ? firstPart.slice(5) : firstPart; - // Parse properties using reduce - const properties = propertyParts.reduce((props, part) => { - // Use splitProperties for the equals sign as well, in case there are nested quotes - const equalsParts = splitProperties(part, '='); - const [propertyName, ...valueParts] = equalsParts; - const propertyValue = valueParts.join('='); // Handle values with = signs + // Parse properties; support both key=value and bare flags (e.g., ":required") + const properties = propertyParts.reduce( + (props, part) => { + const trimmed = part.trim(); + if (!trimmed) return props; - return propertyName && propertyValue - ? { - ...props, - [propertyName.trim()]: parseJsonValue(propertyValue.trim()) + // Use splitProperties for the equals sign as well, in case there are nested quotes + const equalsParts = splitProperties(trimmed, '='); + + if (equalsParts.length === 1) { + // It's a flag with no value, e.g. "required" -> true + const flagName = equalsParts[0].trim(); + if (flagName.length > 0) { + return { ...props, [flagName]: true }; } - : props; - }, {}); + return props; + } + + const [propertyName, ...valueParts] = equalsParts; + const propertyValueRaw = valueParts.join('='); // Handle values with extra '=' + + if (!propertyName || propertyValueRaw == null) return props; + + return { + ...props, + [propertyName.trim()]: parseJsonValue(propertyValueRaw.trim()) + }; + }, + {} as Record + ); return { type, ...properties }; }; - export const parseJsonValue = (value: string): any => { // Remove surrounding quotes if present (for string values) if (value.startsWith('"') && value.endsWith('"')) { From a51f0c30ec1472d71487eab3e15d0351a2716b12 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 15 Sep 2025 11:40:31 -0500 Subject: [PATCH 004/139] refac/fix: knowledge permission --- backend/open_webui/retrieval/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index f5db7521b5..aec8de6846 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -621,6 +621,7 @@ def get_sources_from_items( if knowledge_base and ( user.role == "admin" + or knowledge_base.user_id == user.id or has_access(user.id, "read", knowledge_base.access_control) ): From e4c864de7eb0d577843a80688677ce3659d1f81f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 15 Sep 2025 12:01:46 -0500 Subject: [PATCH 005/139] fix: connection url edit --- src/lib/components/admin/Settings/Connections.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/admin/Settings/Connections.svelte b/src/lib/components/admin/Settings/Connections.svelte index 91926dd6a3..100e440d5d 100644 --- a/src/lib/components/admin/Settings/Connections.svelte +++ b/src/lib/components/admin/Settings/Connections.svelte @@ -261,7 +261,7 @@
{#each OPENAI_API_BASE_URLS as url, idx} {#each OLLAMA_BASE_URLS as url, idx} { From b6a2ca877a2103a0003197844cff78eba8fbe6e5 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 15 Sep 2025 12:07:53 -0500 Subject: [PATCH 006/139] refac --- src/lib/components/chat/SettingsModal.svelte | 2 +- src/lib/components/common/Modal.svelte | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/components/chat/SettingsModal.svelte b/src/lib/components/chat/SettingsModal.svelte index d3da37631c..f822050ebc 100644 --- a/src/lib/components/chat/SettingsModal.svelte +++ b/src/lib/components/chat/SettingsModal.svelte @@ -561,7 +561,7 @@ -
+
{$i18n.t('Settings')}
-
-
- {#if typingUsers.length > 0} -
+ {#if typingUsers.length > 0} +
+
+ + +
{typingUsers.map((user) => user.name).join(', ')} {$i18n.t('is typing...')}
- {/if} +
-
+ {/if}
@@ -811,7 +816,7 @@ json={true} messageInput={true} richText={$settings?.richTextInput ?? true} - {showFormattingToolbar} + showFormattingToolbar={$settings?.showFormattingToolbar ?? false} shiftEnter={!($settings?.ctrlEnterToSend ?? false) && (!$mobile || !( diff --git a/src/lib/components/chat/Messages/Skeleton.svelte b/src/lib/components/chat/Messages/Skeleton.svelte index 90d8a99131..b2631701af 100644 --- a/src/lib/components/chat/Messages/Skeleton.svelte +++ b/src/lib/components/chat/Messages/Skeleton.svelte @@ -2,14 +2,22 @@ export let size = 'md'; - + From 67549dcadd670285d491bd41daf3d081a70fd094 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 15 Sep 2025 13:25:36 -0500 Subject: [PATCH 009/139] refac --- src/lib/components/chat/MessageInput.svelte | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 2f5bbc490a..45b84c28a7 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1024,7 +1024,9 @@ }} >
{#if atSelectedModel !== undefined} From 9e50026107e881de8a86088e30046339f0573eb7 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 15 Sep 2025 13:28:29 -0500 Subject: [PATCH 010/139] refac --- src/lib/components/layout/Sidebar.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index 4a065d9387..4cb20b6940 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -513,7 +513,7 @@ {#if !$mobile && !$showSidebar}