Skip to content

Commit e4c9734

Browse files
authored
Merge pull request open-webui#10038 from open-webui/dev
0.5.13
2 parents 2017856 + 188b928 commit e4c9734

File tree

234 files changed

+4186
-2318
lines changed

Some content is hidden

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

234 files changed

+4186
-2318
lines changed

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,27 @@ 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.13] - 2025-02-17
9+
10+
### Added
11+
12+
- **🌐 Full Context Mode for Web Search**: Enable highly accurate web searches by utilizing full context mode—ideal for models with large context windows, ensuring more precise and insightful results.
13+
- **⚡ Optimized Asynchronous Web Search**: Web searches now load significantly faster with optimized async support, providing users with quicker, more efficient information retrieval.
14+
- **🔄 Auto Text Direction for RTL Languages**: Automatic text alignment based on language input, ensuring seamless conversation flow for Arabic, Hebrew, and other right-to-left scripts.
15+
- **🚀 Jupyter Notebook Support for Code Execution**: The "Run" button in code blocks can now use Jupyter for execution, offering a powerful, dynamic coding experience directly in the chat.
16+
- **🗑️ Message Delete Confirmation Dialog**: Prevent accidental deletions with a new confirmation prompt before removing messages, adding an additional layer of security to your chat history.
17+
- **📥 Download Button for SVG Diagrams**: SVG diagrams generated within chat can now be downloaded instantly, making it easier to save and share complex visual data.
18+
- **✨ General UI/UX Improvements and Backend Stability**: A refined interface with smoother interactions, improved layouts, and backend stability enhancements for a more reliable, polished experience.
19+
20+
### Fixed
21+
22+
- **🛠️ Temporary Chat Message Continue Button Fixed**: The "Continue Response" button for temporary chats now works as expected, ensuring an uninterrupted conversation flow.
23+
24+
### Changed
25+
26+
- **📝 Prompt Variable Update**: Deprecated square bracket '[]' indicators for prompt variables; now requires double curly brackets '{{}}' for consistency and clarity.
27+
- **🔧 Stability Enhancements**: Error handling improved in chat history, ensuring smoother operations when reviewing previous messages.
28+
829
## [0.5.12] - 2025-02-13
930

1031
### Added

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@
1313

