2024-04-07 21:25:06 -07:00
|
|
|
import os
|
2024-11-09 12:51:36 -08:00
|
|
|
from typing import Any
|
2024-10-05 16:08:28 -07:00
|
|
|
from typing import List
|
2024-09-16 11:54:36 -07:00
|
|
|
from urllib.parse import urlparse
|
2024-04-07 21:25:06 -07:00
|
|
|
|
2024-10-12 16:53:11 -07:00
|
|
|
from shared_configs.model_server_models import SupportedEmbeddingModel
|
|
|
|
|
2024-08-19 07:16:32 -07:00
|
|
|
# Used for logging
|
|
|
|
SLACK_CHANNEL_ID = "channel_id"
|
2024-04-07 21:25:06 -07:00
|
|
|
|
2024-04-10 23:13:22 -07:00
|
|
|
MODEL_SERVER_HOST = os.environ.get("MODEL_SERVER_HOST") or "localhost"
|
|
|
|
MODEL_SERVER_ALLOWED_HOST = os.environ.get("MODEL_SERVER_HOST") or "0.0.0.0"
|
|
|
|
MODEL_SERVER_PORT = int(os.environ.get("MODEL_SERVER_PORT") or "9000")
|
|
|
|
# Model server for indexing should use a separate one to not allow indexing to introduce delay
|
|
|
|
# for inference
|
|
|
|
INDEXING_MODEL_SERVER_HOST = (
|
|
|
|
os.environ.get("INDEXING_MODEL_SERVER_HOST") or MODEL_SERVER_HOST
|
|
|
|
)
|
2024-05-21 11:06:24 -07:00
|
|
|
INDEXING_MODEL_SERVER_PORT = int(
|
|
|
|
os.environ.get("INDEXING_MODEL_SERVER_PORT") or MODEL_SERVER_PORT
|
|
|
|
)
|
2024-04-10 23:13:22 -07:00
|
|
|
|
2024-12-13 09:48:43 -08:00
|
|
|
# Onyx custom Deep Learning Models
|
2024-09-08 14:46:00 -07:00
|
|
|
CONNECTOR_CLASSIFIER_MODEL_REPO = "Danswer/filter-extraction-model"
|
|
|
|
CONNECTOR_CLASSIFIER_MODEL_TAG = "1.0.0"
|
2024-08-08 20:45:53 -07:00
|
|
|
INTENT_MODEL_VERSION = "danswer/hybrid-intent-token-classifier"
|
|
|
|
INTENT_MODEL_TAG = "v1.0.3"
|
2024-04-07 21:25:06 -07:00
|
|
|
|
2024-09-08 14:46:00 -07:00
|
|
|
|
2024-04-07 21:25:06 -07:00
|
|
|
# Bi-Encoder, other details
|
|
|
|
DOC_EMBEDDING_CONTEXT_SIZE = 512
|
|
|
|
|
2024-08-16 21:29:15 -07:00
|
|
|
# Used to distinguish alternative indices
|
2024-12-31 11:28:11 -08:00
|
|
|
ALT_INDEX_SUFFIX = "__danswer_alt_index"
|
2024-08-11 14:22:42 -07:00
|
|
|
|
|
|
|
# Used for loading defaults for automatic deployments and dev flows
|
|
|
|
# For local, use: mixedbread-ai/mxbai-rerank-xsmall-v1
|
|
|
|
DEFAULT_CROSS_ENCODER_MODEL_NAME = (
|
|
|
|
os.environ.get("DEFAULT_CROSS_ENCODER_MODEL_NAME") or None
|
2024-04-07 21:25:06 -07:00
|
|
|
)
|
2024-08-11 14:22:42 -07:00
|
|
|
DEFAULT_CROSS_ENCODER_API_KEY = os.environ.get("DEFAULT_CROSS_ENCODER_API_KEY") or None
|
|
|
|
DEFAULT_CROSS_ENCODER_PROVIDER_TYPE = (
|
|
|
|
os.environ.get("DEFAULT_CROSS_ENCODER_PROVIDER_TYPE") or None
|
|
|
|
)
|
|
|
|
DISABLE_RERANK_FOR_STREAMING = (
|
|
|
|
os.environ.get("DISABLE_RERANK_FOR_STREAMING", "").lower() == "true"
|
2024-04-07 21:25:06 -07:00
|
|
|
)
|
2024-08-08 21:33:49 -07:00
|
|
|
|
2024-04-07 21:25:06 -07:00
|
|
|
# This controls the minimum number of pytorch "threads" to allocate to the embedding
|
|
|
|
# model. If torch finds more threads on its own, this value is not used.
|
|
|
|
MIN_THREADS_ML_MODELS = int(os.environ.get("MIN_THREADS_ML_MODELS") or 1)
|
|
|
|
|
2024-04-10 23:13:22 -07:00
|
|
|
# Model server that has indexing only set will throw exception if used for reranking
|
|
|
|
# or intent classification
|
2024-04-07 21:25:06 -07:00
|
|
|
INDEXING_ONLY = os.environ.get("INDEXING_ONLY", "").lower() == "true"
|
2024-04-10 23:13:22 -07:00
|
|
|
|
2024-08-18 19:18:28 -07:00
|
|
|
# The process needs to have this for the log file to write to
|
|
|
|
# otherwise, it will not create additional log files
|
2024-12-13 09:48:43 -08:00
|
|
|
LOG_FILE_NAME = os.environ.get("LOG_FILE_NAME") or "onyx"
|
2024-08-18 19:18:28 -07:00
|
|
|
|
|
|
|
# Enable generating persistent log files for local dev environments
|
|
|
|
DEV_LOGGING_ENABLED = os.environ.get("DEV_LOGGING_ENABLED", "").lower() == "true"
|
|
|
|
# notset, debug, info, notice, warning, error, or critical
|
2024-12-06 10:06:39 -08:00
|
|
|
LOG_LEVEL = os.environ.get("LOG_LEVEL", "info")
|
2024-08-26 21:26:51 -07:00
|
|
|
|
2024-10-18 11:25:27 -07:00
|
|
|
# Timeout for API-based embedding models
|
|
|
|
# NOTE: does not apply for Google VertexAI, since the python client doesn't
|
|
|
|
# allow us to specify a custom timeout
|
|
|
|
API_BASED_EMBEDDING_TIMEOUT = int(os.environ.get("API_BASED_EMBEDDING_TIMEOUT", "600"))
|
|
|
|
|
2024-10-08 20:20:28 -07:00
|
|
|
# Only used for OpenAI
|
2024-10-18 11:25:27 -07:00
|
|
|
OPENAI_EMBEDDING_TIMEOUT = int(
|
|
|
|
os.environ.get("OPENAI_EMBEDDING_TIMEOUT", API_BASED_EMBEDDING_TIMEOUT)
|
|
|
|
)
|
2024-10-08 20:20:28 -07:00
|
|
|
|
2024-10-16 09:44:19 -07:00
|
|
|
# Whether or not to strictly enforce token limit for chunking.
|
|
|
|
STRICT_CHUNK_TOKEN_LIMIT = (
|
|
|
|
os.environ.get("STRICT_CHUNK_TOKEN_LIMIT", "").lower() == "true"
|
|
|
|
)
|
2024-08-26 21:26:51 -07:00
|
|
|
|
2024-10-17 16:20:37 -07:00
|
|
|
# Set up Sentry integration (for error logging)
|
|
|
|
SENTRY_DSN = os.environ.get("SENTRY_DSN")
|
|
|
|
|
|
|
|
|
2024-08-26 21:26:51 -07:00
|
|
|
# Fields which should only be set on new search setting
|
|
|
|
PRESERVED_SEARCH_FIELDS = [
|
2024-09-04 13:59:07 -07:00
|
|
|
"id",
|
2024-08-26 21:26:51 -07:00
|
|
|
"provider_type",
|
|
|
|
"api_key",
|
|
|
|
"model_name",
|
2024-09-02 09:08:35 -07:00
|
|
|
"api_url",
|
2024-08-26 21:26:51 -07:00
|
|
|
"index_name",
|
|
|
|
"multipass_indexing",
|
|
|
|
"model_dim",
|
|
|
|
"normalize",
|
|
|
|
"passage_prefix",
|
|
|
|
"query_prefix",
|
|
|
|
]
|
2024-09-16 11:54:36 -07:00
|
|
|
|
|
|
|
|
|
|
|
def validate_cors_origin(origin: str) -> None:
|
|
|
|
parsed = urlparse(origin)
|
|
|
|
if parsed.scheme not in ["http", "https"] or not parsed.netloc:
|
|
|
|
raise ValueError(f"Invalid CORS origin: '{origin}'")
|
|
|
|
|
|
|
|
|
2024-10-05 16:08:28 -07:00
|
|
|
# Examples of valid values for the environment variable:
|
|
|
|
# - "" (allow all origins)
|
|
|
|
# - "http://example.com" (single origin)
|
|
|
|
# - "http://example.com,https://example.org" (multiple origins)
|
|
|
|
# - "*" (allow all origins)
|
|
|
|
CORS_ALLOWED_ORIGIN_ENV = os.environ.get("CORS_ALLOWED_ORIGIN", "")
|
|
|
|
|
|
|
|
# Explicitly declare the type of CORS_ALLOWED_ORIGIN
|
|
|
|
CORS_ALLOWED_ORIGIN: List[str]
|
|
|
|
|
|
|
|
if CORS_ALLOWED_ORIGIN_ENV:
|
|
|
|
# Split the environment variable into a list of origins
|
|
|
|
CORS_ALLOWED_ORIGIN = [
|
|
|
|
origin.strip()
|
|
|
|
for origin in CORS_ALLOWED_ORIGIN_ENV.split(",")
|
|
|
|
if origin.strip()
|
|
|
|
]
|
|
|
|
# Validate each origin in the list
|
|
|
|
for origin in CORS_ALLOWED_ORIGIN:
|
|
|
|
validate_cors_origin(origin)
|
|
|
|
else:
|
|
|
|
# If the environment variable is empty, allow all origins
|
|
|
|
CORS_ALLOWED_ORIGIN = ["*"]
|
2024-10-10 09:34:32 -07:00
|
|
|
|
2024-10-23 16:12:17 -07:00
|
|
|
|
2024-10-26 22:15:41 -07:00
|
|
|
# Multi-tenancy configuration
|
|
|
|
MULTI_TENANT = os.environ.get("MULTI_TENANT", "").lower() == "true"
|
|
|
|
|
2024-10-23 16:12:17 -07:00
|
|
|
POSTGRES_DEFAULT_SCHEMA = os.environ.get("POSTGRES_DEFAULT_SCHEMA") or "public"
|
|
|
|
|
2024-11-09 12:51:36 -08:00
|
|
|
|
|
|
|
async def async_return_default_schema(*args: Any, **kwargs: Any) -> str:
|
|
|
|
return POSTGRES_DEFAULT_SCHEMA
|
|
|
|
|
|
|
|
|
2024-10-26 22:15:41 -07:00
|
|
|
# Prefix used for all tenant ids
|
|
|
|
TENANT_ID_PREFIX = "tenant_"
|
2024-10-12 16:53:11 -07:00
|
|
|
|
2024-11-13 17:58:54 -08:00
|
|
|
DISALLOWED_SLACK_BOT_TENANT_IDS = os.environ.get("DISALLOWED_SLACK_BOT_TENANT_IDS")
|
2024-11-13 15:52:52 -08:00
|
|
|
DISALLOWED_SLACK_BOT_TENANT_LIST = (
|
2024-11-13 17:58:54 -08:00
|
|
|
[tenant.strip() for tenant in DISALLOWED_SLACK_BOT_TENANT_IDS.split(",")]
|
|
|
|
if DISALLOWED_SLACK_BOT_TENANT_IDS
|
2024-11-13 15:52:52 -08:00
|
|
|
else None
|
|
|
|
)
|
|
|
|
|
2024-11-13 17:58:54 -08:00
|
|
|
IGNORED_SYNCING_TENANT_IDS = os.environ.get("IGNORED_SYNCING_TENANT_IDS")
|
2024-11-13 15:52:52 -08:00
|
|
|
IGNORED_SYNCING_TENANT_LIST = (
|
|
|
|
[tenant.strip() for tenant in IGNORED_SYNCING_TENANT_IDS.split(",")]
|
|
|
|
if IGNORED_SYNCING_TENANT_IDS
|
|
|
|
else None
|
|
|
|
)
|
|
|
|
|
2024-10-12 16:53:11 -07:00
|
|
|
SUPPORTED_EMBEDDING_MODELS = [
|
|
|
|
# Cloud-based models
|
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="cohere/embed-english-v3.0",
|
|
|
|
dim=1024,
|
|
|
|
index_name="danswer_chunk_cohere_embed_english_v3_0",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="cohere/embed-english-v3.0",
|
|
|
|
dim=1024,
|
|
|
|
index_name="danswer_chunk_embed_english_v3_0",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="cohere/embed-english-light-v3.0",
|
|
|
|
dim=384,
|
|
|
|
index_name="danswer_chunk_cohere_embed_english_light_v3_0",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="cohere/embed-english-light-v3.0",
|
|
|
|
dim=384,
|
|
|
|
index_name="danswer_chunk_embed_english_light_v3_0",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="openai/text-embedding-3-large",
|
|
|
|
dim=3072,
|
|
|
|
index_name="danswer_chunk_openai_text_embedding_3_large",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="openai/text-embedding-3-large",
|
|
|
|
dim=3072,
|
|
|
|
index_name="danswer_chunk_text_embedding_3_large",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="openai/text-embedding-3-small",
|
|
|
|
dim=1536,
|
|
|
|
index_name="danswer_chunk_openai_text_embedding_3_small",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="openai/text-embedding-3-small",
|
|
|
|
dim=1536,
|
|
|
|
index_name="danswer_chunk_text_embedding_3_small",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="google/text-embedding-004",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_google_text_embedding_004",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="google/text-embedding-004",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_text_embedding_004",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="google/textembedding-gecko@003",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_google_textembedding_gecko_003",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="google/textembedding-gecko@003",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_textembedding_gecko_003",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="voyage/voyage-large-2-instruct",
|
|
|
|
dim=1024,
|
|
|
|
index_name="danswer_chunk_voyage_large_2_instruct",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="voyage/voyage-large-2-instruct",
|
|
|
|
dim=1024,
|
|
|
|
index_name="danswer_chunk_large_2_instruct",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="voyage/voyage-light-2-instruct",
|
|
|
|
dim=384,
|
|
|
|
index_name="danswer_chunk_voyage_light_2_instruct",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="voyage/voyage-light-2-instruct",
|
|
|
|
dim=384,
|
|
|
|
index_name="danswer_chunk_light_2_instruct",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
# Self-hosted models
|
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="nomic-ai/nomic-embed-text-v1",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_nomic_ai_nomic_embed_text_v1",
|
|
|
|
),
|
2024-12-02 14:43:53 -08:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="nomic-ai/nomic-embed-text-v1",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_nomic_embed_text_v1",
|
|
|
|
),
|
2024-10-12 16:53:11 -07:00
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="intfloat/e5-base-v2",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_intfloat_e5_base_v2",
|
|
|
|
),
|
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="intfloat/e5-small-v2",
|
|
|
|
dim=384,
|
|
|
|
index_name="danswer_chunk_intfloat_e5_small_v2",
|
|
|
|
),
|
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="intfloat/multilingual-e5-base",
|
|
|
|
dim=768,
|
|
|
|
index_name="danswer_chunk_intfloat_multilingual_e5_base",
|
|
|
|
),
|
|
|
|
SupportedEmbeddingModel(
|
|
|
|
name="intfloat/multilingual-e5-small",
|
|
|
|
dim=384,
|
|
|
|
index_name="danswer_chunk_intfloat_multilingual_e5_small",
|
|
|
|
),
|
|
|
|
]
|