2024-08-28 06:10:27 +08:00
import json
2024-03-21 07:11:36 +08:00
import logging
2024-08-28 06:10:27 +08:00
import os
import shutil
2025-02-16 18:33:25 +08:00
import base64
2025-03-09 01:59:15 +08:00
import redis
2025-02-16 18:33:25 +08:00
2024-08-25 22:52:36 +08:00
from datetime import datetime
2024-01-07 17:40:36 +08:00
from pathlib import Path
2025-08-04 18:15:08 +08:00
from typing import Generic , Union , Optional , TypeVar
2024-08-28 06:10:27 +08:00
from urllib . parse import urlparse
2024-02-25 14:35:11 +08:00
2024-02-24 09:12:19 +08:00
import requests
2025-01-16 08:01:26 +08:00
from pydantic import BaseModel
from sqlalchemy import JSON , Column , DateTime , Integer , func
2025-07-10 15:14:53 +08:00
from authlib . integrations . starlette_client import OAuth
2025-01-16 08:01:26 +08:00
2024-09-04 22:54:48 +08:00
from open_webui . env import (
2024-08-28 06:10:27 +08:00
DATA_DIR ,
2025-01-16 08:01:26 +08:00
DATABASE_URL ,
2024-08-28 06:10:27 +08:00
ENV ,
2025-03-09 01:59:15 +08:00
REDIS_URL ,
2025-06-29 01:11:26 +08:00
REDIS_KEY_PREFIX ,
2025-03-27 15:51:55 +08:00
REDIS_SENTINEL_HOSTS ,
REDIS_SENTINEL_PORT ,
2024-08-28 06:10:27 +08:00
FRONTEND_BUILD_DIR ,
2025-01-16 08:01:26 +08:00
OFFLINE_MODE ,
OPEN_WEBUI_DIR ,
2024-08-25 22:52:36 +08:00
WEBUI_AUTH ,
2024-08-28 06:10:27 +08:00
WEBUI_FAVICON_URL ,
WEBUI_NAME ,
2024-08-25 22:52:36 +08:00
log ,
)
2025-01-16 08:01:26 +08:00
from open_webui . internal . db import Base , get_db
2025-03-18 16:28:47 +08:00
from open_webui . utils . redis import get_redis_connection
2024-07-18 04:24:34 +08:00
2025-03-29 02:47:14 +08:00
2024-07-18 04:24:34 +08:00
class EndpointFilter ( logging . Filter ) :
def filter ( self , record : logging . LogRecord ) - > bool :
return record . getMessage ( ) . find ( " /health " ) == - 1
# Filter out /endpoint
logging . getLogger ( " uvicorn.access " ) . addFilter ( EndpointFilter ( ) )
2024-01-07 17:40:36 +08:00
####################################
2024-08-25 22:52:36 +08:00
# Config helpers
2024-01-07 17:40:36 +08:00
####################################
2024-08-25 22:52:36 +08:00
# Function to run the alembic migrations
def run_migrations ( ) :
2025-02-25 22:36:25 +08:00
log . info ( " Running migrations " )
2024-05-20 11:12:03 +08:00
try :
2024-08-25 22:52:36 +08:00
from alembic import command
2024-08-28 06:10:27 +08:00
from alembic . config import Config
2024-02-23 16:36:53 +08:00
2024-09-04 22:54:48 +08:00
alembic_cfg = Config ( OPEN_WEBUI_DIR / " alembic.ini " )
2024-09-04 23:33:39 +08:00
# Set the script location dynamically
migrations_path = OPEN_WEBUI_DIR / " migrations "
alembic_cfg . set_main_option ( " script_location " , str ( migrations_path ) )
2024-08-25 22:52:36 +08:00
command . upgrade ( alembic_cfg , " head " )
except Exception as e :
2025-02-25 22:36:25 +08:00
log . exception ( f " Error running migrations: { e } " )
2024-05-10 14:18:39 +08:00
2024-02-23 16:36:53 +08:00
2024-10-06 03:40:13 +08:00
run_migrations ( )
2024-08-25 22:52:36 +08:00
class Config ( Base ) :
__tablename__ = " config "
2024-05-09 07:33:34 +08:00
2024-08-25 22:52:36 +08:00
id = Column ( Integer , primary_key = True )
data = Column ( JSON , nullable = False )
version = Column ( Integer , nullable = False , default = 0 )
created_at = Column ( DateTime , nullable = False , server_default = func . now ( ) )
updated_at = Column ( DateTime , nullable = True , onupdate = func . now ( ) )
2024-05-09 07:33:34 +08:00
2024-04-09 18:32:28 +08:00
2024-08-25 23:54:51 +08:00
def load_json_config ( ) :
2024-08-25 22:52:36 +08:00
with open ( f " { DATA_DIR } /config.json " , " r " ) as file :
return json . load ( file )
2024-04-09 18:32:28 +08:00
2024-06-03 09:14:36 +08:00
2024-08-25 22:52:36 +08:00
def save_to_db ( data ) :
with get_db ( ) as db :
existing_config = db . query ( Config ) . first ( )
if not existing_config :
new_config = Config ( data = data , version = 0 )
db . add ( new_config )
else :
existing_config . data = data
2024-08-25 23:54:51 +08:00
existing_config . updated_at = datetime . now ( )
db . add ( existing_config )
2024-08-25 22:52:36 +08:00
db . commit ( )
2024-04-09 18:32:28 +08:00
2024-05-10 13:36:10 +08:00
2024-09-25 07:06:11 +08:00
def reset_config ( ) :
with get_db ( ) as db :
db . query ( Config ) . delete ( )
db . commit ( )
2024-08-25 22:52:36 +08:00
# When initializing, check if config.json exists and migrate it to the database
if os . path . exists ( f " { DATA_DIR } /config.json " ) :
2024-08-25 23:54:51 +08:00
data = load_json_config ( )
2024-08-25 22:52:36 +08:00
save_to_db ( data )
os . rename ( f " { DATA_DIR } /config.json " , f " { DATA_DIR } /old_config.json " )
2024-05-10 13:36:10 +08:00
2024-08-26 00:42:27 +08:00
DEFAULT_CONFIG = {
" version " : 0 ,
2025-05-10 21:08:09 +08:00
" ui " : { } ,
2024-08-26 00:42:27 +08:00
}
2024-08-25 23:54:51 +08:00
def get_config ( ) :
with get_db ( ) as db :
config_entry = db . query ( Config ) . order_by ( Config . id . desc ( ) ) . first ( )
2024-08-26 00:42:27 +08:00
return config_entry . data if config_entry else DEFAULT_CONFIG
2024-08-25 23:54:51 +08:00
CONFIG_DATA = get_config ( )
2024-05-10 13:36:10 +08:00
def get_config_value ( config_path : str ) :
path_parts = config_path . split ( " . " )
cur_config = CONFIG_DATA
for key in path_parts :
if key in cur_config :
cur_config = cur_config [ key ]
else :
return None
return cur_config
2024-09-04 03:46:40 +08:00
PERSISTENT_CONFIG_REGISTRY = [ ]
def save_config ( config ) :
global CONFIG_DATA
global PERSISTENT_CONFIG_REGISTRY
try :
save_to_db ( config )
CONFIG_DATA = config
# Trigger updates on all registered PersistentConfig entries
for config_item in PERSISTENT_CONFIG_REGISTRY :
config_item . update ( )
except Exception as e :
log . exception ( e )
return False
return True
2024-05-10 13:36:10 +08:00
T = TypeVar ( " T " )
2025-04-13 07:33:36 +08:00
ENABLE_PERSISTENT_CONFIG = (
os . environ . get ( " ENABLE_PERSISTENT_CONFIG " , " True " ) . lower ( ) == " true "
)
2024-05-10 13:36:10 +08:00
2024-05-14 05:32:21 +08:00
class PersistentConfig ( Generic [ T ] ) :
2024-05-10 13:36:10 +08:00
def __init__ ( self , env_name : str , config_path : str , env_value : T ) :
self . env_name = env_name
self . config_path = config_path
self . env_value = env_value
2024-08-25 23:54:51 +08:00
self . config_value = get_config_value ( config_path )
2025-08-09 04:46:14 +08:00
2025-04-10 03:22:25 +08:00
if self . config_value is not None and ENABLE_PERSISTENT_CONFIG :
2025-08-09 04:46:14 +08:00
if (
self . config_path . startswith ( " oauth. " )
and not ENABLE_OAUTH_PERSISTENT_CONFIG
) :
log . info (
f " Skipping loading of ' { env_name } ' as OAuth persistent config is disabled "
)
self . value = env_value
else :
log . info ( f " ' { env_name } ' loaded from the latest database entry " )
self . value = self . config_value
2024-05-10 13:36:10 +08:00
else :
self . value = env_value
2024-09-04 03:46:40 +08:00
PERSISTENT_CONFIG_REGISTRY . append ( self )
2024-05-10 13:36:10 +08:00
def __str__ ( self ) :
return str ( self . value )
2024-08-25 23:54:51 +08:00
@property
def __dict__ ( self ) :
raise TypeError (
" PersistentConfig object cannot be converted to dict, use config_get or .value instead. "
)
def __getattribute__ ( self , item ) :
if item == " __dict__ " :
raise TypeError (
" PersistentConfig object cannot be converted to dict, use config_get or .value instead. "
)
return super ( ) . __getattribute__ ( item )
2024-05-10 14:18:39 +08:00
2024-09-04 03:46:40 +08:00
def update ( self ) :
new_value = get_config_value ( self . config_path )
if new_value is not None :
self . value = new_value
log . info ( f " Updated { self . env_name } to new value { self . value } " )
2024-05-10 13:36:10 +08:00
def save ( self ) :
2024-08-25 22:52:36 +08:00
log . info ( f " Saving ' { self . env_name } ' to the database " )
2024-05-10 13:36:10 +08:00
path_parts = self . config_path . split ( " . " )
2024-08-25 23:54:51 +08:00
sub_config = CONFIG_DATA
for key in path_parts [ : - 1 ] :
if key not in sub_config :
sub_config [ key ] = { }
sub_config = sub_config [ key ]
sub_config [ path_parts [ - 1 ] ] = self . value
save_to_db ( CONFIG_DATA )
2024-05-10 13:36:10 +08:00
self . config_value = self . value
2024-05-10 15:03:24 +08:00
class AppConfig :
2025-08-04 18:15:08 +08:00
_redis : Union [ redis . Redis , redis . cluster . RedisCluster ] = None
2025-06-29 01:11:26 +08:00
_redis_key_prefix : str
2024-05-10 15:03:24 +08:00
2025-09-21 12:14:43 +08:00
_state : dict [ str , PersistentConfig ]
2025-03-29 02:47:14 +08:00
def __init__ (
2025-06-29 01:18:30 +08:00
self ,
redis_url : Optional [ str ] = None ,
redis_sentinels : Optional [ list ] = [ ] ,
2025-08-04 18:15:08 +08:00
redis_cluster : Optional [ bool ] = False ,
2025-06-29 01:18:30 +08:00
redis_key_prefix : str = " open-webui " ,
2025-03-29 02:47:14 +08:00
) :
2025-03-09 01:59:15 +08:00
if redis_url :
2025-09-21 12:14:43 +08:00
super ( ) . __setattr__ ( " _redis_key_prefix " , redis_key_prefix )
2025-03-09 01:59:15 +08:00
super ( ) . __setattr__ (
2025-03-29 02:47:14 +08:00
" _redis " ,
2025-08-04 18:15:08 +08:00
get_redis_connection (
redis_url ,
redis_sentinels ,
redis_cluster ,
decode_responses = True ,
) ,
2025-03-09 01:59:15 +08:00
)
2024-05-10 15:03:24 +08:00
2025-09-21 12:14:43 +08:00
super ( ) . __setattr__ ( " _state " , { } )
2024-05-10 15:03:24 +08:00
def __setattr__ ( self , key , value ) :
2024-05-14 05:32:21 +08:00
if isinstance ( value , PersistentConfig ) :
2024-05-10 15:03:24 +08:00
self . _state [ key ] = value
else :
self . _state [ key ] . value = value
self . _state [ key ] . save ( )
2025-03-09 01:59:15 +08:00
if self . _redis :
2025-06-29 01:11:26 +08:00
redis_key = f " { self . _redis_key_prefix } :config: { key } "
2025-03-09 01:59:15 +08:00
self . _redis . set ( redis_key , json . dumps ( self . _state [ key ] . value ) )
2024-05-10 15:03:24 +08:00
def __getattr__ ( self , key ) :
2025-03-09 01:59:15 +08:00
if key not in self . _state :
raise AttributeError ( f " Config key ' { key } ' not found " )
# If Redis is available, check for an updated value
if self . _redis :
2025-06-29 01:11:26 +08:00
redis_key = f " { self . _redis_key_prefix } :config: { key } "
2025-03-09 01:59:15 +08:00
redis_value = self . _redis . get ( redis_key )
if redis_value is not None :
try :
decoded_value = json . loads ( redis_value )
# Update the in-memory value if different
if self . _state [ key ] . value != decoded_value :
self . _state [ key ] . value = decoded_value
log . info ( f " Updated { key } from Redis: { decoded_value } " )
except json . JSONDecodeError :
log . error ( f " Invalid JSON format in Redis for { key } : { redis_value } " )
2024-05-10 15:03:24 +08:00
return self . _state [ key ] . value
2024-05-10 13:36:10 +08:00
####################################
# WEBUI_AUTH (Required for security)
####################################
2024-11-20 04:17:23 +08:00
ENABLE_API_KEY = PersistentConfig (
" ENABLE_API_KEY " ,
" auth.api_key.enable " ,
os . environ . get ( " ENABLE_API_KEY " , " True " ) . lower ( ) == " true " ,
2024-11-19 22:14:52 +08:00
)
2024-12-27 12:57:51 +08:00
ENABLE_API_KEY_ENDPOINT_RESTRICTIONS = PersistentConfig (
" ENABLE_API_KEY_ENDPOINT_RESTRICTIONS " ,
" auth.api_key.endpoint_restrictions " ,
os . environ . get ( " ENABLE_API_KEY_ENDPOINT_RESTRICTIONS " , " False " ) . lower ( ) == " true " ,
)
API_KEY_ALLOWED_ENDPOINTS = PersistentConfig (
" API_KEY_ALLOWED_ENDPOINTS " ,
" auth.api_key.allowed_endpoints " ,
os . environ . get ( " API_KEY_ALLOWED_ENDPOINTS " , " " ) ,
)
2024-11-20 04:17:23 +08:00
2024-05-14 05:32:21 +08:00
JWT_EXPIRES_IN = PersistentConfig (
2024-05-10 13:36:10 +08:00
" JWT_EXPIRES_IN " , " auth.jwt_expiry " , os . environ . get ( " JWT_EXPIRES_IN " , " -1 " )
)
2024-05-26 15:37:09 +08:00
####################################
# OAuth config
####################################
2025-08-09 04:46:14 +08:00
ENABLE_OAUTH_PERSISTENT_CONFIG = (
2025-09-01 06:41:29 +08:00
os . environ . get ( " ENABLE_OAUTH_PERSISTENT_CONFIG " , " False " ) . lower ( ) == " true "
2025-08-09 04:46:14 +08:00
)
2025-04-03 08:24:14 +08:00
2024-05-26 15:37:09 +08:00
ENABLE_OAUTH_SIGNUP = PersistentConfig (
" ENABLE_OAUTH_SIGNUP " ,
" oauth.enable_signup " ,
os . environ . get ( " ENABLE_OAUTH_SIGNUP " , " False " ) . lower ( ) == " true " ,
)
2025-04-03 10:23:24 +08:00
2024-05-28 00:21:24 +08:00
OAUTH_MERGE_ACCOUNTS_BY_EMAIL = PersistentConfig (
" OAUTH_MERGE_ACCOUNTS_BY_EMAIL " ,
" oauth.merge_accounts_by_email " ,
os . environ . get ( " OAUTH_MERGE_ACCOUNTS_BY_EMAIL " , " False " ) . lower ( ) == " true " ,
)
2024-05-26 15:37:09 +08:00
OAUTH_PROVIDERS = { }
2024-05-28 00:21:24 +08:00
GOOGLE_CLIENT_ID = PersistentConfig (
2024-12-17 04:10:01 +08:00
" GOOGLE_CLIENT_ID " ,
2024-05-28 00:21:24 +08:00
" oauth.google.client_id " ,
os . environ . get ( " GOOGLE_CLIENT_ID " , " " ) ,
)
GOOGLE_CLIENT_SECRET = PersistentConfig (
" GOOGLE_CLIENT_SECRET " ,
2024-12-17 04:10:01 +08:00
" oauth.google.client_secret " ,
2024-05-28 00:21:24 +08:00
os . environ . get ( " GOOGLE_CLIENT_SECRET " , " " ) ,
)
2024-12-17 03:43:33 +08:00
2024-05-28 00:21:24 +08:00
GOOGLE_OAUTH_SCOPE = PersistentConfig (
" GOOGLE_OAUTH_SCOPE " ,
" oauth.google.scope " ,
os . environ . get ( " GOOGLE_OAUTH_SCOPE " , " openid email profile " ) ,
)
2024-07-19 15:03:41 +08:00
GOOGLE_REDIRECT_URI = PersistentConfig (
" GOOGLE_REDIRECT_URI " ,
" oauth.google.redirect_uri " ,
os . environ . get ( " GOOGLE_REDIRECT_URI " , " " ) ,
)
2024-05-28 00:21:24 +08:00
MICROSOFT_CLIENT_ID = PersistentConfig (
" MICROSOFT_CLIENT_ID " ,
" oauth.microsoft.client_id " ,
os . environ . get ( " MICROSOFT_CLIENT_ID " , " " ) ,
)
MICROSOFT_CLIENT_SECRET = PersistentConfig (
" MICROSOFT_CLIENT_SECRET " ,
" oauth.microsoft.client_secret " ,
os . environ . get ( " MICROSOFT_CLIENT_SECRET " , " " ) ,
)
MICROSOFT_CLIENT_TENANT_ID = PersistentConfig (
" MICROSOFT_CLIENT_TENANT_ID " ,
" oauth.microsoft.tenant_id " ,
os . environ . get ( " MICROSOFT_CLIENT_TENANT_ID " , " " ) ,
)
2025-06-09 21:43:22 +08:00
MICROSOFT_CLIENT_LOGIN_BASE_URL = PersistentConfig (
" MICROSOFT_CLIENT_LOGIN_BASE_URL " ,
" oauth.microsoft.login_base_url " ,
os . environ . get (
" MICROSOFT_CLIENT_LOGIN_BASE_URL " , " https://login.microsoftonline.com "
) ,
)
MICROSOFT_CLIENT_PICTURE_URL = PersistentConfig (
" MICROSOFT_CLIENT_PICTURE_URL " ,
" oauth.microsoft.picture_url " ,
os . environ . get (
" MICROSOFT_CLIENT_PICTURE_URL " ,
" https://graph.microsoft.com/v1.0/me/photo/$value " ,
) ,
)
2024-05-28 00:21:24 +08:00
MICROSOFT_OAUTH_SCOPE = PersistentConfig (
" MICROSOFT_OAUTH_SCOPE " ,
" oauth.microsoft.scope " ,
os . environ . get ( " MICROSOFT_OAUTH_SCOPE " , " openid email profile " ) ,
)
2024-07-19 15:03:41 +08:00
MICROSOFT_REDIRECT_URI = PersistentConfig (
" MICROSOFT_REDIRECT_URI " ,
" oauth.microsoft.redirect_uri " ,
os . environ . get ( " MICROSOFT_REDIRECT_URI " , " " ) ,
)
2025-01-17 13:22:35 +08:00
GITHUB_CLIENT_ID = PersistentConfig (
" GITHUB_CLIENT_ID " ,
" oauth.github.client_id " ,
os . environ . get ( " GITHUB_CLIENT_ID " , " " ) ,
)
GITHUB_CLIENT_SECRET = PersistentConfig (
" GITHUB_CLIENT_SECRET " ,
" oauth.github.client_secret " ,
os . environ . get ( " GITHUB_CLIENT_SECRET " , " " ) ,
)
GITHUB_CLIENT_SCOPE = PersistentConfig (
" GITHUB_CLIENT_SCOPE " ,
" oauth.github.scope " ,
os . environ . get ( " GITHUB_CLIENT_SCOPE " , " user:email " ) ,
)
GITHUB_CLIENT_REDIRECT_URI = PersistentConfig (
" GITHUB_CLIENT_REDIRECT_URI " ,
" oauth.github.redirect_uri " ,
os . environ . get ( " GITHUB_CLIENT_REDIRECT_URI " , " " ) ,
)
2024-05-28 00:21:24 +08:00
OAUTH_CLIENT_ID = PersistentConfig (
" OAUTH_CLIENT_ID " ,
" oauth.oidc.client_id " ,
os . environ . get ( " OAUTH_CLIENT_ID " , " " ) ,
)
OAUTH_CLIENT_SECRET = PersistentConfig (
" OAUTH_CLIENT_SECRET " ,
" oauth.oidc.client_secret " ,
os . environ . get ( " OAUTH_CLIENT_SECRET " , " " ) ,
)
OPENID_PROVIDER_URL = PersistentConfig (
" OPENID_PROVIDER_URL " ,
" oauth.oidc.provider_url " ,
os . environ . get ( " OPENID_PROVIDER_URL " , " " ) ,
)
2024-07-19 15:03:41 +08:00
OPENID_REDIRECT_URI = PersistentConfig (
" OPENID_REDIRECT_URI " ,
" oauth.oidc.redirect_uri " ,
os . environ . get ( " OPENID_REDIRECT_URI " , " " ) ,
)
2024-05-28 00:21:24 +08:00
OAUTH_SCOPES = PersistentConfig (
" OAUTH_SCOPES " ,
" oauth.oidc.scopes " ,
os . environ . get ( " OAUTH_SCOPES " , " openid email profile " ) ,
)
2025-06-28 03:08:46 +08:00
OAUTH_TIMEOUT = PersistentConfig (
" OAUTH_TIMEOUT " ,
" oauth.oidc.oauth_timeout " ,
2025-06-28 04:48:24 +08:00
os . environ . get ( " OAUTH_TIMEOUT " , " " ) ,
2025-06-28 03:08:46 +08:00
)
2025-07-16 19:46:33 +08:00
OAUTH_TOKEN_ENDPOINT_AUTH_METHOD = PersistentConfig (
" OAUTH_TOKEN_ENDPOINT_AUTH_METHOD " ,
" oauth.oidc.token_endpoint_auth_method " ,
os . environ . get ( " OAUTH_TOKEN_ENDPOINT_AUTH_METHOD " , None ) ,
)
2025-03-27 01:24:49 +08:00
OAUTH_CODE_CHALLENGE_METHOD = PersistentConfig (
" OAUTH_CODE_CHALLENGE_METHOD " ,
" oauth.oidc.code_challenge_method " ,
os . environ . get ( " OAUTH_CODE_CHALLENGE_METHOD " , None ) ,
)
2024-05-28 00:21:24 +08:00
OAUTH_PROVIDER_NAME = PersistentConfig (
" OAUTH_PROVIDER_NAME " ,
" oauth.oidc.provider_name " ,
os . environ . get ( " OAUTH_PROVIDER_NAME " , " SSO " ) ,
)
2025-08-09 04:46:14 +08:00
OAUTH_SUB_CLAIM = PersistentConfig (
" OAUTH_SUB_CLAIM " ,
" oauth.oidc.sub_claim " ,
os . environ . get ( " OAUTH_SUB_CLAIM " , None ) ,
)
2024-06-28 21:31:40 +08:00
OAUTH_USERNAME_CLAIM = PersistentConfig (
" OAUTH_USERNAME_CLAIM " ,
" oauth.oidc.username_claim " ,
os . environ . get ( " OAUTH_USERNAME_CLAIM " , " name " ) ,
)
2025-04-03 10:23:24 +08:00
2024-06-28 21:31:40 +08:00
OAUTH_PICTURE_CLAIM = PersistentConfig (
2024-10-04 02:55:32 +08:00
" OAUTH_PICTURE_CLAIM " ,
2024-06-28 21:31:40 +08:00
" oauth.oidc.avatar_claim " ,
os . environ . get ( " OAUTH_PICTURE_CLAIM " , " picture " ) ,
)
2024-08-08 02:39:51 +08:00
OAUTH_EMAIL_CLAIM = PersistentConfig (
" OAUTH_EMAIL_CLAIM " ,
" oauth.oidc.email_claim " ,
os . environ . get ( " OAUTH_EMAIL_CLAIM " , " email " ) ,
)
2024-12-18 03:38:07 +08:00
OAUTH_GROUPS_CLAIM = PersistentConfig (
" OAUTH_GROUPS_CLAIM " ,
" oauth.oidc.group_claim " ,
2025-08-15 03:59:54 +08:00
os . environ . get ( " OAUTH_GROUPS_CLAIM " , os . environ . get ( " OAUTH_GROUP_CLAIM " , " groups " ) ) ,
2024-12-18 03:38:07 +08:00
)
2025-07-30 16:00:15 +08:00
FEISHU_CLIENT_ID = PersistentConfig (
" FEISHU_CLIENT_ID " ,
" oauth.feishu.client_id " ,
os . environ . get ( " FEISHU_CLIENT_ID " , " " ) ,
)
FEISHU_CLIENT_SECRET = PersistentConfig (
" FEISHU_CLIENT_SECRET " ,
" oauth.feishu.client_secret " ,
os . environ . get ( " FEISHU_CLIENT_SECRET " , " " ) ,
)
FEISHU_OAUTH_SCOPE = PersistentConfig (
" FEISHU_OAUTH_SCOPE " ,
" oauth.feishu.scope " ,
os . environ . get ( " FEISHU_OAUTH_SCOPE " , " contact:user.base:readonly " ) ,
)
FEISHU_REDIRECT_URI = PersistentConfig (
" FEISHU_REDIRECT_URI " ,
" oauth.feishu.redirect_uri " ,
os . environ . get ( " FEISHU_REDIRECT_URI " , " " ) ,
)
2024-10-11 05:00:05 +08:00
ENABLE_OAUTH_ROLE_MANAGEMENT = PersistentConfig (
" ENABLE_OAUTH_ROLE_MANAGEMENT " ,
2024-10-04 02:55:32 +08:00
" oauth.enable_role_mapping " ,
2024-10-11 05:00:05 +08:00
os . environ . get ( " ENABLE_OAUTH_ROLE_MANAGEMENT " , " False " ) . lower ( ) == " true " ,
2024-10-04 02:55:32 +08:00
)
2024-12-18 03:38:07 +08:00
ENABLE_OAUTH_GROUP_MANAGEMENT = PersistentConfig (
" ENABLE_OAUTH_GROUP_MANAGEMENT " ,
" oauth.enable_group_mapping " ,
os . environ . get ( " ENABLE_OAUTH_GROUP_MANAGEMENT " , " False " ) . lower ( ) == " true " ,
)
2025-04-19 09:21:49 +08:00
ENABLE_OAUTH_GROUP_CREATION = PersistentConfig (
" ENABLE_OAUTH_GROUP_CREATION " ,
" oauth.enable_group_creation " ,
os . environ . get ( " ENABLE_OAUTH_GROUP_CREATION " , " False " ) . lower ( ) == " true " ,
)
2025-05-02 18:47:02 +08:00
OAUTH_BLOCKED_GROUPS = PersistentConfig (
" OAUTH_BLOCKED_GROUPS " ,
" oauth.blocked_groups " ,
os . environ . get ( " OAUTH_BLOCKED_GROUPS " , " [] " ) ,
)
2024-10-04 02:55:32 +08:00
OAUTH_ROLES_CLAIM = PersistentConfig (
" OAUTH_ROLES_CLAIM " ,
" oauth.roles_claim " ,
os . environ . get ( " OAUTH_ROLES_CLAIM " , " roles " ) ,
)
2024-10-11 05:00:05 +08:00
OAUTH_ALLOWED_ROLES = PersistentConfig (
" OAUTH_ALLOWED_ROLES " ,
" oauth.allowed_roles " ,
2024-10-21 09:38:06 +08:00
[
role . strip ( )
for role in os . environ . get ( " OAUTH_ALLOWED_ROLES " , " user,admin " ) . split ( " , " )
] ,
2024-10-11 05:00:05 +08:00
)
OAUTH_ADMIN_ROLES = PersistentConfig (
" OAUTH_ADMIN_ROLES " ,
" oauth.admin_roles " ,
[ role . strip ( ) for role in os . environ . get ( " OAUTH_ADMIN_ROLES " , " admin " ) . split ( " , " ) ] ,
)
2024-05-26 15:37:09 +08:00
2024-12-02 16:36:56 +08:00
OAUTH_ALLOWED_DOMAINS = PersistentConfig (
" OAUTH_ALLOWED_DOMAINS " ,
" oauth.allowed_domains " ,
2024-12-10 16:54:13 +08:00
[
domain . strip ( )
for domain in os . environ . get ( " OAUTH_ALLOWED_DOMAINS " , " * " ) . split ( " , " )
] ,
2024-12-02 16:36:56 +08:00
)
2025-05-07 00:00:35 +08:00
OAUTH_UPDATE_PICTURE_ON_LOGIN = PersistentConfig (
" OAUTH_UPDATE_PICTURE_ON_LOGIN " ,
" oauth.update_picture_on_login " ,
os . environ . get ( " OAUTH_UPDATE_PICTURE_ON_LOGIN " , " False " ) . lower ( ) == " true " ,
)
2024-10-21 09:38:06 +08:00
2024-05-28 00:21:24 +08:00
def load_oauth_providers ( ) :
OAUTH_PROVIDERS . clear ( )
if GOOGLE_CLIENT_ID . value and GOOGLE_CLIENT_SECRET . value :
2025-01-20 03:59:07 +08:00
2025-07-10 15:14:53 +08:00
def google_oauth_register ( client : OAuth ) :
2025-01-17 12:56:03 +08:00
client . register (
name = " google " ,
client_id = GOOGLE_CLIENT_ID . value ,
client_secret = GOOGLE_CLIENT_SECRET . value ,
server_metadata_url = " https://accounts.google.com/.well-known/openid-configuration " ,
2025-06-28 03:08:46 +08:00
client_kwargs = {
" scope " : GOOGLE_OAUTH_SCOPE . value ,
2025-06-28 04:48:24 +08:00
* * (
{ " timeout " : int ( OAUTH_TIMEOUT . value ) }
if OAUTH_TIMEOUT . value
else { }
) ,
} ,
2025-01-17 12:56:03 +08:00
redirect_uri = GOOGLE_REDIRECT_URI . value ,
)
2025-01-20 03:59:07 +08:00
2024-05-28 00:21:24 +08:00
OAUTH_PROVIDERS [ " google " ] = {
2024-07-19 15:03:41 +08:00
" redirect_uri " : GOOGLE_REDIRECT_URI . value ,
2025-01-17 12:56:03 +08:00
" register " : google_oauth_register ,
2024-05-28 00:21:24 +08:00
}
if (
MICROSOFT_CLIENT_ID . value
and MICROSOFT_CLIENT_SECRET . value
and MICROSOFT_CLIENT_TENANT_ID . value
) :
2025-01-20 03:59:07 +08:00
2025-07-10 15:14:53 +08:00
def microsoft_oauth_register ( client : OAuth ) :
2025-01-17 12:56:03 +08:00
client . register (
name = " microsoft " ,
client_id = MICROSOFT_CLIENT_ID . value ,
client_secret = MICROSOFT_CLIENT_SECRET . value ,
2025-06-09 21:43:22 +08:00
server_metadata_url = f " { MICROSOFT_CLIENT_LOGIN_BASE_URL . value } / { MICROSOFT_CLIENT_TENANT_ID . value } /v2.0/.well-known/openid-configuration?appid= { MICROSOFT_CLIENT_ID . value } " ,
2025-01-17 12:56:03 +08:00
client_kwargs = {
" scope " : MICROSOFT_OAUTH_SCOPE . value ,
2025-06-28 04:48:24 +08:00
* * (
{ " timeout " : int ( OAUTH_TIMEOUT . value ) }
if OAUTH_TIMEOUT . value
else { }
) ,
2025-01-17 12:56:03 +08:00
} ,
redirect_uri = MICROSOFT_REDIRECT_URI . value ,
)
2025-01-20 03:59:07 +08:00
2024-05-28 00:21:24 +08:00
OAUTH_PROVIDERS [ " microsoft " ] = {
2024-07-19 15:03:41 +08:00
" redirect_uri " : MICROSOFT_REDIRECT_URI . value ,
2025-06-09 21:43:22 +08:00
" picture_url " : MICROSOFT_CLIENT_PICTURE_URL . value ,
2025-01-17 12:56:03 +08:00
" register " : microsoft_oauth_register ,
2024-05-28 00:21:24 +08:00
}
2025-01-17 13:22:35 +08:00
if GITHUB_CLIENT_ID . value and GITHUB_CLIENT_SECRET . value :
2025-01-20 03:59:07 +08:00
2025-07-10 15:14:53 +08:00
def github_oauth_register ( client : OAuth ) :
2025-01-17 13:22:35 +08:00
client . register (
name = " github " ,
client_id = GITHUB_CLIENT_ID . value ,
client_secret = GITHUB_CLIENT_SECRET . value ,
access_token_url = " https://github.com/login/oauth/access_token " ,
authorize_url = " https://github.com/login/oauth/authorize " ,
api_base_url = " https://api.github.com " ,
userinfo_endpoint = " https://api.github.com/user " ,
2025-06-28 03:08:46 +08:00
client_kwargs = {
" scope " : GITHUB_CLIENT_SCOPE . value ,
2025-06-28 04:48:24 +08:00
* * (
{ " timeout " : int ( OAUTH_TIMEOUT . value ) }
if OAUTH_TIMEOUT . value
else { }
) ,
2025-06-28 03:08:46 +08:00
} ,
2025-01-17 13:22:35 +08:00
redirect_uri = GITHUB_CLIENT_REDIRECT_URI . value ,
)
2025-01-20 03:59:07 +08:00
2025-01-17 13:22:35 +08:00
OAUTH_PROVIDERS [ " github " ] = {
" redirect_uri " : GITHUB_CLIENT_REDIRECT_URI . value ,
" register " : github_oauth_register ,
" sub_claim " : " id " ,
}
2024-05-28 00:21:24 +08:00
if (
OAUTH_CLIENT_ID . value
2025-08-29 02:47:13 +08:00
and ( OAUTH_CLIENT_SECRET . value or OAUTH_CODE_CHALLENGE_METHOD . value )
2024-05-28 00:21:24 +08:00
and OPENID_PROVIDER_URL . value
) :
2025-01-20 03:59:07 +08:00
2025-07-10 15:14:53 +08:00
def oidc_oauth_register ( client : OAuth ) :
2025-03-27 01:24:49 +08:00
client_kwargs = {
" scope " : OAUTH_SCOPES . value ,
2025-06-28 04:48:24 +08:00
* * (
2025-07-16 19:46:33 +08:00
{
" token_endpoint_auth_method " : OAUTH_TOKEN_ENDPOINT_AUTH_METHOD . value
}
if OAUTH_TOKEN_ENDPOINT_AUTH_METHOD . value
else { }
2025-07-17 02:22:59 +08:00
) ,
2025-06-28 04:48:24 +08:00
* * (
{ " timeout " : int ( OAUTH_TIMEOUT . value ) } if OAUTH_TIMEOUT . value else { }
) ,
2025-03-27 01:24:49 +08:00
}
2025-04-13 07:33:36 +08:00
if (
OAUTH_CODE_CHALLENGE_METHOD . value
and OAUTH_CODE_CHALLENGE_METHOD . value == " S256 "
) :
2025-03-27 01:24:49 +08:00
client_kwargs [ " code_challenge_method " ] = " S256 "
elif OAUTH_CODE_CHALLENGE_METHOD . value :
2025-04-13 07:33:36 +08:00
raise Exception (
' Code challenge methods other than " %s " not supported. Given: " %s " '
% ( " S256 " , OAUTH_CODE_CHALLENGE_METHOD . value )
)
2025-03-27 01:24:49 +08:00
2025-01-17 12:56:03 +08:00
client . register (
name = " oidc " ,
client_id = OAUTH_CLIENT_ID . value ,
client_secret = OAUTH_CLIENT_SECRET . value ,
server_metadata_url = OPENID_PROVIDER_URL . value ,
2025-03-27 01:24:49 +08:00
client_kwargs = client_kwargs ,
2025-01-17 12:56:03 +08:00
redirect_uri = OPENID_REDIRECT_URI . value ,
)
2025-01-20 03:59:07 +08:00
2024-05-28 00:21:24 +08:00
OAUTH_PROVIDERS [ " oidc " ] = {
" name " : OAUTH_PROVIDER_NAME . value ,
2025-01-17 13:22:35 +08:00
" redirect_uri " : OPENID_REDIRECT_URI . value ,
2025-01-17 12:56:03 +08:00
" register " : oidc_oauth_register ,
2024-05-28 00:21:24 +08:00
}
2025-07-30 16:00:15 +08:00
if FEISHU_CLIENT_ID . value and FEISHU_CLIENT_SECRET . value :
2025-09-16 23:54:13 +08:00
2025-07-30 16:00:15 +08:00
def feishu_oauth_register ( client : OAuth ) :
client . register (
name = " feishu " ,
client_id = FEISHU_CLIENT_ID . value ,
client_secret = FEISHU_CLIENT_SECRET . value ,
access_token_url = " https://open.feishu.cn/open-apis/authen/v2/oauth/token " ,
authorize_url = " https://accounts.feishu.cn/open-apis/authen/v1/authorize " ,
api_base_url = " https://open.feishu.cn/open-apis " ,
userinfo_endpoint = " https://open.feishu.cn/open-apis/authen/v1/user_info " ,
client_kwargs = {
" scope " : FEISHU_OAUTH_SCOPE . value ,
* * (
{ " timeout " : int ( OAUTH_TIMEOUT . value ) }
if OAUTH_TIMEOUT . value
else { }
) ,
} ,
redirect_uri = FEISHU_REDIRECT_URI . value ,
)
OAUTH_PROVIDERS [ " feishu " ] = {
" register " : feishu_oauth_register ,
" sub_claim " : " user_id " ,
}
2025-07-25 04:15:58 +08:00
configured_providers = [ ]
if GOOGLE_CLIENT_ID . value :
configured_providers . append ( " Google " )
if MICROSOFT_CLIENT_ID . value :
2025-08-06 05:44:52 +08:00
configured_providers . append ( " Microsoft " )
2025-07-25 04:15:58 +08:00
if GITHUB_CLIENT_ID . value :
configured_providers . append ( " GitHub " )
2025-07-30 16:00:15 +08:00
if FEISHU_CLIENT_ID . value :
configured_providers . append ( " Feishu " )
2025-08-06 05:44:52 +08:00
2025-07-25 04:15:58 +08:00
if configured_providers and not OPENID_PROVIDER_URL . value :
provider_list = " , " . join ( configured_providers )
2025-08-06 05:44:52 +08:00
log . warning (
f " ⚠️ OAuth providers configured ( { provider_list } ) but OPENID_PROVIDER_URL not set - logout will not work! "
)
log . warning (
f " Set OPENID_PROVIDER_URL to your OAuth provider ' s OpenID Connect discovery endpoint to fix logout functionality. "
)
2025-07-25 04:15:58 +08:00
2024-05-28 00:21:24 +08:00
load_oauth_providers ( )
2024-05-26 15:37:09 +08:00
2024-04-09 18:32:28 +08:00
####################################
# Static DIR
####################################
2024-09-04 22:54:48 +08:00
STATIC_DIR = Path ( os . getenv ( " STATIC_DIR " , OPEN_WEBUI_DIR / " static " ) ) . resolve ( )
2024-04-09 18:32:28 +08:00
2025-07-19 22:57:59 +08:00
try :
if STATIC_DIR . exists ( ) :
for item in STATIC_DIR . iterdir ( ) :
if item . is_file ( ) or item . is_symlink ( ) :
try :
item . unlink ( )
except Exception as e :
pass
except Exception as e :
pass
2025-03-04 17:47:17 +08:00
for file_path in ( FRONTEND_BUILD_DIR / " static " ) . glob ( " **/* " ) :
if file_path . is_file ( ) :
target_path = STATIC_DIR / file_path . relative_to (
( FRONTEND_BUILD_DIR / " static " )
)
target_path . parent . mkdir ( parents = True , exist_ok = True )
2025-03-06 11:14:43 +08:00
try :
shutil . copyfile ( file_path , target_path )
except Exception as e :
logging . error ( f " An error occurred: { e } " )
2025-03-04 17:47:17 +08:00
2024-07-09 14:21:17 +08:00
frontend_favicon = FRONTEND_BUILD_DIR / " static " / " favicon.png "
2024-05-14 11:53:46 +08:00
if frontend_favicon . exists ( ) :
2024-06-08 13:56:08 +08:00
try :
shutil . copyfile ( frontend_favicon , STATIC_DIR / " favicon.png " )
2024-06-10 21:27:35 +08:00
except Exception as e :
logging . error ( f " An error occurred: { e } " )
2024-02-24 09:12:19 +08:00
2024-07-09 14:21:17 +08:00
frontend_splash = FRONTEND_BUILD_DIR / " static " / " splash.png "
if frontend_splash . exists ( ) :
try :
shutil . copyfile ( frontend_splash , STATIC_DIR / " splash.png " )
except Exception as e :
logging . error ( f " An error occurred: { e } " )
2025-02-17 10:35:09 +08:00
frontend_loader = FRONTEND_BUILD_DIR / " static " / " loader.js "
if frontend_loader . exists ( ) :
try :
shutil . copyfile ( frontend_loader , STATIC_DIR / " loader.js " )
except Exception as e :
logging . error ( f " An error occurred: { e } " )
2024-07-09 14:21:17 +08:00
2024-02-24 09:12:19 +08:00
####################################
2025-02-17 10:35:09 +08:00
# CUSTOM_NAME (Legacy)
2024-02-24 09:12:19 +08:00
####################################
CUSTOM_NAME = os . environ . get ( " CUSTOM_NAME " , " " )
2024-04-04 12:24:57 +08:00
2024-02-24 09:12:19 +08:00
if CUSTOM_NAME :
2024-02-24 09:36:38 +08:00
try :
r = requests . get ( f " https://api.openwebui.com/api/v1/custom/ { CUSTOM_NAME } " )
data = r . json ( )
if r . ok :
if " logo " in data :
2024-03-26 15:45:36 +08:00
WEBUI_FAVICON_URL = url = (
2024-02-24 09:36:38 +08:00
f " https://api.openwebui.com { data [ ' logo ' ] } "
if data [ " logo " ] [ 0 ] == " / "
else data [ " logo " ]
)
r = requests . get ( url , stream = True )
if r . status_code == 200 :
2024-04-09 18:32:28 +08:00
with open ( f " { STATIC_DIR } /favicon.png " , " wb " ) as f :
2024-02-24 09:36:38 +08:00
r . raw . decode_content = True
shutil . copyfileobj ( r . raw , f )
2024-07-09 13:20:00 +08:00
if " splash " in data :
url = (
f " https://api.openwebui.com { data [ ' splash ' ] } "
if data [ " splash " ] [ 0 ] == " / "
else data [ " splash " ]
)
r = requests . get ( url , stream = True )
if r . status_code == 200 :
with open ( f " { STATIC_DIR } /splash.png " , " wb " ) as f :
r . raw . decode_content = True
2024-07-09 14:21:17 +08:00
shutil . copyfileobj ( r . raw , f )
2024-07-09 13:20:00 +08:00
2024-02-24 09:36:38 +08:00
WEBUI_NAME = data [ " name " ]
except Exception as e :
2024-03-21 07:11:36 +08:00
log . exception ( e )
2024-02-24 09:36:38 +08:00
pass
2024-02-24 09:12:19 +08:00
2024-05-10 14:18:39 +08:00
2024-10-21 13:53:45 +08:00
####################################
# STORAGE PROVIDER
####################################
2025-01-16 08:01:26 +08:00
STORAGE_PROVIDER = os . environ . get ( " STORAGE_PROVIDER " , " local " ) # defaults to local, s3
2024-10-21 13:53:45 +08:00
S3_ACCESS_KEY_ID = os . environ . get ( " S3_ACCESS_KEY_ID " , None )
S3_SECRET_ACCESS_KEY = os . environ . get ( " S3_SECRET_ACCESS_KEY " , None )
S3_REGION_NAME = os . environ . get ( " S3_REGION_NAME " , None )
S3_BUCKET_NAME = os . environ . get ( " S3_BUCKET_NAME " , None )
2025-02-08 01:15:54 +08:00
S3_KEY_PREFIX = os . environ . get ( " S3_KEY_PREFIX " , None )
2024-10-21 13:53:45 +08:00
S3_ENDPOINT_URL = os . environ . get ( " S3_ENDPOINT_URL " , None )
2025-02-23 20:52:22 +08:00
S3_USE_ACCELERATE_ENDPOINT = (
2025-05-07 20:46:58 +08:00
os . environ . get ( " S3_USE_ACCELERATE_ENDPOINT " , " false " ) . lower ( ) == " true "
2025-02-23 20:52:22 +08:00
)
2025-02-23 20:31:08 +08:00
S3_ADDRESSING_STYLE = os . environ . get ( " S3_ADDRESSING_STYLE " , None )
2025-05-07 20:46:58 +08:00
S3_ENABLE_TAGGING = os . getenv ( " S3_ENABLE_TAGGING " , " false " ) . lower ( ) == " true "
2024-10-21 13:53:45 +08:00
2025-01-17 21:53:41 +08:00
GCS_BUCKET_NAME = os . environ . get ( " GCS_BUCKET_NAME " , None )
2025-01-22 11:33:33 +08:00
GOOGLE_APPLICATION_CREDENTIALS_JSON = os . environ . get (
" GOOGLE_APPLICATION_CREDENTIALS_JSON " , None
)
2025-01-17 16:16:25 +08:00
2025-02-19 02:25:49 +08:00
AZURE_STORAGE_ENDPOINT = os . environ . get ( " AZURE_STORAGE_ENDPOINT " , None )
2025-02-19 02:27:37 +08:00
AZURE_STORAGE_CONTAINER_NAME = os . environ . get ( " AZURE_STORAGE_CONTAINER_NAME " , None )
2025-02-19 02:25:49 +08:00
AZURE_STORAGE_KEY = os . environ . get ( " AZURE_STORAGE_KEY " , None )
2023-11-19 08:47:12 +08:00
####################################
2024-01-25 16:40:19 +08:00
# File Upload DIR
2023-11-19 08:47:12 +08:00
####################################
2025-03-05 01:53:52 +08:00
UPLOAD_DIR = DATA_DIR / " uploads "
UPLOAD_DIR . mkdir ( parents = True , exist_ok = True )
2023-11-15 08:28:51 +08:00
2024-05-10 14:18:39 +08:00
2024-02-06 14:51:08 +08:00
####################################
# Cache DIR
####################################
2025-03-05 01:53:52 +08:00
CACHE_DIR = DATA_DIR / " cache "
CACHE_DIR . mkdir ( parents = True , exist_ok = True )
2024-02-06 14:51:08 +08:00
2025-02-12 14:29:45 +08:00
####################################
2025-02-12 15:12:00 +08:00
# DIRECT CONNECTIONS
2025-02-12 14:29:45 +08:00
####################################
2025-02-12 15:12:00 +08:00
ENABLE_DIRECT_CONNECTIONS = PersistentConfig (
" ENABLE_DIRECT_CONNECTIONS " ,
2025-02-12 14:29:45 +08:00
" direct.enable " ,
2025-08-11 17:49:53 +08:00
os . environ . get ( " ENABLE_DIRECT_CONNECTIONS " , " False " ) . lower ( ) == " true " ,
2025-02-12 14:29:45 +08:00
)
2023-11-19 08:47:12 +08:00
####################################
2024-03-07 03:51:51 +08:00
# OLLAMA_BASE_URL
2023-11-19 08:47:12 +08:00
####################################
2024-05-22 14:58:42 +08:00
ENABLE_OLLAMA_API = PersistentConfig (
" ENABLE_OLLAMA_API " ,
" ollama.enable " ,
os . environ . get ( " ENABLE_OLLAMA_API " , " True " ) . lower ( ) == " true " ,
)
2024-01-07 14:59:22 +08:00
OLLAMA_API_BASE_URL = os . environ . get (
" OLLAMA_API_BASE_URL " , " http://localhost:11434/api "
)
2023-11-15 08:28:51 +08:00
2024-03-07 03:44:00 +08:00
OLLAMA_BASE_URL = os . environ . get ( " OLLAMA_BASE_URL " , " " )
2024-12-01 10:13:10 +08:00
if OLLAMA_BASE_URL :
# Remove trailing slash
OLLAMA_BASE_URL = (
OLLAMA_BASE_URL [ : - 1 ] if OLLAMA_BASE_URL . endswith ( " / " ) else OLLAMA_BASE_URL
)
2024-06-17 04:56:49 +08:00
2024-03-28 04:08:43 +08:00
K8S_FLAG = os . environ . get ( " K8S_FLAG " , " " )
2024-04-02 20:47:52 +08:00
USE_OLLAMA_DOCKER = os . environ . get ( " USE_OLLAMA_DOCKER " , " false " )
2024-04-02 17:28:04 +08:00
2024-03-07 03:44:00 +08:00
if OLLAMA_BASE_URL == " " and OLLAMA_API_BASE_URL != " " :
2024-03-03 10:16:02 +08:00
OLLAMA_BASE_URL = (
OLLAMA_API_BASE_URL [ : - 4 ]
if OLLAMA_API_BASE_URL . endswith ( " /api " )
else OLLAMA_API_BASE_URL
)
2024-03-11 10:26:06 +08:00
if ENV == " prod " :
2024-04-03 17:34:25 +08:00
if OLLAMA_BASE_URL == " /ollama " and not K8S_FLAG :
2024-04-02 20:47:52 +08:00
if USE_OLLAMA_DOCKER . lower ( ) == " true " :
2024-04-03 17:43:13 +08:00
# if you use all-in-one docker container (Open WebUI + Ollama)
2024-04-02 20:47:52 +08:00
# with the docker build arg USE_OLLAMA=true (--build-arg="USE_OLLAMA=true") this only works with http://localhost:11434
2024-03-22 16:31:35 +08:00
OLLAMA_BASE_URL = " http://localhost:11434 "
2024-04-03 17:43:13 +08:00
else :
2024-03-22 16:31:35 +08:00
OLLAMA_BASE_URL = " http://host.docker.internal:11434 "
2024-03-28 04:08:43 +08:00
elif K8S_FLAG :
2024-03-26 04:21:32 +08:00
OLLAMA_BASE_URL = " http://ollama-service.open-webui.svc.cluster.local:11434 "
2024-03-11 10:26:06 +08:00
2024-05-10 14:18:39 +08:00
2024-03-07 03:44:00 +08:00
OLLAMA_BASE_URLS = os . environ . get ( " OLLAMA_BASE_URLS " , " " )
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS if OLLAMA_BASE_URLS != " " else OLLAMA_BASE_URL
2024-03-07 04:42:14 +08:00
OLLAMA_BASE_URLS = [ url . strip ( ) for url in OLLAMA_BASE_URLS . split ( " ; " ) ]
2024-05-14 05:32:21 +08:00
OLLAMA_BASE_URLS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" OLLAMA_BASE_URLS " , " ollama.base_urls " , OLLAMA_BASE_URLS
)
2024-03-03 10:16:02 +08:00
2024-11-12 13:18:51 +08:00
OLLAMA_API_CONFIGS = PersistentConfig (
" OLLAMA_API_CONFIGS " ,
" ollama.api_configs " ,
{ } ,
)
2024-01-05 08:49:34 +08:00
####################################
# OPENAI_API
####################################
2024-05-18 01:30:22 +08:00
ENABLE_OPENAI_API = PersistentConfig (
" ENABLE_OPENAI_API " ,
" openai.enable " ,
os . environ . get ( " ENABLE_OPENAI_API " , " True " ) . lower ( ) == " true " ,
)
2024-01-05 08:49:34 +08:00
OPENAI_API_KEY = os . environ . get ( " OPENAI_API_KEY " , " " )
2024-01-05 10:38:03 +08:00
OPENAI_API_BASE_URL = os . environ . get ( " OPENAI_API_BASE_URL " , " " )
2025-02-19 06:39:32 +08:00
GEMINI_API_KEY = os . environ . get ( " GEMINI_API_KEY " , " " )
GEMINI_API_BASE_URL = os . environ . get ( " GEMINI_API_BASE_URL " , " " )
2024-05-10 14:18:39 +08:00
2024-01-05 10:38:03 +08:00
if OPENAI_API_BASE_URL == " " :
OPENAI_API_BASE_URL = " https://api.openai.com/v1 "
2025-08-21 16:50:11 +08:00
else :
if OPENAI_API_BASE_URL . endswith ( " / " ) :
OPENAI_API_BASE_URL = OPENAI_API_BASE_URL [ : - 1 ]
2024-01-05 08:49:34 +08:00
2024-03-07 05:18:17 +08:00
OPENAI_API_KEYS = os . environ . get ( " OPENAI_API_KEYS " , " " )
OPENAI_API_KEYS = OPENAI_API_KEYS if OPENAI_API_KEYS != " " else OPENAI_API_KEY
2024-03-07 08:13:25 +08:00
OPENAI_API_KEYS = [ url . strip ( ) for url in OPENAI_API_KEYS . split ( " ; " ) ]
2024-05-14 05:32:21 +08:00
OPENAI_API_KEYS = PersistentConfig (
" OPENAI_API_KEYS " , " openai.api_keys " , OPENAI_API_KEYS
)
2024-03-07 05:18:17 +08:00
OPENAI_API_BASE_URLS = os . environ . get ( " OPENAI_API_BASE_URLS " , " " )
OPENAI_API_BASE_URLS = (
OPENAI_API_BASE_URLS if OPENAI_API_BASE_URLS != " " else OPENAI_API_BASE_URL
)
2024-03-18 16:11:48 +08:00
OPENAI_API_BASE_URLS = [
url . strip ( ) if url != " " else " https://api.openai.com/v1 "
for url in OPENAI_API_BASE_URLS . split ( " ; " )
]
2024-05-14 05:32:21 +08:00
OPENAI_API_BASE_URLS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" OPENAI_API_BASE_URLS " , " openai.api_base_urls " , OPENAI_API_BASE_URLS
)
2024-01-23 13:07:40 +08:00
2024-11-12 13:18:51 +08:00
OPENAI_API_CONFIGS = PersistentConfig (
" OPENAI_API_CONFIGS " ,
" openai.api_configs " ,
{ } ,
)
2024-04-21 09:37:18 +08:00
2024-11-12 13:18:51 +08:00
# Get the actual OpenAI API key based on the base URL
OPENAI_API_KEY = " "
2024-04-21 09:37:18 +08:00
try :
2024-05-10 13:36:10 +08:00
OPENAI_API_KEY = OPENAI_API_KEYS . value [
OPENAI_API_BASE_URLS . value . index ( " https://api.openai.com/v1 " )
2024-04-21 09:37:18 +08:00
]
2024-08-14 20:38:19 +08:00
except Exception :
2024-04-21 09:37:18 +08:00
pass
2024-04-21 04:15:59 +08:00
OPENAI_API_BASE_URL = " https://api.openai.com/v1 "
2025-06-28 19:12:31 +08:00
####################################
2025-06-30 17:27:07 +08:00
# MODELS
2025-06-28 19:12:31 +08:00
####################################
2025-06-30 17:27:07 +08:00
ENABLE_BASE_MODELS_CACHE = PersistentConfig (
" ENABLE_BASE_MODELS_CACHE " ,
" models.base_models_cache " ,
os . environ . get ( " ENABLE_BASE_MODELS_CACHE " , " False " ) . lower ( ) == " true " ,
2025-06-28 19:12:31 +08:00
)
2025-04-05 18:05:52 +08:00
####################################
# TOOL_SERVERS
####################################
2025-05-07 05:11:28 +08:00
try :
tool_server_connections = json . loads (
os . environ . get ( " TOOL_SERVER_CONNECTIONS " , " [] " )
)
except Exception as e :
log . exception ( f " Error loading TOOL_SERVER_CONNECTIONS: { e } " )
tool_server_connections = [ ]
2025-04-05 18:05:52 +08:00
TOOL_SERVER_CONNECTIONS = PersistentConfig (
" TOOL_SERVER_CONNECTIONS " ,
" tool_server.connections " ,
2025-05-07 05:11:28 +08:00
tool_server_connections ,
2025-04-05 18:05:52 +08:00
)
2024-01-23 13:07:40 +08:00
####################################
# WEBUI
####################################
2024-12-26 00:50:57 +08:00
2025-05-31 19:07:28 +08:00
WEBUI_URL = PersistentConfig ( " WEBUI_URL " , " webui.url " , os . environ . get ( " WEBUI_URL " , " " ) )
2024-12-26 00:50:57 +08:00
2024-05-14 05:32:21 +08:00
ENABLE_SIGNUP = PersistentConfig (
2024-05-10 13:36:10 +08:00
" ENABLE_SIGNUP " ,
" ui.enable_signup " ,
(
False
if not WEBUI_AUTH
else os . environ . get ( " ENABLE_SIGNUP " , " True " ) . lower ( ) == " true "
) ,
)
2024-07-01 05:48:05 +08:00
2024-07-25 09:44:40 +08:00
ENABLE_LOGIN_FORM = PersistentConfig (
" ENABLE_LOGIN_FORM " ,
" ui.ENABLE_LOGIN_FORM " ,
os . environ . get ( " ENABLE_LOGIN_FORM " , " True " ) . lower ( ) == " true " ,
2024-07-24 10:20:45 +08:00
)
2024-12-02 10:25:44 +08:00
2024-07-01 05:48:05 +08:00
DEFAULT_LOCALE = PersistentConfig (
" DEFAULT_LOCALE " ,
" ui.default_locale " ,
os . environ . get ( " DEFAULT_LOCALE " , " " ) ,
)
2024-05-14 05:32:21 +08:00
DEFAULT_MODELS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" DEFAULT_MODELS " , " ui.default_models " , os . environ . get ( " DEFAULT_MODELS " , None )
2024-05-09 07:33:34 +08:00
)
2024-02-20 10:54:22 +08:00
2025-04-22 07:39:01 +08:00
try :
2025-04-28 21:46:05 +08:00
default_prompt_suggestions = json . loads (
os . environ . get ( " DEFAULT_PROMPT_SUGGESTIONS " , " [] " )
)
2025-04-22 07:39:01 +08:00
except Exception as e :
log . exception ( f " Error loading DEFAULT_PROMPT_SUGGESTIONS: { e } " )
default_prompt_suggestions = [ ]
if default_prompt_suggestions == [ ] :
default_prompt_suggestions = [
2024-01-23 13:07:40 +08:00
{
" title " : [ " Help me study " , " vocabulary for a college entrance exam " ] ,
" content " : " Help me study vocabulary: write a sentence for me to fill in the blank, and I ' ll try to pick the correct option. " ,
} ,
{
" title " : [ " Give me ideas " , " for what to do with my kids ' art " ] ,
" content " : " What are 5 creative things I could do with my kids ' art? I don ' t want to throw them away, but it ' s also so much clutter. " ,
} ,
{
" title " : [ " Tell me a fun fact " , " about the Roman Empire " ] ,
" content " : " Tell me a random fun fact about the Roman Empire " ,
} ,
{
" title " : [ " Show me a code snippet " , " of a website ' s sticky header " ] ,
" content " : " Show me a code snippet of a website ' s sticky header in CSS and JavaScript. " ,
} ,
2024-05-02 15:23:32 +08:00
{
" title " : [
" Explain options trading " ,
" if I ' m familiar with buying and selling stocks " ,
] ,
" content " : " Explain options trading in simple terms if I ' m familiar with buying and selling stocks. " ,
} ,
{
" title " : [ " Overcome procrastination " , " give me tips " ] ,
" content " : " Could you start by asking me about instances when I procrastinate the most and then give me some suggestions to overcome it? " ,
} ,
2025-04-22 07:39:01 +08:00
]
2025-05-07 05:11:28 +08:00
2025-04-22 07:39:01 +08:00
DEFAULT_PROMPT_SUGGESTIONS = PersistentConfig (
" DEFAULT_PROMPT_SUGGESTIONS " ,
" ui.prompt_suggestions " ,
default_prompt_suggestions ,
2024-01-23 13:07:40 +08:00
)
2024-02-20 10:54:22 +08:00
2024-11-26 16:55:58 +08:00
MODEL_ORDER_LIST = PersistentConfig (
" MODEL_ORDER_LIST " ,
" ui.model_order_list " ,
[ ] ,
)
2024-05-14 05:32:21 +08:00
DEFAULT_USER_ROLE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" DEFAULT_USER_ROLE " ,
" ui.default_user_role " ,
os . getenv ( " DEFAULT_USER_ROLE " , " pending " ) ,
)
2024-02-20 10:54:22 +08:00
2025-05-15 01:39:17 +08:00
PENDING_USER_OVERLAY_TITLE = PersistentConfig (
" PENDING_USER_OVERLAY_TITLE " ,
" ui.pending_user_overlay_title " ,
os . environ . get ( " PENDING_USER_OVERLAY_TITLE " , " " ) ,
2025-05-14 23:58:20 +08:00
)
2025-05-15 01:39:17 +08:00
PENDING_USER_OVERLAY_CONTENT = PersistentConfig (
" PENDING_USER_OVERLAY_CONTENT " ,
" ui.pending_user_overlay_content " ,
os . environ . get ( " PENDING_USER_OVERLAY_CONTENT " , " " ) ,
2025-05-15 00:10:23 +08:00
)
2025-05-15 01:39:17 +08:00
2025-05-15 03:53:28 +08:00
RESPONSE_WATERMARK = PersistentConfig (
" RESPONSE_WATERMARK " ,
" ui.watermark " ,
os . environ . get ( " RESPONSE_WATERMARK " , " " ) ,
)
2024-11-15 17:29:07 +08:00
USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS = (
os . environ . get ( " USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS " , " False " ) . lower ( )
== " true "
2024-03-20 05:21:46 +08:00
)
2024-03-14 00:01:46 +08:00
2024-11-15 17:29:07 +08:00
USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS = (
os . environ . get ( " USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS " , " False " ) . lower ( )
== " true "
)
USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS = (
os . environ . get ( " USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS " , " False " ) . lower ( )
== " true "
)
USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS = (
os . environ . get ( " USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS " , " False " ) . lower ( ) == " true "
)
2025-04-01 08:15:51 +08:00
USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING = (
os . environ . get (
" USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING " , " False "
) . lower ( )
== " true "
)
USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING = (
os . environ . get (
" USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING " , " False "
) . lower ( )
== " true "
)
USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING = (
os . environ . get (
" USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING " , " False "
) . lower ( )
== " true "
)
USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING = (
os . environ . get (
" USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING " , " False "
) . lower ( )
== " true "
)
2025-01-16 15:01:43 +08:00
USER_PERMISSIONS_CHAT_CONTROLS = (
os . environ . get ( " USER_PERMISSIONS_CHAT_CONTROLS " , " True " ) . lower ( ) == " true "
)
2025-07-31 22:58:58 +08:00
USER_PERMISSIONS_CHAT_VALVES = (
os . environ . get ( " USER_PERMISSIONS_CHAT_VALVES " , " True " ) . lower ( ) == " true "
)
2025-06-16 19:12:32 +08:00
USER_PERMISSIONS_CHAT_SYSTEM_PROMPT = (
os . environ . get ( " USER_PERMISSIONS_CHAT_SYSTEM_PROMPT " , " True " ) . lower ( ) == " true "
)
2025-07-31 22:58:58 +08:00
USER_PERMISSIONS_CHAT_PARAMS = (
os . environ . get ( " USER_PERMISSIONS_CHAT_PARAMS " , " True " ) . lower ( ) == " true "
)
2024-11-16 18:31:04 +08:00
USER_PERMISSIONS_CHAT_FILE_UPLOAD = (
os . environ . get ( " USER_PERMISSIONS_CHAT_FILE_UPLOAD " , " True " ) . lower ( ) == " true "
)
2024-11-15 12:51:49 +08:00
USER_PERMISSIONS_CHAT_DELETE = (
os . environ . get ( " USER_PERMISSIONS_CHAT_DELETE " , " True " ) . lower ( ) == " true "
2024-03-20 05:21:46 +08:00
)
2024-03-14 00:01:46 +08:00
2025-08-26 19:05:35 +08:00
USER_PERMISSIONS_CHAT_DELETE_MESSAGE = (
os . environ . get ( " USER_PERMISSIONS_CHAT_DELETE_MESSAGE " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE = (
os . environ . get ( " USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE = (
os . environ . get ( " USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE " , " True " ) . lower ( )
== " true "
)
USER_PERMISSIONS_CHAT_RATE_RESPONSE = (
os . environ . get ( " USER_PERMISSIONS_CHAT_RATE_RESPONSE " , " True " ) . lower ( ) == " true "
)
2024-11-15 12:51:49 +08:00
USER_PERMISSIONS_CHAT_EDIT = (
os . environ . get ( " USER_PERMISSIONS_CHAT_EDIT " , " True " ) . lower ( ) == " true "
2024-08-19 22:49:40 +08:00
)
2025-04-23 13:43:33 +08:00
USER_PERMISSIONS_CHAT_SHARE = (
os . environ . get ( " USER_PERMISSIONS_CHAT_SHARE " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_CHAT_EXPORT = (
os . environ . get ( " USER_PERMISSIONS_CHAT_EXPORT " , " True " ) . lower ( ) == " true "
)
2025-04-14 16:40:22 +08:00
USER_PERMISSIONS_CHAT_STT = (
os . environ . get ( " USER_PERMISSIONS_CHAT_STT " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_CHAT_TTS = (
os . environ . get ( " USER_PERMISSIONS_CHAT_TTS " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_CHAT_CALL = (
os . environ . get ( " USER_PERMISSIONS_CHAT_CALL " , " True " ) . lower ( ) == " true "
)
2025-04-13 08:37:30 +08:00
USER_PERMISSIONS_CHAT_MULTIPLE_MODELS = (
os . environ . get ( " USER_PERMISSIONS_CHAT_MULTIPLE_MODELS " , " True " ) . lower ( ) == " true "
)
2024-08-19 22:49:40 +08:00
USER_PERMISSIONS_CHAT_TEMPORARY = (
os . environ . get ( " USER_PERMISSIONS_CHAT_TEMPORARY " , " True " ) . lower ( ) == " true "
)
2025-04-01 08:58:43 +08:00
USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED = (
os . environ . get ( " USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED " , " False " ) . lower ( )
== " true "
)
2025-04-01 08:15:51 +08:00
2025-04-13 08:37:30 +08:00
2025-04-03 09:36:03 +08:00
USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS = (
os . environ . get ( " USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS " , " False " ) . lower ( )
== " true "
)
2025-01-16 15:01:43 +08:00
USER_PERMISSIONS_FEATURES_WEB_SEARCH = (
os . environ . get ( " USER_PERMISSIONS_FEATURES_WEB_SEARCH " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_FEATURES_IMAGE_GENERATION = (
os . environ . get ( " USER_PERMISSIONS_FEATURES_IMAGE_GENERATION " , " True " ) . lower ( )
== " true "
)
2025-02-04 13:56:35 +08:00
USER_PERMISSIONS_FEATURES_CODE_INTERPRETER = (
os . environ . get ( " USER_PERMISSIONS_FEATURES_CODE_INTERPRETER " , " True " ) . lower ( )
== " true "
)
2025-05-04 21:22:51 +08:00
USER_PERMISSIONS_FEATURES_NOTES = (
os . environ . get ( " USER_PERMISSIONS_FEATURES_NOTES " , " True " ) . lower ( ) == " true "
)
2025-02-04 13:56:35 +08:00
2025-01-16 15:01:43 +08:00
DEFAULT_USER_PERMISSIONS = {
" workspace " : {
" models " : USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS ,
" knowledge " : USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS ,
" prompts " : USER_PERMISSIONS_WORKSPACE_PROMPTS_ACCESS ,
" tools " : USER_PERMISSIONS_WORKSPACE_TOOLS_ACCESS ,
} ,
2025-04-01 08:15:51 +08:00
" sharing " : {
" public_models " : USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_PUBLIC_SHARING ,
" public_knowledge " : USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING ,
" public_prompts " : USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING ,
" public_tools " : USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING ,
} ,
2025-01-16 15:01:43 +08:00
" chat " : {
" controls " : USER_PERMISSIONS_CHAT_CONTROLS ,
2025-07-31 22:58:58 +08:00
" valves " : USER_PERMISSIONS_CHAT_VALVES ,
2025-06-16 19:12:32 +08:00
" system_prompt " : USER_PERMISSIONS_CHAT_SYSTEM_PROMPT ,
2025-07-31 22:58:58 +08:00
" params " : USER_PERMISSIONS_CHAT_PARAMS ,
2025-01-16 15:01:43 +08:00
" file_upload " : USER_PERMISSIONS_CHAT_FILE_UPLOAD ,
" delete " : USER_PERMISSIONS_CHAT_DELETE ,
2025-08-26 19:05:35 +08:00
" delete_message " : USER_PERMISSIONS_CHAT_DELETE_MESSAGE ,
" continue_response " : USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE ,
" regenerate_response " : USER_PERMISSIONS_CHAT_REGENERATE_RESPONSE ,
" rate_response " : USER_PERMISSIONS_CHAT_RATE_RESPONSE ,
2025-01-16 15:01:43 +08:00
" edit " : USER_PERMISSIONS_CHAT_EDIT ,
2025-04-23 13:43:33 +08:00
" share " : USER_PERMISSIONS_CHAT_SHARE ,
" export " : USER_PERMISSIONS_CHAT_EXPORT ,
2025-04-14 16:40:22 +08:00
" stt " : USER_PERMISSIONS_CHAT_STT ,
" tts " : USER_PERMISSIONS_CHAT_TTS ,
" call " : USER_PERMISSIONS_CHAT_CALL ,
2025-04-13 08:37:30 +08:00
" multiple_models " : USER_PERMISSIONS_CHAT_MULTIPLE_MODELS ,
2025-01-16 15:01:43 +08:00
" temporary " : USER_PERMISSIONS_CHAT_TEMPORARY ,
2025-04-01 08:58:43 +08:00
" temporary_enforced " : USER_PERMISSIONS_CHAT_TEMPORARY_ENFORCED ,
2025-01-16 15:01:43 +08:00
} ,
" features " : {
2025-04-03 09:36:03 +08:00
" direct_tool_servers " : USER_PERMISSIONS_FEATURES_DIRECT_TOOL_SERVERS ,
2025-01-16 15:01:43 +08:00
" web_search " : USER_PERMISSIONS_FEATURES_WEB_SEARCH ,
" image_generation " : USER_PERMISSIONS_FEATURES_IMAGE_GENERATION ,
2025-02-04 13:56:35 +08:00
" code_interpreter " : USER_PERMISSIONS_FEATURES_CODE_INTERPRETER ,
2025-05-04 21:22:51 +08:00
" notes " : USER_PERMISSIONS_FEATURES_NOTES ,
2025-01-16 15:01:43 +08:00
} ,
}
2024-05-14 05:32:21 +08:00
USER_PERMISSIONS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" USER_PERMISSIONS " ,
2024-11-15 12:51:49 +08:00
" user.permissions " ,
2025-01-16 15:01:43 +08:00
DEFAULT_USER_PERMISSIONS ,
2024-05-10 13:36:10 +08:00
)
2024-02-14 17:17:43 +08:00
2024-12-23 12:02:14 +08:00
ENABLE_CHANNELS = PersistentConfig (
" ENABLE_CHANNELS " ,
" channels.enable " ,
os . environ . get ( " ENABLE_CHANNELS " , " False " ) . lower ( ) == " true " ,
)
2025-05-01 20:39:36 +08:00
ENABLE_NOTES = PersistentConfig (
" ENABLE_NOTES " ,
" notes.enable " ,
os . environ . get ( " ENABLE_NOTES " , " True " ) . lower ( ) == " true " ,
)
2024-10-22 18:16:48 +08:00
ENABLE_EVALUATION_ARENA_MODELS = PersistentConfig (
" ENABLE_EVALUATION_ARENA_MODELS " ,
" evaluation.arena.enable " ,
os . environ . get ( " ENABLE_EVALUATION_ARENA_MODELS " , " True " ) . lower ( ) == " true " ,
)
EVALUATION_ARENA_MODELS = PersistentConfig (
" EVALUATION_ARENA_MODELS " ,
" evaluation.arena.models " ,
[ ] ,
)
DEFAULT_ARENA_MODEL = {
" id " : " arena-model " ,
" name " : " Arena Model " ,
" meta " : {
" profile_image_url " : " /favicon.png " ,
" description " : " Submit your questions to anonymous AI chatbots and vote on the best response. " ,
" model_ids " : None ,
} ,
}
2024-05-14 05:32:21 +08:00
WEBHOOK_URL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" WEBHOOK_URL " , " webhook_url " , os . environ . get ( " WEBHOOK_URL " , " " )
)
2024-03-10 13:47:01 +08:00
2024-04-23 02:55:46 +08:00
ENABLE_ADMIN_EXPORT = os . environ . get ( " ENABLE_ADMIN_EXPORT " , " True " ) . lower ( ) == " true "
2024-04-17 16:33:22 +08:00
2025-08-06 05:44:52 +08:00
ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS = (
os . environ . get ( " ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS " , " True " ) . lower ( ) == " true "
)
2025-08-21 17:08:22 +08:00
BYPASS_ADMIN_ACCESS_CONTROL = (
os . environ . get (
" BYPASS_ADMIN_ACCESS_CONTROL " ,
os . environ . get ( " ENABLE_ADMIN_WORKSPACE_CONTENT_ACCESS " , " True " ) ,
) . lower ( )
== " true "
)
2024-08-04 22:16:14 +08:00
ENABLE_ADMIN_CHAT_ACCESS = (
os . environ . get ( " ENABLE_ADMIN_CHAT_ACCESS " , " True " ) . lower ( ) == " true "
)
2024-05-27 00:10:25 +08:00
ENABLE_COMMUNITY_SHARING = PersistentConfig (
" ENABLE_COMMUNITY_SHARING " ,
" ui.enable_community_sharing " ,
os . environ . get ( " ENABLE_COMMUNITY_SHARING " , " True " ) . lower ( ) == " true " ,
)
2024-08-19 21:16:49 +08:00
ENABLE_MESSAGE_RATING = PersistentConfig (
" ENABLE_MESSAGE_RATING " ,
" ui.enable_message_rating " ,
os . environ . get ( " ENABLE_MESSAGE_RATING " , " True " ) . lower ( ) == " true " ,
)
2025-03-31 12:31:16 +08:00
ENABLE_USER_WEBHOOKS = PersistentConfig (
" ENABLE_USER_WEBHOOKS " ,
" ui.enable_user_webhooks " ,
os . environ . get ( " ENABLE_USER_WEBHOOKS " , " True " ) . lower ( ) == " true " ,
)
2025-04-18 21:22:23 +08:00
# FastAPI / AnyIO settings
2025-05-09 00:47:41 +08:00
THREAD_POOL_SIZE = os . getenv ( " THREAD_POOL_SIZE " , None )
if THREAD_POOL_SIZE is not None and isinstance ( THREAD_POOL_SIZE , str ) :
try :
THREAD_POOL_SIZE = int ( THREAD_POOL_SIZE )
except ValueError :
log . warning (
f " THREAD_POOL_SIZE is not a valid integer: { THREAD_POOL_SIZE } . Defaulting to None. "
)
THREAD_POOL_SIZE = None
2025-04-18 21:22:23 +08:00
2024-08-19 06:04:01 +08:00
2024-08-19 05:17:26 +08:00
def validate_cors_origin ( origin ) :
parsed_url = urlparse ( origin )
2025-08-05 16:38:08 +08:00
# Check if the scheme is either http or https, or a custom scheme
2025-08-06 05:44:52 +08:00
schemes = [ " http " , " https " ] + CORS_ALLOW_CUSTOM_SCHEME
2025-08-05 16:38:08 +08:00
if parsed_url . scheme not in schemes :
2024-08-19 06:04:01 +08:00
raise ValueError (
2025-08-05 16:38:08 +08:00
f " Invalid scheme in CORS_ALLOW_ORIGIN: ' { origin } ' . Only ' http ' and ' https ' and CORS_ALLOW_CUSTOM_SCHEME are allowed. "
2024-08-19 06:04:01 +08:00
)
2024-08-19 05:17:26 +08:00
# Ensure that the netloc (domain + port) is present, indicating it's a valid URL
if not parsed_url . netloc :
raise ValueError ( f " Invalid URL structure in CORS_ALLOW_ORIGIN: ' { origin } ' . " )
# For production, you should only need one host as
# fastapi serves the svelte-kit built frontend and backend from the same host and port.
# To test CORS_ALLOW_ORIGIN locally, you can set something like
# CORS_ALLOW_ORIGIN=http://localhost:5173;http://localhost:8080
# in your .env file depending on your frontend port, 5173 in this case.
2025-06-09 00:02:14 +08:00
CORS_ALLOW_ORIGIN = os . environ . get ( " CORS_ALLOW_ORIGIN " , " * " ) . split ( " ; " )
2024-08-19 05:17:26 +08:00
2025-08-05 16:38:08 +08:00
# Allows custom URL schemes (e.g., app://) to be used as origins for CORS.
# Useful for local development or desktop clients with schemes like app:// or other custom protocols.
# Provide a semicolon-separated list of allowed schemes in the environment variable CORS_ALLOW_CUSTOM_SCHEMES.
CORS_ALLOW_CUSTOM_SCHEME = os . environ . get ( " CORS_ALLOW_CUSTOM_SCHEME " , " " ) . split ( " ; " )
2025-06-08 21:16:51 +08:00
if CORS_ALLOW_ORIGIN == [ " * " ] :
2024-08-19 06:04:01 +08:00
log . warning (
" \n \n WARNING: CORS_ALLOW_ORIGIN IS SET TO ' * ' - NOT RECOMMENDED FOR PRODUCTION DEPLOYMENTS. \n "
)
2025-06-08 21:16:51 +08:00
else :
# You have to pick between a single wildcard or a list of origins.
# Doing both will result in CORS errors in the browser.
for origin in CORS_ALLOW_ORIGIN :
validate_cors_origin ( origin )
2024-05-28 03:48:08 +08:00
2025-06-09 00:02:14 +08:00
2024-05-27 03:18:43 +08:00
class BannerModel ( BaseModel ) :
id : str
type : str
title : Optional [ str ] = None
content : str
dismissible : bool
timestamp : int
2024-07-03 07:51:30 +08:00
2024-07-02 21:17:36 +08:00
try :
banners = json . loads ( os . environ . get ( " WEBUI_BANNERS " , " [] " ) )
banners = [ BannerModel ( * * banner ) for banner in banners ]
2024-07-02 21:41:59 +08:00
except Exception as e :
2025-02-25 22:36:25 +08:00
log . exception ( f " Error loading WEBUI_BANNERS: { e } " )
2024-07-02 21:17:36 +08:00
banners = [ ]
2024-05-27 03:18:43 +08:00
2024-07-02 21:17:36 +08:00
WEBUI_BANNERS = PersistentConfig ( " WEBUI_BANNERS " , " ui.banners " , banners )
2024-05-27 03:18:43 +08:00
2024-06-04 12:17:43 +08:00
SHOW_ADMIN_DETAILS = PersistentConfig (
" SHOW_ADMIN_DETAILS " ,
" auth.admin.show " ,
os . environ . get ( " SHOW_ADMIN_DETAILS " , " true " ) . lower ( ) == " true " ,
)
ADMIN_EMAIL = PersistentConfig (
" ADMIN_EMAIL " ,
" auth.admin.email " ,
os . environ . get ( " ADMIN_EMAIL " , None ) ,
)
2024-06-10 06:19:36 +08:00
####################################
# TASKS
####################################
2024-06-10 05:53:10 +08:00
TASK_MODEL = PersistentConfig (
" TASK_MODEL " ,
" task.model.default " ,
os . environ . get ( " TASK_MODEL " , " " ) ,
)
TASK_MODEL_EXTERNAL = PersistentConfig (
" TASK_MODEL_EXTERNAL " ,
" task.model.external " ,
os . environ . get ( " TASK_MODEL_EXTERNAL " , " " ) ,
)
2024-06-10 05:25:31 +08:00
TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" TITLE_GENERATION_PROMPT_TEMPLATE " ,
" task.title.prompt_template " ,
2024-09-07 11:50:29 +08:00
os . environ . get ( " TITLE_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
2025-01-30 06:40:36 +08:00
DEFAULT_TITLE_GENERATION_PROMPT_TEMPLATE = """ ### Task:
Generate a concise , 3 - 5 word title with an emoji summarizing the chat history .
### Guidelines:
- The title should clearly represent the main theme or subject of the conversation .
- Use emojis that enhance understanding of the topic , but avoid quotation marks or special formatting .
- Write the title in the chat ' s primary language; default to English if multilingual.
- Prioritize accuracy over excessive creativity ; keep it clear and simple .
2025-05-08 15:31:51 +08:00
- Your entire response must consist solely of the JSON object , without any introductory or concluding text .
- The output must be a single , raw JSON object , without any markdown code fences or other encapsulating text .
- Ensure no conversational text , affirmations , or explanations precede or follow the raw JSON output , as this will cause direct parsing failure .
2025-01-30 06:40:36 +08:00
### Output:
JSON format : { " title " : " your concise title here " }
2025-01-30 12:11:37 +08:00
### Examples:
- { " title " : " 📉 Stock Market Trends " } ,
- { " title " : " 🍪 Perfect Chocolate Chip Recipe " } ,
- { " title " : " Evolution of Music Streaming " } ,
- { " title " : " Remote Work Productivity Tips " } ,
- { " title " : " Artificial Intelligence in Healthcare " } ,
- { " title " : " 🎮 Video Game Development Insights " }
2025-01-30 06:40:36 +08:00
### Chat History:
2024-12-13 14:28:42 +08:00
< chat_history >
{ { MESSAGES : END : 2 } }
< / chat_history > """
2024-10-20 12:27:10 +08:00
TAGS_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" TAGS_GENERATION_PROMPT_TEMPLATE " ,
" task.tags.prompt_template " ,
os . environ . get ( " TAGS_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
2024-12-13 14:28:42 +08:00
DEFAULT_TAGS_GENERATION_PROMPT_TEMPLATE = """ ### Task:
Generate 1 - 3 broad tags categorizing the main themes of the chat history , along with 1 - 3 more specific subtopic tags .
### Guidelines:
- Start with high - level domains ( e . g . Science , Technology , Philosophy , Arts , Politics , Business , Health , Sports , Entertainment , Education )
- Consider including relevant subfields / subdomains if they are strongly represented throughout the conversation
- If content is too short ( less than 3 messages ) or too diverse , use only [ " General " ]
- Use the chat ' s primary language; default to English if multilingual
- Prioritize accuracy over specificity
### Output:
JSON format : { " tags " : [ " tag1 " , " tag2 " , " tag3 " ] }
### Chat History:
< chat_history >
{ { MESSAGES : END : 6 } }
< / chat_history > """
2025-01-16 16:06:37 +08:00
IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE " ,
" task.image.prompt_template " ,
os . environ . get ( " IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
DEFAULT_IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE = """ ### Task:
Generate a detailed prompt for am image generation task based on the given language and context . Describe the image as if you were explaining it to someone who cannot see it . Include relevant details , colors , shapes , and any other important elements .
### Guidelines:
- Be descriptive and detailed , focusing on the most important aspects of the image .
- Avoid making assumptions or adding information not present in the image .
- Use the chat ' s primary language; default to English if multilingual.
- If the image is too complex , focus on the most prominent elements .
### Output:
Strictly return in JSON format :
{
" prompt " : " Your detailed description here. "
}
### Chat History:
< chat_history >
{ { MESSAGES : END : 6 } }
< / chat_history > """
2025-06-03 22:07:29 +08:00
FOLLOW_UP_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" FOLLOW_UP_GENERATION_PROMPT_TEMPLATE " ,
" task.follow_up.prompt_template " ,
os . environ . get ( " FOLLOW_UP_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
DEFAULT_FOLLOW_UP_GENERATION_PROMPT_TEMPLATE = """ ### Task:
2025-08-25 22:12:47 +08:00
Suggest 3 - 5 relevant follow - up questions or prompts that the user might naturally ask next in this conversation as a * * user * * , based on the chat history , to help continue or deepen the discussion .
2025-06-03 22:07:29 +08:00
### Guidelines:
2025-06-05 05:11:31 +08:00
- Write all follow - up questions from the user ’ s point of view , directed to the assistant .
2025-06-03 22:07:29 +08:00
- Make questions concise , clear , and directly related to the discussed topic ( s ) .
2025-06-03 22:47:49 +08:00
- Only suggest follow - ups that make sense given the chat content and do not repeat what was already covered .
- If the conversation is very short or not specific , suggest more general ( but relevant ) follow - ups the user might ask .
- Use the conversation ' s primary language; default to English if multilingual.
2025-06-03 22:07:29 +08:00
- Response must be a JSON array of strings , no extra text or formatting .
### Output:
JSON format : { " follow_ups " : [ " Question 1? " , " Question 2? " , " Question 3? " ] }
### Chat History:
< chat_history >
{ { MESSAGES : END : 6 } }
< / chat_history > """
ENABLE_FOLLOW_UP_GENERATION = PersistentConfig (
" ENABLE_FOLLOW_UP_GENERATION " ,
" task.follow_up.enable " ,
os . environ . get ( " ENABLE_FOLLOW_UP_GENERATION " , " True " ) . lower ( ) == " true " ,
)
2024-11-06 10:32:08 +08:00
ENABLE_TAGS_GENERATION = PersistentConfig (
" ENABLE_TAGS_GENERATION " ,
" task.tags.enable " ,
os . environ . get ( " ENABLE_TAGS_GENERATION " , " True " ) . lower ( ) == " true " ,
)
2025-02-13 23:28:39 +08:00
ENABLE_TITLE_GENERATION = PersistentConfig (
" ENABLE_TITLE_GENERATION " ,
" task.title.enable " ,
os . environ . get ( " ENABLE_TITLE_GENERATION " , " True " ) . lower ( ) == " true " ,
)
2024-11-19 18:24:32 +08:00
ENABLE_SEARCH_QUERY_GENERATION = PersistentConfig (
" ENABLE_SEARCH_QUERY_GENERATION " ,
" task.query.search.enable " ,
os . environ . get ( " ENABLE_SEARCH_QUERY_GENERATION " , " True " ) . lower ( ) == " true " ,
)
ENABLE_RETRIEVAL_QUERY_GENERATION = PersistentConfig (
" ENABLE_RETRIEVAL_QUERY_GENERATION " ,
" task.query.retrieval.enable " ,
os . environ . get ( " ENABLE_RETRIEVAL_QUERY_GENERATION " , " True " ) . lower ( ) == " true " ,
2024-06-10 05:25:31 +08:00
)
2024-11-19 18:24:32 +08:00
QUERY_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" QUERY_GENERATION_PROMPT_TEMPLATE " ,
" task.query.prompt_template " ,
os . environ . get ( " QUERY_GENERATION_PROMPT_TEMPLATE " , " " ) ,
2024-06-10 05:53:10 +08:00
)
2024-11-19 18:24:32 +08:00
DEFAULT_QUERY_GENERATION_PROMPT_TEMPLATE = """ ### Task:
2024-11-27 02:23:29 +08:00
Analyze the chat history to determine the necessity of generating search queries , in the given language . By default , * * prioritize generating 1 - 3 broad and relevant search queries * * unless it is absolutely certain that no additional information is required . The aim is to retrieve comprehensive , updated , and valuable information even with minimal uncertainty . If no search is unequivocally needed , return an empty list .
2024-11-19 18:24:32 +08:00
### Guidelines:
2024-11-25 10:49:56 +08:00
- Respond * * EXCLUSIVELY * * with a JSON object . Any form of extra commentary , explanation , or additional text is strictly prohibited .
- When generating search queries , respond in the format : { " queries " : [ " query1 " , " query2 " ] } , ensuring each query is distinct , concise , and relevant to the topic .
- If and only if it is entirely certain that no useful results can be retrieved by a search , return : { " queries " : [ ] } .
- Err on the side of suggesting search queries if there is * * any chance * * they might provide useful or updated information .
- Be concise and focused on composing high - quality search queries , avoiding unnecessary elaboration , commentary , or assumptions .
2024-11-27 02:23:29 +08:00
- Today ' s date is: {{ CURRENT_DATE}}.
2024-11-25 10:49:56 +08:00
- Always prioritize providing actionable and broad queries that maximize informational coverage .
2024-11-19 18:24:32 +08:00
### Output:
2024-11-25 10:03:58 +08:00
Strictly return in JSON format :
{
2024-11-19 18:24:32 +08:00
" queries " : [ " query1 " , " query2 " ]
}
### Chat History:
< chat_history >
{ { MESSAGES : END : 6 } }
< / chat_history >
"""
2024-12-01 10:30:59 +08:00
ENABLE_AUTOCOMPLETE_GENERATION = PersistentConfig (
" ENABLE_AUTOCOMPLETE_GENERATION " ,
" task.autocomplete.enable " ,
2025-03-16 01:40:39 +08:00
os . environ . get ( " ENABLE_AUTOCOMPLETE_GENERATION " , " False " ) . lower ( ) == " true " ,
2024-12-01 10:30:59 +08:00
)
AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH = PersistentConfig (
" AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH " ,
" task.autocomplete.input_max_length " ,
int ( os . environ . get ( " AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH " , " -1 " ) ) ,
)
2024-06-10 06:19:36 +08:00
2024-11-29 15:53:52 +08:00
AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE " ,
" task.autocomplete.prompt_template " ,
os . environ . get ( " AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
2024-11-29 17:02:32 +08:00
2024-11-29 15:53:52 +08:00
DEFAULT_AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE = """ ### Task:
2024-11-29 17:02:32 +08:00
You are an autocompletion system . Continue the text in ` < text > ` based on the * * completion type * * in ` < type > ` and the given language .
### **Instructions**:
1. Analyze ` < text > ` for context and meaning .
2. Use ` < type > ` to guide your output :
- * * General * * : Provide a natural , concise continuation .
- * * Search Query * * : Complete as if generating a realistic search query .
3. Start as if you are directly continuing ` < text > ` . Do * * not * * repeat , paraphrase , or respond as a model . Simply complete the text .
4. Ensure the continuation :
- Flows naturally from ` < text > ` .
- Avoids repetition , overexplaining , or unrelated ideas .
5. If unsure , return : ` { " text " : " " } ` .
### **Output Rules**:
- Respond only in JSON format : ` { " text " : " <your_completion> " } ` .
### **Examples**:
#### Example 1:
Input :
< type > General < / type >
< text > The sun was setting over the horizon , painting the sky < / text >
Output :
{ " text " : " with vibrant shades of orange and pink. " }
#### Example 2:
Input :
< type > Search Query < / type >
< text > Top - rated restaurants in < / text >
Output :
{ " text " : " New York City for Italian cuisine. " }
- - -
2024-11-30 16:29:27 +08:00
### Context:
< chat_history >
{ { MESSAGES : END : 6 } }
< / chat_history >
2024-11-29 17:02:32 +08:00
< type > { { TYPE } } < / type >
< text > { { PROMPT } } < / text >
#### Output:
2024-11-29 15:53:52 +08:00
"""
2024-06-10 06:19:36 +08:00
2024-06-11 14:40:27 +08:00
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig (
" TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE " ,
" task.tools.prompt_template " ,
2024-09-07 11:50:29 +08:00
os . environ . get ( " TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE " , " " ) ,
2024-06-11 14:40:27 +08:00
)
2025-02-02 13:01:06 +08:00
DEFAULT_TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = """ Available Tools: {{ TOOLS}}
Your task is to choose and return the correct tool ( s ) from the list of available tools based on the query . Follow these guidelines :
- Return only the JSON object , without any additional text or explanation .
- If no tools match the query , return an empty array :
{
" tool_calls " : [ ]
}
- If one or more tools match the query , construct a JSON response containing a " tool_calls " array with objects that include :
- " name " : The tool ' s name.
- " parameters " : A dictionary of required parameters and their corresponding values .
The format for the JSON response is strictly :
{
" tool_calls " : [
{ " name " : " toolName1 " , " parameters " : { " key1 " : " value1 " } } ,
{ " name " : " toolName2 " , " parameters " : { " key2 " : " value2 " } }
]
} """
2024-12-13 14:28:42 +08:00
DEFAULT_EMOJI_GENERATION_PROMPT_TEMPLATE = """ Your task is to reflect the speaker ' s likely facial expression through a fitting emoji. Interpret emotions from the message and reflect their facial expression using fitting, diverse emojis (e.g., 😊, 😢, 😡, 😱).
Message : ` ` ` { { prompt } } ` ` ` """
DEFAULT_MOA_GENERATION_PROMPT_TEMPLATE = """ You have been provided with a set of responses from various models to the latest user query: " {{ prompt}} "
Your task is to synthesize these responses into a single , high - quality response . It is crucial to critically evaluate the information provided in these responses , recognizing that some of it may be biased or incorrect . Your response should not simply replicate the given answers but should offer a refined , accurate , and comprehensive reply to the instruction . Ensure your response is well - structured , coherent , and adheres to the highest standards of accuracy and reliability .
Responses from models : { { responses } } """
2025-02-03 17:14:38 +08:00
2025-02-10 18:25:02 +08:00
####################################
# Code Interpreter
####################################
2025-03-06 11:06:28 +08:00
ENABLE_CODE_EXECUTION = PersistentConfig (
" ENABLE_CODE_EXECUTION " ,
" code_execution.enable " ,
os . environ . get ( " ENABLE_CODE_EXECUTION " , " True " ) . lower ( ) == " true " ,
)
2025-02-18 08:25:50 +08:00
CODE_EXECUTION_ENGINE = PersistentConfig (
" CODE_EXECUTION_ENGINE " ,
" code_execution.engine " ,
os . environ . get ( " CODE_EXECUTION_ENGINE " , " pyodide " ) ,
)
CODE_EXECUTION_JUPYTER_URL = PersistentConfig (
" CODE_EXECUTION_JUPYTER_URL " ,
" code_execution.jupyter.url " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_URL " , " " ) ,
)
CODE_EXECUTION_JUPYTER_AUTH = PersistentConfig (
" CODE_EXECUTION_JUPYTER_AUTH " ,
" code_execution.jupyter.auth " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_AUTH " , " " ) ,
)
CODE_EXECUTION_JUPYTER_AUTH_TOKEN = PersistentConfig (
" CODE_EXECUTION_JUPYTER_AUTH_TOKEN " ,
" code_execution.jupyter.auth_token " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_AUTH_TOKEN " , " " ) ,
)
CODE_EXECUTION_JUPYTER_AUTH_PASSWORD = PersistentConfig (
" CODE_EXECUTION_JUPYTER_AUTH_PASSWORD " ,
" code_execution.jupyter.auth_password " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_AUTH_PASSWORD " , " " ) ,
)
2025-02-20 08:41:54 +08:00
CODE_EXECUTION_JUPYTER_TIMEOUT = PersistentConfig (
" CODE_EXECUTION_JUPYTER_TIMEOUT " ,
" code_execution.jupyter.timeout " ,
int ( os . environ . get ( " CODE_EXECUTION_JUPYTER_TIMEOUT " , " 60 " ) ) ,
)
2025-02-18 08:25:50 +08:00
2025-02-10 18:25:02 +08:00
ENABLE_CODE_INTERPRETER = PersistentConfig (
" ENABLE_CODE_INTERPRETER " ,
" code_interpreter.enable " ,
os . environ . get ( " ENABLE_CODE_INTERPRETER " , " True " ) . lower ( ) == " true " ,
)
CODE_INTERPRETER_ENGINE = PersistentConfig (
" CODE_INTERPRETER_ENGINE " ,
" code_interpreter.engine " ,
os . environ . get ( " CODE_INTERPRETER_ENGINE " , " pyodide " ) ,
)
2025-02-12 13:36:16 +08:00
CODE_INTERPRETER_PROMPT_TEMPLATE = PersistentConfig (
" CODE_INTERPRETER_PROMPT_TEMPLATE " ,
" code_interpreter.prompt_template " ,
os . environ . get ( " CODE_INTERPRETER_PROMPT_TEMPLATE " , " " ) ,
)
2025-02-10 18:25:02 +08:00
CODE_INTERPRETER_JUPYTER_URL = PersistentConfig (
" CODE_INTERPRETER_JUPYTER_URL " ,
" code_interpreter.jupyter.url " ,
2025-02-18 08:25:50 +08:00
os . environ . get (
" CODE_INTERPRETER_JUPYTER_URL " , os . environ . get ( " CODE_EXECUTION_JUPYTER_URL " , " " )
) ,
2025-02-10 18:25:02 +08:00
)
CODE_INTERPRETER_JUPYTER_AUTH = PersistentConfig (
" CODE_INTERPRETER_JUPYTER_AUTH " ,
" code_interpreter.jupyter.auth " ,
2025-02-18 08:25:50 +08:00
os . environ . get (
" CODE_INTERPRETER_JUPYTER_AUTH " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_AUTH " , " " ) ,
) ,
2025-02-10 18:25:02 +08:00
)
CODE_INTERPRETER_JUPYTER_AUTH_TOKEN = PersistentConfig (
" CODE_INTERPRETER_JUPYTER_AUTH_TOKEN " ,
" code_interpreter.jupyter.auth_token " ,
2025-02-18 08:25:50 +08:00
os . environ . get (
" CODE_INTERPRETER_JUPYTER_AUTH_TOKEN " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_AUTH_TOKEN " , " " ) ,
) ,
2025-02-10 18:25:02 +08:00
)
CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD = PersistentConfig (
" CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD " ,
" code_interpreter.jupyter.auth_password " ,
2025-02-18 08:25:50 +08:00
os . environ . get (
" CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_AUTH_PASSWORD " , " " ) ,
) ,
2025-02-10 18:25:02 +08:00
)
2025-02-20 08:41:54 +08:00
CODE_INTERPRETER_JUPYTER_TIMEOUT = PersistentConfig (
" CODE_INTERPRETER_JUPYTER_TIMEOUT " ,
" code_interpreter.jupyter.timeout " ,
int (
os . environ . get (
" CODE_INTERPRETER_JUPYTER_TIMEOUT " ,
os . environ . get ( " CODE_EXECUTION_JUPYTER_TIMEOUT " , " 60 " ) ,
)
) ,
)
2025-08-17 08:15:13 +08:00
CODE_INTERPRETER_BLOCKED_MODULES = [
library . strip ( )
for library in os . environ . get ( " CODE_INTERPRETER_BLOCKED_MODULES " , " " ) . split ( " , " )
if library . strip ( )
]
2025-02-10 18:25:02 +08:00
2025-02-03 17:14:38 +08:00
DEFAULT_CODE_INTERPRETER_PROMPT = """
#### Tools Available
1. * * Code Interpreter * * : ` < code_interpreter type = " code " lang = " python " > < / code_interpreter > `
- You have access to a Python shell that runs directly in the user ' s browser, enabling fast execution of code for analysis, calculations, or problem-solving. Use it in this response.
- The Python code you write can incorporate a wide array of libraries , handle data manipulation or visualization , perform API calls for web - related tasks , or tackle virtually any computational challenge . Use this flexibility to * * think outside the box , craft elegant solutions , and harness Python ' s full potential**.
2025-05-07 05:36:17 +08:00
- To use it , * * you must enclose your code within ` < code_interpreter type = " code " lang = " python " > ` XML tags * * and stop right away . If you don ' t, the code won ' t execute .
- When writing code in the code_interpreter XML tag , Do NOT use the triple backticks code block for markdown formatting , example : ` ` ` py # python code ``` will cause an error because it is markdown formatting, it is not python code.
2025-02-03 17:14:38 +08:00
- When coding , * * always aim to print meaningful outputs * * ( e . g . , results , tables , summaries , or visuals ) to better interpret and verify the findings . Avoid relying on implicit outputs ; prioritize explicit and clear print statements so the results are effectively communicated to the user .
- After obtaining the printed output , * * always provide a concise analysis , interpretation , or next steps to help the user understand the findings or refine the outcome further . * *
- If the results are unclear , unexpected , or require validation , refine the code and execute it again as needed . Always aim to deliver meaningful insights from the results , iterating if necessary .
2025-02-11 05:53:16 +08:00
- * * If a link to an image , audio , or any file is provided in markdown format in the output , ALWAYS regurgitate word for word , explicitly display it as part of the response to ensure the user can access it easily , do NOT change the link . * *
2025-02-04 12:49:54 +08:00
- All responses should be communicated in the chat ' s primary language, ensuring seamless understanding. If the chat is multilingual, default to English for clarity.
2025-02-05 10:36:22 +08:00
2025-02-03 17:14:38 +08:00
Ensure that the tools are effectively utilized to achieve the highest - quality analysis for the user . """
2025-02-04 12:49:54 +08:00
2024-07-01 05:49:15 +08:00
####################################
2024-09-10 08:34:27 +08:00
# Vector Database
2024-07-01 05:49:15 +08:00
####################################
2024-09-10 09:27:50 +08:00
VECTOR_DB = os . environ . get ( " VECTOR_DB " , " chroma " )
2024-01-07 14:59:22 +08:00
2024-09-10 09:27:50 +08:00
# Chroma
2025-02-28 03:39:00 +08:00
CHROMA_DATA_PATH = f " { DATA_DIR } /vector_db "
2025-02-25 22:35:36 +08:00
if VECTOR_DB == " chroma " :
import chromadb
2025-02-27 07:42:19 +08:00
2025-02-25 22:35:36 +08:00
CHROMA_TENANT = os . environ . get ( " CHROMA_TENANT " , chromadb . DEFAULT_TENANT )
CHROMA_DATABASE = os . environ . get ( " CHROMA_DATABASE " , chromadb . DEFAULT_DATABASE )
CHROMA_HTTP_HOST = os . environ . get ( " CHROMA_HTTP_HOST " , " " )
CHROMA_HTTP_PORT = int ( os . environ . get ( " CHROMA_HTTP_PORT " , " 8000 " ) )
CHROMA_CLIENT_AUTH_PROVIDER = os . environ . get ( " CHROMA_CLIENT_AUTH_PROVIDER " , " " )
2025-02-27 07:42:19 +08:00
CHROMA_CLIENT_AUTH_CREDENTIALS = os . environ . get (
" CHROMA_CLIENT_AUTH_CREDENTIALS " , " "
)
2025-02-25 22:35:36 +08:00
# Comma-separated list of header=value pairs
CHROMA_HTTP_HEADERS = os . environ . get ( " CHROMA_HTTP_HEADERS " , " " )
if CHROMA_HTTP_HEADERS :
CHROMA_HTTP_HEADERS = dict (
[ pair . split ( " = " ) for pair in CHROMA_HTTP_HEADERS . split ( " , " ) ]
)
else :
CHROMA_HTTP_HEADERS = None
CHROMA_HTTP_SSL = os . environ . get ( " CHROMA_HTTP_SSL " , " false " ) . lower ( ) == " true "
2024-04-23 02:27:43 +08:00
# this uses the model defined in the Dockerfile ENV variable. If you dont use docker or docker based deployments such as k8s, the default embedding model will be used (sentence-transformers/all-MiniLM-L6-v2)
2024-04-15 05:55:00 +08:00
2024-09-12 13:52:19 +08:00
# Milvus
MILVUS_URI = os . environ . get ( " MILVUS_URI " , f " { DATA_DIR } /vector_db/milvus.db " )
2025-01-15 03:08:11 +08:00
MILVUS_DB = os . environ . get ( " MILVUS_DB " , " default " )
2025-02-01 06:00:38 +08:00
MILVUS_TOKEN = os . environ . get ( " MILVUS_TOKEN " , None )
2024-09-12 13:52:19 +08:00
2025-05-08 19:21:34 +08:00
MILVUS_INDEX_TYPE = os . environ . get ( " MILVUS_INDEX_TYPE " , " HNSW " )
2025-05-08 11:32:58 +08:00
MILVUS_METRIC_TYPE = os . environ . get ( " MILVUS_METRIC_TYPE " , " COSINE " )
MILVUS_HNSW_M = int ( os . environ . get ( " MILVUS_HNSW_M " , " 16 " ) )
MILVUS_HNSW_EFCONSTRUCTION = int ( os . environ . get ( " MILVUS_HNSW_EFCONSTRUCTION " , " 100 " ) )
MILVUS_IVF_FLAT_NLIST = int ( os . environ . get ( " MILVUS_IVF_FLAT_NLIST " , " 128 " ) )
2024-10-09 18:51:43 +08:00
# Qdrant
QDRANT_URI = os . environ . get ( " QDRANT_URI " , None )
2024-11-15 04:06:46 +08:00
QDRANT_API_KEY = os . environ . get ( " QDRANT_API_KEY " , None )
2025-04-15 06:35:39 +08:00
QDRANT_ON_DISK = os . environ . get ( " QDRANT_ON_DISK " , " false " ) . lower ( ) == " true "
2025-06-24 16:42:44 +08:00
QDRANT_PREFER_GRPC = os . environ . get ( " QDRANT_PREFER_GRPC " , " false " ) . lower ( ) == " true "
2025-04-17 13:13:49 +08:00
QDRANT_GRPC_PORT = int ( os . environ . get ( " QDRANT_GRPC_PORT " , " 6334 " ) )
2025-08-10 02:12:30 +08:00
QDRANT_TIMEOUT = int ( os . environ . get ( " QDRANT_TIMEOUT " , " 5 " ) )
QDRANT_HNSW_M = int ( os . environ . get ( " QDRANT_HNSW_M " , " 16 " ) )
2025-05-17 01:05:52 +08:00
ENABLE_QDRANT_MULTITENANCY_MODE = (
2025-06-24 16:42:44 +08:00
os . environ . get ( " ENABLE_QDRANT_MULTITENANCY_MODE " , " true " ) . lower ( ) == " true "
2025-05-17 01:05:52 +08:00
)
2025-06-26 19:52:26 +08:00
QDRANT_COLLECTION_PREFIX = os . environ . get ( " QDRANT_COLLECTION_PREFIX " , " open-webui " )
2024-10-09 18:51:43 +08:00
2024-10-30 08:28:37 +08:00
# OpenSearch
OPENSEARCH_URI = os . environ . get ( " OPENSEARCH_URI " , " https://localhost:9200 " )
2025-03-09 07:43:49 +08:00
OPENSEARCH_SSL = os . environ . get ( " OPENSEARCH_SSL " , " true " ) . lower ( ) == " true "
2025-03-10 22:27:31 +08:00
OPENSEARCH_CERT_VERIFY = (
os . environ . get ( " OPENSEARCH_CERT_VERIFY " , " false " ) . lower ( ) == " true "
)
2024-10-30 08:28:37 +08:00
OPENSEARCH_USERNAME = os . environ . get ( " OPENSEARCH_USERNAME " , None )
OPENSEARCH_PASSWORD = os . environ . get ( " OPENSEARCH_PASSWORD " , None )
2025-03-04 05:39:42 +08:00
# ElasticSearch
ELASTICSEARCH_URL = os . environ . get ( " ELASTICSEARCH_URL " , " https://localhost:9200 " )
ELASTICSEARCH_CA_CERTS = os . environ . get ( " ELASTICSEARCH_CA_CERTS " , None )
ELASTICSEARCH_API_KEY = os . environ . get ( " ELASTICSEARCH_API_KEY " , None )
ELASTICSEARCH_USERNAME = os . environ . get ( " ELASTICSEARCH_USERNAME " , None )
ELASTICSEARCH_PASSWORD = os . environ . get ( " ELASTICSEARCH_PASSWORD " , None )
ELASTICSEARCH_CLOUD_ID = os . environ . get ( " ELASTICSEARCH_CLOUD_ID " , None )
SSL_ASSERT_FINGERPRINT = os . environ . get ( " SSL_ASSERT_FINGERPRINT " , None )
2025-03-06 11:06:28 +08:00
ELASTICSEARCH_INDEX_PREFIX = os . environ . get (
" ELASTICSEARCH_INDEX_PREFIX " , " open_webui_collections "
)
2024-11-05 05:34:05 +08:00
# Pgvector
2024-11-06 07:15:32 +08:00
PGVECTOR_DB_URL = os . environ . get ( " PGVECTOR_DB_URL " , DATABASE_URL )
if VECTOR_DB == " pgvector " and not PGVECTOR_DB_URL . startswith ( " postgres " ) :
raise ValueError (
" Pgvector requires setting PGVECTOR_DB_URL or using Postgres with vector extension as the primary database. "
)
2025-01-04 01:11:09 +08:00
PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH = int (
os . environ . get ( " PGVECTOR_INITIALIZE_MAX_VECTOR_LENGTH " , " 1536 " )
)
2024-10-09 18:51:43 +08:00
2025-09-01 04:04:26 +08:00
PGVECTOR_CREATE_EXTENSION = (
os . getenv ( " PGVECTOR_CREATE_EXTENSION " , " true " ) . lower ( ) == " true "
)
2025-06-09 22:14:33 +08:00
PGVECTOR_PGCRYPTO = os . getenv ( " PGVECTOR_PGCRYPTO " , " false " ) . lower ( ) == " true "
PGVECTOR_PGCRYPTO_KEY = os . getenv ( " PGVECTOR_PGCRYPTO_KEY " , None )
if PGVECTOR_PGCRYPTO and not PGVECTOR_PGCRYPTO_KEY :
raise ValueError (
" PGVECTOR_PGCRYPTO is enabled but PGVECTOR_PGCRYPTO_KEY is not set. Please provide a valid key. "
)
2025-07-14 16:18:44 +08:00
PGVECTOR_POOL_SIZE = os . environ . get ( " PGVECTOR_POOL_SIZE " , None )
if PGVECTOR_POOL_SIZE != None :
try :
PGVECTOR_POOL_SIZE = int ( PGVECTOR_POOL_SIZE )
except Exception :
PGVECTOR_POOL_SIZE = None
PGVECTOR_POOL_MAX_OVERFLOW = os . environ . get ( " PGVECTOR_POOL_MAX_OVERFLOW " , 0 )
if PGVECTOR_POOL_MAX_OVERFLOW == " " :
PGVECTOR_POOL_MAX_OVERFLOW = 0
else :
try :
PGVECTOR_POOL_MAX_OVERFLOW = int ( PGVECTOR_POOL_MAX_OVERFLOW )
except Exception :
PGVECTOR_POOL_MAX_OVERFLOW = 0
PGVECTOR_POOL_TIMEOUT = os . environ . get ( " PGVECTOR_POOL_TIMEOUT " , 30 )
if PGVECTOR_POOL_TIMEOUT == " " :
PGVECTOR_POOL_TIMEOUT = 30
else :
try :
PGVECTOR_POOL_TIMEOUT = int ( PGVECTOR_POOL_TIMEOUT )
except Exception :
PGVECTOR_POOL_TIMEOUT = 30
PGVECTOR_POOL_RECYCLE = os . environ . get ( " PGVECTOR_POOL_RECYCLE " , 3600 )
if PGVECTOR_POOL_RECYCLE == " " :
PGVECTOR_POOL_RECYCLE = 3600
else :
try :
PGVECTOR_POOL_RECYCLE = int ( PGVECTOR_POOL_RECYCLE )
except Exception :
PGVECTOR_POOL_RECYCLE = 3600
2025-04-20 15:49:28 +08:00
# Pinecone
PINECONE_API_KEY = os . environ . get ( " PINECONE_API_KEY " , None )
PINECONE_ENVIRONMENT = os . environ . get ( " PINECONE_ENVIRONMENT " , None )
PINECONE_INDEX_NAME = os . getenv ( " PINECONE_INDEX_NAME " , " open-webui-index " )
PINECONE_DIMENSION = int ( os . getenv ( " PINECONE_DIMENSION " , 1536 ) ) # or 3072, 1024, 768
PINECONE_METRIC = os . getenv ( " PINECONE_METRIC " , " cosine " )
PINECONE_CLOUD = os . getenv ( " PINECONE_CLOUD " , " aws " ) # or "gcp" or "azure"
2025-07-07 16:52:58 +08:00
# ORACLE23AI (Oracle23ai Vector Search)
ORACLE_DB_USE_WALLET = os . environ . get ( " ORACLE_DB_USE_WALLET " , " false " ) . lower ( ) == " true "
2025-08-06 18:42:57 +08:00
ORACLE_DB_USER = os . environ . get ( " ORACLE_DB_USER " , None ) #
ORACLE_DB_PASSWORD = os . environ . get ( " ORACLE_DB_PASSWORD " , None ) #
ORACLE_DB_DSN = os . environ . get ( " ORACLE_DB_DSN " , None ) #
2025-07-07 16:52:58 +08:00
ORACLE_WALLET_DIR = os . environ . get ( " ORACLE_WALLET_DIR " , None )
ORACLE_WALLET_PASSWORD = os . environ . get ( " ORACLE_WALLET_PASSWORD " , None )
2025-07-07 13:58:02 +08:00
ORACLE_VECTOR_LENGTH = os . environ . get ( " ORACLE_VECTOR_LENGTH " , 768 )
2025-07-07 20:13:05 +08:00
ORACLE_DB_POOL_MIN = int ( os . environ . get ( " ORACLE_DB_POOL_MIN " , 2 ) )
ORACLE_DB_POOL_MAX = int ( os . environ . get ( " ORACLE_DB_POOL_MAX " , 10 ) )
ORACLE_DB_POOL_INCREMENT = int ( os . environ . get ( " ORACLE_DB_POOL_INCREMENT " , 1 ) )
2025-08-06 18:42:57 +08:00
if VECTOR_DB == " oracle23ai " :
if not ORACLE_DB_USER or not ORACLE_DB_PASSWORD or not ORACLE_DB_DSN :
raise ValueError (
" Oracle23ai requires setting ORACLE_DB_USER, ORACLE_DB_PASSWORD, and ORACLE_DB_DSN. "
)
if ORACLE_DB_USE_WALLET and ( not ORACLE_WALLET_DIR or not ORACLE_WALLET_PASSWORD ) :
raise ValueError (
" Oracle23ai requires setting ORACLE_WALLET_DIR and ORACLE_WALLET_PASSWORD when using wallet authentication. "
)
2025-07-07 13:58:02 +08:00
2025-08-06 18:47:27 +08:00
log . info ( f " VECTOR_DB: { VECTOR_DB } " )
2025-07-16 11:20:54 +08:00
# S3 Vector
S3_VECTOR_BUCKET_NAME = os . environ . get ( " S3_VECTOR_BUCKET_NAME " , None )
S3_VECTOR_REGION = os . environ . get ( " S3_VECTOR_REGION " , None )
2024-09-10 08:34:27 +08:00
####################################
2024-09-28 07:35:31 +08:00
# Information Retrieval (RAG)
2024-09-10 08:34:27 +08:00
####################################
2024-12-19 10:04:56 +08:00
# If configured, Google Drive will be available as an upload option.
ENABLE_GOOGLE_DRIVE_INTEGRATION = PersistentConfig (
" ENABLE_GOOGLE_DRIVE_INTEGRATION " ,
" google_drive.enable " ,
os . getenv ( " ENABLE_GOOGLE_DRIVE_INTEGRATION " , " False " ) . lower ( ) == " true " ,
)
2024-12-27 03:41:58 +08:00
GOOGLE_DRIVE_CLIENT_ID = PersistentConfig (
" GOOGLE_DRIVE_CLIENT_ID " ,
" google_drive.client_id " ,
os . environ . get ( " GOOGLE_DRIVE_CLIENT_ID " , " " ) ,
)
GOOGLE_DRIVE_API_KEY = PersistentConfig (
" GOOGLE_DRIVE_API_KEY " ,
" google_drive.api_key " ,
os . environ . get ( " GOOGLE_DRIVE_API_KEY " , " " ) ,
)
2024-12-19 10:04:56 +08:00
2025-02-24 22:14:10 +08:00
ENABLE_ONEDRIVE_INTEGRATION = PersistentConfig (
" ENABLE_ONEDRIVE_INTEGRATION " ,
" onedrive.enable " ,
os . getenv ( " ENABLE_ONEDRIVE_INTEGRATION " , " False " ) . lower ( ) == " true " ,
)
2025-09-21 13:40:14 +08:00
2025-09-16 23:54:13 +08:00
ENABLE_ONEDRIVE_PERSONAL = (
os . environ . get ( " ENABLE_ONEDRIVE_PERSONAL " , " True " ) . lower ( ) == " true "
)
ENABLE_ONEDRIVE_BUSINESS = (
os . environ . get ( " ENABLE_ONEDRIVE_BUSINESS " , " True " ) . lower ( ) == " true "
)
2025-02-24 22:14:10 +08:00
2025-09-21 13:40:14 +08:00
ONEDRIVE_CLIENT_ID = os . environ . get ( " ONEDRIVE_CLIENT_ID " , " " )
ONEDRIVE_CLIENT_ID_PERSONAL = os . environ . get (
" ONEDRIVE_CLIENT_ID_PERSONAL " , ONEDRIVE_CLIENT_ID
)
ONEDRIVE_CLIENT_ID_BUSINESS = os . environ . get (
" ONEDRIVE_CLIENT_ID_BUSINESS " , ONEDRIVE_CLIENT_ID
2025-02-24 22:14:10 +08:00
)
2025-04-14 23:27:59 +08:00
ONEDRIVE_SHAREPOINT_URL = PersistentConfig (
" ONEDRIVE_SHAREPOINT_URL " ,
" onedrive.sharepoint_url " ,
os . environ . get ( " ONEDRIVE_SHAREPOINT_URL " , " " ) ,
)
2025-05-06 23:03:07 +08:00
ONEDRIVE_SHAREPOINT_TENANT_ID = PersistentConfig (
" ONEDRIVE_SHAREPOINT_TENANT_ID " ,
" onedrive.sharepoint_tenant_id " ,
os . environ . get ( " ONEDRIVE_SHAREPOINT_TENANT_ID " , " " ) ,
)
2025-04-14 23:27:59 +08:00
2024-09-10 08:34:27 +08:00
# RAG Content Extraction
CONTENT_EXTRACTION_ENGINE = PersistentConfig (
" CONTENT_EXTRACTION_ENGINE " ,
" rag.CONTENT_EXTRACTION_ENGINE " ,
os . environ . get ( " CONTENT_EXTRACTION_ENGINE " , " " ) . lower ( ) ,
)
2025-05-27 12:44:07 +08:00
DATALAB_MARKER_API_KEY = PersistentConfig (
" DATALAB_MARKER_API_KEY " ,
" rag.datalab_marker_api_key " ,
os . environ . get ( " DATALAB_MARKER_API_KEY " , " " ) ,
)
2025-07-23 08:49:28 +08:00
DATALAB_MARKER_API_BASE_URL = PersistentConfig (
" DATALAB_MARKER_API_BASE_URL " ,
" rag.datalab_marker_api_base_url " ,
os . environ . get ( " DATALAB_MARKER_API_BASE_URL " , " " ) ,
)
DATALAB_MARKER_ADDITIONAL_CONFIG = PersistentConfig (
" DATALAB_MARKER_ADDITIONAL_CONFIG " ,
" rag.datalab_marker_additional_config " ,
os . environ . get ( " DATALAB_MARKER_ADDITIONAL_CONFIG " , " " ) ,
2025-05-27 12:44:07 +08:00
)
DATALAB_MARKER_USE_LLM = PersistentConfig (
" DATALAB_MARKER_USE_LLM " ,
" rag.DATALAB_MARKER_USE_LLM " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_USE_LLM " , " false " ) . lower ( ) == " true " ,
2025-05-27 12:44:07 +08:00
)
DATALAB_MARKER_SKIP_CACHE = PersistentConfig (
" DATALAB_MARKER_SKIP_CACHE " ,
" rag.datalab_marker_skip_cache " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_SKIP_CACHE " , " false " ) . lower ( ) == " true " ,
2025-05-27 12:44:07 +08:00
)
DATALAB_MARKER_FORCE_OCR = PersistentConfig (
" DATALAB_MARKER_FORCE_OCR " ,
" rag.datalab_marker_force_ocr " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_FORCE_OCR " , " false " ) . lower ( ) == " true " ,
2025-05-27 12:44:07 +08:00
)
DATALAB_MARKER_PAGINATE = PersistentConfig (
" DATALAB_MARKER_PAGINATE " ,
" rag.datalab_marker_paginate " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_PAGINATE " , " false " ) . lower ( ) == " true " ,
2025-05-27 12:44:07 +08:00
)
DATALAB_MARKER_STRIP_EXISTING_OCR = PersistentConfig (
" DATALAB_MARKER_STRIP_EXISTING_OCR " ,
" rag.datalab_marker_strip_existing_ocr " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_STRIP_EXISTING_OCR " , " false " ) . lower ( ) == " true " ,
2025-05-27 12:44:07 +08:00
)
DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION = PersistentConfig (
" DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION " ,
" rag.datalab_marker_disable_image_extraction " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION " , " false " ) . lower ( )
== " true " ,
2025-05-27 12:44:07 +08:00
)
2025-07-23 09:06:29 +08:00
DATALAB_MARKER_FORMAT_LINES = PersistentConfig (
" DATALAB_MARKER_FORMAT_LINES " ,
" rag.datalab_marker_format_lines " ,
os . environ . get ( " DATALAB_MARKER_FORMAT_LINES " , " false " ) . lower ( ) == " true " ,
)
2025-05-27 12:44:07 +08:00
DATALAB_MARKER_OUTPUT_FORMAT = PersistentConfig (
" DATALAB_MARKER_OUTPUT_FORMAT " ,
" rag.datalab_marker_output_format " ,
2025-05-29 06:33:40 +08:00
os . environ . get ( " DATALAB_MARKER_OUTPUT_FORMAT " , " markdown " ) ,
2025-05-27 12:44:07 +08:00
)
2025-05-15 02:28:40 +08:00
EXTERNAL_DOCUMENT_LOADER_URL = PersistentConfig (
" EXTERNAL_DOCUMENT_LOADER_URL " ,
" rag.external_document_loader_url " ,
os . environ . get ( " EXTERNAL_DOCUMENT_LOADER_URL " , " " ) ,
)
EXTERNAL_DOCUMENT_LOADER_API_KEY = PersistentConfig (
" EXTERNAL_DOCUMENT_LOADER_API_KEY " ,
" rag.external_document_loader_api_key " ,
os . environ . get ( " EXTERNAL_DOCUMENT_LOADER_API_KEY " , " " ) ,
)
2024-09-10 08:34:27 +08:00
TIKA_SERVER_URL = PersistentConfig (
" TIKA_SERVER_URL " ,
" rag.tika_server_url " ,
os . getenv ( " TIKA_SERVER_URL " , " http://tika:9998 " ) , # Default for sidecar deployment
)
2025-02-14 20:08:03 +08:00
DOCLING_SERVER_URL = PersistentConfig (
" DOCLING_SERVER_URL " ,
" rag.docling_server_url " ,
os . getenv ( " DOCLING_SERVER_URL " , " http://docling:5001 " ) ,
)
2025-09-09 00:51:33 +08:00
DOCLING_DO_OCR = PersistentConfig (
" DOCLING_DO_OCR " ,
" rag.docling_do_ocr " ,
os . getenv ( " DOCLING_DO_OCR " , " True " ) . lower ( ) == " true " ,
)
DOCLING_FORCE_OCR = PersistentConfig (
" DOCLING_FORCE_OCR " ,
" rag.docling_force_ocr " ,
os . getenv ( " DOCLING_FORCE_OCR " , " False " ) . lower ( ) == " true " ,
)
2025-05-03 05:31:00 +08:00
DOCLING_OCR_ENGINE = PersistentConfig (
" DOCLING_OCR_ENGINE " ,
" rag.docling_ocr_engine " ,
os . getenv ( " DOCLING_OCR_ENGINE " , " tesseract " ) ,
)
DOCLING_OCR_LANG = PersistentConfig (
" DOCLING_OCR_LANG " ,
" rag.docling_ocr_lang " ,
os . getenv ( " DOCLING_OCR_LANG " , " eng,fra,deu,spa " ) ,
)
2025-09-09 00:51:33 +08:00
DOCLING_PDF_BACKEND = PersistentConfig (
" DOCLING_PDF_BACKEND " ,
" rag.docling_pdf_backend " ,
os . getenv ( " DOCLING_PDF_BACKEND " , " dlparse_v4 " ) ,
)
DOCLING_TABLE_MODE = PersistentConfig (
" DOCLING_TABLE_MODE " ,
" rag.docling_table_mode " ,
os . getenv ( " DOCLING_TABLE_MODE " , " accurate " ) ,
)
DOCLING_PIPELINE = PersistentConfig (
" DOCLING_PIPELINE " ,
" rag.docling_pipeline " ,
os . getenv ( " DOCLING_PIPELINE " , " standard " ) ,
)
2025-05-15 01:26:49 +08:00
DOCLING_DO_PICTURE_DESCRIPTION = PersistentConfig (
" DOCLING_DO_PICTURE_DESCRIPTION " ,
" rag.docling_do_picture_description " ,
os . getenv ( " DOCLING_DO_PICTURE_DESCRIPTION " , " False " ) . lower ( ) == " true " ,
)
2025-06-08 22:30:26 +08:00
DOCLING_PICTURE_DESCRIPTION_MODE = PersistentConfig (
" DOCLING_PICTURE_DESCRIPTION_MODE " ,
" rag.docling_picture_description_mode " ,
os . getenv ( " DOCLING_PICTURE_DESCRIPTION_MODE " , " " ) ,
)
2025-06-09 00:02:14 +08:00
docling_picture_description_local = os . getenv ( " DOCLING_PICTURE_DESCRIPTION_LOCAL " , " " )
try :
docling_picture_description_local = json . loads ( docling_picture_description_local )
except json . JSONDecodeError :
docling_picture_description_local = { }
2025-06-08 22:30:26 +08:00
2025-06-09 00:02:14 +08:00
DOCLING_PICTURE_DESCRIPTION_LOCAL = PersistentConfig (
" DOCLING_PICTURE_DESCRIPTION_LOCAL " ,
" rag.docling_picture_description_local " ,
docling_picture_description_local ,
2025-06-08 22:30:26 +08:00
)
2025-06-09 05:50:10 +08:00
docling_picture_description_api = os . getenv ( " DOCLING_PICTURE_DESCRIPTION_API " , " " )
2025-06-09 00:02:14 +08:00
try :
2025-06-09 05:50:10 +08:00
docling_picture_description_api = json . loads ( docling_picture_description_api )
2025-06-09 00:02:14 +08:00
except json . JSONDecodeError :
2025-06-09 05:50:10 +08:00
docling_picture_description_api = { }
2025-06-08 22:30:26 +08:00
2025-06-09 00:02:14 +08:00
DOCLING_PICTURE_DESCRIPTION_API = PersistentConfig (
" DOCLING_PICTURE_DESCRIPTION_API " ,
" rag.docling_picture_description_api " ,
2025-06-09 05:50:10 +08:00
docling_picture_description_api ,
2025-06-08 22:30:26 +08:00
)
2025-06-09 00:02:14 +08:00
2025-02-07 20:44:47 +08:00
DOCUMENT_INTELLIGENCE_ENDPOINT = PersistentConfig (
" DOCUMENT_INTELLIGENCE_ENDPOINT " ,
" rag.document_intelligence_endpoint " ,
os . getenv ( " DOCUMENT_INTELLIGENCE_ENDPOINT " , " " ) ,
)
DOCUMENT_INTELLIGENCE_KEY = PersistentConfig (
" DOCUMENT_INTELLIGENCE_KEY " ,
" rag.document_intelligence_key " ,
os . getenv ( " DOCUMENT_INTELLIGENCE_KEY " , " " ) ,
)
2025-03-22 20:44:50 +08:00
MISTRAL_OCR_API_KEY = PersistentConfig (
" MISTRAL_OCR_API_KEY " ,
" rag.mistral_ocr_api_key " ,
os . getenv ( " MISTRAL_OCR_API_KEY " , " " ) ,
)
2025-02-27 07:42:19 +08:00
BYPASS_EMBEDDING_AND_RETRIEVAL = PersistentConfig (
" BYPASS_EMBEDDING_AND_RETRIEVAL " ,
" rag.bypass_embedding_and_retrieval " ,
os . environ . get ( " BYPASS_EMBEDDING_AND_RETRIEVAL " , " False " ) . lower ( ) == " true " ,
)
2024-05-14 05:32:21 +08:00
RAG_TOP_K = PersistentConfig (
2024-09-19 22:44:33 +08:00
" RAG_TOP_K " , " rag.top_k " , int ( os . environ . get ( " RAG_TOP_K " , " 3 " ) )
2024-05-10 13:36:10 +08:00
)
2025-03-06 17:47:57 +08:00
RAG_TOP_K_RERANKER = PersistentConfig (
" RAG_TOP_K_RERANKER " ,
" rag.top_k_reranker " ,
2025-03-27 16:40:28 +08:00
int ( os . environ . get ( " RAG_TOP_K_RERANKER " , " 3 " ) ) ,
2025-03-06 17:47:57 +08:00
)
2024-05-14 05:32:21 +08:00
RAG_RELEVANCE_THRESHOLD = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_RELEVANCE_THRESHOLD " ,
" rag.relevance_threshold " ,
float ( os . environ . get ( " RAG_RELEVANCE_THRESHOLD " , " 0.0 " ) ) ,
2024-04-27 02:41:39 +08:00
)
2025-05-24 04:06:44 +08:00
RAG_HYBRID_BM25_WEIGHT = PersistentConfig (
" RAG_HYBRID_BM25_WEIGHT " ,
" rag.hybrid_bm25_weight " ,
float ( os . environ . get ( " RAG_HYBRID_BM25_WEIGHT " , " 0.5 " ) ) ,
2025-05-20 16:39:31 +08:00
)
2024-04-23 07:36:46 +08:00
2024-05-14 05:32:21 +08:00
ENABLE_RAG_HYBRID_SEARCH = PersistentConfig (
2024-05-10 13:36:10 +08:00
" ENABLE_RAG_HYBRID_SEARCH " ,
" rag.enable_hybrid_search " ,
os . environ . get ( " ENABLE_RAG_HYBRID_SEARCH " , " " ) . lower ( ) == " true " ,
)
2024-05-07 04:12:08 +08:00
2025-02-19 13:14:58 +08:00
RAG_FULL_CONTEXT = PersistentConfig (
" RAG_FULL_CONTEXT " ,
" rag.full_context " ,
os . getenv ( " RAG_FULL_CONTEXT " , " False " ) . lower ( ) == " true " ,
)
2024-08-27 21:30:57 +08:00
RAG_FILE_MAX_COUNT = PersistentConfig (
" RAG_FILE_MAX_COUNT " ,
" rag.file.max_count " ,
(
int ( os . environ . get ( " RAG_FILE_MAX_COUNT " ) )
if os . environ . get ( " RAG_FILE_MAX_COUNT " )
else None
) ,
2024-08-02 21:36:17 +08:00
)
2024-08-27 21:30:57 +08:00
RAG_FILE_MAX_SIZE = PersistentConfig (
" RAG_FILE_MAX_SIZE " ,
" rag.file.max_size " ,
(
int ( os . environ . get ( " RAG_FILE_MAX_SIZE " ) )
if os . environ . get ( " RAG_FILE_MAX_SIZE " )
else None
) ,
2024-08-02 21:36:17 +08:00
)
2025-06-16 20:52:57 +08:00
FILE_IMAGE_COMPRESSION_WIDTH = PersistentConfig (
" FILE_IMAGE_COMPRESSION_WIDTH " ,
" file.image_compression_width " ,
(
int ( os . environ . get ( " FILE_IMAGE_COMPRESSION_WIDTH " ) )
if os . environ . get ( " FILE_IMAGE_COMPRESSION_WIDTH " )
else None
) ,
)
FILE_IMAGE_COMPRESSION_HEIGHT = PersistentConfig (
" FILE_IMAGE_COMPRESSION_HEIGHT " ,
" file.image_compression_height " ,
(
int ( os . environ . get ( " FILE_IMAGE_COMPRESSION_HEIGHT " ) )
if os . environ . get ( " FILE_IMAGE_COMPRESSION_HEIGHT " )
else None
) ,
)
2025-05-15 03:06:33 +08:00
RAG_ALLOWED_FILE_EXTENSIONS = PersistentConfig (
" RAG_ALLOWED_FILE_EXTENSIONS " ,
" rag.file.allowed_extensions " ,
2025-05-17 01:05:52 +08:00
[
ext . strip ( )
for ext in os . environ . get ( " RAG_ALLOWED_FILE_EXTENSIONS " , " " ) . split ( " , " )
if ext . strip ( )
] ,
2025-05-15 03:06:33 +08:00
)
2024-05-14 05:32:21 +08:00
RAG_EMBEDDING_ENGINE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_EMBEDDING_ENGINE " ,
" rag.embedding_engine " ,
os . environ . get ( " RAG_EMBEDDING_ENGINE " , " " ) ,
)
2024-04-15 05:55:00 +08:00
2024-05-14 05:32:21 +08:00
PDF_EXTRACT_IMAGES = PersistentConfig (
2024-05-10 13:36:10 +08:00
" PDF_EXTRACT_IMAGES " ,
" rag.pdf_extract_images " ,
os . environ . get ( " PDF_EXTRACT_IMAGES " , " False " ) . lower ( ) == " true " ,
)
2024-04-28 06:54:26 +08:00
2024-05-14 05:32:21 +08:00
RAG_EMBEDDING_MODEL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_EMBEDDING_MODEL " ,
" rag.embedding_model " ,
os . environ . get ( " RAG_EMBEDDING_MODEL " , " sentence-transformers/all-MiniLM-L6-v2 " ) ,
2024-04-23 02:27:43 +08:00
)
2024-08-14 20:38:19 +08:00
log . info ( f " Embedding model set: { RAG_EMBEDDING_MODEL . value } " )
2024-04-10 14:54:20 +08:00
2024-04-25 20:49:59 +08:00
RAG_EMBEDDING_MODEL_AUTO_UPDATE = (
2024-12-18 05:51:29 +08:00
not OFFLINE_MODE
and os . environ . get ( " RAG_EMBEDDING_MODEL_AUTO_UPDATE " , " True " ) . lower ( ) == " true "
2024-04-25 20:49:59 +08:00
)
2024-04-23 02:27:43 +08:00
RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE = (
2024-11-13 12:44:14 +08:00
os . environ . get ( " RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE " , " True " ) . lower ( ) == " true "
2024-04-23 04:49:58 +08:00
)
2024-09-27 06:28:47 +08:00
RAG_EMBEDDING_BATCH_SIZE = PersistentConfig (
" RAG_EMBEDDING_BATCH_SIZE " ,
" rag.embedding_batch_size " ,
2024-10-07 06:09:07 +08:00
int (
os . environ . get ( " RAG_EMBEDDING_BATCH_SIZE " )
or os . environ . get ( " RAG_EMBEDDING_OPENAI_BATCH_SIZE " , " 1 " )
) ,
2024-06-02 22:34:31 +08:00
)
2025-03-31 12:55:15 +08:00
RAG_EMBEDDING_QUERY_PREFIX = os . environ . get ( " RAG_EMBEDDING_QUERY_PREFIX " , None )
2025-01-16 09:05:04 +08:00
2025-03-31 12:55:15 +08:00
RAG_EMBEDDING_CONTENT_PREFIX = os . environ . get ( " RAG_EMBEDDING_CONTENT_PREFIX " , None )
2025-02-05 05:04:36 +08:00
2025-03-31 12:55:15 +08:00
RAG_EMBEDDING_PREFIX_FIELD_NAME = os . environ . get (
" RAG_EMBEDDING_PREFIX_FIELD_NAME " , None
2025-01-16 09:05:04 +08:00
)
2025-05-10 22:25:20 +08:00
RAG_RERANKING_ENGINE = PersistentConfig (
" RAG_RERANKING_ENGINE " ,
" rag.reranking_engine " ,
os . environ . get ( " RAG_RERANKING_ENGINE " , " " ) ,
)
2024-05-14 05:32:21 +08:00
RAG_RERANKING_MODEL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_RERANKING_MODEL " ,
" rag.reranking_model " ,
os . environ . get ( " RAG_RERANKING_MODEL " , " " ) ,
)
if RAG_RERANKING_MODEL . value != " " :
2024-08-14 20:38:19 +08:00
log . info ( f " Reranking model set: { RAG_RERANKING_MODEL . value } " )
2024-04-23 04:49:58 +08:00
2025-05-10 22:25:20 +08:00
2024-04-25 20:49:59 +08:00
RAG_RERANKING_MODEL_AUTO_UPDATE = (
2024-12-18 05:51:29 +08:00
not OFFLINE_MODE
and os . environ . get ( " RAG_RERANKING_MODEL_AUTO_UPDATE " , " True " ) . lower ( ) == " true "
2024-04-25 20:49:59 +08:00
)
2024-04-23 04:49:58 +08:00
RAG_RERANKING_MODEL_TRUST_REMOTE_CODE = (
2024-11-13 12:44:14 +08:00
os . environ . get ( " RAG_RERANKING_MODEL_TRUST_REMOTE_CODE " , " True " ) . lower ( ) == " true "
2024-04-10 14:54:20 +08:00
)
2024-04-09 04:57:54 +08:00
2025-05-10 22:25:20 +08:00
RAG_EXTERNAL_RERANKER_URL = PersistentConfig (
" RAG_EXTERNAL_RERANKER_URL " ,
" rag.external_reranker_url " ,
os . environ . get ( " RAG_EXTERNAL_RERANKER_URL " , " " ) ,
)
RAG_EXTERNAL_RERANKER_API_KEY = PersistentConfig (
" RAG_EXTERNAL_RERANKER_API_KEY " ,
" rag.external_reranker_api_key " ,
os . environ . get ( " RAG_EXTERNAL_RERANKER_API_KEY " , " " ) ,
)
2024-10-13 17:07:50 +08:00
RAG_TEXT_SPLITTER = PersistentConfig (
" RAG_TEXT_SPLITTER " ,
" rag.text_splitter " ,
os . environ . get ( " RAG_TEXT_SPLITTER " , " " ) ,
)
TIKTOKEN_CACHE_DIR = os . environ . get ( " TIKTOKEN_CACHE_DIR " , f " { CACHE_DIR } /tiktoken " )
TIKTOKEN_ENCODING_NAME = PersistentConfig (
" TIKTOKEN_ENCODING_NAME " ,
" rag.tiktoken_encoding_name " ,
os . environ . get ( " TIKTOKEN_ENCODING_NAME " , " cl100k_base " ) ,
)
2024-05-14 05:32:21 +08:00
CHUNK_SIZE = PersistentConfig (
2024-09-19 22:44:33 +08:00
" CHUNK_SIZE " , " rag.chunk_size " , int ( os . environ . get ( " CHUNK_SIZE " , " 1000 " ) )
2024-05-10 13:36:10 +08:00
)
2024-05-14 05:32:21 +08:00
CHUNK_OVERLAP = PersistentConfig (
2024-05-10 13:36:10 +08:00
" CHUNK_OVERLAP " ,
" rag.chunk_overlap " ,
int ( os . environ . get ( " CHUNK_OVERLAP " , " 100 " ) ) ,
)
2024-02-18 14:41:03 +08:00
2024-11-22 09:58:29 +08:00
DEFAULT_RAG_TEMPLATE = """ ### Task:
2025-04-05 17:40:48 +08:00
Respond to the user query using the provided context , incorporating inline citations in the format [ id ] * * only when the < source > tag includes an explicit id attribute * * ( e . g . , < source id = " 1 " > ) .
2024-11-22 09:58:29 +08:00
### Guidelines:
- If you don ' t know the answer, clearly state that.
- If uncertain , ask the user for clarification .
- Respond in the same language as the user ' s query.
- If the context is unreadable or of poor quality , inform the user and provide the best possible answer .
- If the answer isn ' t present in the context but you possess the knowledge, explain this to the user and provide the answer using your own understanding.
2025-04-05 17:40:48 +08:00
- * * Only include inline citations using [ id ] ( e . g . , [ 1 ] , [ 2 ] ) when the < source > tag includes an id attribute . * *
- Do not cite if the < source > tag does not contain an id attribute .
2024-11-22 09:58:29 +08:00
- Do not use XML tags in your response .
- Ensure citations are concise and directly related to the information provided .
### Example of Citation:
2025-04-05 17:40:48 +08:00
If the user asks about a specific topic and the information is found in a source with a provided id attribute , the response should include the citation like in the following example :
2025-04-03 11:07:09 +08:00
* " According to the study, the proposed method increases efficiency by 20 % [1]. "
2024-11-22 09:58:29 +08:00
### Output:
2025-04-05 17:40:48 +08:00
Provide a clear and direct response to the user ' s query, including inline citations in the format [id] only when the <source> tag with id attribute is present in the context.
2024-09-12 21:31:49 +08:00
2024-02-18 14:41:03 +08:00
< context >
2024-10-15 09:47:41 +08:00
{ { CONTEXT } }
2024-02-18 14:41:03 +08:00
< / context >
2024-09-12 21:31:49 +08:00
< user_query >
2024-10-15 09:47:41 +08:00
{ { QUERY } }
2024-09-12 21:31:49 +08:00
< / user_query >
"""
2024-02-18 14:41:03 +08:00
2024-05-14 05:32:21 +08:00
RAG_TEMPLATE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_TEMPLATE " ,
" rag.template " ,
os . environ . get ( " RAG_TEMPLATE " , DEFAULT_RAG_TEMPLATE ) ,
)
2024-04-23 07:36:46 +08:00
2024-05-14 05:32:21 +08:00
RAG_OPENAI_API_BASE_URL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_OPENAI_API_BASE_URL " ,
" rag.openai_api_base_url " ,
os . getenv ( " RAG_OPENAI_API_BASE_URL " , OPENAI_API_BASE_URL ) ,
)
2024-05-14 05:32:21 +08:00
RAG_OPENAI_API_KEY = PersistentConfig (
2024-05-10 13:36:10 +08:00
" RAG_OPENAI_API_KEY " ,
" rag.openai_api_key " ,
os . getenv ( " RAG_OPENAI_API_KEY " , OPENAI_API_KEY ) ,
)
2024-04-21 04:15:59 +08:00
2025-05-20 10:58:04 +08:00
RAG_AZURE_OPENAI_BASE_URL = PersistentConfig (
" RAG_AZURE_OPENAI_BASE_URL " ,
" rag.azure_openai.base_url " ,
os . getenv ( " RAG_AZURE_OPENAI_BASE_URL " , " " ) ,
)
RAG_AZURE_OPENAI_API_KEY = PersistentConfig (
" RAG_AZURE_OPENAI_API_KEY " ,
" rag.azure_openai.api_key " ,
os . getenv ( " RAG_AZURE_OPENAI_API_KEY " , " " ) ,
)
2025-05-30 04:34:18 +08:00
RAG_AZURE_OPENAI_API_VERSION = PersistentConfig (
" RAG_AZURE_OPENAI_API_VERSION " ,
" rag.azure_openai.api_version " ,
os . getenv ( " RAG_AZURE_OPENAI_API_VERSION " , " " ) ,
2024-05-10 13:36:10 +08:00
)
2024-04-21 04:15:59 +08:00
2024-11-19 06:25:36 +08:00
RAG_OLLAMA_BASE_URL = PersistentConfig (
" RAG_OLLAMA_BASE_URL " ,
" rag.ollama.url " ,
os . getenv ( " RAG_OLLAMA_BASE_URL " , OLLAMA_BASE_URL ) ,
)
RAG_OLLAMA_API_KEY = PersistentConfig (
" RAG_OLLAMA_API_KEY " ,
" rag.ollama.key " ,
os . getenv ( " RAG_OLLAMA_API_KEY " , " " ) ,
)
2024-05-07 04:12:08 +08:00
ENABLE_RAG_LOCAL_WEB_FETCH = (
os . getenv ( " ENABLE_RAG_LOCAL_WEB_FETCH " , " False " ) . lower ( ) == " true "
)
2024-04-30 03:55:17 +08:00
2024-05-14 05:32:21 +08:00
YOUTUBE_LOADER_LANGUAGE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" YOUTUBE_LOADER_LANGUAGE " ,
" rag.youtube_loader_language " ,
os . getenv ( " YOUTUBE_LOADER_LANGUAGE " , " en " ) . split ( " , " ) ,
)
2024-05-09 01:51:29 +08:00
2024-11-27 22:09:33 +08:00
YOUTUBE_LOADER_PROXY_URL = PersistentConfig (
" YOUTUBE_LOADER_PROXY_URL " ,
" rag.youtube_loader_proxy_url " ,
os . getenv ( " YOUTUBE_LOADER_PROXY_URL " , " " ) ,
)
2024-05-28 03:48:08 +08:00
2025-04-13 07:33:36 +08:00
####################################
# Web Search (RAG)
####################################
ENABLE_WEB_SEARCH = PersistentConfig (
" ENABLE_WEB_SEARCH " ,
2024-06-02 10:03:56 +08:00
" rag.web.search.enable " ,
2025-04-13 07:33:36 +08:00
os . getenv ( " ENABLE_WEB_SEARCH " , " False " ) . lower ( ) == " true " ,
2024-06-02 10:03:56 +08:00
)
2025-04-13 07:33:36 +08:00
WEB_SEARCH_ENGINE = PersistentConfig (
" WEB_SEARCH_ENGINE " ,
2024-06-02 10:40:48 +08:00
" rag.web.search.engine " ,
2025-04-13 07:33:36 +08:00
os . getenv ( " WEB_SEARCH_ENGINE " , " " ) ,
2024-06-02 10:40:48 +08:00
)
2024-06-02 10:03:56 +08:00
2025-02-27 07:42:19 +08:00
BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig (
" BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL " ,
" rag.web.search.bypass_embedding_and_retrieval " ,
os . getenv ( " BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL " , " False " ) . lower ( ) == " true " ,
2025-02-18 10:14:26 +08:00
)
2025-04-13 07:33:36 +08:00
2025-05-23 06:30:35 +08:00
BYPASS_WEB_SEARCH_WEB_LOADER = PersistentConfig (
" BYPASS_WEB_SEARCH_WEB_LOADER " ,
" rag.web.search.bypass_web_loader " ,
os . getenv ( " BYPASS_WEB_SEARCH_WEB_LOADER " , " False " ) . lower ( ) == " true " ,
)
2025-04-13 07:33:36 +08:00
WEB_SEARCH_RESULT_COUNT = PersistentConfig (
" WEB_SEARCH_RESULT_COUNT " ,
" rag.web.search.result_count " ,
int ( os . getenv ( " WEB_SEARCH_RESULT_COUNT " , " 3 " ) ) ,
)
2024-06-18 05:32:23 +08:00
# You can provide a list of your own websites to filter after performing a web search.
2024-06-17 15:33:23 +08:00
# This ensures the highest level of safety and reliability of the information sources.
2025-04-13 07:33:36 +08:00
WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig (
" WEB_SEARCH_DOMAIN_FILTER_LIST " ,
2025-02-08 03:23:04 +08:00
" rag.web.search.domain.filter_list " ,
2024-06-13 08:14:48 +08:00
[
2024-06-18 05:32:23 +08:00
# "wikipedia.com",
# "wikimedia.org",
2024-06-17 15:33:23 +08:00
# "wikidata.org",
2024-06-13 08:14:48 +08:00
] ,
)
2025-04-13 07:33:36 +08:00
WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig (
" WEB_SEARCH_CONCURRENT_REQUESTS " ,
" rag.web.search.concurrent_requests " ,
int ( os . getenv ( " WEB_SEARCH_CONCURRENT_REQUESTS " , " 10 " ) ) ,
)
2025-05-23 06:30:35 +08:00
2025-04-13 07:33:36 +08:00
WEB_LOADER_ENGINE = PersistentConfig (
" WEB_LOADER_ENGINE " ,
" rag.web.loader.engine " ,
os . environ . get ( " WEB_LOADER_ENGINE " , " " ) ,
)
2025-08-19 00:06:36 +08:00
WEB_LOADER_CONCURRENT_REQUESTS = PersistentConfig (
" WEB_LOADER_CONCURRENT_REQUESTS " ,
" rag.web.loader.concurrent_requests " ,
int ( os . getenv ( " WEB_LOADER_CONCURRENT_REQUESTS " , " 10 " ) ) ,
)
2025-04-13 07:33:36 +08:00
ENABLE_WEB_LOADER_SSL_VERIFICATION = PersistentConfig (
" ENABLE_WEB_LOADER_SSL_VERIFICATION " ,
" rag.web.loader.ssl_verification " ,
os . environ . get ( " ENABLE_WEB_LOADER_SSL_VERIFICATION " , " True " ) . lower ( ) == " true " ,
)
WEB_SEARCH_TRUST_ENV = PersistentConfig (
" WEB_SEARCH_TRUST_ENV " ,
" rag.web.search.trust_env " ,
os . getenv ( " WEB_SEARCH_TRUST_ENV " , " False " ) . lower ( ) == " true " ,
)
2024-12-19 02:25:57 +08:00
2025-09-25 04:19:05 +08:00
OLLAMA_CLOUD_WEB_SEARCH_API_KEY = PersistentConfig (
" OLLAMA_CLOUD_WEB_SEARCH_API_KEY " ,
" rag.web.search.ollama_cloud_api_key " ,
os . getenv ( " OLLAMA_CLOUD_API_KEY " , " " ) ,
)
2024-06-02 10:03:56 +08:00
SEARXNG_QUERY_URL = PersistentConfig (
" SEARXNG_QUERY_URL " ,
" rag.web.search.searxng_query_url " ,
os . getenv ( " SEARXNG_QUERY_URL " , " " ) ,
)
2025-04-27 02:07:13 +08:00
YACY_QUERY_URL = PersistentConfig (
" YACY_QUERY_URL " ,
" rag.web.search.yacy_query_url " ,
os . getenv ( " YACY_QUERY_URL " , " " ) ,
)
2025-04-27 09:27:55 +08:00
YACY_USERNAME = PersistentConfig (
" YACY_USERNAME " ,
" rag.web.search.yacy_username " ,
os . getenv ( " YACY_USERNAME " , " " ) ,
)
YACY_PASSWORD = PersistentConfig (
" YACY_PASSWORD " ,
" rag.web.search.yacy_password " ,
os . getenv ( " YACY_PASSWORD " , " " ) ,
)
2024-06-02 10:03:56 +08:00
GOOGLE_PSE_API_KEY = PersistentConfig (
" GOOGLE_PSE_API_KEY " ,
" rag.web.search.google_pse_api_key " ,
os . getenv ( " GOOGLE_PSE_API_KEY " , " " ) ,
)
GOOGLE_PSE_ENGINE_ID = PersistentConfig (
" GOOGLE_PSE_ENGINE_ID " ,
" rag.web.search.google_pse_engine_id " ,
os . getenv ( " GOOGLE_PSE_ENGINE_ID " , " " ) ,
)
BRAVE_SEARCH_API_KEY = PersistentConfig (
" BRAVE_SEARCH_API_KEY " ,
" rag.web.search.brave_search_api_key " ,
os . getenv ( " BRAVE_SEARCH_API_KEY " , " " ) ,
)
2024-12-08 13:21:10 +08:00
KAGI_SEARCH_API_KEY = PersistentConfig (
" KAGI_SEARCH_API_KEY " ,
" rag.web.search.kagi_search_api_key " ,
os . getenv ( " KAGI_SEARCH_API_KEY " , " " ) ,
)
2024-10-29 22:45:38 +08:00
MOJEEK_SEARCH_API_KEY = PersistentConfig (
" MOJEEK_SEARCH_API_KEY " ,
2024-11-22 00:10:05 +08:00
" rag.web.search.mojeek_search_api_key " ,
2024-10-29 22:45:38 +08:00
os . getenv ( " MOJEEK_SEARCH_API_KEY " , " " ) ,
)
2025-02-10 16:44:47 +08:00
BOCHA_SEARCH_API_KEY = PersistentConfig (
" BOCHA_SEARCH_API_KEY " ,
" rag.web.search.bocha_search_api_key " ,
os . getenv ( " BOCHA_SEARCH_API_KEY " , " " ) ,
)
2024-06-02 10:03:56 +08:00
SERPSTACK_API_KEY = PersistentConfig (
" SERPSTACK_API_KEY " ,
" rag.web.search.serpstack_api_key " ,
os . getenv ( " SERPSTACK_API_KEY " , " " ) ,
)
2024-05-28 03:48:08 +08:00
2024-06-02 10:03:56 +08:00
SERPSTACK_HTTPS = PersistentConfig (
" SERPSTACK_HTTPS " ,
" rag.web.search.serpstack_https " ,
os . getenv ( " SERPSTACK_HTTPS " , " True " ) . lower ( ) == " true " ,
2024-05-12 15:19:52 +08:00
)
2024-05-28 03:48:08 +08:00
2024-06-02 10:03:56 +08:00
SERPER_API_KEY = PersistentConfig (
" SERPER_API_KEY " ,
" rag.web.search.serper_api_key " ,
os . getenv ( " SERPER_API_KEY " , " " ) ,
2024-05-11 23:12:52 +08:00
)
2024-05-06 12:27:46 +08:00
2024-06-10 09:39:46 +08:00
SERPLY_API_KEY = PersistentConfig (
" SERPLY_API_KEY " ,
" rag.web.search.serply_api_key " ,
os . getenv ( " SERPLY_API_KEY " , " " ) ,
)
2024-11-04 09:07:24 +08:00
JINA_API_KEY = PersistentConfig (
" JINA_API_KEY " ,
" rag.web.search.jina_api_key " ,
os . getenv ( " JINA_API_KEY " , " " ) ,
)
2024-08-27 15:45:17 +08:00
SEARCHAPI_API_KEY = PersistentConfig (
" SEARCHAPI_API_KEY " ,
" rag.web.search.searchapi_api_key " ,
os . getenv ( " SEARCHAPI_API_KEY " , " " ) ,
)
SEARCHAPI_ENGINE = PersistentConfig (
" SEARCHAPI_ENGINE " ,
" rag.web.search.searchapi_engine " ,
os . getenv ( " SEARCHAPI_ENGINE " , " " ) ,
)
2025-02-14 12:24:58 +08:00
SERPAPI_API_KEY = PersistentConfig (
" SERPAPI_API_KEY " ,
" rag.web.search.serpapi_api_key " ,
os . getenv ( " SERPAPI_API_KEY " , " " ) ,
)
SERPAPI_ENGINE = PersistentConfig (
" SERPAPI_ENGINE " ,
" rag.web.search.serpapi_engine " ,
os . getenv ( " SERPAPI_ENGINE " , " " ) ,
)
2024-11-04 09:07:24 +08:00
BING_SEARCH_V7_ENDPOINT = PersistentConfig (
" BING_SEARCH_V7_ENDPOINT " ,
" rag.web.search.bing_search_v7_endpoint " ,
os . environ . get (
" BING_SEARCH_V7_ENDPOINT " , " https://api.bing.microsoft.com/v7.0/search "
) ,
)
BING_SEARCH_V7_SUBSCRIPTION_KEY = PersistentConfig (
" BING_SEARCH_V7_SUBSCRIPTION_KEY " ,
" rag.web.search.bing_search_v7_subscription_key " ,
os . environ . get ( " BING_SEARCH_V7_SUBSCRIPTION_KEY " , " " ) ,
)
2025-02-05 02:13:05 +08:00
EXA_API_KEY = PersistentConfig (
" EXA_API_KEY " ,
" rag.web.search.exa_api_key " ,
os . getenv ( " EXA_API_KEY " , " " ) ,
)
2024-11-04 09:07:24 +08:00
2025-02-27 16:12:41 +08:00
PERPLEXITY_API_KEY = PersistentConfig (
" PERPLEXITY_API_KEY " ,
" rag.web.search.perplexity_api_key " ,
os . getenv ( " PERPLEXITY_API_KEY " , " " ) ,
)
2025-06-03 06:19:08 +08:00
PERPLEXITY_MODEL = PersistentConfig (
" PERPLEXITY_MODEL " ,
" rag.web.search.perplexity_model " ,
os . getenv ( " PERPLEXITY_MODEL " , " sonar " ) ,
)
PERPLEXITY_SEARCH_CONTEXT_USAGE = PersistentConfig (
" PERPLEXITY_SEARCH_CONTEXT_USAGE " ,
" rag.web.search.perplexity_search_context_usage " ,
os . getenv ( " PERPLEXITY_SEARCH_CONTEXT_USAGE " , " medium " ) ,
)
2025-04-10 14:51:44 +08:00
SOUGOU_API_SID = PersistentConfig (
" SOUGOU_API_SID " ,
" rag.web.search.sougou_api_sid " ,
os . getenv ( " SOUGOU_API_SID " , " " ) ,
)
SOUGOU_API_SK = PersistentConfig (
" SOUGOU_API_SK " ,
" rag.web.search.sougou_api_sk " ,
os . getenv ( " SOUGOU_API_SK " , " " ) ,
)
2025-04-13 07:33:36 +08:00
TAVILY_API_KEY = PersistentConfig (
" TAVILY_API_KEY " ,
" rag.web.search.tavily_api_key " ,
os . getenv ( " TAVILY_API_KEY " , " " ) ,
2025-01-29 13:03:15 +08:00
)
2024-06-02 10:03:56 +08:00
2025-04-13 07:33:36 +08:00
TAVILY_EXTRACT_DEPTH = PersistentConfig (
" TAVILY_EXTRACT_DEPTH " ,
" rag.web.search.tavily_extract_depth " ,
os . getenv ( " TAVILY_EXTRACT_DEPTH " , " basic " ) ,
2025-02-14 15:15:09 +08:00
)
2024-06-02 10:03:56 +08:00
2025-04-13 07:33:36 +08:00
PLAYWRIGHT_WS_URL = PersistentConfig (
" PLAYWRIGHT_WS_URL " ,
2025-04-13 07:34:20 +08:00
" rag.web.loader.playwright_ws_url " ,
2025-04-13 07:33:36 +08:00
os . environ . get ( " PLAYWRIGHT_WS_URL " , " " ) ,
2025-02-03 07:58:09 +08:00
)
2025-03-21 05:01:47 +08:00
PLAYWRIGHT_TIMEOUT = PersistentConfig (
" PLAYWRIGHT_TIMEOUT " ,
2025-04-12 17:13:30 +08:00
" rag.web.loader.playwright_timeout " ,
int ( os . environ . get ( " PLAYWRIGHT_TIMEOUT " , " 10000 " ) ) ,
2025-03-20 14:58:38 +08:00
)
2025-02-19 16:54:44 +08:00
FIRECRAWL_API_KEY = PersistentConfig (
" FIRECRAWL_API_KEY " ,
2025-04-12 17:13:30 +08:00
" rag.web.loader.firecrawl_api_key " ,
2025-02-19 16:54:44 +08:00
os . environ . get ( " FIRECRAWL_API_KEY " , " " ) ,
)
FIRECRAWL_API_BASE_URL = PersistentConfig (
" FIRECRAWL_API_BASE_URL " ,
2025-04-12 17:13:30 +08:00
" rag.web.loader.firecrawl_api_url " ,
2025-02-19 16:54:44 +08:00
os . environ . get ( " FIRECRAWL_API_BASE_URL " , " https://api.firecrawl.dev " ) ,
)
2025-04-14 01:49:05 +08:00
EXTERNAL_WEB_SEARCH_URL = PersistentConfig (
" EXTERNAL_WEB_SEARCH_URL " ,
" rag.web.search.external_web_search_url " ,
os . environ . get ( " EXTERNAL_WEB_SEARCH_URL " , " " ) ,
)
EXTERNAL_WEB_SEARCH_API_KEY = PersistentConfig (
" EXTERNAL_WEB_SEARCH_API_KEY " ,
" rag.web.search.external_web_search_api_key " ,
os . environ . get ( " EXTERNAL_WEB_SEARCH_API_KEY " , " " ) ,
)
EXTERNAL_WEB_LOADER_URL = PersistentConfig (
" EXTERNAL_WEB_LOADER_URL " ,
" rag.web.loader.external_web_loader_url " ,
os . environ . get ( " EXTERNAL_WEB_LOADER_URL " , " " ) ,
)
EXTERNAL_WEB_LOADER_API_KEY = PersistentConfig (
" EXTERNAL_WEB_LOADER_API_KEY " ,
" rag.web.loader.external_web_loader_api_key " ,
os . environ . get ( " EXTERNAL_WEB_LOADER_API_KEY " , " " ) ,
)
2025-04-12 17:13:30 +08:00
2024-02-22 10:12:01 +08:00
####################################
# Images
####################################
2024-05-14 05:32:21 +08:00
IMAGE_GENERATION_ENGINE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGE_GENERATION_ENGINE " ,
" image_generation.engine " ,
2024-08-22 00:29:52 +08:00
os . getenv ( " IMAGE_GENERATION_ENGINE " , " openai " ) ,
2024-05-10 13:36:10 +08:00
)
2024-04-28 06:54:26 +08:00
2024-05-14 05:32:21 +08:00
ENABLE_IMAGE_GENERATION = PersistentConfig (
2024-05-10 13:36:10 +08:00
" ENABLE_IMAGE_GENERATION " ,
" image_generation.enable " ,
os . environ . get ( " ENABLE_IMAGE_GENERATION " , " " ) . lower ( ) == " true " ,
)
2025-01-16 16:13:02 +08:00
ENABLE_IMAGE_PROMPT_GENERATION = PersistentConfig (
" ENABLE_IMAGE_PROMPT_GENERATION " ,
" image_generation.prompt.enable " ,
os . environ . get ( " ENABLE_IMAGE_PROMPT_GENERATION " , " true " ) . lower ( ) == " true " ,
)
2024-05-14 05:32:21 +08:00
AUTOMATIC1111_BASE_URL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" AUTOMATIC1111_BASE_URL " ,
" image_generation.automatic1111.base_url " ,
os . getenv ( " AUTOMATIC1111_BASE_URL " , " " ) ,
2024-04-11 13:21:12 +08:00
)
2024-06-20 14:15:49 +08:00
AUTOMATIC1111_API_AUTH = PersistentConfig (
" AUTOMATIC1111_API_AUTH " ,
" image_generation.automatic1111.api_auth " ,
os . getenv ( " AUTOMATIC1111_API_AUTH " , " " ) ,
)
2024-04-21 05:04:16 +08:00
2024-09-07 23:21:17 +08:00
AUTOMATIC1111_CFG_SCALE = PersistentConfig (
" AUTOMATIC1111_CFG_SCALE " ,
" image_generation.automatic1111.cfg_scale " ,
2024-09-12 20:00:24 +08:00
(
float ( os . environ . get ( " AUTOMATIC1111_CFG_SCALE " ) )
if os . environ . get ( " AUTOMATIC1111_CFG_SCALE " )
else None
) ,
2024-09-07 23:21:17 +08:00
)
2024-09-12 20:00:24 +08:00
2024-09-07 23:21:17 +08:00
AUTOMATIC1111_SAMPLER = PersistentConfig (
2024-10-29 05:02:18 +08:00
" AUTOMATIC1111_SAMPLER " ,
2024-09-07 23:21:17 +08:00
" image_generation.automatic1111.sampler " ,
2024-09-12 20:00:24 +08:00
(
os . environ . get ( " AUTOMATIC1111_SAMPLER " )
if os . environ . get ( " AUTOMATIC1111_SAMPLER " )
else None
2024-09-13 12:49:23 +08:00
) ,
2024-09-07 23:21:17 +08:00
)
AUTOMATIC1111_SCHEDULER = PersistentConfig (
" AUTOMATIC1111_SCHEDULER " ,
" image_generation.automatic1111.scheduler " ,
2024-09-12 20:00:24 +08:00
(
os . environ . get ( " AUTOMATIC1111_SCHEDULER " )
if os . environ . get ( " AUTOMATIC1111_SCHEDULER " )
else None
2024-09-13 12:49:23 +08:00
) ,
2024-09-07 23:21:17 +08:00
)
2024-05-14 05:32:21 +08:00
COMFYUI_BASE_URL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" COMFYUI_BASE_URL " ,
" image_generation.comfyui.base_url " ,
os . getenv ( " COMFYUI_BASE_URL " , " " ) ,
)
2024-04-21 05:04:16 +08:00
2024-12-17 15:29:00 +08:00
COMFYUI_API_KEY = PersistentConfig (
" COMFYUI_API_KEY " ,
" image_generation.comfyui.api_key " ,
os . getenv ( " COMFYUI_API_KEY " , " " ) ,
)
2024-08-21 06:35:42 +08:00
COMFYUI_DEFAULT_WORKFLOW = """
{
" 3 " : {
" inputs " : {
" seed " : 0 ,
" steps " : 20 ,
" cfg " : 8 ,
" sampler_name " : " euler " ,
" scheduler " : " normal " ,
" denoise " : 1 ,
" model " : [
" 4 " ,
0
] ,
" positive " : [
" 6 " ,
0
] ,
" negative " : [
" 7 " ,
0
] ,
" latent_image " : [
" 5 " ,
0
]
} ,
" class_type " : " KSampler " ,
" _meta " : {
" title " : " KSampler "
}
} ,
" 4 " : {
" inputs " : {
" ckpt_name " : " model.safetensors "
} ,
" class_type " : " CheckpointLoaderSimple " ,
" _meta " : {
" title " : " Load Checkpoint "
}
} ,
" 5 " : {
" inputs " : {
" width " : 512 ,
" height " : 512 ,
" batch_size " : 1
} ,
" class_type " : " EmptyLatentImage " ,
" _meta " : {
" title " : " Empty Latent Image "
}
} ,
" 6 " : {
" inputs " : {
" text " : " Prompt " ,
" clip " : [
" 4 " ,
1
]
} ,
" class_type " : " CLIPTextEncode " ,
" _meta " : {
" title " : " CLIP Text Encode (Prompt) "
}
} ,
" 7 " : {
" inputs " : {
" text " : " " ,
" clip " : [
" 4 " ,
1
]
} ,
" class_type " : " CLIPTextEncode " ,
" _meta " : {
" title " : " CLIP Text Encode (Prompt) "
}
} ,
" 8 " : {
" inputs " : {
" samples " : [
" 3 " ,
0
] ,
" vae " : [
" 4 " ,
2
]
} ,
" class_type " : " VAEDecode " ,
" _meta " : {
" title " : " VAE Decode "
}
} ,
" 9 " : {
" inputs " : {
" filename_prefix " : " ComfyUI " ,
" images " : [
" 8 " ,
0
]
} ,
" class_type " : " SaveImage " ,
" _meta " : {
" title " : " Save Image "
}
}
}
"""
2024-08-21 00:17:15 +08:00
COMFYUI_WORKFLOW = PersistentConfig (
" COMFYUI_WORKFLOW " ,
" image_generation.comfyui.workflow " ,
2024-08-21 06:35:42 +08:00
os . getenv ( " COMFYUI_WORKFLOW " , COMFYUI_DEFAULT_WORKFLOW ) ,
)
COMFYUI_WORKFLOW_NODES = PersistentConfig (
" COMFYUI_WORKFLOW " ,
" image_generation.comfyui.nodes " ,
[ ] ,
2024-08-02 11:01:21 +08:00
)
2024-05-14 05:32:21 +08:00
IMAGES_OPENAI_API_BASE_URL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGES_OPENAI_API_BASE_URL " ,
" image_generation.openai.api_base_url " ,
os . getenv ( " IMAGES_OPENAI_API_BASE_URL " , OPENAI_API_BASE_URL ) ,
)
2025-09-02 21:37:15 +08:00
IMAGES_OPENAI_API_VERSION = PersistentConfig (
" IMAGES_OPENAI_API_VERSION " ,
" image_generation.openai.api_version " ,
os . getenv ( " IMAGES_OPENAI_API_VERSION " , " " ) ,
)
2024-05-14 05:32:21 +08:00
IMAGES_OPENAI_API_KEY = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGES_OPENAI_API_KEY " ,
" image_generation.openai.api_key " ,
os . getenv ( " IMAGES_OPENAI_API_KEY " , OPENAI_API_KEY ) ,
2024-04-23 18:58:57 +08:00
)
2024-04-23 18:53:04 +08:00
2025-02-19 06:39:32 +08:00
IMAGES_GEMINI_API_BASE_URL = PersistentConfig (
" IMAGES_GEMINI_API_BASE_URL " ,
" image_generation.gemini.api_base_url " ,
os . getenv ( " IMAGES_GEMINI_API_BASE_URL " , GEMINI_API_BASE_URL ) ,
)
IMAGES_GEMINI_API_KEY = PersistentConfig (
" IMAGES_GEMINI_API_KEY " ,
" image_generation.gemini.api_key " ,
os . getenv ( " IMAGES_GEMINI_API_KEY " , GEMINI_API_KEY ) ,
)
2024-05-14 05:32:21 +08:00
IMAGE_SIZE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGE_SIZE " , " image_generation.size " , os . getenv ( " IMAGE_SIZE " , " 512x512 " )
)
2024-04-28 06:54:26 +08:00
2024-05-14 05:32:21 +08:00
IMAGE_STEPS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGE_STEPS " , " image_generation.steps " , int ( os . getenv ( " IMAGE_STEPS " , 50 ) )
)
2024-04-28 06:54:26 +08:00
2024-05-14 05:32:21 +08:00
IMAGE_GENERATION_MODEL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGE_GENERATION_MODEL " ,
" image_generation.model " ,
os . getenv ( " IMAGE_GENERATION_MODEL " , " " ) ,
)
2024-04-23 18:53:04 +08:00
2024-04-21 05:04:16 +08:00
####################################
# Audio
####################################
2024-10-21 12:34:36 +08:00
# Transcription
WHISPER_MODEL = PersistentConfig (
" WHISPER_MODEL " ,
" audio.stt.whisper_model " ,
os . getenv ( " WHISPER_MODEL " , " base " ) ,
)
WHISPER_MODEL_DIR = os . getenv ( " WHISPER_MODEL_DIR " , f " { CACHE_DIR } /whisper/models " )
WHISPER_MODEL_AUTO_UPDATE = (
2024-12-18 05:51:29 +08:00
not OFFLINE_MODE
and os . environ . get ( " WHISPER_MODEL_AUTO_UPDATE " , " " ) . lower ( ) == " true "
2024-10-21 12:34:36 +08:00
)
2025-04-14 14:39:38 +08:00
WHISPER_VAD_FILTER = PersistentConfig (
" WHISPER_VAD_FILTER " ,
" audio.stt.whisper_vad_filter " ,
os . getenv ( " WHISPER_VAD_FILTER " , " False " ) . lower ( ) == " true " ,
)
2025-05-02 05:03:49 +08:00
WHISPER_LANGUAGE = os . getenv ( " WHISPER_LANGUAGE " , " " ) . lower ( ) or None
2025-04-14 14:39:38 +08:00
2025-02-02 21:58:59 +08:00
# Add Deepgram configuration
DEEPGRAM_API_KEY = PersistentConfig (
" DEEPGRAM_API_KEY " ,
" audio.stt.deepgram.api_key " ,
os . getenv ( " DEEPGRAM_API_KEY " , " " ) ,
)
2024-10-21 12:34:36 +08:00
2025-04-14 14:39:38 +08:00
2024-06-08 11:18:48 +08:00
AUDIO_STT_OPENAI_API_BASE_URL = PersistentConfig (
" AUDIO_STT_OPENAI_API_BASE_URL " ,
" audio.stt.openai.api_base_url " ,
os . getenv ( " AUDIO_STT_OPENAI_API_BASE_URL " , OPENAI_API_BASE_URL ) ,
)
AUDIO_STT_OPENAI_API_KEY = PersistentConfig (
" AUDIO_STT_OPENAI_API_KEY " ,
" audio.stt.openai.api_key " ,
os . getenv ( " AUDIO_STT_OPENAI_API_KEY " , OPENAI_API_KEY ) ,
)
AUDIO_STT_ENGINE = PersistentConfig (
" AUDIO_STT_ENGINE " ,
" audio.stt.engine " ,
os . getenv ( " AUDIO_STT_ENGINE " , " " ) ,
)
AUDIO_STT_MODEL = PersistentConfig (
" AUDIO_STT_MODEL " ,
" audio.stt.model " ,
2024-10-21 12:34:36 +08:00
os . getenv ( " AUDIO_STT_MODEL " , " " ) ,
2024-06-08 11:18:48 +08:00
)
2025-06-16 20:13:40 +08:00
AUDIO_STT_SUPPORTED_CONTENT_TYPES = PersistentConfig (
" AUDIO_STT_SUPPORTED_CONTENT_TYPES " ,
" audio.stt.supported_content_types " ,
2025-06-16 20:52:57 +08:00
[
content_type . strip ( )
for content_type in os . environ . get (
" AUDIO_STT_SUPPORTED_CONTENT_TYPES " , " "
) . split ( " , " )
if content_type . strip ( )
] ,
2025-06-16 20:13:40 +08:00
)
2025-04-11 04:38:59 +08:00
AUDIO_STT_AZURE_API_KEY = PersistentConfig (
" AUDIO_STT_AZURE_API_KEY " ,
" audio.stt.azure.api_key " ,
os . getenv ( " AUDIO_STT_AZURE_API_KEY " , " " ) ,
)
AUDIO_STT_AZURE_REGION = PersistentConfig (
" AUDIO_STT_AZURE_REGION " ,
" audio.stt.azure.region " ,
os . getenv ( " AUDIO_STT_AZURE_REGION " , " " ) ,
)
AUDIO_STT_AZURE_LOCALES = PersistentConfig (
" AUDIO_STT_AZURE_LOCALES " ,
" audio.stt.azure.locales " ,
os . getenv ( " AUDIO_STT_AZURE_LOCALES " , " " ) ,
)
2025-04-30 20:51:01 +08:00
AUDIO_STT_AZURE_BASE_URL = PersistentConfig (
" AUDIO_STT_AZURE_BASE_URL " ,
" audio.stt.azure.base_url " ,
os . getenv ( " AUDIO_STT_AZURE_BASE_URL " , " " ) ,
)
AUDIO_STT_AZURE_MAX_SPEAKERS = PersistentConfig (
" AUDIO_STT_AZURE_MAX_SPEAKERS " ,
" audio.stt.azure.max_speakers " ,
2025-05-06 10:08:48 +08:00
os . getenv ( " AUDIO_STT_AZURE_MAX_SPEAKERS " , " " ) ,
2025-04-30 20:51:01 +08:00
)
2024-06-08 11:18:48 +08:00
AUDIO_TTS_OPENAI_API_BASE_URL = PersistentConfig (
" AUDIO_TTS_OPENAI_API_BASE_URL " ,
" audio.tts.openai.api_base_url " ,
os . getenv ( " AUDIO_TTS_OPENAI_API_BASE_URL " , OPENAI_API_BASE_URL ) ,
)
AUDIO_TTS_OPENAI_API_KEY = PersistentConfig (
" AUDIO_TTS_OPENAI_API_KEY " ,
" audio.tts.openai.api_key " ,
os . getenv ( " AUDIO_TTS_OPENAI_API_KEY " , OPENAI_API_KEY ) ,
)
2024-07-19 16:35:05 +08:00
AUDIO_TTS_API_KEY = PersistentConfig (
" AUDIO_TTS_API_KEY " ,
" audio.tts.api_key " ,
os . getenv ( " AUDIO_TTS_API_KEY " , " " ) ,
)
2024-06-08 11:18:48 +08:00
AUDIO_TTS_ENGINE = PersistentConfig (
" AUDIO_TTS_ENGINE " ,
" audio.tts.engine " ,
os . getenv ( " AUDIO_TTS_ENGINE " , " " ) ,
)
AUDIO_TTS_MODEL = PersistentConfig (
" AUDIO_TTS_MODEL " ,
" audio.tts.model " ,
2024-08-17 06:42:15 +08:00
os . getenv ( " AUDIO_TTS_MODEL " , " tts-1 " ) , # OpenAI default model
2024-06-08 11:18:48 +08:00
)
AUDIO_TTS_VOICE = PersistentConfig (
" AUDIO_TTS_VOICE " ,
" audio.tts.voice " ,
2024-08-17 06:42:15 +08:00
os . getenv ( " AUDIO_TTS_VOICE " , " alloy " ) , # OpenAI default voice
2024-05-10 13:36:10 +08:00
)
2024-08-25 08:35:42 +08:00
AUDIO_TTS_SPLIT_ON = PersistentConfig (
" AUDIO_TTS_SPLIT_ON " ,
" audio.tts.split_on " ,
os . getenv ( " AUDIO_TTS_SPLIT_ON " , " punctuation " ) ,
)
2024-09-18 21:13:42 +08:00
AUDIO_TTS_AZURE_SPEECH_REGION = PersistentConfig (
" AUDIO_TTS_AZURE_SPEECH_REGION " ,
2024-09-19 08:42:24 +08:00
" audio.tts.azure.speech_region " ,
2025-05-06 10:08:48 +08:00
os . getenv ( " AUDIO_TTS_AZURE_SPEECH_REGION " , " " ) ,
)
AUDIO_TTS_AZURE_SPEECH_BASE_URL = PersistentConfig (
" AUDIO_TTS_AZURE_SPEECH_BASE_URL " ,
" audio.tts.azure.speech_base_url " ,
os . getenv ( " AUDIO_TTS_AZURE_SPEECH_BASE_URL " , " " ) ,
2024-09-18 21:13:42 +08:00
)
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT = PersistentConfig (
" AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT " ,
2024-09-19 08:42:24 +08:00
" audio.tts.azure.speech_output_format " ,
os . getenv (
" AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT " , " audio-24khz-160kbitrate-mono-mp3 "
) ,
2024-09-18 21:13:42 +08:00
)
2024-11-06 06:20:54 +08:00
####################################
# LDAP
####################################
ENABLE_LDAP = PersistentConfig (
" ENABLE_LDAP " ,
" ldap.enable " ,
2024-11-06 11:58:54 +08:00
os . environ . get ( " ENABLE_LDAP " , " false " ) . lower ( ) == " true " ,
2024-11-06 06:20:54 +08:00
)
LDAP_SERVER_LABEL = PersistentConfig (
" LDAP_SERVER_LABEL " ,
" ldap.server.label " ,
os . environ . get ( " LDAP_SERVER_LABEL " , " LDAP Server " ) ,
)
LDAP_SERVER_HOST = PersistentConfig (
" LDAP_SERVER_HOST " ,
" ldap.server.host " ,
2024-11-06 07:15:32 +08:00
os . environ . get ( " LDAP_SERVER_HOST " , " localhost " ) ,
2024-11-06 06:20:54 +08:00
)
LDAP_SERVER_PORT = PersistentConfig (
" LDAP_SERVER_PORT " ,
" ldap.server.port " ,
2024-11-06 07:15:32 +08:00
int ( os . environ . get ( " LDAP_SERVER_PORT " , " 389 " ) ) ,
2024-11-06 06:20:54 +08:00
)
2025-01-10 08:53:03 +08:00
LDAP_ATTRIBUTE_FOR_MAIL = PersistentConfig (
" LDAP_ATTRIBUTE_FOR_MAIL " ,
" ldap.server.attribute_for_mail " ,
os . environ . get ( " LDAP_ATTRIBUTE_FOR_MAIL " , " mail " ) ,
)
2024-11-06 06:20:54 +08:00
LDAP_ATTRIBUTE_FOR_USERNAME = PersistentConfig (
" LDAP_ATTRIBUTE_FOR_USERNAME " ,
" ldap.server.attribute_for_username " ,
2024-11-06 07:15:32 +08:00
os . environ . get ( " LDAP_ATTRIBUTE_FOR_USERNAME " , " uid " ) ,
2024-11-06 06:20:54 +08:00
)
LDAP_APP_DN = PersistentConfig (
2024-11-06 07:15:32 +08:00
" LDAP_APP_DN " , " ldap.server.app_dn " , os . environ . get ( " LDAP_APP_DN " , " " )
2024-11-06 06:20:54 +08:00
)
LDAP_APP_PASSWORD = PersistentConfig (
" LDAP_APP_PASSWORD " ,
" ldap.server.app_password " ,
2024-11-06 07:15:32 +08:00
os . environ . get ( " LDAP_APP_PASSWORD " , " " ) ,
2024-11-06 06:20:54 +08:00
)
LDAP_SEARCH_BASE = PersistentConfig (
2024-11-06 07:15:32 +08:00
" LDAP_SEARCH_BASE " , " ldap.server.users_dn " , os . environ . get ( " LDAP_SEARCH_BASE " , " " )
2024-11-06 06:20:54 +08:00
)
LDAP_SEARCH_FILTERS = PersistentConfig (
" LDAP_SEARCH_FILTER " ,
" ldap.server.search_filter " ,
2025-02-28 03:45:25 +08:00
os . environ . get ( " LDAP_SEARCH_FILTER " , os . environ . get ( " LDAP_SEARCH_FILTERS " , " " ) ) ,
2024-11-06 06:20:54 +08:00
)
LDAP_USE_TLS = PersistentConfig (
" LDAP_USE_TLS " ,
" ldap.server.use_tls " ,
2024-11-06 07:15:32 +08:00
os . environ . get ( " LDAP_USE_TLS " , " True " ) . lower ( ) == " true " ,
2024-11-06 06:20:54 +08:00
)
LDAP_CA_CERT_FILE = PersistentConfig (
" LDAP_CA_CERT_FILE " ,
" ldap.server.ca_cert_file " ,
2024-11-06 07:15:32 +08:00
os . environ . get ( " LDAP_CA_CERT_FILE " , " " ) ,
2024-11-06 06:20:54 +08:00
)
2025-05-13 23:36:50 +08:00
LDAP_VALIDATE_CERT = PersistentConfig (
" LDAP_VALIDATE_CERT " ,
" ldap.server.validate_cert " ,
2025-05-15 03:13:06 +08:00
os . environ . get ( " LDAP_VALIDATE_CERT " , " True " ) . lower ( ) == " true " ,
2025-05-13 23:36:50 +08:00
)
2024-11-06 06:20:54 +08:00
LDAP_CIPHERS = PersistentConfig (
2024-11-06 07:15:32 +08:00
" LDAP_CIPHERS " , " ldap.server.ciphers " , os . environ . get ( " LDAP_CIPHERS " , " ALL " )
2024-11-06 06:20:54 +08:00
)
2025-06-11 22:55:31 +08:00
# For LDAP Group Management
ENABLE_LDAP_GROUP_MANAGEMENT = PersistentConfig (
" ENABLE_LDAP_GROUP_MANAGEMENT " ,
" ldap.group.enable_management " ,
os . environ . get ( " ENABLE_LDAP_GROUP_MANAGEMENT " , " False " ) . lower ( ) == " true " ,
)
ENABLE_LDAP_GROUP_CREATION = PersistentConfig (
" ENABLE_LDAP_GROUP_CREATION " ,
" ldap.group.enable_creation " ,
os . environ . get ( " ENABLE_LDAP_GROUP_CREATION " , " False " ) . lower ( ) == " true " ,
)
LDAP_ATTRIBUTE_FOR_GROUPS = PersistentConfig (
" LDAP_ATTRIBUTE_FOR_GROUPS " ,
" ldap.server.attribute_for_groups " ,
os . environ . get ( " LDAP_ATTRIBUTE_FOR_GROUPS " , " memberOf " ) ,
)