2024-08-25 22:52:36 +08:00
import importlib . metadata
2024-08-28 06:10:27 +08:00
import json
import logging
import os
2024-08-25 22:52:36 +08:00
import pkgutil
2024-08-28 06:10:27 +08:00
import sys
2024-09-04 23:14:24 +08:00
import shutil
2024-08-28 06:10:27 +08:00
from pathlib import Path
2024-08-25 22:52:36 +08:00
import markdown
from bs4 import BeautifulSoup
2024-09-04 22:54:48 +08:00
from open_webui . constants import ERROR_MESSAGES
2024-08-25 22:52:36 +08:00
####################################
# Load .env file
####################################
2024-09-04 22:54:48 +08:00
OPEN_WEBUI_DIR = Path ( __file__ ) . parent # the path containing this file
print ( OPEN_WEBUI_DIR )
BACKEND_DIR = OPEN_WEBUI_DIR . parent # the path containing this file
2024-08-25 22:52:36 +08:00
BASE_DIR = BACKEND_DIR . parent # the path containing the backend/
2024-09-04 22:54:48 +08:00
print ( BACKEND_DIR )
2024-08-25 22:52:36 +08:00
print ( BASE_DIR )
try :
2024-08-28 06:10:27 +08:00
from dotenv import find_dotenv , load_dotenv
2024-08-25 22:52:36 +08:00
load_dotenv ( find_dotenv ( str ( BASE_DIR / " .env " ) ) )
except ImportError :
print ( " dotenv not installed, skipping... " )
2024-09-20 02:56:13 +08:00
DOCKER = os . environ . get ( " DOCKER " , " False " ) . lower ( ) == " true "
2024-08-25 22:52:36 +08:00
2024-09-10 08:37:36 +08:00
# device type embedding models - "cpu" (default), "cuda" (nvidia gpu required) or "mps" (apple silicon) - choosing this right can lead to better performance
USE_CUDA = os . environ . get ( " USE_CUDA_DOCKER " , " false " )
if USE_CUDA . lower ( ) == " true " :
2024-09-13 23:12:00 +08:00
try :
import torch
2024-09-13 23:18:44 +08:00
2024-09-13 23:12:00 +08:00
assert torch . cuda . is_available ( ) , " CUDA not available "
DEVICE_TYPE = " cuda "
except Exception as e :
cuda_error = (
" Error when testing CUDA but USE_CUDA_DOCKER is true. "
f " Resetting USE_CUDA_DOCKER to false: { e } "
)
os . environ [ " USE_CUDA_DOCKER " ] = " false "
USE_CUDA = " false "
DEVICE_TYPE = " cpu "
2024-09-10 08:37:36 +08:00
else :
DEVICE_TYPE = " cpu "
2025-01-05 16:28:36 +08:00
try :
2025-01-07 02:08:12 +08:00
import torch
2025-01-05 16:28:36 +08:00
if torch . backends . mps . is_available ( ) and torch . backends . mps . is_built ( ) :
DEVICE_TYPE = " mps "
except Exception :
pass
2025-01-05 16:27:44 +08:00
2024-08-25 22:52:36 +08:00
####################################
# LOGGING
####################################
GLOBAL_LOG_LEVEL = os . environ . get ( " GLOBAL_LOG_LEVEL " , " " ) . upper ( )
2025-02-27 17:19:27 +08:00
if GLOBAL_LOG_LEVEL in logging . getLevelNamesMapping ( ) :
2024-08-25 22:52:36 +08:00
logging . basicConfig ( stream = sys . stdout , level = GLOBAL_LOG_LEVEL , force = True )
else :
GLOBAL_LOG_LEVEL = " INFO "
log = logging . getLogger ( __name__ )
log . info ( f " GLOBAL_LOG_LEVEL: { GLOBAL_LOG_LEVEL } " )
2024-09-13 23:12:00 +08:00
if " cuda_error " in locals ( ) :
log . exception ( cuda_error )
2025-03-04 12:55:07 +08:00
del cuda_error
2024-09-13 23:12:00 +08:00
2024-08-25 22:52:36 +08:00
log_sources = [
" AUDIO " ,
" COMFYUI " ,
" CONFIG " ,
" DB " ,
" IMAGES " ,
" MAIN " ,
" MODELS " ,
" OLLAMA " ,
" OPENAI " ,
" RAG " ,
" WEBHOOK " ,
2024-09-22 08:14:59 +08:00
" SOCKET " ,
2025-02-08 03:53:25 +08:00
" OAUTH " ,
2024-08-25 22:52:36 +08:00
]
SRC_LOG_LEVELS = { }
for source in log_sources :
log_env_var = source + " _LOG_LEVEL "
SRC_LOG_LEVELS [ source ] = os . environ . get ( log_env_var , " " ) . upper ( )
2025-02-27 17:19:27 +08:00
if SRC_LOG_LEVELS [ source ] not in logging . getLevelNamesMapping ( ) :
2024-08-25 22:52:36 +08:00
SRC_LOG_LEVELS [ source ] = GLOBAL_LOG_LEVEL
log . info ( f " { log_env_var } : { SRC_LOG_LEVELS [ source ] } " )
log . setLevel ( SRC_LOG_LEVELS [ " CONFIG " ] )
WEBUI_NAME = os . environ . get ( " WEBUI_NAME " , " Open WebUI " )
if WEBUI_NAME != " Open WebUI " :
WEBUI_NAME + = " (Open WebUI) "
WEBUI_FAVICON_URL = " https://openwebui.com/favicon.png "
2025-02-16 16:11:18 +08:00
TRUSTED_SIGNATURE_KEY = os . environ . get ( " TRUSTED_SIGNATURE_KEY " , " " )
2024-08-25 22:52:36 +08:00
####################################
# ENV (dev,test,prod)
####################################
ENV = os . environ . get ( " ENV " , " dev " )
2024-09-06 10:59:20 +08:00
FROM_INIT_PY = os . environ . get ( " FROM_INIT_PY " , " False " ) . lower ( ) == " true "
2024-09-04 22:54:48 +08:00
2024-09-06 10:59:20 +08:00
if FROM_INIT_PY :
2024-09-04 22:54:48 +08:00
PACKAGE_DATA = { " version " : importlib . metadata . version ( " open-webui " ) }
else :
2024-08-25 22:52:36 +08:00
try :
2024-09-04 22:54:48 +08:00
PACKAGE_DATA = json . loads ( ( BASE_DIR / " package.json " ) . read_text ( ) )
except Exception :
2024-08-25 22:52:36 +08:00
PACKAGE_DATA = { " version " : " 0.0.0 " }
VERSION = PACKAGE_DATA [ " version " ]
# Function to parse each section
def parse_section ( section ) :
items = [ ]
for li in section . find_all ( " li " ) :
# Extract raw HTML string
raw_html = str ( li )
# Extract text without HTML tags
text = li . get_text ( separator = " " , strip = True )
# Split into title and content
parts = text . split ( " : " , 1 )
title = parts [ 0 ] . strip ( ) if len ( parts ) > 1 else " "
content = parts [ 1 ] . strip ( ) if len ( parts ) > 1 else text
items . append ( { " title " : title , " content " : content , " raw " : raw_html } )
return items
try :
changelog_path = BASE_DIR / " CHANGELOG.md "
with open ( str ( changelog_path . absolute ( ) ) , " r " , encoding = " utf8 " ) as file :
changelog_content = file . read ( )
except Exception :
changelog_content = ( pkgutil . get_data ( " open_webui " , " CHANGELOG.md " ) or b " " ) . decode ( )
# Convert markdown content to HTML
html_content = markdown . markdown ( changelog_content )
# Parse the HTML content
soup = BeautifulSoup ( html_content , " html.parser " )
# Initialize JSON structure
changelog_json = { }
# Iterate over each version
for version in soup . find_all ( " h2 " ) :
version_number = version . get_text ( ) . strip ( ) . split ( " - " ) [ 0 ] [ 1 : - 1 ] # Remove brackets
date = version . get_text ( ) . strip ( ) . split ( " - " ) [ 1 ]
version_data = { " date " : date }
# Find the next sibling that is a h3 tag (section title)
current = version . find_next_sibling ( )
while current and current . name != " h2 " :
if current . name == " h3 " :
section_title = current . get_text ( ) . lower ( ) # e.g., "added", "fixed"
section_items = parse_section ( current . find_next_sibling ( " ul " ) )
version_data [ section_title ] = section_items
# Move to the next element
current = current . find_next_sibling ( )
changelog_json [ version_number ] = version_data
CHANGELOG = changelog_json
####################################
# SAFE_MODE
####################################
SAFE_MODE = os . environ . get ( " SAFE_MODE " , " false " ) . lower ( ) == " true "
2024-11-01 23:23:18 +08:00
####################################
2024-11-01 23:24:10 +08:00
# ENABLE_FORWARD_USER_INFO_HEADERS
2024-11-01 23:23:18 +08:00
####################################
2024-11-04 09:07:24 +08:00
ENABLE_FORWARD_USER_INFO_HEADERS = (
os . environ . get ( " ENABLE_FORWARD_USER_INFO_HEADERS " , " False " ) . lower ( ) == " true "
)
2024-11-01 23:23:18 +08:00
2024-08-25 22:52:36 +08:00
####################################
# WEBUI_BUILD_HASH
####################################
WEBUI_BUILD_HASH = os . environ . get ( " WEBUI_BUILD_HASH " , " dev-build " )
####################################
# DATA/FRONTEND BUILD DIR
####################################
DATA_DIR = Path ( os . getenv ( " DATA_DIR " , BACKEND_DIR / " data " ) ) . resolve ( )
2024-09-04 22:54:48 +08:00
2024-09-06 10:59:20 +08:00
if FROM_INIT_PY :
2024-09-04 23:47:51 +08:00
NEW_DATA_DIR = Path ( os . getenv ( " DATA_DIR " , OPEN_WEBUI_DIR / " data " ) ) . resolve ( )
NEW_DATA_DIR . mkdir ( parents = True , exist_ok = True )
2024-09-04 22:54:48 +08:00
# Check if the data directory exists in the package directory
2024-09-05 22:11:07 +08:00
if DATA_DIR . exists ( ) and DATA_DIR != NEW_DATA_DIR :
2024-09-04 23:47:51 +08:00
log . info ( f " Moving { DATA_DIR } to { NEW_DATA_DIR } " )
for item in DATA_DIR . iterdir ( ) :
dest = NEW_DATA_DIR / item . name
if item . is_dir ( ) :
shutil . copytree ( item , dest , dirs_exist_ok = True )
else :
shutil . copy2 ( item , dest )
2024-09-26 09:13:38 +08:00
# Zip the data directory
shutil . make_archive ( DATA_DIR . parent / " open_webui_data " , " zip " , DATA_DIR )
# Remove the old data directory
shutil . rmtree ( DATA_DIR )
2024-09-26 09:02:08 +08:00
2024-09-05 14:17:58 +08:00
DATA_DIR = Path ( os . getenv ( " DATA_DIR " , OPEN_WEBUI_DIR / " data " ) )
2024-09-04 22:54:48 +08:00
2024-10-13 15:05:28 +08:00
STATIC_DIR = Path ( os . getenv ( " STATIC_DIR " , OPEN_WEBUI_DIR / " static " ) )
2024-09-06 21:52:23 +08:00
FONTS_DIR = Path ( os . getenv ( " FONTS_DIR " , OPEN_WEBUI_DIR / " static " / " fonts " ) )
2024-08-25 22:52:36 +08:00
FRONTEND_BUILD_DIR = Path ( os . getenv ( " FRONTEND_BUILD_DIR " , BASE_DIR / " build " ) ) . resolve ( )
2024-09-05 22:11:07 +08:00
2024-09-06 10:59:20 +08:00
if FROM_INIT_PY :
2024-09-04 23:47:51 +08:00
FRONTEND_BUILD_DIR = Path (
os . getenv ( " FRONTEND_BUILD_DIR " , OPEN_WEBUI_DIR / " frontend " )
) . resolve ( )
2024-08-25 22:52:36 +08:00
####################################
# Database
####################################
# Check if the file exists
if os . path . exists ( f " { DATA_DIR } /ollama.db " ) :
# Rename the file
os . rename ( f " { DATA_DIR } /ollama.db " , f " { DATA_DIR } /webui.db " )
log . info ( " Database migrated from Ollama-WebUI successfully. " )
else :
pass
DATABASE_URL = os . environ . get ( " DATABASE_URL " , f " sqlite:/// { DATA_DIR } /webui.db " )
# Replace the postgres:// with postgresql://
if " postgres:// " in DATABASE_URL :
DATABASE_URL = DATABASE_URL . replace ( " postgres:// " , " postgresql:// " )
2024-12-10 22:18:26 +08:00
DATABASE_SCHEMA = os . environ . get ( " DATABASE_SCHEMA " , None )
2024-10-06 22:46:35 +08:00
DATABASE_POOL_SIZE = os . environ . get ( " DATABASE_POOL_SIZE " , 0 )
if DATABASE_POOL_SIZE == " " :
DATABASE_POOL_SIZE = 0
else :
try :
DATABASE_POOL_SIZE = int ( DATABASE_POOL_SIZE )
except Exception :
DATABASE_POOL_SIZE = 0
DATABASE_POOL_MAX_OVERFLOW = os . environ . get ( " DATABASE_POOL_MAX_OVERFLOW " , 0 )
if DATABASE_POOL_MAX_OVERFLOW == " " :
DATABASE_POOL_MAX_OVERFLOW = 0
else :
try :
DATABASE_POOL_MAX_OVERFLOW = int ( DATABASE_POOL_MAX_OVERFLOW )
except Exception :
DATABASE_POOL_MAX_OVERFLOW = 0
DATABASE_POOL_TIMEOUT = os . environ . get ( " DATABASE_POOL_TIMEOUT " , 30 )
if DATABASE_POOL_TIMEOUT == " " :
DATABASE_POOL_TIMEOUT = 30
else :
try :
DATABASE_POOL_TIMEOUT = int ( DATABASE_POOL_TIMEOUT )
except Exception :
DATABASE_POOL_TIMEOUT = 30
DATABASE_POOL_RECYCLE = os . environ . get ( " DATABASE_POOL_RECYCLE " , 3600 )
if DATABASE_POOL_RECYCLE == " " :
DATABASE_POOL_RECYCLE = 3600
else :
try :
DATABASE_POOL_RECYCLE = int ( DATABASE_POOL_RECYCLE )
except Exception :
DATABASE_POOL_RECYCLE = 3600
2024-08-25 22:52:36 +08:00
2024-09-25 07:06:11 +08:00
RESET_CONFIG_ON_START = (
os . environ . get ( " RESET_CONFIG_ON_START " , " False " ) . lower ( ) == " true "
)
2024-12-28 14:36:14 +08:00
ENABLE_REALTIME_CHAT_SAVE = (
2025-01-02 12:12:42 +08:00
os . environ . get ( " ENABLE_REALTIME_CHAT_SAVE " , " False " ) . lower ( ) == " true "
2024-12-28 14:36:14 +08:00
)
2024-10-09 14:37:37 +08:00
####################################
# REDIS
####################################
2025-03-09 01:59:15 +08:00
REDIS_URL = os . environ . get ( " REDIS_URL " , " " )
2025-03-27 15:51:55 +08:00
REDIS_SENTINEL_HOSTS = os . environ . get ( " REDIS_SENTINEL_HOSTS " , " " )
REDIS_SENTINEL_PORT = os . environ . get ( " REDIS_SENTINEL_PORT " , " 26379 " )
2024-10-09 14:37:37 +08:00
2025-04-09 00:38:00 +08:00
####################################
# UVICORN WORKERS
####################################
2025-04-09 00:47:48 +08:00
# Number of uvicorn worker processes for handling requests
2025-04-09 00:38:00 +08:00
UVICORN_WORKERS = os . environ . get ( " UVICORN_WORKERS " , " 1 " )
try :
UVICORN_WORKERS = int ( UVICORN_WORKERS )
if UVICORN_WORKERS < 1 :
UVICORN_WORKERS = 1
except ValueError :
UVICORN_WORKERS = 1
log . info ( f " Invalid UVICORN_WORKERS value, defaulting to { UVICORN_WORKERS } " )
2024-08-25 22:52:36 +08:00
####################################
# WEBUI_AUTH (Required for security)
####################################
WEBUI_AUTH = os . environ . get ( " WEBUI_AUTH " , " True " ) . lower ( ) == " true "
WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os . environ . get (
" WEBUI_AUTH_TRUSTED_EMAIL_HEADER " , None
)
WEBUI_AUTH_TRUSTED_NAME_HEADER = os . environ . get ( " WEBUI_AUTH_TRUSTED_NAME_HEADER " , None )
2025-05-25 03:17:12 +08:00
WEBUI_AUTH_TRUSTED_GROUPS_HEADER = os . environ . get (
" WEBUI_AUTH_TRUSTED_GROUPS_HEADER " , None
)
2024-08-25 22:52:36 +08:00
2024-12-02 10:25:44 +08:00
BYPASS_MODEL_ACCESS_CONTROL = (
os . environ . get ( " BYPASS_MODEL_ACCESS_CONTROL " , " False " ) . lower ( ) == " true "
)
2024-08-25 22:52:36 +08:00
2025-04-19 14:58:37 +08:00
WEBUI_AUTH_SIGNOUT_REDIRECT_URL = os . environ . get (
" WEBUI_AUTH_SIGNOUT_REDIRECT_URL " , None
)
2025-04-08 09:39:00 +08:00
2024-08-25 22:52:36 +08:00
####################################
# WEBUI_SECRET_KEY
####################################
WEBUI_SECRET_KEY = os . environ . get (
" WEBUI_SECRET_KEY " ,
os . environ . get (
" WEBUI_JWT_SECRET_KEY " , " t0p-s3cr3t "
) , # DEPRECATED: remove at next major version
)
2025-01-23 22:16:50 +08:00
WEBUI_SESSION_COOKIE_SAME_SITE = os . environ . get ( " WEBUI_SESSION_COOKIE_SAME_SITE " , " lax " )
2024-08-25 22:52:36 +08:00
2025-02-04 05:37:29 +08:00
WEBUI_SESSION_COOKIE_SECURE = (
os . environ . get ( " WEBUI_SESSION_COOKIE_SECURE " , " false " ) . lower ( ) == " true "
)
2025-01-23 22:16:50 +08:00
2025-02-04 05:37:29 +08:00
WEBUI_AUTH_COOKIE_SAME_SITE = os . environ . get (
" WEBUI_AUTH_COOKIE_SAME_SITE " , WEBUI_SESSION_COOKIE_SAME_SITE
)
2025-01-23 22:16:50 +08:00
2025-02-04 05:37:29 +08:00
WEBUI_AUTH_COOKIE_SECURE = (
os . environ . get (
" WEBUI_AUTH_COOKIE_SECURE " ,
os . environ . get ( " WEBUI_SESSION_COOKIE_SECURE " , " false " ) ,
) . lower ( )
== " true "
)
2024-08-25 22:52:36 +08:00
if WEBUI_AUTH and WEBUI_SECRET_KEY == " " :
raise ValueError ( ERROR_MESSAGES . ENV_VAR_NOT_FOUND )
2024-09-10 06:17:17 +08:00
ENABLE_WEBSOCKET_SUPPORT = (
os . environ . get ( " ENABLE_WEBSOCKET_SUPPORT " , " True " ) . lower ( ) == " true "
)
2024-09-21 05:43:22 +08:00
WEBSOCKET_MANAGER = os . environ . get ( " WEBSOCKET_MANAGER " , " " )
2024-10-09 14:37:37 +08:00
WEBSOCKET_REDIS_URL = os . environ . get ( " WEBSOCKET_REDIS_URL " , REDIS_URL )
2025-03-01 08:02:15 +08:00
WEBSOCKET_REDIS_LOCK_TIMEOUT = os . environ . get ( " WEBSOCKET_REDIS_LOCK_TIMEOUT " , 60 )
2024-09-30 22:32:38 +08:00
2025-03-04 18:10:07 +08:00
WEBSOCKET_SENTINEL_HOSTS = os . environ . get ( " WEBSOCKET_SENTINEL_HOSTS " , " " )
WEBSOCKET_SENTINEL_PORT = os . environ . get ( " WEBSOCKET_SENTINEL_PORT " , " 26379 " )
2024-09-30 22:32:38 +08:00
AIOHTTP_CLIENT_TIMEOUT = os . environ . get ( " AIOHTTP_CLIENT_TIMEOUT " , " " )
if AIOHTTP_CLIENT_TIMEOUT == " " :
AIOHTTP_CLIENT_TIMEOUT = None
else :
try :
AIOHTTP_CLIENT_TIMEOUT = int ( AIOHTTP_CLIENT_TIMEOUT )
except Exception :
AIOHTTP_CLIENT_TIMEOUT = 300
2024-10-08 13:13:49 +08:00
2025-04-18 13:11:42 +08:00
AIOHTTP_CLIENT_SESSION_SSL = (
os . environ . get ( " AIOHTTP_CLIENT_SESSION_SSL " , " True " ) . lower ( ) == " true "
)
2025-03-04 12:24:10 +08:00
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = os . environ . get (
" AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST " ,
2025-03-19 23:32:31 +08:00
os . environ . get ( " AIOHTTP_CLIENT_TIMEOUT_OPENAI_MODEL_LIST " , " 10 " ) ,
2024-10-14 13:56:33 +08:00
)
2024-10-14 08:52:59 +08:00
2025-03-04 12:24:10 +08:00
if AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST == " " :
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = None
2024-10-14 08:52:59 +08:00
else :
try :
2025-03-04 12:24:10 +08:00
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = int ( AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST )
2024-10-14 08:52:59 +08:00
except Exception :
2025-03-19 23:32:31 +08:00
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST = 10
2025-03-04 12:24:10 +08:00
2025-04-11 01:23:14 +08:00
AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = os . environ . get (
" AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA " , " 10 "
)
2025-04-11 02:18:53 +08:00
if AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA == " " :
AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = None
else :
try :
AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = int (
AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA
)
except Exception :
AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA = 10
2025-04-18 13:02:16 +08:00
AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL = (
os . environ . get ( " AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL " , " True " ) . lower ( ) == " true "
)
2025-04-24 00:55:18 +08:00
####################################
# SENTENCE TRANSFORMERS
####################################
SENTENCE_TRANSFORMERS_BACKEND = os . environ . get ( " SENTENCE_TRANSFORMERS_BACKEND " , " " )
if SENTENCE_TRANSFORMERS_BACKEND == " " :
SENTENCE_TRANSFORMERS_BACKEND = " torch "
SENTENCE_TRANSFORMERS_MODEL_KWARGS = os . environ . get (
" SENTENCE_TRANSFORMERS_MODEL_KWARGS " , " "
)
if SENTENCE_TRANSFORMERS_MODEL_KWARGS == " " :
SENTENCE_TRANSFORMERS_MODEL_KWARGS = None
else :
try :
SENTENCE_TRANSFORMERS_MODEL_KWARGS = json . loads (
SENTENCE_TRANSFORMERS_MODEL_KWARGS
)
except Exception :
SENTENCE_TRANSFORMERS_MODEL_KWARGS = None
SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND = os . environ . get (
" SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND " , " "
)
if SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND == " " :
SENTENCE_TRANSFORMERS_CROSS_ENCODER_BACKEND = " torch "
SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = os . environ . get (
" SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS " , " "
)
if SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS == " " :
SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = None
else :
try :
SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = json . loads (
SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS
)
except Exception :
SENTENCE_TRANSFORMERS_CROSS_ENCODER_MODEL_KWARGS = None
2024-10-08 13:13:49 +08:00
####################################
# OFFLINE_MODE
####################################
OFFLINE_MODE = os . environ . get ( " OFFLINE_MODE " , " false " ) . lower ( ) == " true "
2024-12-29 14:23:09 +08:00
if OFFLINE_MODE :
os . environ [ " HF_HUB_OFFLINE " ] = " 1 "
2025-02-20 22:15:38 +08:00
2025-04-24 00:55:18 +08:00
2025-02-20 22:15:38 +08:00
####################################
# AUDIT LOGGING
####################################
# Where to store log file
AUDIT_LOGS_FILE_PATH = f " { DATA_DIR } /audit.log "
# Maximum size of a file before rotating into a new log file
AUDIT_LOG_FILE_ROTATION_SIZE = os . getenv ( " AUDIT_LOG_FILE_ROTATION_SIZE " , " 10MB " )
# METADATA | REQUEST | REQUEST_RESPONSE
2025-03-22 15:21:05 +08:00
AUDIT_LOG_LEVEL = os . getenv ( " AUDIT_LOG_LEVEL " , " NONE " ) . upper ( )
2025-02-20 22:15:38 +08:00
try :
MAX_BODY_LOG_SIZE = int ( os . environ . get ( " MAX_BODY_LOG_SIZE " ) or 2048 )
except ValueError :
MAX_BODY_LOG_SIZE = 2048
# Comma separated list for urls to exclude from audit
AUDIT_EXCLUDED_PATHS = os . getenv ( " AUDIT_EXCLUDED_PATHS " , " /chats,/chat,/folders " ) . split (
" , "
)
AUDIT_EXCLUDED_PATHS = [ path . strip ( ) for path in AUDIT_EXCLUDED_PATHS ]
AUDIT_EXCLUDED_PATHS = [ path . lstrip ( " / " ) for path in AUDIT_EXCLUDED_PATHS ]
2025-03-10 22:27:31 +08:00
2025-04-24 00:55:18 +08:00
2025-03-10 22:27:31 +08:00
####################################
# OPENTELEMETRY
####################################
2025-03-12 02:55:30 +08:00
ENABLE_OTEL = os . environ . get ( " ENABLE_OTEL " , " False " ) . lower ( ) == " true "
2025-03-11 11:53:03 +08:00
OTEL_EXPORTER_OTLP_ENDPOINT = os . environ . get (
" OTEL_EXPORTER_OTLP_ENDPOINT " , " http://localhost:4317 "
)
OTEL_SERVICE_NAME = os . environ . get ( " OTEL_SERVICE_NAME " , " open-webui " )
OTEL_RESOURCE_ATTRIBUTES = os . environ . get (
" OTEL_RESOURCE_ATTRIBUTES " , " "
) # e.g. key1=val1,key2=val2
OTEL_TRACES_SAMPLER = os . environ . get (
" OTEL_TRACES_SAMPLER " , " parentbased_always_on "
) . lower ( )
2025-03-13 05:15:26 +08:00
####################################
# TOOLS/FUNCTIONS PIP OPTIONS
####################################
PIP_OPTIONS = os . getenv ( " PIP_OPTIONS " , " " ) . split ( )
PIP_PACKAGE_INDEX_OPTIONS = os . getenv ( " PIP_PACKAGE_INDEX_OPTIONS " , " " ) . split ( )
2025-04-11 01:35:43 +08:00
####################################
# PROGRESSIVE WEB APP OPTIONS
####################################
2025-04-13 07:35:11 +08:00
EXTERNAL_PWA_MANIFEST_URL = os . environ . get ( " EXTERNAL_PWA_MANIFEST_URL " )