Skip to content

Commit f865a23

Browse files
committed
Merge remote-tracking branch 'upstream/main'
2 parents a381ffc + cf4bbcd commit f865a23

File tree

97 files changed

+3686
-2144
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

97 files changed

+3686
-2144
lines changed

.github/workflows/release-pypi.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
uses: actions/checkout@v4
2020
- uses: actions/setup-node@v4
2121
with:
22-
node-version: 18
22+
node-version: 22
2323
- uses: actions/setup-python@v5
2424
with:
2525
python-version: 3.11

CHANGELOG.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## [0.5.15] - 2025-02-20
9+
10+
### Added
11+
12+
- **📄 Full Context Mode for Local Document Search (RAG)**: Toggle full context mode from Admin Settings > Documents to inject entire document content into context, improving accuracy for models with large context windows—ideal for deep context understanding.
13+
- **🌍 Smarter Web Search with Agentic Workflows**: Web searches now intelligently gather and refine multiple relevant terms, similar to RAG handling, delivering significantly better search results for more accurate information retrieval.
14+
- **🔎 Experimental Playwright Support for Web Loader**: Web content retrieval is taken to the next level with Playwright-powered scraping for enhanced accuracy in extracted web data.
15+
- **☁️ Experimental Azure Storage Provider**: Early-stage support for Azure Storage allows more cloud storage flexibility directly within Open WebUI.
16+
- **📊 Improved Jupyter Code Execution with Plots**: Interactive coding now properly displays inline plots, making data visualization more seamless inside chat interactions.
17+
- **⏳ Adjustable Execution Timeout for Jupyter Interpreter**: Customize execution timeout (default: 60s) for Jupyter-based code execution, allowing longer or more constrained execution based on your needs.
18+
- **▶️ "Running..." Indicator for Jupyter Code Execution**: A visual indicator now appears while code execution is in progress, providing real-time status updates on ongoing computations.
19+
- **⚙️ General Backend & Frontend Stability Enhancements**: Extensive refactoring improves reliability, performance, and overall user experience for a more seamless Open WebUI.
20+
- **🌍 Translation Updates**: Various international translation refinements ensure better localization and a more natural user interface experience.
21+
22+
### Fixed
23+
24+
- **📱 Mobile Hover Issue Resolved**: Users can now edit responses smoothly on mobile without interference, fixing a longstanding hover issue.
25+
- **🔄 Temporary Chat Message Duplication Fixed**: Eliminated buggy behavior where messages were being unnecessarily repeated in temporary chat mode, ensuring a smooth and consistent conversation flow.
26+
827
## [0.5.14] - 2025-02-17
928

1029
### Fixed

backend/open_webui/config.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,10 @@ def oidc_oauth_register(client):
684684
"GOOGLE_APPLICATION_CREDENTIALS_JSON", None
685685
)
686686

687+
AZURE_STORAGE_ENDPOINT = os.environ.get("AZURE_STORAGE_ENDPOINT", None)
688+
AZURE_STORAGE_CONTAINER_NAME = os.environ.get("AZURE_STORAGE_CONTAINER_NAME", None)
689+
AZURE_STORAGE_KEY = os.environ.get("AZURE_STORAGE_KEY", None)
690+
687691
####################################
688692
# File Upload DIR
689693
####################################
@@ -783,6 +787,9 @@ def oidc_oauth_register(client):
783787
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
784788
OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
785789

790+
GEMINI_API_KEY = os.environ.get("GEMINI_API_KEY", "")
791+
GEMINI_API_BASE_URL = os.environ.get("GEMINI_API_BASE_URL", "")
792+
786793

787794
if OPENAI_API_BASE_URL == "":
788795
OPENAI_API_BASE_URL = "https://api.openai.com/v1"
@@ -1395,6 +1402,11 @@ class BannerModel(BaseModel):
13951402
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH_PASSWORD", ""),
13961403
)
13971404

1405+
CODE_EXECUTION_JUPYTER_TIMEOUT = PersistentConfig(
1406+
"CODE_EXECUTION_JUPYTER_TIMEOUT",
1407+
"code_execution.jupyter.timeout",
1408+
int(os.environ.get("CODE_EXECUTION_JUPYTER_TIMEOUT", "60")),
1409+
)
13981410

13991411
ENABLE_CODE_INTERPRETER = PersistentConfig(
14001412
"ENABLE_CODE_INTERPRETER",
@@ -1450,6 +1462,17 @@ class BannerModel(BaseModel):
14501462
),
14511463
)
14521464

1465+
CODE_INTERPRETER_JUPYTER_TIMEOUT = PersistentConfig(
1466+
"CODE_INTERPRETER_JUPYTER_TIMEOUT",
1467+
"code_interpreter.jupyter.timeout",
1468+
int(
1469+
os.environ.get(
1470+
"CODE_INTERPRETER_JUPYTER_TIMEOUT",
1471+
os.environ.get("CODE_EXECUTION_JUPYTER_TIMEOUT", "60"),
1472+
)
1473+
),
1474+
)
1475+
14531476

