Skip to content
Merged

Dev #212

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
166 commits
Select commit Hold shift + click to select a range
c6d8049
feat: improve ollama model management experience
silentoplayz Aug 23, 2025
8df74dd
fix
silentoplayz Aug 23, 2025
3b1197a
i18n: improve Chinese translation
ShirasawaSama Sep 29, 2025
3389f0e
fix: handle non‑UTF8 chars in third‑party responses without error
ShirasawaSama Sep 29, 2025
a395af3
German translation of new strings in i18n
Ithanil Sep 29, 2025
c9c0dd3
log web search queries only with level 'debug' instead of 'info'
Ithanil Sep 29, 2025
f267e47
DEV branch changelog 0.6.32
Classic298 Sep 29, 2025
a5a0989
refac
tjbck Sep 29, 2025
88f7852
Merge pull request #17890 from Classic298/patch-1
tjbck Sep 29, 2025
5438eb0
doc: changelog
tjbck Sep 29, 2025
4d7fdda
Merge pull request #17892 from open-webui/dev
tjbck Sep 29, 2025
0a928d6
Tool calls now only include text and dont inlcude other content like …
jmleksan Sep 29, 2025
2a3f57b
fix onedrive
Classic298 Sep 29, 2025
b15db79
Merge pull request #17902 from Classic298/patch-1
tjbck Sep 30, 2025
b387880
Merge pull request #17897 from jmleksan/fix/tool-task-only-include-text
tjbck Sep 30, 2025
7d513ff
Merge pull request #17881 from ShirasawaSama/patch-20
tjbck Sep 30, 2025
170ae9f
Merge pull request #17882 from ShirasawaSama/patch-3
tjbck Sep 30, 2025
ccf53af
Merge pull request #17886 from Ithanil/de_i18n
tjbck Sep 30, 2025
ddb109a
Merge pull request #17888 from Ithanil/nolog_websearch
tjbck Sep 30, 2025
73f32a8
fix: discovery url
tjbck Sep 30, 2025
887772d
fix: default permissions not being loaded
tjbck Sep 30, 2025
58efa18
fix: ai hallucination
tjbck Sep 30, 2025
fcc3d9e
fix: non rich text input copy
tjbck Sep 30, 2025
88a6fe3
refac: rm print statements
tjbck Sep 30, 2025
8c662c6
refac: disable direct models from model editors
tjbck Sep 30, 2025
01a5b97
refac/fix: do not process xlsx files with azure doc intelligence
tjbck Sep 30, 2025
0d0d286
Update pull_request_template.md
Classic298 Sep 30, 2025
7259905
Update generated image translation in DE-de
Classic298 Sep 30, 2025
e96fb67
added missing danish translations
sinejespersen Sep 30, 2025
07cc807
feat(onedrive): Enable search and "My Organization" pivot
Sep 30, 2025
5c059e6
style(onedrive): Formatting fix
Sep 30, 2025
44b71de
Merge pull request #17923 from itk-dev/feature/danish-translations-added
tjbck Sep 30, 2025
c850439
Merge pull request #17916 from Classic298/patch-2
tjbck Sep 30, 2025
39b6f4b
Merge pull request #17912 from Classic298/patch-1
tjbck Sep 30, 2025
80cbdbb
feat: Implement toggling for vertical and horizontal flow layouts
silentoplayz Sep 30, 2025
2341c2e
Merge pull request #17930 from selenecodes/feat/onedrive-file-picker-…
tjbck Oct 1, 2025
6cc7a8b
build(deps): bump pydantic from 2.11.7 to 2.11.9 in /backend
dependabot[bot] Oct 1, 2025
d9a723b
build(deps): bump black from 25.1.0 to 25.9.0 in /backend
dependabot[bot] Oct 1, 2025
17af981
build(deps): bump markdown from 3.8.2 to 3.9 in /backend
dependabot[bot] Oct 1, 2025
242bcc8
build(deps): bump chromadb from 1.0.20 to 1.1.0 in /backend
dependabot[bot] Oct 1, 2025
b0e3afc
build(deps): bump opentelemetry-api from 1.36.0 to 1.37.0
dependabot[bot] Oct 1, 2025
a8a0a26
refac: ollama embed form data
tjbck Oct 1, 2025
b1c196e
fix: non rich text handling
tjbck Oct 1, 2025
e493562
fix: oauth client registration
tjbck Oct 1, 2025
0330dc3
refac
tjbck Oct 1, 2025
be01b87
Merge pull request #17944 from open-webui/dependabot/pip/backend/dev/…
tjbck Oct 1, 2025
c6e498e
Merge pull request #17945 from open-webui/dependabot/pip/backend/dev/…
tjbck Oct 1, 2025
86727ae
Merge pull request #17947 from open-webui/dependabot/pip/backend/dev/…
tjbck Oct 1, 2025
8c9c2be
Merge pull request #17948 from open-webui/dependabot/pip/backend/dev/…
tjbck Oct 1, 2025
6eb479d
Merge pull request #17952 from open-webui/dependabot/uv/dev/opentelem…
tjbck Oct 1, 2025
f5a4d27
chore: dep bump
tjbck Oct 1, 2025
7563a62
chore: fastapi bump
tjbck Oct 1, 2025
ebce057
chore/refac: bump bcrypt and remove passlib
tjbck Oct 2, 2025
2f923e4
Merge pull request #17941 from silentoplayz/vertical-and-horizontal-o…
tjbck Oct 2, 2025
6ddb449
Improving Korean Translation
Cyp9715 Oct 2, 2025
03498bd
refac
tjbck Oct 2, 2025
dc3911b
Improving Korean Translation
Cyp9715 Oct 2, 2025
6f88db1
Merge pull request #17983 from Cyp9715/dev
tjbck Oct 2, 2025
6c8c325
feat: PWA share_target implementation
tjbck Oct 2, 2025
557367c
refac: message input mobile detection behaviour
tjbck Oct 2, 2025
e2ca7b8
feat: model_ids per folder
tjbck Oct 2, 2025
6afbcac
Update translation.json (pt-BR)
joaoback Oct 2, 2025
97faecc
refac
tjbck Oct 2, 2025
d87a231
refac
tjbck Oct 2, 2025
9677871
refac
tjbck Oct 2, 2025
af34e41
refac
tjbck Oct 2, 2025
3a601e0
refac/fix: temp chat
tjbck Oct 2, 2025
028f295
refac
tjbck Oct 2, 2025
c0d3e70
refac: stop task
tjbck Oct 2, 2025
2e75c6d
refac/fix: azure audio escape
tjbck Oct 2, 2025
3967543
refac: external tool validation
tjbck Oct 2, 2025
e9bced8
Merge pull request #17986 from joaoback/patch-11
tjbck Oct 2, 2025
6ff392e
refac/enh: start.sh additional args support
tjbck Oct 2, 2025
a57bb6a
refac
tjbck Oct 2, 2025
b6538b2
refac: styling
tjbck Oct 2, 2025
6c4deed
refac/fix: direct connection floating action buttons
tjbck Oct 2, 2025
a1fc99c
refac/fix: system prompt duplication
tjbck Oct 2, 2025
5d5b42d
refac/enh: openai tts additional params support
tjbck Oct 2, 2025
c8c6a48
refac
tjbck Oct 2, 2025
981306f
feat: load data in parallel to accelerate page loading speed
ShirasawaSama Oct 2, 2025
b8649fc
i18n: improve Chinese translation
ShirasawaSama Oct 2, 2025
8f41835
refac
tjbck Oct 2, 2025
5fe588b
Merge pull request #18004 from ShirasawaSama/i18n/improve-chinese-tra…
tjbck Oct 2, 2025
79afb7a
refac: model selector
tjbck Oct 2, 2025
d9fdbb6
Merge pull request #17559 from ShirasawaSama/patch-14
tjbck Oct 2, 2025
893d4fb
UPD: i18n es-ES Translation v0.6.33
rgaricano Oct 2, 2025
abe70d1
refac
tjbck Oct 2, 2025
d12afc6
improved query pref by querying only relevant columns
expruc Oct 2, 2025
2494de8
Merge pull request #18009 from rgaricano/dev-es_ES
tjbck Oct 2, 2025
339e95e
refac/enh: docling params
tjbck Oct 2, 2025
227139a
Merge pull request #16863 from silentoplayz/ollama-cancel-and-toast-c…
tjbck Oct 2, 2025
7e70f8d
refac
tjbck Oct 2, 2025
f25b7b7
refac: openai additional headers support
tjbck Oct 3, 2025
5b05f13
Merge pull request #18013 from expruc/perf/query_file_metadatas
tjbck Oct 3, 2025
8334149
refac
tjbck Oct 3, 2025
351ba16
FEAT: Add Vega Char Visualizer Renderer
rgaricano Oct 3, 2025
c5c6c32
refac
tjbck Oct 3, 2025
0a4922b
Merge pull request #18033 from rgaricano/dev-FEAT_Vega_Visualizer
tjbck Oct 3, 2025
9ff6baf
chore
tjbck Oct 3, 2025
59929a8
refac
tjbck Oct 3, 2025
039358e
FEAT: Add Vega-Lite Char Visualizer Renderer
rgaricano Oct 4, 2025
f65231b
Merge pull request #18040 from rgaricano/dev-FEAT_Vega_Visualizer
tjbck Oct 4, 2025
d40c710
refac
tjbck Oct 4, 2025
ce83276
refac/fix: switch
tjbck Oct 4, 2025
a2a2baf
enh/refac: url input handling
tjbck Oct 4, 2025
f20723c
refac
tjbck Oct 4, 2025
2c59a28
refac: styling
tjbck Oct 4, 2025
2e08bda
UPD: Add Validators & Error Toast for Mermaid & Vega diagrams
rgaricano Oct 4, 2025
0ba1cfc
removed redundant knowledge API call
expruc Oct 4, 2025
e6cc7db
Fix Code Format
rgaricano Oct 4, 2025
6050c86
refac: model workspace view
tjbck Oct 5, 2025
96ecb47
refac
tjbck Oct 5, 2025
2250d10
refac: knowledge
tjbck Oct 5, 2025
23c8f6d
refac: prompts
tjbck Oct 5, 2025
a743b16
refac: tools
tjbck Oct 5, 2025
fff0e55
refac
tjbck Oct 5, 2025
d2cb781
feat: attach folder
tjbck Oct 5, 2025
713f0ef
refac: make tencentcloud-sdk-python optional
tjbck Oct 5, 2025
062264c
refac/fix: oauth
tjbck Oct 5, 2025
c453d91
Merge pull request #18057 from expruc/perf/knowledge_page
tjbck Oct 5, 2025
eaf786c
enh: ENABLE_OAUTH_EMAIL_FALLBACK
tjbck Oct 5, 2025
5448618
refac/fix: folders
tjbck Oct 5, 2025
52998e6
Update requirements.txt
Classic298 Oct 5, 2025
079b9ec
Update pyproject.toml
Classic298 Oct 5, 2025
8538d1b
UPD: Add Validators & Error Toast for Mermaid & Vega diagrams
rgaricano Oct 5, 2025
fa2534a
Removed unused toast import & Code Format
rgaricano Oct 5, 2025
a97f145
Merge pull request #18066 from Classic298/pymilvus
tjbck Oct 6, 2025
08f8713
Merge pull request #18068 from rgaricano/dev-FEAT_Vega_Visualizer
tjbck Oct 6, 2025
53de48d
refac
tjbck Oct 6, 2025
9b4f032
refac: external tool server view
tjbck Oct 6, 2025
270ca2d
refac
tjbck Oct 6, 2025
b4536a6
refac: overview
tjbck Oct 6, 2025
2f39889
refac: styling
tjbck Oct 6, 2025
3f71fa6
refac
tjbck Oct 6, 2025
d62f215
Update bug_report.yaml
Classic298 Oct 6, 2025
dec3748
refac
tjbck Oct 6, 2025
ca3563b
Merge pull request #18079 from Classic298/patch-2
tjbck Oct 6, 2025
c58a4a0
refac
tjbck Oct 6, 2025
b610852
refac
tjbck Oct 6, 2025
b98d8aa
refac
tjbck Oct 7, 2025
82a16f1
refac: oauth client fallback
tjbck Oct 7, 2025
f69426f
Fixed: Cannot handle batch sizes > 1 if no padding token is defined
YetheSamartaka Oct 7, 2025
4bb5b39
refac: fallback to reasoning content
tjbck Oct 7, 2025
7448cf6
fix(i18n): corrected typo in Spanish translation for "Reasoning Tags"
Akutangulo Oct 7, 2025
861953f
refac/fix: ENABLE_STAR_SESSIONS_MIDDLEWARE
tjbck Oct 7, 2025
db17806
refac/fix: redirect
tjbck Oct 7, 2025
696876d
Merge pull request #18108 from YetheSamartaka/main
tjbck Oct 7, 2025
2d71193
refac
tjbck Oct 7, 2025
e000494
refac
tjbck Oct 7, 2025
7d205b1
refac
tjbck Oct 7, 2025
53e9862
refac: web search error handling
tjbck Oct 7, 2025
3c47e49
refac: source parsing
tjbck Oct 7, 2025
299e0e2
Merge pull request #18114 from Akutangulo/main
tjbck Oct 7, 2025
f5e1a42
refac: functions
tjbck Oct 7, 2025
18d74f2
refac
tjbck Oct 7, 2025
216fb5c
refac/enh: note pdf export
tjbck Oct 7, 2025
911a114
refac/fix: mcp oauth2.1
tjbck Oct 7, 2025
d11fba2
chore: format
tjbck Oct 7, 2025
73f38dc
chore: Changelog (#17995)
Classic298 Oct 7, 2025
dbbdad3
refac
tjbck Oct 7, 2025
c1e86ad
chore: dep bump
tjbck Oct 7, 2025
8d7d79d
0.6.33 (#18118)
tjbck Oct 7, 2025
19ba6c0
refac/fix: verify connection
tjbck Oct 8, 2025
46ae3f4
Merge branch 'dev' into main
tjbck Oct 8, 2025
4e12f5f
Merge remote-tracking branch 'oui/main' into dev
OrenZhang Oct 8, 2025
8c663a4
chore(repo): merge from remote
OrenZhang Oct 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
113 changes: 99 additions & 14 deletions CHANGELOG.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions CHANGELOG_EXTRA.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.6.33.1] - 2025.10.08

### Changed

- 合并官方 0.6.33 改动

## [0.6.32.1] - 2025.09.29

### Added
Expand Down
52 changes: 41 additions & 11 deletions backend/open_webui/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -655,8 +655,8 @@ def load_oauth_providers():
OAUTH_PROVIDERS.clear()
if GOOGLE_CLIENT_ID.value and GOOGLE_CLIENT_SECRET.value:

def google_oauth_register(client: OAuth):
client.register(
def google_oauth_register(oauth: OAuth):
client = oauth.register(
name="google",
client_id=GOOGLE_CLIENT_ID.value,
client_secret=GOOGLE_CLIENT_SECRET.value,
Expand All @@ -671,6 +671,7 @@ def google_oauth_register(client: OAuth):
},
redirect_uri=GOOGLE_REDIRECT_URI.value,
)
return client

OAUTH_PROVIDERS["google"] = {
"redirect_uri": GOOGLE_REDIRECT_URI.value,
Expand All @@ -683,8 +684,8 @@ def google_oauth_register(client: OAuth):
and MICROSOFT_CLIENT_TENANT_ID.value
):

def microsoft_oauth_register(client: OAuth):
client.register(
def microsoft_oauth_register(oauth: OAuth):
client = oauth.register(
name="microsoft",
client_id=MICROSOFT_CLIENT_ID.value,
client_secret=MICROSOFT_CLIENT_SECRET.value,
Expand All @@ -699,6 +700,7 @@ def microsoft_oauth_register(client: OAuth):
},
redirect_uri=MICROSOFT_REDIRECT_URI.value,
)
return client

OAUTH_PROVIDERS["microsoft"] = {
"redirect_uri": MICROSOFT_REDIRECT_URI.value,
Expand All @@ -708,8 +710,8 @@ def microsoft_oauth_register(client: OAuth):

if GITHUB_CLIENT_ID.value and GITHUB_CLIENT_SECRET.value:

def github_oauth_register(client: OAuth):
client.register(
def github_oauth_register(oauth: OAuth):
client = oauth.register(
name="github",
client_id=GITHUB_CLIENT_ID.value,
client_secret=GITHUB_CLIENT_SECRET.value,
Expand All @@ -727,6 +729,7 @@ def github_oauth_register(client: OAuth):
},
redirect_uri=GITHUB_CLIENT_REDIRECT_URI.value,
)
return client

OAUTH_PROVIDERS["github"] = {
"redirect_uri": GITHUB_CLIENT_REDIRECT_URI.value,
Expand All @@ -740,7 +743,7 @@ def github_oauth_register(client: OAuth):
and OPENID_PROVIDER_URL.value
):

def oidc_oauth_register(client: OAuth):
def oidc_oauth_register(oauth: OAuth):
client_kwargs = {
"scope": OAUTH_SCOPES.value,
**(
Expand All @@ -766,14 +769,15 @@ def oidc_oauth_register(client: OAuth):
% ("S256", OAUTH_CODE_CHALLENGE_METHOD.value)
)

client.register(
client = oauth.register(
name="oidc",
client_id=OAUTH_CLIENT_ID.value,
client_secret=OAUTH_CLIENT_SECRET.value,
server_metadata_url=OPENID_PROVIDER_URL.value,
client_kwargs=client_kwargs,
redirect_uri=OPENID_REDIRECT_URI.value,
)
return client

OAUTH_PROVIDERS["oidc"] = {
"name": OAUTH_PROVIDER_NAME.value,
Expand All @@ -783,8 +787,8 @@ def oidc_oauth_register(client: OAuth):

if FEISHU_CLIENT_ID.value and FEISHU_CLIENT_SECRET.value:

def feishu_oauth_register(client: OAuth):
client.register(
def feishu_oauth_register(oauth: OAuth):
client = oauth.register(
name="feishu",
client_id=FEISHU_CLIENT_ID.value,
client_secret=FEISHU_CLIENT_SECRET.value,
Expand All @@ -802,6 +806,7 @@ def feishu_oauth_register(client: OAuth):
},
redirect_uri=FEISHU_REDIRECT_URI.value,
)
return client

OAUTH_PROVIDERS["feishu"] = {
"register": feishu_oauth_register,
Expand Down Expand Up @@ -2040,7 +2045,7 @@ class BannerModel(BaseModel):
os.environ.get("MILVUS_DISKANN_SEARCH_LIST_SIZE", "100")
)
ENABLE_MILVUS_MULTITENANCY_MODE = (
os.environ.get("ENABLE_MILVUS_MULTITENANCY_MODE", "true").lower() == "true"
os.environ.get("ENABLE_MILVUS_MULTITENANCY_MODE", "false").lower() == "true"
)
# Hyphens not allowed, need to use underscores in collection names
MILVUS_COLLECTION_PREFIX = os.environ.get("MILVUS_COLLECTION_PREFIX", "open_webui")
Expand Down Expand Up @@ -2329,6 +2334,18 @@ class BannerModel(BaseModel):
os.getenv("DOCLING_SERVER_URL", "http://docling:5001"),
)

docling_params = os.getenv("DOCLING_PARAMS", "")
try:
docling_params = json.loads(docling_params)
except json.JSONDecodeError:
docling_params = {}

DOCLING_PARAMS = PersistentConfig(
"DOCLING_PARAMS",
"rag.docling_params",
docling_params,
)

DOCLING_DO_OCR = PersistentConfig(
"DOCLING_DO_OCR",
"rag.docling_do_ocr",
Expand Down Expand Up @@ -3359,6 +3376,19 @@ class BannerModel(BaseModel):
os.getenv("AUDIO_TTS_OPENAI_API_KEY", OPENAI_API_KEY),
)

audio_tts_openai_params = os.getenv("AUDIO_TTS_OPENAI_PARAMS", "")
try:
audio_tts_openai_params = json.loads(audio_tts_openai_params)
except json.JSONDecodeError:
audio_tts_openai_params = {}

AUDIO_TTS_OPENAI_PARAMS = PersistentConfig(
"AUDIO_TTS_OPENAI_PARAMS",
"audio.tts.openai.params",
audio_tts_openai_params,
)


AUDIO_TTS_API_KEY = PersistentConfig(
"AUDIO_TTS_API_KEY",
"audio.tts.api_key",
Expand Down
10 changes: 8 additions & 2 deletions backend/open_webui/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,11 @@ def parse_section(section):
os.environ.get("ENABLE_FORWARD_USER_INFO_HEADERS", "False").lower() == "true"
)

# Experimental feature, may be removed in future
ENABLE_STAR_SESSIONS_MIDDLEWARE = (
os.environ.get("ENABLE_STAR_SESSIONS_MIDDLEWARE", "False").lower() == "true"
)

####################################
# WEBUI_BUILD_HASH
####################################
Expand Down Expand Up @@ -470,7 +475,9 @@ def parse_section(section):
####################################
# OAUTH Configuration
####################################

ENABLE_OAUTH_EMAIL_FALLBACK = (
os.environ.get("ENABLE_OAUTH_EMAIL_FALLBACK", "False").lower() == "true"
)

ENABLE_OAUTH_ID_TOKEN_COOKIE = (
os.environ.get("ENABLE_OAUTH_ID_TOKEN_COOKIE", "True").lower() == "true"
Expand All @@ -484,7 +491,6 @@ def parse_section(section):
"OAUTH_SESSION_TOKEN_ENCRYPTION_KEY", WEBUI_SECRET_KEY
)


####################################
# SCIM Configuration
####################################
Expand Down
97 changes: 70 additions & 27 deletions backend/open_webui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import sys
import time
import random
import re
from uuid import uuid4

from contextlib import asynccontextmanager
Expand Down Expand Up @@ -168,13 +169,14 @@
AUDIO_STT_AZURE_LOCALES,
AUDIO_STT_AZURE_BASE_URL,
AUDIO_STT_AZURE_MAX_SPEAKERS,
AUDIO_TTS_API_KEY,
AUDIO_TTS_ENGINE,
AUDIO_TTS_MODEL,
AUDIO_TTS_VOICE,
AUDIO_TTS_OPENAI_API_BASE_URL,
AUDIO_TTS_OPENAI_API_KEY,
AUDIO_TTS_OPENAI_PARAMS,
AUDIO_TTS_API_KEY,
AUDIO_TTS_SPLIT_ON,
AUDIO_TTS_VOICE,
AUDIO_TTS_AZURE_SPEECH_REGION,
AUDIO_TTS_AZURE_SPEECH_BASE_URL,
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
Expand Down Expand Up @@ -236,6 +238,7 @@
EXTERNAL_DOCUMENT_LOADER_API_KEY,
TIKA_SERVER_URL,
DOCLING_SERVER_URL,
DOCLING_PARAMS,
DOCLING_DO_OCR,
DOCLING_FORCE_OCR,
DOCLING_OCR_ENGINE,
Expand Down Expand Up @@ -466,6 +469,7 @@
ENABLE_OTEL,
EXTERNAL_PWA_MANIFEST_URL,
AIOHTTP_CLIENT_SESSION_SSL,
ENABLE_STAR_SESSIONS_MIDDLEWARE,
BASE_DIR,
)

Expand Down Expand Up @@ -855,6 +859,7 @@ async def lifespan(app: FastAPI):
app.state.config.EXTERNAL_DOCUMENT_LOADER_API_KEY = EXTERNAL_DOCUMENT_LOADER_API_KEY
app.state.config.TIKA_SERVER_URL = TIKA_SERVER_URL
app.state.config.DOCLING_SERVER_URL = DOCLING_SERVER_URL
app.state.config.DOCLING_PARAMS = DOCLING_PARAMS
app.state.config.DOCLING_DO_OCR = DOCLING_DO_OCR
app.state.config.DOCLING_FORCE_OCR = DOCLING_FORCE_OCR
app.state.config.DOCLING_OCR_ENGINE = DOCLING_OCR_ENGINE
Expand Down Expand Up @@ -1111,11 +1116,15 @@ async def lifespan(app: FastAPI):
app.state.config.AUDIO_STT_AZURE_BASE_URL = AUDIO_STT_AZURE_BASE_URL
app.state.config.AUDIO_STT_AZURE_MAX_SPEAKERS = AUDIO_STT_AZURE_MAX_SPEAKERS

app.state.config.TTS_OPENAI_API_BASE_URL = AUDIO_TTS_OPENAI_API_BASE_URL
app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY
app.state.config.TTS_ENGINE = AUDIO_TTS_ENGINE

app.state.config.TTS_MODEL = AUDIO_TTS_MODEL
app.state.config.TTS_VOICE = AUDIO_TTS_VOICE

app.state.config.TTS_OPENAI_API_BASE_URL = AUDIO_TTS_OPENAI_API_BASE_URL
app.state.config.TTS_OPENAI_API_KEY = AUDIO_TTS_OPENAI_API_KEY
app.state.config.TTS_OPENAI_PARAMS = AUDIO_TTS_OPENAI_PARAMS

app.state.config.TTS_API_KEY = AUDIO_TTS_API_KEY
app.state.config.TTS_SPLIT_ON = AUDIO_TTS_SPLIT_ON

Expand Down Expand Up @@ -1222,12 +1231,32 @@ async def dispatch(self, request: Request, call_next):
path = request.url.path
query_params = dict(parse_qs(urlparse(str(request.url)).query))

redirect_params = {}

# Check for the specific watch path and the presence of 'v' parameter
if path.endswith("/watch") and "v" in query_params:
# Extract the first 'v' parameter
video_id = query_params["v"][0]
encoded_video_id = urlencode({"youtube": video_id})
redirect_url = f"/?{encoded_video_id}"
youtube_video_id = query_params["v"][0]
redirect_params["youtube"] = youtube_video_id

if "shared" in query_params and len(query_params["shared"]) > 0:
# PWA share_target support

text = query_params["shared"][0]
if text:
urls = re.match(r"https://\S+", text)
if urls:
from open_webui.retrieval.loaders.youtube import _parse_video_id

if youtube_video_id := _parse_video_id(urls[0]):
redirect_params["youtube"] = youtube_video_id
else:
redirect_params["load-url"] = urls[0]
else:
redirect_params["q"] = text

if redirect_params:
redirect_url = f"/?{urlencode(redirect_params)}"
return RedirectResponse(url=redirect_url)

# Proceed with the normal flow of other requests
Expand Down Expand Up @@ -1539,7 +1568,7 @@ async def chat_completion(
}

if metadata.get("chat_id") and (user and user.role != "admin"):
if metadata["chat_id"] != "local":
if not metadata["chat_id"].startswith("local:"):
chat = Chats.get_chat_by_id_and_user_id(metadata["chat_id"], user.id)
if chat is None:
raise HTTPException(
Expand Down Expand Up @@ -1570,13 +1599,14 @@ async def process_chat(request, form_data, user, metadata, model):
response = await chat_completion_handler(request, form_data, user)
if metadata.get("chat_id") and metadata.get("message_id"):
try:
Chats.upsert_message_to_chat_by_id_and_message_id(
metadata["chat_id"],
metadata["message_id"],
{
"model": model_id,
},
)
if not metadata["chat_id"].startswith("local:"):
Chats.upsert_message_to_chat_by_id_and_message_id(
metadata["chat_id"],
metadata["message_id"],
{
"model": model_id,
},
)
except:
pass

Expand All @@ -1597,13 +1627,14 @@ async def process_chat(request, form_data, user, metadata, model):
if metadata.get("chat_id") and metadata.get("message_id"):
# Update the chat message with the error
try:
Chats.upsert_message_to_chat_by_id_and_message_id(
metadata["chat_id"],
metadata["message_id"],
{
"error": {"content": str(e)},
},
)
if not metadata["chat_id"].startswith("local:"):
Chats.upsert_message_to_chat_by_id_and_message_id(
metadata["chat_id"],
metadata["message_id"],
{
"error": {"content": str(e)},
},
)

event_emitter = get_event_emitter(metadata)
await event_emitter(
Expand Down Expand Up @@ -1973,13 +2004,20 @@ async def get_current_usage(user=Depends(get_verified_user)):
"oauth_client_info", ""
)

oauth_client_info = decrypt_data(oauth_client_info)
app.state.oauth_client_manager.add_client(
f"mcp:{server_id}", OAuthClientInformationFull(**oauth_client_info)
)
try:
oauth_client_info = decrypt_data(oauth_client_info)
app.state.oauth_client_manager.add_client(
f"mcp:{server_id}",
OAuthClientInformationFull(**oauth_client_info),
)
except Exception as e:
log.error(
f"Error adding OAuth client for MCP tool server {server_id}: {e}"
)
pass

try:
if REDIS_URL:
if ENABLE_STAR_SESSIONS_MIDDLEWARE:
redis_session_store = RedisStore(
url=REDIS_URL,
prefix=(f"{REDIS_KEY_PREFIX}:session:" if REDIS_KEY_PREFIX else "session:"),
Expand Down Expand Up @@ -2074,6 +2112,11 @@ async def get_manifest_json():
"purpose": "maskable",
},
],
"share_target": {
"action": "/",
"method": "GET",
"params": {"text": "shared"},
},
}


Expand Down
4 changes: 3 additions & 1 deletion backend/open_webui/models/files.py
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,9 @@ def get_file_metadatas_by_ids(self, ids: list[str]) -> list[FileMetadataResponse
created_at=file.created_at,
updated_at=file.updated_at,
)
for file in db.query(File)
for file in db.query(
File.id, File.meta, File.created_at, File.updated_at
)
.filter(File.id.in_(ids))
.order_by(File.updated_at.desc())
.all()
Expand Down
Loading
Loading