This commit is contained in:
Timothy Jaeryang Baek committed 2026-08-25 12:22:19 -04:00
1 parent 2d2bcb5332
commit 3c1017f6c3
5 files changed
+31 -8

No files matched your search

+9
View File
@@ -507,6 +507,15 @@ try:
except ValueError: except ValueError:
WEBSOCKET_SERVER_PING_INTERVAL = 25 WEBSOCKET_SERVER_PING_INTERVAL = 25
WEBSOCKET_HEARTBEAT_INTERVAL = os.getenv('WEBSOCKET_HEARTBEAT_INTERVAL', '')
if WEBSOCKET_HEARTBEAT_INTERVAL == '':
WEBSOCKET_HEARTBEAT_INTERVAL = None
else:
try:
WEBSOCKET_HEARTBEAT_INTERVAL = min(max(int(WEBSOCKET_HEARTBEAT_INTERVAL), 5), 90)
except ValueError:
WEBSOCKET_HEARTBEAT_INTERVAL = 30
WEBSOCKET_EVENT_CALLER_TIMEOUT = os.getenv('WEBSOCKET_EVENT_CALLER_TIMEOUT', '') WEBSOCKET_EVENT_CALLER_TIMEOUT = os.getenv('WEBSOCKET_EVENT_CALLER_TIMEOUT', '')
if WEBSOCKET_EVENT_CALLER_TIMEOUT == '': if WEBSOCKET_EVENT_CALLER_TIMEOUT == '':
+6
View File
@@ -111,6 +111,7 @@ from open_webui.env import (
SAFE_MODE, SAFE_MODE,
SCIM_TOKEN, SCIM_TOKEN,
VERSION, VERSION,
WEBSOCKET_HEARTBEAT_INTERVAL,
# Admin Account Runtime Creation # Admin Account Runtime Creation
WEBUI_ADMIN_EMAIL, WEBUI_ADMIN_EMAIL,
WEBUI_ADMIN_NAME, WEBUI_ADMIN_NAME,
@@ -2297,6 +2298,11 @@ async def get_app_config(request: Request):
'enable_signup': config.get('ui.enable_signup'), 'enable_signup': config.get('ui.enable_signup'),
'enable_login_form': config.get('ui.enable_login_form'), 'enable_login_form': config.get('ui.enable_login_form'),
'enable_websocket': ENABLE_WEBSOCKET_SUPPORT, 'enable_websocket': ENABLE_WEBSOCKET_SUPPORT,
**(
{'websocket_heartbeat_interval': WEBSOCKET_HEARTBEAT_INTERVAL}
if WEBSOCKET_HEARTBEAT_INTERVAL is not None
else {}
),
# --- Authenticated: only consumed by logged-in frontend --- # --- Authenticated: only consumed by logged-in frontend ---
**( **(
{ {
+6 -1
View File
@@ -16,6 +16,7 @@ from open_webui.env import (
GLOBAL_LOG_LEVEL, GLOBAL_LOG_LEVEL,
REDIS_KEY_PREFIX, REDIS_KEY_PREFIX,
WEBSOCKET_EVENT_CALLER_TIMEOUT, WEBSOCKET_EVENT_CALLER_TIMEOUT,
WEBSOCKET_HEARTBEAT_INTERVAL,
WEBSOCKET_MANAGER, WEBSOCKET_MANAGER,
WEBSOCKET_REDIS_CLUSTER, WEBSOCKET_REDIS_CLUSTER,
WEBSOCKET_REDIS_LOCK_TIMEOUT, WEBSOCKET_REDIS_LOCK_TIMEOUT,
@@ -102,7 +103,11 @@ else:
# Timeout duration in seconds # Timeout duration in seconds
TIMEOUT_DURATION = 3 TIMEOUT_DURATION = 3
SESSION_POOL_TIMEOUT = 120 # seconds without heartbeat before session is reaped SESSION_POOL_TIMEOUT = (
max(WEBSOCKET_HEARTBEAT_INTERVAL * 4, 120)
if WEBSOCKET_HEARTBEAT_INTERVAL is not None
else 120
)
# Dictionary to maintain the user pool # Dictionary to maintain the user pool
+1
View File
@@ -355,6 +355,7 @@ type Config = {
enable_version_update_check: boolean; enable_version_update_check: boolean;
enable_pyodide_file_persistence?: boolean; enable_pyodide_file_persistence?: boolean;
folder_max_file_count?: number; folder_max_file_count?: number;
websocket_heartbeat_interval?: number | null;
}; };
oauth: { oauth: {
providers: { providers: {
+9 -7
View File
@@ -213,13 +213,15 @@
} }
} }
// Send heartbeat every 30 seconds heartbeatInterval = setInterval(
heartbeatInterval = setInterval(() => { () => {
if (_socket.connected) { if (_socket.connected) {
console.log('Sending heartbeat'); console.log('Sending heartbeat');
_socket.emit('heartbeat', {}); _socket.emit('heartbeat', {});
} }
}, 30000); },
($config?.features?.websocket_heartbeat_interval ?? 30) * 1000
);
if (deploymentId !== null) { if (deploymentId !== null) {
WEBUI_DEPLOYMENT_ID.set(deploymentId); WEBUI_DEPLOYMENT_ID.set(deploymentId);