|
@@ -5,6 +5,7 @@ import chromadb
|
|
from chromadb import Settings
|
|
from chromadb import Settings
|
|
from base64 import b64encode
|
|
from base64 import b64encode
|
|
from bs4 import BeautifulSoup
|
|
from bs4 import BeautifulSoup
|
|
|
|
+from typing import TypeVar, Generic, Union
|
|
|
|
|
|
from pathlib import Path
|
|
from pathlib import Path
|
|
import json
|
|
import json
|
|
@@ -17,7 +18,6 @@ import shutil
|
|
from secrets import token_bytes
|
|
from secrets import token_bytes
|
|
from constants import ERROR_MESSAGES
|
|
from constants import ERROR_MESSAGES
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# Load .env file
|
|
# Load .env file
|
|
####################################
|
|
####################################
|
|
@@ -29,7 +29,6 @@ try:
|
|
except ImportError:
|
|
except ImportError:
|
|
print("dotenv not installed, skipping...")
|
|
print("dotenv not installed, skipping...")
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# LOGGING
|
|
# LOGGING
|
|
####################################
|
|
####################################
|
|
@@ -71,7 +70,6 @@ for source in log_sources:
|
|
|
|
|
|
log.setLevel(SRC_LOG_LEVELS["CONFIG"])
|
|
log.setLevel(SRC_LOG_LEVELS["CONFIG"])
|
|
|
|
|
|
-
|
|
|
|
WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
|
|
WEBUI_NAME = os.environ.get("WEBUI_NAME", "Open WebUI")
|
|
if WEBUI_NAME != "Open WebUI":
|
|
if WEBUI_NAME != "Open WebUI":
|
|
WEBUI_NAME += " (Open WebUI)"
|
|
WEBUI_NAME += " (Open WebUI)"
|
|
@@ -80,7 +78,6 @@ WEBUI_URL = os.environ.get("WEBUI_URL", "http://localhost:3000")
|
|
|
|
|
|
WEBUI_FAVICON_URL = "https://openwebui.com/favicon.png"
|
|
WEBUI_FAVICON_URL = "https://openwebui.com/favicon.png"
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# ENV (dev,test,prod)
|
|
# ENV (dev,test,prod)
|
|
####################################
|
|
####################################
|
|
@@ -151,26 +148,14 @@ for version in soup.find_all("h2"):
|
|
|
|
|
|
changelog_json[version_number] = version_data
|
|
changelog_json[version_number] = version_data
|
|
|
|
|
|
-
|
|
|
|
CHANGELOG = changelog_json
|
|
CHANGELOG = changelog_json
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# WEBUI_VERSION
|
|
# WEBUI_VERSION
|
|
####################################
|
|
####################################
|
|
|
|
|
|
WEBUI_VERSION = os.environ.get("WEBUI_VERSION", "v1.0.0-alpha.100")
|
|
WEBUI_VERSION = os.environ.get("WEBUI_VERSION", "v1.0.0-alpha.100")
|
|
|
|
|
|
-####################################
|
|
|
|
-# WEBUI_AUTH (Required for security)
|
|
|
|
-####################################
|
|
|
|
-
|
|
|
|
-WEBUI_AUTH = os.environ.get("WEBUI_AUTH", "True").lower() == "true"
|
|
|
|
-WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os.environ.get(
|
|
|
|
- "WEBUI_AUTH_TRUSTED_EMAIL_HEADER", None
|
|
|
|
-)
|
|
|
|
-
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# DATA/FRONTEND BUILD DIR
|
|
# DATA/FRONTEND BUILD DIR
|
|
####################################
|
|
####################################
|
|
@@ -184,6 +169,93 @@ try:
|
|
except:
|
|
except:
|
|
CONFIG_DATA = {}
|
|
CONFIG_DATA = {}
|
|
|
|
|
|
|
|
+
|
|
|
|
+####################################
|
|
|
|
+# Config helpers
|
|
|
|
+####################################
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def save_config():
|
|
|
|
+ try:
|
|
|
|
+ with open(f"{DATA_DIR}/config.json", "w") as f:
|
|
|
|
+ json.dump(CONFIG_DATA, f, indent="\t")
|
|
|
|
+ except Exception as e:
|
|
|
|
+ log.exception(e)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+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
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+T = TypeVar("T")
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class WrappedConfig(Generic[T]):
|
|
|
|
+ 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
|
|
|
|
+ self.config_value = get_config_value(config_path)
|
|
|
|
+ if self.config_value is not None:
|
|
|
|
+ log.info(f"'{env_name}' loaded from config.json")
|
|
|
|
+ self.value = self.config_value
|
|
|
|
+ else:
|
|
|
|
+ self.value = env_value
|
|
|
|
+
|
|
|
|
+ def __str__(self):
|
|
|
|
+ return str(self.value)
|
|
|
|
+
|
|
|
|
+ def save(self):
|
|
|
|
+ # Don't save if the value is the same as the env value and the config value
|
|
|
|
+ if self.env_value == self.value:
|
|
|
|
+ if self.config_value == self.value:
|
|
|
|
+ return
|
|
|
|
+ log.info(f"Saving '{self.env_name}' to config.json")
|
|
|
|
+ path_parts = self.config_path.split(".")
|
|
|
|
+ config = CONFIG_DATA
|
|
|
|
+ for key in path_parts[:-1]:
|
|
|
|
+ if key not in config:
|
|
|
|
+ config[key] = {}
|
|
|
|
+ config = config[key]
|
|
|
|
+ config[path_parts[-1]] = self.value
|
|
|
|
+ save_config()
|
|
|
|
+ self.config_value = self.value
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def config_set(config: Union[WrappedConfig[T], T], value: T, save_config=True):
|
|
|
|
+ if isinstance(config, WrappedConfig):
|
|
|
|
+ config.value = value
|
|
|
|
+ if save_config:
|
|
|
|
+ config.save()
|
|
|
|
+ else:
|
|
|
|
+ config = value
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+def config_get(config: Union[WrappedConfig[T], T]) -> T:
|
|
|
|
+ if isinstance(config, WrappedConfig):
|
|
|
|
+ return config.value
|
|
|
|
+ return config
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+####################################
|
|
|
|
+# WEBUI_AUTH (Required for security)
|
|
|
|
+####################################
|
|
|
|
+
|
|
|
|
+WEBUI_AUTH = os.environ.get("WEBUI_AUTH", "True").lower() == "true"
|
|
|
|
+WEBUI_AUTH_TRUSTED_EMAIL_HEADER = os.environ.get(
|
|
|
|
+ "WEBUI_AUTH_TRUSTED_EMAIL_HEADER", None
|
|
|
|
+)
|
|
|
|
+JWT_EXPIRES_IN = WrappedConfig(
|
|
|
|
+ "JWT_EXPIRES_IN", "auth.jwt_expiry", os.environ.get("JWT_EXPIRES_IN", "-1")
|
|
|
|
+)
|
|
|
|
+
|
|
####################################
|
|
####################################
|
|
# Static DIR
|
|
# Static DIR
|
|
####################################
|
|
####################################
|
|
@@ -225,7 +297,6 @@ if CUSTOM_NAME:
|
|
log.exception(e)
|
|
log.exception(e)
|
|
pass
|
|
pass
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# File Upload DIR
|
|
# File Upload DIR
|
|
####################################
|
|
####################################
|
|
@@ -233,7 +304,6 @@ if CUSTOM_NAME:
|
|
UPLOAD_DIR = f"{DATA_DIR}/uploads"
|
|
UPLOAD_DIR = f"{DATA_DIR}/uploads"
|
|
Path(UPLOAD_DIR).mkdir(parents=True, exist_ok=True)
|
|
Path(UPLOAD_DIR).mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# Cache DIR
|
|
# Cache DIR
|
|
####################################
|
|
####################################
|
|
@@ -241,7 +311,6 @@ Path(UPLOAD_DIR).mkdir(parents=True, exist_ok=True)
|
|
CACHE_DIR = f"{DATA_DIR}/cache"
|
|
CACHE_DIR = f"{DATA_DIR}/cache"
|
|
Path(CACHE_DIR).mkdir(parents=True, exist_ok=True)
|
|
Path(CACHE_DIR).mkdir(parents=True, exist_ok=True)
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# Docs DIR
|
|
# Docs DIR
|
|
####################################
|
|
####################################
|
|
@@ -282,7 +351,6 @@ if not os.path.exists(LITELLM_CONFIG_PATH):
|
|
create_config_file(LITELLM_CONFIG_PATH)
|
|
create_config_file(LITELLM_CONFIG_PATH)
|
|
log.info("Config file created successfully.")
|
|
log.info("Config file created successfully.")
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# OLLAMA_BASE_URL
|
|
# OLLAMA_BASE_URL
|
|
####################################
|
|
####################################
|
|
@@ -313,12 +381,13 @@ if ENV == "prod":
|
|
elif K8S_FLAG:
|
|
elif K8S_FLAG:
|
|
OLLAMA_BASE_URL = "http://ollama-service.open-webui.svc.cluster.local:11434"
|
|
OLLAMA_BASE_URL = "http://ollama-service.open-webui.svc.cluster.local:11434"
|
|
|
|
|
|
-
|
|
|
|
OLLAMA_BASE_URLS = os.environ.get("OLLAMA_BASE_URLS", "")
|
|
OLLAMA_BASE_URLS = os.environ.get("OLLAMA_BASE_URLS", "")
|
|
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS if OLLAMA_BASE_URLS != "" else OLLAMA_BASE_URL
|
|
OLLAMA_BASE_URLS = OLLAMA_BASE_URLS if OLLAMA_BASE_URLS != "" else OLLAMA_BASE_URL
|
|
|
|
|
|
OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(";")]
|
|
OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(";")]
|
|
-
|
|
|
|
|
|
+OLLAMA_BASE_URLS = WrappedConfig(
|
|
|
|
+ "OLLAMA_BASE_URLS", "ollama.base_urls", OLLAMA_BASE_URLS
|
|
|
|
+)
|
|
|
|
|
|
####################################
|
|
####################################
|
|
# OPENAI_API
|
|
# OPENAI_API
|
|
@@ -327,7 +396,6 @@ OLLAMA_BASE_URLS = [url.strip() for url in OLLAMA_BASE_URLS.split(";")]
|
|
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
|
|
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY", "")
|
|
OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
|
|
OPENAI_API_BASE_URL = os.environ.get("OPENAI_API_BASE_URL", "")
|
|
|
|
|
|
-
|
|
|
|
if OPENAI_API_BASE_URL == "":
|
|
if OPENAI_API_BASE_URL == "":
|
|
OPENAI_API_BASE_URL = "https://api.openai.com/v1"
|
|
OPENAI_API_BASE_URL = "https://api.openai.com/v1"
|
|
|
|
|
|
@@ -335,7 +403,7 @@ OPENAI_API_KEYS = os.environ.get("OPENAI_API_KEYS", "")
|
|
OPENAI_API_KEYS = OPENAI_API_KEYS if OPENAI_API_KEYS != "" else OPENAI_API_KEY
|
|
OPENAI_API_KEYS = OPENAI_API_KEYS if OPENAI_API_KEYS != "" else OPENAI_API_KEY
|
|
|
|
|
|
OPENAI_API_KEYS = [url.strip() for url in OPENAI_API_KEYS.split(";")]
|
|
OPENAI_API_KEYS = [url.strip() for url in OPENAI_API_KEYS.split(";")]
|
|
-
|
|
|
|
|
|
+OPENAI_API_KEYS = WrappedConfig("OPENAI_API_KEYS", "openai.api_keys", OPENAI_API_KEYS)
|
|
|
|
|
|
OPENAI_API_BASE_URLS = os.environ.get("OPENAI_API_BASE_URLS", "")
|
|
OPENAI_API_BASE_URLS = os.environ.get("OPENAI_API_BASE_URLS", "")
|
|
OPENAI_API_BASE_URLS = (
|
|
OPENAI_API_BASE_URLS = (
|
|
@@ -346,37 +414,42 @@ OPENAI_API_BASE_URLS = [
|
|
url.strip() if url != "" else "https://api.openai.com/v1"
|
|
url.strip() if url != "" else "https://api.openai.com/v1"
|
|
for url in OPENAI_API_BASE_URLS.split(";")
|
|
for url in OPENAI_API_BASE_URLS.split(";")
|
|
]
|
|
]
|
|
|
|
+OPENAI_API_BASE_URLS = WrappedConfig(
|
|
|
|
+ "OPENAI_API_BASE_URLS", "openai.api_base_urls", OPENAI_API_BASE_URLS
|
|
|
|
+)
|
|
|
|
|
|
OPENAI_API_KEY = ""
|
|
OPENAI_API_KEY = ""
|
|
|
|
|
|
try:
|
|
try:
|
|
- OPENAI_API_KEY = OPENAI_API_KEYS[
|
|
|
|
- OPENAI_API_BASE_URLS.index("https://api.openai.com/v1")
|
|
|
|
|
|
+ OPENAI_API_KEY = OPENAI_API_KEYS.value[
|
|
|
|
+ OPENAI_API_BASE_URLS.value.index("https://api.openai.com/v1")
|
|
]
|
|
]
|
|
except:
|
|
except:
|
|
pass
|
|
pass
|
|
|
|
|
|
OPENAI_API_BASE_URL = "https://api.openai.com/v1"
|
|
OPENAI_API_BASE_URL = "https://api.openai.com/v1"
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# WEBUI
|
|
# WEBUI
|
|
####################################
|
|
####################################
|
|
|
|
|
|
-ENABLE_SIGNUP = (
|
|
|
|
- False
|
|
|
|
- if WEBUI_AUTH == False
|
|
|
|
- else os.environ.get("ENABLE_SIGNUP", "True").lower() == "true"
|
|
|
|
|
|
+ENABLE_SIGNUP = WrappedConfig(
|
|
|
|
+ "ENABLE_SIGNUP",
|
|
|
|
+ "ui.enable_signup",
|
|
|
|
+ (
|
|
|
|
+ False
|
|
|
|
+ if not WEBUI_AUTH
|
|
|
|
+ else os.environ.get("ENABLE_SIGNUP", "True").lower() == "true"
|
|
|
|
+ ),
|
|
|
|
+)
|
|
|
|
+DEFAULT_MODELS = WrappedConfig(
|
|
|
|
+ "DEFAULT_MODELS", "ui.default_models", os.environ.get("DEFAULT_MODELS", None)
|
|
)
|
|
)
|
|
-DEFAULT_MODELS = os.environ.get("DEFAULT_MODELS", None)
|
|
|
|
-
|
|
|
|
|
|
|
|
-DEFAULT_PROMPT_SUGGESTIONS = (
|
|
|
|
- CONFIG_DATA["ui"]["prompt_suggestions"]
|
|
|
|
- if "ui" in CONFIG_DATA
|
|
|
|
- and "prompt_suggestions" in CONFIG_DATA["ui"]
|
|
|
|
- and type(CONFIG_DATA["ui"]["prompt_suggestions"]) is list
|
|
|
|
- else [
|
|
|
|
|
|
+DEFAULT_PROMPT_SUGGESTIONS = WrappedConfig(
|
|
|
|
+ "DEFAULT_PROMPT_SUGGESTIONS",
|
|
|
|
+ "ui.prompt_suggestions",
|
|
|
|
+ [
|
|
{
|
|
{
|
|
"title": ["Help me study", "vocabulary for a college entrance exam"],
|
|
"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.",
|
|
"content": "Help me study vocabulary: write a sentence for me to fill in the blank, and I'll try to pick the correct option.",
|
|
@@ -404,23 +477,42 @@ DEFAULT_PROMPT_SUGGESTIONS = (
|
|
"title": ["Overcome procrastination", "give me tips"],
|
|
"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?",
|
|
"content": "Could you start by asking me about instances when I procrastinate the most and then give me some suggestions to overcome it?",
|
|
},
|
|
},
|
|
- ]
|
|
|
|
|
|
+ ],
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+DEFAULT_USER_ROLE = WrappedConfig(
|
|
|
|
+ "DEFAULT_USER_ROLE",
|
|
|
|
+ "ui.default_user_role",
|
|
|
|
+ os.getenv("DEFAULT_USER_ROLE", "pending"),
|
|
|
|
+)
|
|
|
|
|
|
-DEFAULT_USER_ROLE = os.getenv("DEFAULT_USER_ROLE", "pending")
|
|
|
|
-
|
|
|
|
-USER_PERMISSIONS_CHAT_DELETION = (
|
|
|
|
- os.environ.get("USER_PERMISSIONS_CHAT_DELETION", "True").lower() == "true"
|
|
|
|
|
|
+USER_PERMISSIONS_CHAT_DELETION = WrappedConfig(
|
|
|
|
+ "USER_PERMISSIONS_CHAT_DELETION",
|
|
|
|
+ "ui.user_permissions.chat.deletion",
|
|
|
|
+ os.environ.get("USER_PERMISSIONS_CHAT_DELETION", "True").lower() == "true",
|
|
)
|
|
)
|
|
|
|
|
|
-USER_PERMISSIONS = {"chat": {"deletion": USER_PERMISSIONS_CHAT_DELETION}}
|
|
|
|
|
|
+USER_PERMISSIONS = WrappedConfig(
|
|
|
|
+ "USER_PERMISSIONS",
|
|
|
|
+ "ui.user_permissions",
|
|
|
|
+ {"chat": {"deletion": USER_PERMISSIONS_CHAT_DELETION}},
|
|
|
|
+)
|
|
|
|
|
|
-ENABLE_MODEL_FILTER = os.environ.get("ENABLE_MODEL_FILTER", "False").lower() == "true"
|
|
|
|
|
|
+ENABLE_MODEL_FILTER = WrappedConfig(
|
|
|
|
+ "ENABLE_MODEL_FILTER",
|
|
|
|
+ "model_filter.enable",
|
|
|
|
+ os.environ.get("ENABLE_MODEL_FILTER", "False").lower() == "true",
|
|
|
|
+)
|
|
MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "")
|
|
MODEL_FILTER_LIST = os.environ.get("MODEL_FILTER_LIST", "")
|
|
-MODEL_FILTER_LIST = [model.strip() for model in MODEL_FILTER_LIST.split(";")]
|
|
|
|
|
|
+MODEL_FILTER_LIST = WrappedConfig(
|
|
|
|
+ "MODEL_FILTER_LIST",
|
|
|
|
+ "model_filter.list",
|
|
|
|
+ [model.strip() for model in MODEL_FILTER_LIST.split(";")],
|
|
|
|
+)
|
|
|
|
|
|
-WEBHOOK_URL = os.environ.get("WEBHOOK_URL", "")
|
|
|
|
|
|
+WEBHOOK_URL = WrappedConfig(
|
|
|
|
+ "WEBHOOK_URL", "webhook_url", os.environ.get("WEBHOOK_URL", "")
|
|
|
|
+)
|
|
|
|
|
|
ENABLE_ADMIN_EXPORT = os.environ.get("ENABLE_ADMIN_EXPORT", "True").lower() == "true"
|
|
ENABLE_ADMIN_EXPORT = os.environ.get("ENABLE_ADMIN_EXPORT", "True").lower() == "true"
|
|
|
|
|
|
@@ -458,26 +550,45 @@ else:
|
|
CHROMA_HTTP_SSL = os.environ.get("CHROMA_HTTP_SSL", "false").lower() == "true"
|
|
CHROMA_HTTP_SSL = os.environ.get("CHROMA_HTTP_SSL", "false").lower() == "true"
|
|
# 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)
|
|
# 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)
|
|
|
|
|
|
-RAG_TOP_K = int(os.environ.get("RAG_TOP_K", "5"))
|
|
|
|
-RAG_RELEVANCE_THRESHOLD = float(os.environ.get("RAG_RELEVANCE_THRESHOLD", "0.0"))
|
|
|
|
-
|
|
|
|
-ENABLE_RAG_HYBRID_SEARCH = (
|
|
|
|
- os.environ.get("ENABLE_RAG_HYBRID_SEARCH", "").lower() == "true"
|
|
|
|
|
|
+RAG_TOP_K = WrappedConfig(
|
|
|
|
+ "RAG_TOP_K", "rag.top_k", int(os.environ.get("RAG_TOP_K", "5"))
|
|
|
|
+)
|
|
|
|
+RAG_RELEVANCE_THRESHOLD = WrappedConfig(
|
|
|
|
+ "RAG_RELEVANCE_THRESHOLD",
|
|
|
|
+ "rag.relevance_threshold",
|
|
|
|
+ float(os.environ.get("RAG_RELEVANCE_THRESHOLD", "0.0")),
|
|
)
|
|
)
|
|
|
|
|
|
|
|
+ENABLE_RAG_HYBRID_SEARCH = WrappedConfig(
|
|
|
|
+ "ENABLE_RAG_HYBRID_SEARCH",
|
|
|
|
+ "rag.enable_hybrid_search",
|
|
|
|
+ os.environ.get("ENABLE_RAG_HYBRID_SEARCH", "").lower() == "true",
|
|
|
|
+)
|
|
|
|
|
|
-ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = (
|
|
|
|
- os.environ.get("ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION", "True").lower() == "true"
|
|
|
|
|
|
+ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = WrappedConfig(
|
|
|
|
+ "ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION",
|
|
|
|
+ "rag.enable_web_loader_ssl_verification",
|
|
|
|
+ os.environ.get("ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION", "True").lower() == "true",
|
|
)
|
|
)
|
|
|
|
|
|
-RAG_EMBEDDING_ENGINE = os.environ.get("RAG_EMBEDDING_ENGINE", "")
|
|
|
|
|
|
+RAG_EMBEDDING_ENGINE = WrappedConfig(
|
|
|
|
+ "RAG_EMBEDDING_ENGINE",
|
|
|
|
+ "rag.embedding_engine",
|
|
|
|
+ os.environ.get("RAG_EMBEDDING_ENGINE", ""),
|
|
|
|
+)
|
|
|
|
|
|
-PDF_EXTRACT_IMAGES = os.environ.get("PDF_EXTRACT_IMAGES", "False").lower() == "true"
|
|
|
|
|
|
+PDF_EXTRACT_IMAGES = WrappedConfig(
|
|
|
|
+ "PDF_EXTRACT_IMAGES",
|
|
|
|
+ "rag.pdf_extract_images",
|
|
|
|
+ os.environ.get("PDF_EXTRACT_IMAGES", "False").lower() == "true",
|
|
|
|
+)
|
|
|
|
|
|
-RAG_EMBEDDING_MODEL = os.environ.get(
|
|
|
|
- "RAG_EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2"
|
|
|
|
|
|
+RAG_EMBEDDING_MODEL = WrappedConfig(
|
|
|
|
+ "RAG_EMBEDDING_MODEL",
|
|
|
|
+ "rag.embedding_model",
|
|
|
|
+ os.environ.get("RAG_EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2"),
|
|
)
|
|
)
|
|
-log.info(f"Embedding model set: {RAG_EMBEDDING_MODEL}"),
|
|
|
|
|
|
+log.info(f"Embedding model set: {RAG_EMBEDDING_MODEL.value}"),
|
|
|
|
|
|
RAG_EMBEDDING_MODEL_AUTO_UPDATE = (
|
|
RAG_EMBEDDING_MODEL_AUTO_UPDATE = (
|
|
os.environ.get("RAG_EMBEDDING_MODEL_AUTO_UPDATE", "").lower() == "true"
|
|
os.environ.get("RAG_EMBEDDING_MODEL_AUTO_UPDATE", "").lower() == "true"
|
|
@@ -487,9 +598,13 @@ RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE = (
|
|
os.environ.get("RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE", "").lower() == "true"
|
|
os.environ.get("RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE", "").lower() == "true"
|
|
)
|
|
)
|
|
|
|
|
|
-RAG_RERANKING_MODEL = os.environ.get("RAG_RERANKING_MODEL", "")
|
|
|
|
-if not RAG_RERANKING_MODEL == "":
|
|
|
|
- log.info(f"Reranking model set: {RAG_RERANKING_MODEL}"),
|
|
|
|
|
|
+RAG_RERANKING_MODEL = WrappedConfig(
|
|
|
|
+ "RAG_RERANKING_MODEL",
|
|
|
|
+ "rag.reranking_model",
|
|
|
|
+ os.environ.get("RAG_RERANKING_MODEL", ""),
|
|
|
|
+)
|
|
|
|
+if RAG_RERANKING_MODEL.value != "":
|
|
|
|
+ log.info(f"Reranking model set: {RAG_RERANKING_MODEL.value}"),
|
|
|
|
|
|
RAG_RERANKING_MODEL_AUTO_UPDATE = (
|
|
RAG_RERANKING_MODEL_AUTO_UPDATE = (
|
|
os.environ.get("RAG_RERANKING_MODEL_AUTO_UPDATE", "").lower() == "true"
|
|
os.environ.get("RAG_RERANKING_MODEL_AUTO_UPDATE", "").lower() == "true"
|
|
@@ -499,7 +614,6 @@ RAG_RERANKING_MODEL_TRUST_REMOTE_CODE = (
|
|
os.environ.get("RAG_RERANKING_MODEL_TRUST_REMOTE_CODE", "").lower() == "true"
|
|
os.environ.get("RAG_RERANKING_MODEL_TRUST_REMOTE_CODE", "").lower() == "true"
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
if CHROMA_HTTP_HOST != "":
|
|
if CHROMA_HTTP_HOST != "":
|
|
CHROMA_CLIENT = chromadb.HttpClient(
|
|
CHROMA_CLIENT = chromadb.HttpClient(
|
|
host=CHROMA_HTTP_HOST,
|
|
host=CHROMA_HTTP_HOST,
|
|
@@ -518,7 +632,6 @@ else:
|
|
database=CHROMA_DATABASE,
|
|
database=CHROMA_DATABASE,
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
# device type embedding models - "cpu" (default), "cuda" (nvidia gpu required) or "mps" (apple silicon) - choosing this right can lead to better performance
|
|
# device type embedding models - "cpu" (default), "cuda" (nvidia gpu required) or "mps" (apple silicon) - choosing this right can lead to better performance
|
|
USE_CUDA = os.environ.get("USE_CUDA_DOCKER", "false")
|
|
USE_CUDA = os.environ.get("USE_CUDA_DOCKER", "false")
|
|
|
|
|
|
@@ -527,9 +640,14 @@ if USE_CUDA.lower() == "true":
|
|
else:
|
|
else:
|
|
DEVICE_TYPE = "cpu"
|
|
DEVICE_TYPE = "cpu"
|
|
|
|
|
|
-
|
|
|
|
-CHUNK_SIZE = int(os.environ.get("CHUNK_SIZE", "1500"))
|
|
|
|
-CHUNK_OVERLAP = int(os.environ.get("CHUNK_OVERLAP", "100"))
|
|
|
|
|
|
+CHUNK_SIZE = WrappedConfig(
|
|
|
|
+ "CHUNK_SIZE", "rag.chunk_size", int(os.environ.get("CHUNK_SIZE", "1500"))
|
|
|
|
+)
|
|
|
|
+CHUNK_OVERLAP = WrappedConfig(
|
|
|
|
+ "CHUNK_OVERLAP",
|
|
|
|
+ "rag.chunk_overlap",
|
|
|
|
+ int(os.environ.get("CHUNK_OVERLAP", "100")),
|
|
|
|
+)
|
|
|
|
|
|
DEFAULT_RAG_TEMPLATE = """Use the following context as your learned knowledge, inside <context></context> XML tags.
|
|
DEFAULT_RAG_TEMPLATE = """Use the following context as your learned knowledge, inside <context></context> XML tags.
|
|
<context>
|
|
<context>
|
|
@@ -545,16 +663,32 @@ And answer according to the language of the user's question.
|
|
Given the context information, answer the query.
|
|
Given the context information, answer the query.
|
|
Query: [query]"""
|
|
Query: [query]"""
|
|
|
|
|
|
-RAG_TEMPLATE = os.environ.get("RAG_TEMPLATE", DEFAULT_RAG_TEMPLATE)
|
|
|
|
|
|
+RAG_TEMPLATE = WrappedConfig(
|
|
|
|
+ "RAG_TEMPLATE",
|
|
|
|
+ "rag.template",
|
|
|
|
+ os.environ.get("RAG_TEMPLATE", DEFAULT_RAG_TEMPLATE),
|
|
|
|
+)
|
|
|
|
|
|
-RAG_OPENAI_API_BASE_URL = os.getenv("RAG_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL)
|
|
|
|
-RAG_OPENAI_API_KEY = os.getenv("RAG_OPENAI_API_KEY", OPENAI_API_KEY)
|
|
|
|
|
|
+RAG_OPENAI_API_BASE_URL = WrappedConfig(
|
|
|
|
+ "RAG_OPENAI_API_BASE_URL",
|
|
|
|
+ "rag.openai_api_base_url",
|
|
|
|
+ os.getenv("RAG_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL),
|
|
|
|
+)
|
|
|
|
+RAG_OPENAI_API_KEY = WrappedConfig(
|
|
|
|
+ "RAG_OPENAI_API_KEY",
|
|
|
|
+ "rag.openai_api_key",
|
|
|
|
+ os.getenv("RAG_OPENAI_API_KEY", OPENAI_API_KEY),
|
|
|
|
+)
|
|
|
|
|
|
ENABLE_RAG_LOCAL_WEB_FETCH = (
|
|
ENABLE_RAG_LOCAL_WEB_FETCH = (
|
|
os.getenv("ENABLE_RAG_LOCAL_WEB_FETCH", "False").lower() == "true"
|
|
os.getenv("ENABLE_RAG_LOCAL_WEB_FETCH", "False").lower() == "true"
|
|
)
|
|
)
|
|
|
|
|
|
-YOUTUBE_LOADER_LANGUAGE = os.getenv("YOUTUBE_LOADER_LANGUAGE", "en").split(",")
|
|
|
|
|
|
+YOUTUBE_LOADER_LANGUAGE = WrappedConfig(
|
|
|
|
+ "YOUTUBE_LOADER_LANGUAGE",
|
|
|
|
+ "rag.youtube_loader_language",
|
|
|
|
+ os.getenv("YOUTUBE_LOADER_LANGUAGE", "en").split(","),
|
|
|
|
+)
|
|
|
|
|
|
####################################
|
|
####################################
|
|
# Transcribe
|
|
# Transcribe
|
|
@@ -566,39 +700,82 @@ WHISPER_MODEL_AUTO_UPDATE = (
|
|
os.environ.get("WHISPER_MODEL_AUTO_UPDATE", "").lower() == "true"
|
|
os.environ.get("WHISPER_MODEL_AUTO_UPDATE", "").lower() == "true"
|
|
)
|
|
)
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# Images
|
|
# Images
|
|
####################################
|
|
####################################
|
|
|
|
|
|
-IMAGE_GENERATION_ENGINE = os.getenv("IMAGE_GENERATION_ENGINE", "")
|
|
|
|
|
|
+IMAGE_GENERATION_ENGINE = WrappedConfig(
|
|
|
|
+ "IMAGE_GENERATION_ENGINE",
|
|
|
|
+ "image_generation.engine",
|
|
|
|
+ os.getenv("IMAGE_GENERATION_ENGINE", ""),
|
|
|
|
+)
|
|
|
|
|
|
-ENABLE_IMAGE_GENERATION = (
|
|
|
|
- os.environ.get("ENABLE_IMAGE_GENERATION", "").lower() == "true"
|
|
|
|
|
|
+ENABLE_IMAGE_GENERATION = WrappedConfig(
|
|
|
|
+ "ENABLE_IMAGE_GENERATION",
|
|
|
|
+ "image_generation.enable",
|
|
|
|
+ os.environ.get("ENABLE_IMAGE_GENERATION", "").lower() == "true",
|
|
|
|
+)
|
|
|
|
+AUTOMATIC1111_BASE_URL = WrappedConfig(
|
|
|
|
+ "AUTOMATIC1111_BASE_URL",
|
|
|
|
+ "image_generation.automatic1111.base_url",
|
|
|
|
+ os.getenv("AUTOMATIC1111_BASE_URL", ""),
|
|
)
|
|
)
|
|
-AUTOMATIC1111_BASE_URL = os.getenv("AUTOMATIC1111_BASE_URL", "")
|
|
|
|
|
|
|
|
-COMFYUI_BASE_URL = os.getenv("COMFYUI_BASE_URL", "")
|
|
|
|
|
|
+COMFYUI_BASE_URL = WrappedConfig(
|
|
|
|
+ "COMFYUI_BASE_URL",
|
|
|
|
+ "image_generation.comfyui.base_url",
|
|
|
|
+ os.getenv("COMFYUI_BASE_URL", ""),
|
|
|
|
+)
|
|
|
|
|
|
-IMAGES_OPENAI_API_BASE_URL = os.getenv(
|
|
|
|
- "IMAGES_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL
|
|
|
|
|
|
+IMAGES_OPENAI_API_BASE_URL = WrappedConfig(
|
|
|
|
+ "IMAGES_OPENAI_API_BASE_URL",
|
|
|
|
+ "image_generation.openai.api_base_url",
|
|
|
|
+ os.getenv("IMAGES_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL),
|
|
|
|
+)
|
|
|
|
+IMAGES_OPENAI_API_KEY = WrappedConfig(
|
|
|
|
+ "IMAGES_OPENAI_API_KEY",
|
|
|
|
+ "image_generation.openai.api_key",
|
|
|
|
+ os.getenv("IMAGES_OPENAI_API_KEY", OPENAI_API_KEY),
|
|
)
|
|
)
|
|
-IMAGES_OPENAI_API_KEY = os.getenv("IMAGES_OPENAI_API_KEY", OPENAI_API_KEY)
|
|
|
|
|
|
|
|
-IMAGE_SIZE = os.getenv("IMAGE_SIZE", "512x512")
|
|
|
|
|
|
+IMAGE_SIZE = WrappedConfig(
|
|
|
|
+ "IMAGE_SIZE", "image_generation.size", os.getenv("IMAGE_SIZE", "512x512")
|
|
|
|
+)
|
|
|
|
|
|
-IMAGE_STEPS = int(os.getenv("IMAGE_STEPS", 50))
|
|
|
|
|
|
+IMAGE_STEPS = WrappedConfig(
|
|
|
|
+ "IMAGE_STEPS", "image_generation.steps", int(os.getenv("IMAGE_STEPS", 50))
|
|
|
|
+)
|
|
|
|
|
|
-IMAGE_GENERATION_MODEL = os.getenv("IMAGE_GENERATION_MODEL", "")
|
|
|
|
|
|
+IMAGE_GENERATION_MODEL = WrappedConfig(
|
|
|
|
+ "IMAGE_GENERATION_MODEL",
|
|
|
|
+ "image_generation.model",
|
|
|
|
+ os.getenv("IMAGE_GENERATION_MODEL", ""),
|
|
|
|
+)
|
|
|
|
|
|
####################################
|
|
####################################
|
|
# Audio
|
|
# Audio
|
|
####################################
|
|
####################################
|
|
|
|
|
|
-AUDIO_OPENAI_API_BASE_URL = os.getenv("AUDIO_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL)
|
|
|
|
-AUDIO_OPENAI_API_KEY = os.getenv("AUDIO_OPENAI_API_KEY", OPENAI_API_KEY)
|
|
|
|
-AUDIO_OPENAI_API_MODEL = os.getenv("AUDIO_OPENAI_API_MODEL", "tts-1")
|
|
|
|
-AUDIO_OPENAI_API_VOICE = os.getenv("AUDIO_OPENAI_API_VOICE", "alloy")
|
|
|
|
|
|
+AUDIO_OPENAI_API_BASE_URL = WrappedConfig(
|
|
|
|
+ "AUDIO_OPENAI_API_BASE_URL",
|
|
|
|
+ "audio.openai.api_base_url",
|
|
|
|
+ os.getenv("AUDIO_OPENAI_API_BASE_URL", OPENAI_API_BASE_URL),
|
|
|
|
+)
|
|
|
|
+AUDIO_OPENAI_API_KEY = WrappedConfig(
|
|
|
|
+ "AUDIO_OPENAI_API_KEY",
|
|
|
|
+ "audio.openai.api_key",
|
|
|
|
+ os.getenv("AUDIO_OPENAI_API_KEY", OPENAI_API_KEY),
|
|
|
|
+)
|
|
|
|
+AUDIO_OPENAI_API_MODEL = WrappedConfig(
|
|
|
|
+ "AUDIO_OPENAI_API_MODEL",
|
|
|
|
+ "audio.openai.api_model",
|
|
|
|
+ os.getenv("AUDIO_OPENAI_API_MODEL", "tts-1"),
|
|
|
|
+)
|
|
|
|
+AUDIO_OPENAI_API_VOICE = WrappedConfig(
|
|
|
|
+ "AUDIO_OPENAI_API_VOICE",
|
|
|
|
+ "audio.openai.api_voice",
|
|
|
|
+ os.getenv("AUDIO_OPENAI_API_VOICE", "alloy"),
|
|
|
|
+)
|
|
|
|
|
|
####################################
|
|
####################################
|
|
# LiteLLM
|
|
# LiteLLM
|
|
@@ -612,7 +789,6 @@ if LITELLM_PROXY_PORT < 0 or LITELLM_PROXY_PORT > 65535:
|
|
raise ValueError("Invalid port number for LITELLM_PROXY_PORT")
|
|
raise ValueError("Invalid port number for LITELLM_PROXY_PORT")
|
|
LITELLM_PROXY_HOST = os.getenv("LITELLM_PROXY_HOST", "127.0.0.1")
|
|
LITELLM_PROXY_HOST = os.getenv("LITELLM_PROXY_HOST", "127.0.0.1")
|
|
|
|
|
|
-
|
|
|
|
####################################
|
|
####################################
|
|
# Database
|
|
# Database
|
|
####################################
|
|
####################################
|