14541477
DEFAULT_CODE_INTERPRETER_PROMPT = """
14551478
#### Tools Available
@@ -1571,6 +1594,12 @@ class BannerModel(BaseModel):
15711594
os.environ.get("ENABLE_RAG_HYBRID_SEARCH", "").lower() == "true",
15721595
)
15731596

1597+
RAG_FULL_CONTEXT = PersistentConfig(
1598+
"RAG_FULL_CONTEXT",
1599+
"rag.full_context",
1600+
os.getenv("RAG_FULL_CONTEXT", "False").lower() == "true",
1601+
)
1602+
15741603
RAG_FILE_MAX_COUNT = PersistentConfig(
15751604
"RAG_FILE_MAX_COUNT",
15761605
"rag.file.max_count",
@@ -1919,12 +1948,36 @@ class BannerModel(BaseModel):
19191948
int(os.getenv("RAG_WEB_SEARCH_CONCURRENT_REQUESTS", "10")),
19201949
)
19211950

1951+
RAG_WEB_LOADER_ENGINE = PersistentConfig(
1952+
"RAG_WEB_LOADER_ENGINE",
1953+
"rag.web.loader.engine",
1954+
os.environ.get("RAG_WEB_LOADER_ENGINE", "safe_web"),
1955+
)
1956+
19221957
RAG_WEB_SEARCH_TRUST_ENV = PersistentConfig(
19231958
"RAG_WEB_SEARCH_TRUST_ENV",
19241959
"rag.web.search.trust_env",
19251960
os.getenv("RAG_WEB_SEARCH_TRUST_ENV", False),
19261961
)
19271962

1963+
PLAYWRIGHT_WS_URI = PersistentConfig(
1964+
"PLAYWRIGHT_WS_URI",
1965+
"rag.web.loader.engine.playwright.ws.uri",
1966+
os.environ.get("PLAYWRIGHT_WS_URI", None),
1967+
)
1968+
1969+
FIRECRAWL_API_KEY = PersistentConfig(
1970+
"FIRECRAWL_API_KEY",
1971+
"firecrawl.api_key",
1972+
os.environ.get("FIRECRAWL_API_KEY", ""),
1973+
)
1974+
1975+
FIRECRAWL_API_BASE_URL = PersistentConfig(
1976+
"FIRECRAWL_API_BASE_URL",
1977+
"firecrawl.api_url",
1978+
os.environ.get("FIRECRAWL_API_BASE_URL", "https://api.firecrawl.dev"),
1979+
)
1980+
19281981
####################################
19291982
# Images
19301983
####################################
@@ -2135,6 +2188,17 @@ class BannerModel(BaseModel):
21352188
os.getenv("IMAGES_OPENAI_API_KEY", OPENAI_API_KEY),
21362189
)
21372190

2191+
IMAGES_GEMINI_API_BASE_URL = PersistentConfig(
2192+
"IMAGES_GEMINI_API_BASE_URL",
2193+
"image_generation.gemini.api_base_url",
2194+
os.getenv("IMAGES_GEMINI_API_BASE_URL", GEMINI_API_BASE_URL),
2195+
)
2196+
IMAGES_GEMINI_API_KEY = PersistentConfig(
2197+
"IMAGES_GEMINI_API_KEY",
2198+
"image_generation.gemini.api_key",
2199+
os.getenv("IMAGES_GEMINI_API_KEY", GEMINI_API_KEY),
2200+
)
2201+
21382202
IMAGE_SIZE = PersistentConfig(
21392203
"IMAGE_SIZE", "image_generation.size", os.getenv("IMAGE_SIZE", "512x512")
21402204
)

backend/open_webui/main.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,15 @@
106106
CODE_EXECUTION_JUPYTER_AUTH,
107107
CODE_EXECUTION_JUPYTER_AUTH_TOKEN,
108108
CODE_EXECUTION_JUPYTER_AUTH_PASSWORD,
109+
CODE_EXECUTION_JUPYTER_TIMEOUT,
109110
ENABLE_CODE_INTERPRETER,
110111
CODE_INTERPRETER_ENGINE,
111112
CODE_INTERPRETER_PROMPT_TEMPLATE,
112113
CODE_INTERPRETER_JUPYTER_URL,
113114
CODE_INTERPRETER_JUPYTER_AUTH,
114115
CODE_INTERPRETER_JUPYTER_AUTH_TOKEN,
115116
CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD,
117+
CODE_INTERPRETER_JUPYTER_TIMEOUT,
116118
# Image
117119
AUTOMATIC1111_API_AUTH,
118120
AUTOMATIC1111_BASE_URL,
@@ -131,6 +133,8 @@
131133
IMAGE_STEPS,
132134
IMAGES_OPENAI_API_BASE_URL,
133135
IMAGES_OPENAI_API_KEY,
136+
IMAGES_GEMINI_API_BASE_URL,
137+
IMAGES_GEMINI_API_KEY,
134138
# Audio
135139
AUDIO_STT_ENGINE,
136140
AUDIO_STT_MODEL,
@@ -145,13 +149,18 @@
145149
AUDIO_TTS_VOICE,
146150
AUDIO_TTS_AZURE_SPEECH_REGION,
147151
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
152+
PLAYWRIGHT_WS_URI,
153+
FIRECRAWL_API_BASE_URL,
154+
FIRECRAWL_API_KEY,
155+
RAG_WEB_LOADER_ENGINE,
148156
WHISPER_MODEL,
149157
DEEPGRAM_API_KEY,
150158
WHISPER_MODEL_AUTO_UPDATE,
151159
WHISPER_MODEL_DIR,
152160
# Retrieval
153161
RAG_TEMPLATE,
154162
DEFAULT_RAG_TEMPLATE,
163+
RAG_FULL_CONTEXT,
155164
RAG_EMBEDDING_MODEL,
156165
RAG_EMBEDDING_MODEL_AUTO_UPDATE,
157166
RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE,
@@ -515,6 +524,8 @@ async def lifespan(app: FastAPI):
515524
app.state.config.FILE_MAX_SIZE = RAG_FILE_MAX_SIZE
516525
app.state.config.FILE_MAX_COUNT = RAG_FILE_MAX_COUNT
517526

527+
528+
app.state.config.RAG_FULL_CONTEXT = RAG_FULL_CONTEXT
518529
app.state.config.ENABLE_RAG_HYBRID_SEARCH = ENABLE_RAG_HYBRID_SEARCH
519530
app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = (
520531
ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION
@@ -576,7 +587,11 @@ async def lifespan(app: FastAPI):
576587

577588
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT
578589
app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS
590+
app.state.config.RAG_WEB_LOADER_ENGINE = RAG_WEB_LOADER_ENGINE
579591
app.state.config.RAG_WEB_SEARCH_TRUST_ENV = RAG_WEB_SEARCH_TRUST_ENV
592+
app.state.config.PLAYWRIGHT_WS_URI = PLAYWRIGHT_WS_URI
593+
app.state.config.FIRECRAWL_API_BASE_URL = FIRECRAWL_API_BASE_URL
594+
app.state.config.FIRECRAWL_API_KEY = FIRECRAWL_API_KEY
580595

581596
app.state.EMBEDDING_FUNCTION = None
582597
app.state.ef = None
@@ -631,6 +646,7 @@ async def lifespan(app: FastAPI):
631646
app.state.config.CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = (
632647
CODE_EXECUTION_JUPYTER_AUTH_PASSWORD
633648
)
649+
app.state.config.CODE_EXECUTION_JUPYTER_TIMEOUT = CODE_EXECUTION_JUPYTER_TIMEOUT
634650

635651
app.state.config.ENABLE_CODE_INTERPRETER = ENABLE_CODE_INTERPRETER
636652
app.state.config.CODE_INTERPRETER_ENGINE = CODE_INTERPRETER_ENGINE
@@ -644,6 +660,7 @@ async def lifespan(app: FastAPI):
644660
app.state.config.CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = (
645661
CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD
646662
)
663+
app.state.config.CODE_INTERPRETER_JUPYTER_TIMEOUT = CODE_INTERPRETER_JUPYTER_TIMEOUT
647664

648665
########################################
649666
#
@@ -658,6 +675,9 @@ async def lifespan(app: FastAPI):
658675
app.state.config.IMAGES_OPENAI_API_BASE_URL = IMAGES_OPENAI_API_BASE_URL
659676
app.state.config.IMAGES_OPENAI_API_KEY = IMAGES_OPENAI_API_KEY
660677

678+
app.state.config.IMAGES_GEMINI_API_BASE_URL = IMAGES_GEMINI_API_BASE_URL
679+
app.state.config.IMAGES_GEMINI_API_KEY = IMAGES_GEMINI_API_KEY
680+
661681
app.state.config.IMAGE_GENERATION_MODEL = IMAGE_GENERATION_MODEL
662682

663683
app.state.config.AUTOMATIC1111_BASE_URL = AUTOMATIC1111_BASE_URL
@@ -967,7 +987,7 @@ async def chat_completion(
967987
"files": form_data.get("files", None),
968988
"features": form_data.get("features", None),
969989
"variables": form_data.get("variables", None),
970-
"model": model_info,
990+
"model": model_info.model_dump() if model_info else model,
971991
"direct": model_item.get("direct", False),
972992
**(
973993
{"function_calling": "native"}

0 commit comments

Comments
 (0)