1414
**Open WebUI is an [extensible](https://docs.openwebui.com/features/plugin/), feature-rich, and user-friendly self-hosted AI platform designed to operate entirely offline.** It supports various LLM runners like **Ollama** and **OpenAI-compatible APIs**, with **built-in inference engine** for RAG, making it a **powerful AI deployment solution**.
1515

16-
For more information, be sure to check out our [Open WebUI Documentation](https://docs.openwebui.com/).
17-
1816
![Open WebUI Demo](./demo.gif)
1917

18+
> [!TIP]
19+
> **Looking for an [Enterprise Plan](https://docs.openwebui.com/enterprise)?****[Speak with Our Sales Team Today!](mailto:[email protected])**
20+
>
21+
> Get **enhanced capabilities**, including **custom theming and branding**, **Service Level Agreement (SLA) support**, **Long-Term Support (LTS) versions**, and **more!**
22+
23+
For more information, be sure to check out our [Open WebUI Documentation](https://docs.openwebui.com/).
24+
2025
## Key Features of Open WebUI ⭐
2126

2227
- 🚀 **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both `:ollama` and `:cuda` tagged images.

backend/open_webui/config.py

Lines changed: 94 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import logging
33
import os
44
import shutil
5+
import base64
6+
57
from datetime import datetime
68
from pathlib import Path
79
from typing import Generic, Optional, TypeVar
@@ -586,15 +588,27 @@ def oidc_oauth_register(client):
586588

587589
STATIC_DIR = Path(os.getenv("STATIC_DIR", OPEN_WEBUI_DIR / "static")).resolve()
588590

591+
592+
def override_static(path: str, content: str):
593+
# Ensure path is safe
594+
if "/" in path or ".." in path:
595+
log.error(f"Invalid path: {path}")
596+
return
597+
598+
file_path = os.path.join(STATIC_DIR, path)
599+
os.makedirs(os.path.dirname(file_path), exist_ok=True)
600+
601+
with open(file_path, "wb") as f:
602+
f.write(base64.b64decode(content)) # Convert Base64 back to raw binary
603+
604+
589605
frontend_favicon = FRONTEND_BUILD_DIR / "static" / "favicon.png"
590606

591607
if frontend_favicon.exists():
592608
try:
593609
shutil.copyfile(frontend_favicon, STATIC_DIR / "favicon.png")
594610
except Exception as e:
595611
logging.error(f"An error occurred: {e}")
596-
else:
597-
logging.warning(f"Frontend favicon not found at {frontend_favicon}")
598612

599613
frontend_splash = FRONTEND_BUILD_DIR / "static" / "splash.png"
600614

@@ -603,12 +617,18 @@ def oidc_oauth_register(client):
603617
shutil.copyfile(frontend_splash, STATIC_DIR / "splash.png")
604618
except Exception as e:
605619
logging.error(f"An error occurred: {e}")
606-
else:
607-
logging.warning(f"Frontend splash not found at {frontend_splash}")
620+
621+
frontend_loader = FRONTEND_BUILD_DIR / "static" / "loader.js"
622+
623+
if frontend_loader.exists():
624+
try:
625+
shutil.copyfile(frontend_loader, STATIC_DIR / "loader.js")
626+
except Exception as e:
627+
logging.error(f"An error occurred: {e}")
608628

609629

610630
####################################
611-
# CUSTOM_NAME
631+
# CUSTOM_NAME (Legacy)
612632
####################################
613633

614634
CUSTOM_NAME = os.environ.get("CUSTOM_NAME", "")
@@ -650,6 +670,16 @@ def oidc_oauth_register(client):
650670
pass
651671

652672

673+
####################################
674+
# LICENSE_KEY
675+
####################################
676+
677+
LICENSE_KEY = PersistentConfig(
678+
"LICENSE_KEY",
679+
"license.key",
680+
os.environ.get("LICENSE_KEY", ""),
681+
)
682+
653683
####################################
654684
# STORAGE PROVIDER
655685
####################################
@@ -1347,6 +1377,39 @@ class BannerModel(BaseModel):
13471377
# Code Interpreter
13481378
####################################
13491379

1380+
1381+
CODE_EXECUTION_ENGINE = PersistentConfig(
1382+
"CODE_EXECUTION_ENGINE",
1383+
"code_execution.engine",
1384+
os.environ.get("CODE_EXECUTION_ENGINE", "pyodide"),
1385+
)
1386+
1387+
CODE_EXECUTION_JUPYTER_URL = PersistentConfig(
1388+
"CODE_EXECUTION_JUPYTER_URL",
1389+
"code_execution.jupyter.url",
1390+
os.environ.get("CODE_EXECUTION_JUPYTER_URL", ""),
1391+
)
1392+
1393+
CODE_EXECUTION_JUPYTER_AUTH = PersistentConfig(
1394+
"CODE_EXECUTION_JUPYTER_AUTH",
1395+
"code_execution.jupyter.auth",
1396+
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH", ""),
1397+
)
1398+
1399+
CODE_EXECUTION_JUPYTER_AUTH_TOKEN = PersistentConfig(
1400+
"CODE_EXECUTION_JUPYTER_AUTH_TOKEN",
1401+
"code_execution.jupyter.auth_token",
1402+
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH_TOKEN", ""),
1403+
)
1404+
1405+
1406+
CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = PersistentConfig(
1407+
"CODE_EXECUTION_JUPYTER_AUTH_PASSWORD",
1408+
"code_execution.jupyter.auth_password",
1409+
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH_PASSWORD", ""),
1410+
)
1411+
1412+
13501413
ENABLE_CODE_INTERPRETER = PersistentConfig(
13511414
"ENABLE_CODE_INTERPRETER",
13521415
"code_interpreter.enable",
@@ -1368,26 +1431,37 @@ class BannerModel(BaseModel):
13681431
CODE_INTERPRETER_JUPYTER_URL = PersistentConfig(
13691432
"CODE_INTERPRETER_JUPYTER_URL",
13701433
"code_interpreter.jupyter.url",
1371-
os.environ.get("CODE_INTERPRETER_JUPYTER_URL", ""),
1434+
os.environ.get(
1435+
"CODE_INTERPRETER_JUPYTER_URL", os.environ.get("CODE_EXECUTION_JUPYTER_URL", "")
1436+
),
13721437
)
13731438

13741439
CODE_INTERPRETER_JUPYTER_AUTH = PersistentConfig(
13751440
"CODE_INTERPRETER_JUPYTER_AUTH",
13761441
"code_interpreter.jupyter.auth",
1377-
os.environ.get("CODE_INTERPRETER_JUPYTER_AUTH", ""),
1442+
os.environ.get(
1443+
"CODE_INTERPRETER_JUPYTER_AUTH",
1444+
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH", ""),
1445+
),
13781446
)
13791447

13801448
CODE_INTERPRETER_JUPYTER_AUTH_TOKEN = PersistentConfig(
13811449
"CODE_INTERPRETER_JUPYTER_AUTH_TOKEN",
13821450
"code_interpreter.jupyter.auth_token",
1383-
os.environ.get("CODE_INTERPRETER_JUPYTER_AUTH_TOKEN", ""),
1451+
os.environ.get(
1452+
"CODE_INTERPRETER_JUPYTER_AUTH_TOKEN",
1453+
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH_TOKEN", ""),
1454+
),
13841455
)
13851456

13861457

13871458
CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = PersistentConfig(
13881459
"CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD",
13891460
"code_interpreter.jupyter.auth_password",
1390-
os.environ.get("CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD", ""),
1461+
os.environ.get(
1462+
"CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD",
1463+
os.environ.get("CODE_EXECUTION_JUPYTER_AUTH_PASSWORD", ""),
1464+
),
13911465
)
13921466

13931467

@@ -1706,6 +1780,12 @@ class BannerModel(BaseModel):
17061780
os.getenv("RAG_WEB_SEARCH_ENGINE", ""),
17071781
)
17081782

1783+
RAG_WEB_SEARCH_FULL_CONTEXT = PersistentConfig(
1784+
"RAG_WEB_SEARCH_FULL_CONTEXT",
1785+
"rag.web.search.full_context",
1786+
os.getenv("RAG_WEB_SEARCH_FULL_CONTEXT", "False").lower() == "true",
1787+
)
1788+
17091789
# You can provide a list of your own websites to filter after performing a web search.
17101790
# This ensures the highest level of safety and reliability of the information sources.
17111791
RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig(
@@ -1853,6 +1933,11 @@ class BannerModel(BaseModel):
18531933
int(os.getenv("RAG_WEB_SEARCH_CONCURRENT_REQUESTS", "10")),
18541934
)
18551935

1936+
RAG_WEB_SEARCH_TRUST_ENV = PersistentConfig(
1937+
"RAG_WEB_SEARCH_TRUST_ENV",
1938+
"rag.web.search.trust_env",
1939+
os.getenv("RAG_WEB_SEARCH_TRUST_ENV", False),
1940+
)
18561941

18571942
####################################
18581943
# Images

backend/open_webui/env.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113

114114
WEBUI_FAVICON_URL = "https://openwebui.com/favicon.png"
115115

116+
TRUSTED_SIGNATURE_KEY = os.environ.get("TRUSTED_SIGNATURE_KEY", "")
116117

117118
####################################
118119
# ENV (dev,test,prod)

0 commit comments

Comments
 (0)