2024-08-28 00:10:27 +02:00
import json
2024-03-20 17:11:36 -06:00
import logging
2024-08-28 00:10:27 +02:00
import os
import shutil
2024-08-25 16:52:36 +02:00
from datetime import datetime
2024-01-07 01:40:36 -08:00
from pathlib import Path
2024-08-28 00:10:27 +02:00
from typing import Generic , Optional , TypeVar
from urllib . parse import urlparse
2024-02-24 22:35:11 -08:00
2024-08-28 00:10:27 +02:00
import chromadb
2024-02-23 17:12:19 -08:00
import requests
2024-08-28 00:10:27 +02:00
import yaml
2024-09-04 16:54:48 +02:00
from open_webui . apps . webui . internal . db import Base , get_db
from open_webui . env import (
OPEN_WEBUI_DIR ,
2024-08-28 00:10:27 +02:00
DATA_DIR ,
ENV ,
FRONTEND_BUILD_DIR ,
2024-08-25 16:52:36 +02:00
WEBUI_AUTH ,
2024-08-28 00:10:27 +02:00
WEBUI_FAVICON_URL ,
WEBUI_NAME ,
2024-08-25 16:52:36 +02:00
log ,
)
2024-08-28 00:10:27 +02:00
from pydantic import BaseModel
from sqlalchemy import JSON , Column , DateTime , Integer , func
2024-04-12 17:27:40 +08:00
2024-07-17 22:24:34 +02: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 01:40:36 -08:00
####################################
2024-08-25 16:52:36 +02:00
# Config helpers
2024-01-07 01:40:36 -08:00
####################################
2024-08-25 16:52:36 +02:00
# Function to run the alembic migrations
def run_migrations ( ) :
print ( " Running migrations " )
2024-05-20 11:12:03 +08:00
try :
2024-08-25 16:52:36 +02:00
from alembic import command
2024-08-28 00:10:27 +02:00
from alembic . config import Config
2024-02-23 00:36:53 -08:00
2024-09-04 16:54:48 +02:00
alembic_cfg = Config ( OPEN_WEBUI_DIR / " alembic.ini " )
2024-09-04 17:33:39 +02: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 16:52:36 +02:00
command . upgrade ( alembic_cfg , " head " )
except Exception as e :
print ( f " Error: { e } " )
2024-05-10 14:18:39 +08:00
2024-02-23 00:36:53 -08:00
2024-10-05 12:40:13 -07:00
run_migrations ( )
2024-08-25 16:52:36 +02:00
class Config ( Base ) :
__tablename__ = " config "
2024-05-08 16:33:34 -07:00
2024-08-25 16:52:36 +02: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-08 16:33:34 -07:00
2024-04-09 16:02:28 +05:30
2024-08-25 17:54:51 +02:00
def load_json_config ( ) :
2024-08-25 16:52:36 +02:00
with open ( f " { DATA_DIR } /config.json " , " r " ) as file :
return json . load ( file )
2024-04-09 16:02:28 +05:30
2024-06-02 18:14:36 -07:00
2024-08-25 16:52:36 +02: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 17:54:51 +02:00
existing_config . updated_at = datetime . now ( )
db . add ( existing_config )
2024-08-25 16:52:36 +02:00
db . commit ( )
2024-04-09 16:02:28 +05:30
2024-05-10 13:36:10 +08:00
2024-09-25 01:06:11 +02:00
def reset_config ( ) :
with get_db ( ) as db :
db . query ( Config ) . delete ( )
db . commit ( )
2024-08-25 16:52:36 +02: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 17:54:51 +02:00
data = load_json_config ( )
2024-08-25 16:52:36 +02: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-25 18:42:27 +02:00
DEFAULT_CONFIG = {
" version " : 0 ,
" ui " : {
" default_locale " : " " ,
" prompt_suggestions " : [
{
" 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. " ,
} ,
{
" 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? " ,
} ,
{
" title " : [
" Grammar check " ,
" rewrite it for better readability " ,
] ,
" content " : ' Check the following sentence for grammar and clarity: " [sentence] " . Rewrite it for better readability while maintaining its original meaning. ' ,
} ,
] ,
} ,
}
2024-08-25 17:54:51 +02:00
def get_config ( ) :
with get_db ( ) as db :
config_entry = db . query ( Config ) . order_by ( Config . id . desc ( ) ) . first ( )
2024-08-25 18:42:27 +02:00
return config_entry . data if config_entry else DEFAULT_CONFIG
2024-08-25 17:54:51 +02: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-03 21:46:40 +02: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 " )
2024-05-13 11:32:21 -10: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 17:54:51 +02:00
self . config_value = get_config_value ( config_path )
2024-05-10 13:36:10 +08:00
if self . config_value is not None :
2024-08-25 16:52:36 +02:00
log . info ( f " ' { env_name } ' loaded from the latest database entry " )
2024-05-10 13:36:10 +08:00
self . value = self . config_value
else :
self . value = env_value
2024-09-03 21:46:40 +02:00
PERSISTENT_CONFIG_REGISTRY . append ( self )
2024-05-10 13:36:10 +08:00
def __str__ ( self ) :
return str ( self . value )
2024-08-25 17:54:51 +02: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-03 21:46:40 +02: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 16:52:36 +02: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 17:54:51 +02: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 :
2024-05-13 11:32:21 -10:00
_state : dict [ str , PersistentConfig ]
2024-05-10 15:03:24 +08:00
def __init__ ( self ) :
super ( ) . __setattr__ ( " _state " , { } )
def __setattr__ ( self , key , value ) :
2024-05-13 11:32:21 -10: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 ( )
def __getattr__ ( self , key ) :
return self . _state [ key ] . value
2024-05-10 13:36:10 +08:00
####################################
# WEBUI_AUTH (Required for security)
####################################
2024-05-13 11:32:21 -10: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 08:37:09 +01:00
####################################
# OAuth config
####################################
ENABLE_OAUTH_SIGNUP = PersistentConfig (
" ENABLE_OAUTH_SIGNUP " ,
" oauth.enable_signup " ,
os . environ . get ( " ENABLE_OAUTH_SIGNUP " , " False " ) . lower ( ) == " true " ,
)
2024-05-27 17:21:24 +01: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 08:37:09 +01:00
OAUTH_PROVIDERS = { }
2024-05-27 17:21:24 +01:00
GOOGLE_CLIENT_ID = PersistentConfig (
" GOOGLE_CLIENT_ID " ,
" oauth.google.client_id " ,
os . environ . get ( " GOOGLE_CLIENT_ID " , " " ) ,
)
GOOGLE_CLIENT_SECRET = PersistentConfig (
" GOOGLE_CLIENT_SECRET " ,
" oauth.google.client_secret " ,
os . environ . get ( " GOOGLE_CLIENT_SECRET " , " " ) ,
)
GOOGLE_OAUTH_SCOPE = PersistentConfig (
" GOOGLE_OAUTH_SCOPE " ,
" oauth.google.scope " ,
os . environ . get ( " GOOGLE_OAUTH_SCOPE " , " openid email profile " ) ,
)
2024-07-19 09:03:41 +02:00
GOOGLE_REDIRECT_URI = PersistentConfig (
" GOOGLE_REDIRECT_URI " ,
" oauth.google.redirect_uri " ,
os . environ . get ( " GOOGLE_REDIRECT_URI " , " " ) ,
)
2024-05-27 17:21:24 +01: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 " , " " ) ,
)
MICROSOFT_OAUTH_SCOPE = PersistentConfig (
" MICROSOFT_OAUTH_SCOPE " ,
" oauth.microsoft.scope " ,
os . environ . get ( " MICROSOFT_OAUTH_SCOPE " , " openid email profile " ) ,
)
2024-07-19 09:03:41 +02:00
MICROSOFT_REDIRECT_URI = PersistentConfig (
" MICROSOFT_REDIRECT_URI " ,
" oauth.microsoft.redirect_uri " ,
os . environ . get ( " MICROSOFT_REDIRECT_URI " , " " ) ,
)
2024-05-27 17:21:24 +01: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 09:03:41 +02:00
OPENID_REDIRECT_URI = PersistentConfig (
" OPENID_REDIRECT_URI " ,
" oauth.oidc.redirect_uri " ,
os . environ . get ( " OPENID_REDIRECT_URI " , " " ) ,
)
2024-05-27 17:21:24 +01:00
OAUTH_SCOPES = PersistentConfig (
" OAUTH_SCOPES " ,
" oauth.oidc.scopes " ,
os . environ . get ( " OAUTH_SCOPES " , " openid email profile " ) ,
)
OAUTH_PROVIDER_NAME = PersistentConfig (
" OAUTH_PROVIDER_NAME " ,
" oauth.oidc.provider_name " ,
os . environ . get ( " OAUTH_PROVIDER_NAME " , " SSO " ) ,
)
2024-06-28 16:31:40 +03:00
OAUTH_USERNAME_CLAIM = PersistentConfig (
" OAUTH_USERNAME_CLAIM " ,
" oauth.oidc.username_claim " ,
os . environ . get ( " OAUTH_USERNAME_CLAIM " , " name " ) ,
)
OAUTH_PICTURE_CLAIM = PersistentConfig (
2024-10-03 20:55:32 +02:00
" OAUTH_PICTURE_CLAIM " ,
2024-06-28 16:31:40 +03:00
" oauth.oidc.avatar_claim " ,
os . environ . get ( " OAUTH_PICTURE_CLAIM " , " picture " ) ,
)
2024-08-07 11:39:51 -07:00
OAUTH_EMAIL_CLAIM = PersistentConfig (
" OAUTH_EMAIL_CLAIM " ,
" oauth.oidc.email_claim " ,
os . environ . get ( " OAUTH_EMAIL_CLAIM " , " email " ) ,
)
2024-10-10 23:00:05 +02:00
ENABLE_OAUTH_ROLE_MANAGEMENT = PersistentConfig (
" ENABLE_OAUTH_ROLE_MANAGEMENT " ,
2024-10-03 20:55:32 +02:00
" oauth.enable_role_mapping " ,
2024-10-10 23:00:05 +02:00
os . environ . get ( " ENABLE_OAUTH_ROLE_MANAGEMENT " , " False " ) . lower ( ) == " true " ,
2024-10-03 20:55:32 +02:00
)
OAUTH_ROLES_CLAIM = PersistentConfig (
" OAUTH_ROLES_CLAIM " ,
" oauth.roles_claim " ,
os . environ . get ( " OAUTH_ROLES_CLAIM " , " roles " ) ,
)
2024-10-10 23:00:05 +02:00
OAUTH_ALLOWED_ROLES = PersistentConfig (
" OAUTH_ALLOWED_ROLES " ,
" oauth.allowed_roles " ,
2024-10-20 18:38:06 -07:00
[
role . strip ( )
for role in os . environ . get ( " OAUTH_ALLOWED_ROLES " , " user,admin " ) . split ( " , " )
] ,
2024-10-10 23:00:05 +02: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 08:37:09 +01:00
2024-10-20 18:38:06 -07:00
2024-05-27 17:21:24 +01:00
def load_oauth_providers ( ) :
OAUTH_PROVIDERS . clear ( )
if GOOGLE_CLIENT_ID . value and GOOGLE_CLIENT_SECRET . value :
OAUTH_PROVIDERS [ " google " ] = {
" client_id " : GOOGLE_CLIENT_ID . value ,
" client_secret " : GOOGLE_CLIENT_SECRET . value ,
" server_metadata_url " : " https://accounts.google.com/.well-known/openid-configuration " ,
" scope " : GOOGLE_OAUTH_SCOPE . value ,
2024-07-19 09:03:41 +02:00
" redirect_uri " : GOOGLE_REDIRECT_URI . value ,
2024-05-27 17:21:24 +01:00
}
if (
MICROSOFT_CLIENT_ID . value
and MICROSOFT_CLIENT_SECRET . value
and MICROSOFT_CLIENT_TENANT_ID . value
) :
OAUTH_PROVIDERS [ " microsoft " ] = {
" client_id " : MICROSOFT_CLIENT_ID . value ,
" client_secret " : MICROSOFT_CLIENT_SECRET . value ,
" server_metadata_url " : f " https://login.microsoftonline.com/ { MICROSOFT_CLIENT_TENANT_ID . value } /v2.0/.well-known/openid-configuration " ,
" scope " : MICROSOFT_OAUTH_SCOPE . value ,
2024-07-19 09:03:41 +02:00
" redirect_uri " : MICROSOFT_REDIRECT_URI . value ,
2024-05-27 17:21:24 +01:00
}
if (
OAUTH_CLIENT_ID . value
and OAUTH_CLIENT_SECRET . value
and OPENID_PROVIDER_URL . value
) :
OAUTH_PROVIDERS [ " oidc " ] = {
" client_id " : OAUTH_CLIENT_ID . value ,
" client_secret " : OAUTH_CLIENT_SECRET . value ,
" server_metadata_url " : OPENID_PROVIDER_URL . value ,
" scope " : OAUTH_SCOPES . value ,
" name " : OAUTH_PROVIDER_NAME . value ,
2024-07-19 09:03:41 +02:00
" redirect_uri " : OPENID_REDIRECT_URI . value ,
2024-05-27 17:21:24 +01:00
}
load_oauth_providers ( )
2024-05-26 08:37:09 +01:00
2024-04-09 16:02:28 +05:30
####################################
# Static DIR
####################################
2024-09-04 16:54:48 +02:00
STATIC_DIR = Path ( os . getenv ( " STATIC_DIR " , OPEN_WEBUI_DIR / " static " ) ) . resolve ( )
2024-04-09 16:02:28 +05:30
2024-07-08 23:21:17 -07: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-04-28 16:03:30 +01:00
else :
logging . warning ( f " Frontend favicon not found at { frontend_favicon } " )
2024-02-23 17:12:19 -08:00
2024-07-08 23:21:17 -07: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 } " )
else :
logging . warning ( f " Frontend splash not found at { frontend_splash } " )
2024-02-23 17:12:19 -08:00
####################################
# CUSTOM_NAME
####################################
CUSTOM_NAME = os . environ . get ( " CUSTOM_NAME " , " " )
2024-04-03 21:24:57 -07:00
2024-02-23 17:12:19 -08:00
if CUSTOM_NAME :
2024-02-23 17: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-23 17: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 16:02:28 +05:30
with open ( f " { STATIC_DIR } /favicon.png " , " wb " ) as f :
2024-02-23 17:36:38 -08:00
r . raw . decode_content = True
shutil . copyfileobj ( r . raw , f )
2024-07-08 22:20:00 -07: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-08 23:21:17 -07:00
shutil . copyfileobj ( r . raw , f )
2024-07-08 22:20:00 -07:00
2024-02-23 17:36:38 -08:00
WEBUI_NAME = data [ " name " ]
except Exception as e :
2024-03-20 17:11:36 -06:00
log . exception ( e )
2024-02-23 17:36:38 -08:00
pass
2024-02-23 17:12:19 -08:00
2024-05-10 14:18:39 +08:00
2024-10-20 22:53:45 -07:00
####################################
# STORAGE PROVIDER
####################################
STORAGE_PROVIDER = os . environ . get ( " STORAGE_PROVIDER " , " " ) # defaults to local, s3
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 )
S3_ENDPOINT_URL = os . environ . get ( " S3_ENDPOINT_URL " , None )
2023-11-18 16:47:12 -08:00
####################################
2024-01-25 00:40:19 -08:00
# File Upload DIR
2023-11-18 16:47:12 -08:00
####################################
2024-01-25 00:40:19 -08:00
UPLOAD_DIR = f " { DATA_DIR } /uploads "
Path ( UPLOAD_DIR ) . mkdir ( parents = True , exist_ok = True )
2023-11-14 16:28:51 -08:00
2024-05-10 14:18:39 +08:00
2024-02-05 22:51:08 -08:00
####################################
# Cache DIR
####################################
CACHE_DIR = f " { DATA_DIR } /cache "
Path ( CACHE_DIR ) . mkdir ( parents = True , exist_ok = True )
2023-11-18 16:47:12 -08:00
####################################
2024-03-06 11:51:51 -08:00
# OLLAMA_BASE_URL
2023-11-18 16:47:12 -08:00
####################################
2024-05-21 23:58:42 -07:00
ENABLE_OLLAMA_API = PersistentConfig (
" ENABLE_OLLAMA_API " ,
" ollama.enable " ,
os . environ . get ( " ENABLE_OLLAMA_API " , " True " ) . lower ( ) == " true " ,
)
2024-01-06 22:59:22 -08:00
OLLAMA_API_BASE_URL = os . environ . get (
" OLLAMA_API_BASE_URL " , " http://localhost:11434/api "
)
2023-11-14 16:28:51 -08:00
2024-03-06 11:44:00 -08:00
OLLAMA_BASE_URL = os . environ . get ( " OLLAMA_BASE_URL " , " " )
2024-06-16 13:56:49 -07:00
2024-03-27 13:08:43 -07:00
K8S_FLAG = os . environ . get ( " K8S_FLAG " , " " )
2024-04-02 14:47:52 +02:00
USE_OLLAMA_DOCKER = os . environ . get ( " USE_OLLAMA_DOCKER " , " false " )
2024-04-02 11:28:04 +02:00
2024-03-06 11:44:00 -08:00
if OLLAMA_BASE_URL == " " and OLLAMA_API_BASE_URL != " " :
2024-03-02 18: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-10 19:26:06 -07:00
if ENV == " prod " :
2024-04-03 11:34:25 +02:00
if OLLAMA_BASE_URL == " /ollama " and not K8S_FLAG :
2024-04-02 14:47:52 +02:00
if USE_OLLAMA_DOCKER . lower ( ) == " true " :
2024-04-03 11:43:13 +02:00
# if you use all-in-one docker container (Open WebUI + Ollama)
2024-04-02 14:47:52 +02:00
# with the docker build arg USE_OLLAMA=true (--build-arg="USE_OLLAMA=true") this only works with http://localhost:11434
2024-03-22 09:31:35 +01:00
OLLAMA_BASE_URL = " http://localhost:11434 "
2024-04-03 11:43:13 +02:00
else :
2024-03-22 09:31:35 +01:00
OLLAMA_BASE_URL = " http://host.docker.internal:11434 "
2024-03-27 13:08:43 -07:00
elif K8S_FLAG :
2024-03-25 21:21:32 +01:00
OLLAMA_BASE_URL = " http://ollama-service.open-webui.svc.cluster.local:11434 "
2024-03-10 19:26:06 -07:00
2024-05-10 14:18:39 +08:00
2024-03-06 11: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-06 12:42:14 -08:00
OLLAMA_BASE_URLS = [ url . strip ( ) for url in OLLAMA_BASE_URLS . split ( " ; " ) ]
2024-05-13 11:32:21 -10:00
OLLAMA_BASE_URLS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" OLLAMA_BASE_URLS " , " ollama.base_urls " , OLLAMA_BASE_URLS
)
2024-03-02 18:16:02 -08:00
2024-01-04 16:49:34 -08:00
####################################
# OPENAI_API
####################################
2024-05-17 10:30:22 -07:00
ENABLE_OPENAI_API = PersistentConfig (
" ENABLE_OPENAI_API " ,
" openai.enable " ,
os . environ . get ( " ENABLE_OPENAI_API " , " True " ) . lower ( ) == " true " ,
)
2024-01-04 16:49:34 -08:00
OPENAI_API_KEY = os . environ . get ( " OPENAI_API_KEY " , " " )
2024-01-04 18:38:03 -08:00
OPENAI_API_BASE_URL = os . environ . get ( " OPENAI_API_BASE_URL " , " " )
2024-05-10 14:18:39 +08:00
2024-01-04 18:38:03 -08:00
if OPENAI_API_BASE_URL == " " :
OPENAI_API_BASE_URL = " https://api.openai.com/v1 "
2024-01-04 16:49:34 -08:00
2024-03-06 13: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-06 16:13:25 -08:00
OPENAI_API_KEYS = [ url . strip ( ) for url in OPENAI_API_KEYS . split ( " ; " ) ]
2024-05-13 11:32:21 -10:00
OPENAI_API_KEYS = PersistentConfig (
" OPENAI_API_KEYS " , " openai.api_keys " , OPENAI_API_KEYS
)
2024-03-06 13: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 01:11:48 -07: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-13 11:32:21 -10: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-22 21:07:40 -08:00
2024-04-20 15:15:59 -05:00
OPENAI_API_KEY = " "
2024-04-20 20:37:18 -05: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-20 20:37:18 -05:00
]
2024-08-14 13:38:19 +01:00
except Exception :
2024-04-20 20:37:18 -05:00
pass
2024-04-20 15:15:59 -05:00
OPENAI_API_BASE_URL = " https://api.openai.com/v1 "
2024-01-22 21:07:40 -08:00
####################################
# WEBUI
####################################
2024-05-13 11:32:21 -10: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-06-30 14:48:05 -07:00
2024-07-24 21:44:40 -04:00
ENABLE_LOGIN_FORM = PersistentConfig (
" ENABLE_LOGIN_FORM " ,
" ui.ENABLE_LOGIN_FORM " ,
os . environ . get ( " ENABLE_LOGIN_FORM " , " True " ) . lower ( ) == " true " ,
2024-07-23 22:20:45 -04:00
)
2024-06-30 14:48:05 -07:00
DEFAULT_LOCALE = PersistentConfig (
" DEFAULT_LOCALE " ,
" ui.default_locale " ,
os . environ . get ( " DEFAULT_LOCALE " , " " ) ,
)
2024-05-13 11:32:21 -10: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-08 16:33:34 -07:00
)
2024-02-19 18:54:22 -08:00
2024-05-13 11:32:21 -10:00
DEFAULT_PROMPT_SUGGESTIONS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" DEFAULT_PROMPT_SUGGESTIONS " ,
" ui.prompt_suggestions " ,
[
2024-01-22 21: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 00:23:32 -07: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? " ,
} ,
2024-05-10 13:36:10 +08:00
] ,
2024-01-22 21:07:40 -08:00
)
2024-02-19 18:54:22 -08:00
2024-05-13 11:32:21 -10: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-19 18:54:22 -08:00
2024-05-10 15:20:22 +08:00
USER_PERMISSIONS_CHAT_DELETION = (
os . environ . get ( " USER_PERMISSIONS_CHAT_DELETION " , " True " ) . lower ( ) == " true "
2024-03-19 14:21:46 -07:00
)
2024-03-14 00:01:46 +08:00
2024-08-19 16:49:40 +02:00
USER_PERMISSIONS_CHAT_EDITING = (
os . environ . get ( " USER_PERMISSIONS_CHAT_EDITING " , " True " ) . lower ( ) == " true "
)
USER_PERMISSIONS_CHAT_TEMPORARY = (
os . environ . get ( " USER_PERMISSIONS_CHAT_TEMPORARY " , " True " ) . lower ( ) == " true "
)
2024-05-13 11:32:21 -10:00
USER_PERMISSIONS = PersistentConfig (
2024-05-10 13:36:10 +08:00
" USER_PERMISSIONS " ,
" ui.user_permissions " ,
2024-08-19 16:49:40 +02:00
{
" chat " : {
" deletion " : USER_PERMISSIONS_CHAT_DELETION ,
" editing " : USER_PERMISSIONS_CHAT_EDITING ,
" temporary " : USER_PERMISSIONS_CHAT_TEMPORARY ,
}
} ,
2024-05-10 13:36:10 +08:00
)
2024-02-14 01:17:43 -08:00
2024-10-22 03:16:48 -07: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-13 11:32:21 -10:00
ENABLE_MODEL_FILTER = PersistentConfig (
2024-05-10 13:36:10 +08:00
" ENABLE_MODEL_FILTER " ,
" model_filter.enable " ,
os . environ . get ( " ENABLE_MODEL_FILTER " , " False " ) . lower ( ) == " true " ,
)
2024-03-09 21:47:01 -08:00
MODEL_FILTER_LIST = os . environ . get ( " MODEL_FILTER_LIST " , " " )
2024-05-13 11:32:21 -10:00
MODEL_FILTER_LIST = PersistentConfig (
2024-05-10 13:36:10 +08:00
" MODEL_FILTER_LIST " ,
" model_filter.list " ,
[ model . strip ( ) for model in MODEL_FILTER_LIST . split ( " ; " ) ] ,
)
2024-03-09 21:47:01 -08:00
2024-05-13 11:32:21 -10:00
WEBHOOK_URL = PersistentConfig (
2024-05-10 13:36:10 +08:00
" WEBHOOK_URL " , " webhook_url " , os . environ . get ( " WEBHOOK_URL " , " " )
)
2024-03-09 21:47:01 -08:00
2024-04-22 19:55:46 +01:00
ENABLE_ADMIN_EXPORT = os . environ . get ( " ENABLE_ADMIN_EXPORT " , " True " ) . lower ( ) == " true "
2024-04-17 09:33:22 +01:00
2024-08-04 15:16:14 +01:00
ENABLE_ADMIN_CHAT_ACCESS = (
os . environ . get ( " ENABLE_ADMIN_CHAT_ACCESS " , " True " ) . lower ( ) == " true "
)
2024-05-26 17:10:25 +01:00
ENABLE_COMMUNITY_SHARING = PersistentConfig (
" ENABLE_COMMUNITY_SHARING " ,
" ui.enable_community_sharing " ,
os . environ . get ( " ENABLE_COMMUNITY_SHARING " , " True " ) . lower ( ) == " true " ,
)
2024-08-19 15:16:49 +02:00
ENABLE_MESSAGE_RATING = PersistentConfig (
" ENABLE_MESSAGE_RATING " ,
" ui.enable_message_rating " ,
os . environ . get ( " ENABLE_MESSAGE_RATING " , " True " ) . lower ( ) == " true " ,
)
2024-08-18 15:04:01 -07:00
2024-08-18 14:17:26 -07:00
def validate_cors_origins ( origins ) :
for origin in origins :
if origin != " * " :
validate_cors_origin ( origin )
def validate_cors_origin ( origin ) :
parsed_url = urlparse ( origin )
# Check if the scheme is either http or https
if parsed_url . scheme not in [ " http " , " https " ] :
2024-08-18 15:04:01 -07:00
raise ValueError (
f " Invalid scheme in CORS_ALLOW_ORIGIN: ' { origin } ' . Only ' http ' and ' https ' are allowed. "
)
2024-08-18 14:17:26 -07: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.
CORS_ALLOW_ORIGIN = os . environ . get ( " CORS_ALLOW_ORIGIN " , " * " ) . split ( " ; " )
if " * " in CORS_ALLOW_ORIGIN :
2024-08-18 15:04:01 -07:00
log . warning (
" \n \n WARNING: CORS_ALLOW_ORIGIN IS SET TO ' * ' - NOT RECOMMENDED FOR PRODUCTION DEPLOYMENTS. \n "
)
2024-08-18 14:17:26 -07:00
validate_cors_origins ( CORS_ALLOW_ORIGIN )
2024-05-27 12:48:08 -07:00
2024-05-26 12:18:43 -07:00
class BannerModel ( BaseModel ) :
id : str
type : str
title : Optional [ str ] = None
content : str
dismissible : bool
timestamp : int
2024-07-02 16:51:30 -07:00
2024-07-02 14:17:36 +01:00
try :
banners = json . loads ( os . environ . get ( " WEBUI_BANNERS " , " [] " ) )
banners = [ BannerModel ( * * banner ) for banner in banners ]
2024-07-02 14:41:59 +01:00
except Exception as e :
2024-07-02 14:17:36 +01:00
print ( f " Error loading WEBUI_BANNERS: { e } " )
banners = [ ]
2024-05-26 12:18:43 -07:00
2024-07-02 14:17:36 +01:00
WEBUI_BANNERS = PersistentConfig ( " WEBUI_BANNERS " , " ui.banners " , banners )
2024-05-26 12:18:43 -07:00
2024-06-03 21:17:43 -07: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-09 15:19:36 -07:00
####################################
# TASKS
####################################
2024-06-09 14:53:10 -07: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-09 14:25:31 -07:00
TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" TITLE_GENERATION_PROMPT_TEMPLATE " ,
" task.title.prompt_template " ,
2024-09-07 04:50:29 +01:00
os . environ . get ( " TITLE_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
2024-10-19 21:27:10 -07:00
TAGS_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" TAGS_GENERATION_PROMPT_TEMPLATE " ,
" task.tags.prompt_template " ,
os . environ . get ( " TAGS_GENERATION_PROMPT_TEMPLATE " , " " ) ,
)
2024-09-07 04:50:29 +01:00
ENABLE_SEARCH_QUERY = PersistentConfig (
" ENABLE_SEARCH_QUERY " ,
" task.search.enable " ,
os . environ . get ( " ENABLE_SEARCH_QUERY " , " True " ) . lower ( ) == " true " ,
2024-06-09 14:25:31 -07:00
)
2024-06-09 14:53:10 -07:00
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE = PersistentConfig (
" SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE " ,
" task.search.prompt_template " ,
2024-09-07 04:50:29 +01:00
os . environ . get ( " SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE " , " " ) ,
2024-06-09 14:53:10 -07:00
)
2024-06-09 15:19:36 -07:00
2024-06-10 23:40:27 -07:00
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig (
" TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE " ,
" task.tools.prompt_template " ,
2024-09-07 04:50:29 +01:00
os . environ . get ( " TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE " , " " ) ,
2024-06-10 23:40:27 -07:00
)
2024-06-30 15:49:15 -06:00
####################################
2024-09-10 01:34:27 +01:00
# Vector Database
2024-06-30 15:49:15 -06:00
####################################
2024-09-10 02:27:50 +01:00
VECTOR_DB = os . environ . get ( " VECTOR_DB " , " chroma " )
2024-01-06 22:59:22 -08:00
2024-09-10 02:27:50 +01:00
# Chroma
2024-01-22 01:47:07 -08:00
CHROMA_DATA_PATH = f " { DATA_DIR } /vector_db "
2024-04-27 18:52:35 +01: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 " ) )
2024-10-27 14:01:00 +07:00
CHROMA_CLIENT_AUTH_PROVIDER = os . environ . get ( " CHROMA_CLIENT_AUTH_PROVIDER " , " " )
CHROMA_CLIENT_AUTH_CREDENTIALS = os . environ . get ( " CHROMA_CLIENT_AUTH_CREDENTIALS " , " " )
2024-04-27 18:52:35 +01: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-22 13:27:43 -05: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-14 17:55:00 -04:00
2024-09-12 01:52:19 -04:00
# Milvus
MILVUS_URI = os . environ . get ( " MILVUS_URI " , f " { DATA_DIR } /vector_db/milvus.db " )
2024-10-09 12:51:43 +02:00
# Qdrant
QDRANT_URI = os . environ . get ( " QDRANT_URI " , None )
2024-09-10 01:34:27 +01:00
####################################
2024-09-28 01:35:31 +02:00
# Information Retrieval (RAG)
2024-09-10 01:34:27 +01:00
####################################
# RAG Content Extraction
CONTENT_EXTRACTION_ENGINE = PersistentConfig (
" CONTENT_EXTRACTION_ENGINE " ,
" rag.CONTENT_EXTRACTION_ENGINE " ,
os . environ . get ( " CONTENT_EXTRACTION_ENGINE " , " " ) . lower ( ) ,
)
TIKA_SERVER_URL = PersistentConfig (
" TIKA_SERVER_URL " ,
" rag.tika_server_url " ,
os . getenv ( " TIKA_SERVER_URL " , " http://tika:9998 " ) , # Default for sidecar deployment
)
2024-05-13 11:32:21 -10:00
RAG_TOP_K = PersistentConfig (
2024-09-19 16:44:33 +02:00
" RAG_TOP_K " , " rag.top_k " , int ( os . environ . get ( " RAG_TOP_K " , " 3 " ) )
2024-05-10 13:36:10 +08:00
)
2024-05-13 11:32:21 -10: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-26 14:41:39 -04:00
)
2024-04-22 18:36:46 -05:00
2024-05-13 11:32:21 -10: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-06 13:12:08 -07:00
2024-08-27 15:30:57 +02: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 15:30:57 +02: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
)
2024-05-13 11:32:21 -10:00
ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = PersistentConfig (
2024-05-10 13:36:10 +08:00
" ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION " ,
" rag.enable_web_loader_ssl_verification " ,
os . environ . get ( " ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION " , " True " ) . lower ( ) == " true " ,
2024-05-06 13:12:08 -07:00
)
2024-05-13 11:32:21 -10: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-14 17:55:00 -04:00
2024-05-13 11:32:21 -10: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-13 11:32:21 -10: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-22 13:27:43 -05:00
)
2024-08-14 13:38:19 +01:00
log . info ( f " Embedding model set: { RAG_EMBEDDING_MODEL . value } " )
2024-04-09 23:54:20 -07:00
2024-04-25 07:49:59 -05:00
RAG_EMBEDDING_MODEL_AUTO_UPDATE = (
os . environ . get ( " RAG_EMBEDDING_MODEL_AUTO_UPDATE " , " " ) . lower ( ) == " true "
)
2024-04-22 13:27:43 -05:00
RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE = (
os . environ . get ( " RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE " , " " ) . lower ( ) == " true "
2024-04-22 15:49:58 -05:00
)
2024-09-26 23:28:47 +01:00
RAG_EMBEDDING_BATCH_SIZE = PersistentConfig (
" RAG_EMBEDDING_BATCH_SIZE " ,
" rag.embedding_batch_size " ,
2024-10-06 23:09:07 +01:00
int (
os . environ . get ( " RAG_EMBEDDING_BATCH_SIZE " )
or os . environ . get ( " RAG_EMBEDDING_OPENAI_BATCH_SIZE " , " 1 " )
) ,
2024-06-02 15:34:31 +01:00
)
2024-05-13 11:32:21 -10: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 13:38:19 +01:00
log . info ( f " Reranking model set: { RAG_RERANKING_MODEL . value } " )
2024-04-22 15:49:58 -05:00
2024-04-25 07:49:59 -05:00
RAG_RERANKING_MODEL_AUTO_UPDATE = (
os . environ . get ( " RAG_RERANKING_MODEL_AUTO_UPDATE " , " " ) . lower ( ) == " true "
)
2024-04-22 15:49:58 -05:00
RAG_RERANKING_MODEL_TRUST_REMOTE_CODE = (
os . environ . get ( " RAG_RERANKING_MODEL_TRUST_REMOTE_CODE " , " " ) . lower ( ) == " true "
2024-04-09 23:54:20 -07:00
)
2024-04-08 14:57:54 -06:00
2024-10-13 02:07:50 -07: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-13 11:32:21 -10:00
CHUNK_SIZE = PersistentConfig (
2024-09-19 16:44:33 +02:00
" CHUNK_SIZE " , " rag.chunk_size " , int ( os . environ . get ( " CHUNK_SIZE " , " 1000 " ) )
2024-05-10 13:36:10 +08:00
)
2024-05-13 11:32:21 -10: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-17 22:41:03 -08:00
2024-09-12 15:31:49 +02:00
DEFAULT_RAG_TEMPLATE = """ You are given a user query, some textual context and rules, all inside xml tags. You have to answer the query based on the context while respecting the rules.
2024-02-17 22:41:03 -08:00
< context >
2024-10-14 18:47:41 -07:00
{ { CONTEXT } }
2024-02-17 22:41:03 -08:00
< / context >
2024-09-12 15:31:49 +02:00
< rules >
- If you don ' t know, just say so.
- If you are not sure , ask for clarification .
- Answer in the same language as the user query .
- If the context appears unreadable or of poor quality , tell the user then answer as best as you can .
- If the answer is not in the context but you think you know the answer , explain that to the user then answer with your own knowledge .
- Answer directly and without using xml tags .
< / rules >
< user_query >
2024-10-14 18:47:41 -07:00
{ { QUERY } }
2024-09-12 15:31:49 +02:00
< / user_query >
"""
2024-02-17 22:41:03 -08:00
2024-05-13 11:32:21 -10: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-22 18:36:46 -05:00
2024-05-13 11:32:21 -10: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-13 11:32:21 -10: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-20 15:15:59 -05:00
2024-05-06 13:12:08 -07:00
ENABLE_RAG_LOCAL_WEB_FETCH = (
os . getenv ( " ENABLE_RAG_LOCAL_WEB_FETCH " , " False " ) . lower ( ) == " true "
)
2024-04-29 20:55:17 +01:00
2024-05-13 11:32:21 -10: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-08 10:51:29 -07:00
2024-05-27 12:48:08 -07:00
2024-06-01 19:03:56 -07:00
ENABLE_RAG_WEB_SEARCH = PersistentConfig (
" ENABLE_RAG_WEB_SEARCH " ,
" rag.web.search.enable " ,
os . getenv ( " ENABLE_RAG_WEB_SEARCH " , " False " ) . lower ( ) == " true " ,
)
2024-06-01 19:40:48 -07:00
RAG_WEB_SEARCH_ENGINE = PersistentConfig (
" RAG_WEB_SEARCH_ENGINE " ,
" rag.web.search.engine " ,
os . getenv ( " RAG_WEB_SEARCH_ENGINE " , " " ) ,
)
2024-06-01 19:03:56 -07:00
2024-06-17 14:32:23 -07:00
# You can provide a list of your own websites to filter after performing a web search.
2024-06-17 14:33:23 +07:00
# This ensures the highest level of safety and reliability of the information sources.
RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig (
" RAG_WEB_SEARCH_DOMAIN_FILTER_LIST " ,
" rag.rag.web.search.domain.filter_list " ,
2024-06-13 07:14:48 +07:00
[
2024-06-17 14:32:23 -07:00
# "wikipedia.com",
# "wikimedia.org",
2024-06-17 14:33:23 +07:00
# "wikidata.org",
2024-06-13 07:14:48 +07:00
] ,
)
2024-06-01 19:03:56 -07:00
SEARXNG_QUERY_URL = PersistentConfig (
" SEARXNG_QUERY_URL " ,
" rag.web.search.searxng_query_url " ,
os . getenv ( " SEARXNG_QUERY_URL " , " " ) ,
)
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 " , " " ) ,
)
SERPSTACK_API_KEY = PersistentConfig (
" SERPSTACK_API_KEY " ,
" rag.web.search.serpstack_api_key " ,
os . getenv ( " SERPSTACK_API_KEY " , " " ) ,
)
2024-05-27 12:48:08 -07:00
2024-06-01 19:03:56 -07: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-27 12:48:08 -07:00
2024-06-01 19:03:56 -07: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-09 21:39:46 -04:00
SERPLY_API_KEY = PersistentConfig (
" SERPLY_API_KEY " ,
" rag.web.search.serply_api_key " ,
os . getenv ( " SERPLY_API_KEY " , " " ) ,
)
2024-06-14 20:44:11 +05:30
TAVILY_API_KEY = PersistentConfig (
" TAVILY_API_KEY " ,
" rag.web.search.tavily_api_key " ,
os . getenv ( " TAVILY_API_KEY " , " " ) ,
)
2024-06-01 19:03:56 -07:00
2024-08-27 13:15:17 +05:30
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 " , " " ) ,
)
2024-06-01 19:03:56 -07:00
RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig (
" RAG_WEB_SEARCH_RESULT_COUNT " ,
" rag.web.search.result_count " ,
int ( os . getenv ( " RAG_WEB_SEARCH_RESULT_COUNT " , " 3 " ) ) ,
)
RAG_WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig (
" RAG_WEB_SEARCH_CONCURRENT_REQUESTS " ,
" rag.web.search.concurrent_requests " ,
int ( os . getenv ( " RAG_WEB_SEARCH_CONCURRENT_REQUESTS " , " 10 " ) ) ,
)
2024-02-21 18:12:01 -08:00
####################################
# Images
####################################
2024-05-13 11:32:21 -10:00
IMAGE_GENERATION_ENGINE = PersistentConfig (
2024-05-10 13:36:10 +08:00
" IMAGE_GENERATION_ENGINE " ,
" image_generation.engine " ,
2024-08-21 18:29:52 +02: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-13 11:32:21 -10: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 " ,
)
2024-05-13 11:32:21 -10: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-10 23:21:12 -06: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-20 16:04:16 -05:00
2024-09-07 17:21:17 +02:00
AUTOMATIC1111_CFG_SCALE = PersistentConfig (
" AUTOMATIC1111_CFG_SCALE " ,
" image_generation.automatic1111.cfg_scale " ,
2024-09-12 14:00:24 +02:00
(
float ( os . environ . get ( " AUTOMATIC1111_CFG_SCALE " ) )
if os . environ . get ( " AUTOMATIC1111_CFG_SCALE " )
else None
) ,
2024-09-07 17:21:17 +02:00
)
2024-09-12 14:00:24 +02:00
2024-09-07 17:21:17 +02:00
AUTOMATIC1111_SAMPLER = PersistentConfig (
2024-10-28 17:02:18 -04:00
" AUTOMATIC1111_SAMPLER " ,
2024-09-07 17:21:17 +02:00
" image_generation.automatic1111.sampler " ,
2024-09-12 14:00:24 +02:00
(
os . environ . get ( " AUTOMATIC1111_SAMPLER " )
if os . environ . get ( " AUTOMATIC1111_SAMPLER " )
else None
2024-09-13 00:49:23 -04:00
) ,
2024-09-07 17:21:17 +02:00
)
AUTOMATIC1111_SCHEDULER = PersistentConfig (
" AUTOMATIC1111_SCHEDULER " ,
" image_generation.automatic1111.scheduler " ,
2024-09-12 14:00:24 +02:00
(
os . environ . get ( " AUTOMATIC1111_SCHEDULER " )
if os . environ . get ( " AUTOMATIC1111_SCHEDULER " )
else None
2024-09-13 00:49:23 -04:00
) ,
2024-09-07 17:21:17 +02:00
)
2024-05-13 11:32:21 -10: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-20 16:04:16 -05:00
2024-08-21 00:35:42 +02: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-20 18:17:15 +02:00
COMFYUI_WORKFLOW = PersistentConfig (
" COMFYUI_WORKFLOW " ,
" image_generation.comfyui.workflow " ,
2024-08-21 00:35:42 +02:00
os . getenv ( " COMFYUI_WORKFLOW " , COMFYUI_DEFAULT_WORKFLOW ) ,
)
COMFYUI_WORKFLOW_NODES = PersistentConfig (
" COMFYUI_WORKFLOW " ,
" image_generation.comfyui.nodes " ,
[ ] ,
2024-08-02 00:31:21 -02:30
)
2024-05-13 11:32:21 -10: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 ) ,
)
2024-05-13 11:32:21 -10: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 06:58:57 -04:00
)
2024-04-23 06:53:04 -04:00
2024-05-13 11:32:21 -10: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-13 11:32:21 -10: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-13 11:32:21 -10: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 06:53:04 -04:00
2024-04-20 16:04:16 -05:00
####################################
# Audio
####################################
2024-10-20 21:34:36 -07: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 = (
os . environ . get ( " WHISPER_MODEL_AUTO_UPDATE " , " " ) . lower ( ) == " true "
)
2024-06-07 20:18:48 -07: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-20 21:34:36 -07:00
os . getenv ( " AUDIO_STT_MODEL " , " " ) ,
2024-06-07 20:18:48 -07: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 10:35:05 +02:00
AUDIO_TTS_API_KEY = PersistentConfig (
" AUDIO_TTS_API_KEY " ,
" audio.tts.api_key " ,
os . getenv ( " AUDIO_TTS_API_KEY " , " " ) ,
)
2024-06-07 20:18:48 -07: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-16 15:42:15 -07:00
os . getenv ( " AUDIO_TTS_MODEL " , " tts-1 " ) , # OpenAI default model
2024-06-07 20:18:48 -07:00
)
AUDIO_TTS_VOICE = PersistentConfig (
" AUDIO_TTS_VOICE " ,
" audio.tts.voice " ,
2024-08-16 15:42:15 -07:00
os . getenv ( " AUDIO_TTS_VOICE " , " alloy " ) , # OpenAI default voice
2024-05-10 13:36:10 +08:00
)
2024-08-24 20:35:42 -04:00
AUDIO_TTS_SPLIT_ON = PersistentConfig (
" AUDIO_TTS_SPLIT_ON " ,
" audio.tts.split_on " ,
os . getenv ( " AUDIO_TTS_SPLIT_ON " , " punctuation " ) ,
)
2024-09-18 14:13:42 +01:00
AUDIO_TTS_AZURE_SPEECH_REGION = PersistentConfig (
" AUDIO_TTS_AZURE_SPEECH_REGION " ,
2024-09-19 02:42:24 +02:00
" audio.tts.azure.speech_region " ,
os . getenv ( " AUDIO_TTS_AZURE_SPEECH_REGION " , " eastus " ) ,
2024-09-18 14:13:42 +01:00
)
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT = PersistentConfig (
" AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT " ,
2024-09-19 02:42:24 +02:00
" audio.tts.azure.speech_output_format " ,
os . getenv (
" AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT " , " audio-24khz-160kbitrate-mono-mp3 "
) ,
2024-09-18 14:13:42 +01:00
)