Spaces:
Paused
Paused
| from typing import Any, Optional | |
| from urllib.parse import quote_plus | |
| from pydantic import Field, NonNegativeInt, PositiveFloat, PositiveInt, computed_field | |
| from pydantic_settings import BaseSettings | |
| from configs.middleware.cache.redis_config import RedisConfig | |
| from configs.middleware.storage.aliyun_oss_storage_config import AliyunOSSStorageConfig | |
| from configs.middleware.storage.amazon_s3_storage_config import S3StorageConfig | |
| from configs.middleware.storage.azure_blob_storage_config import AzureBlobStorageConfig | |
| from configs.middleware.storage.baidu_obs_storage_config import BaiduOBSStorageConfig | |
| from configs.middleware.storage.google_cloud_storage_config import GoogleCloudStorageConfig | |
| from configs.middleware.storage.huawei_obs_storage_config import HuaweiCloudOBSStorageConfig | |
| from configs.middleware.storage.oci_storage_config import OCIStorageConfig | |
| from configs.middleware.storage.supabase_storage_config import SupabaseStorageConfig | |
| from configs.middleware.storage.tencent_cos_storage_config import TencentCloudCOSStorageConfig | |
| from configs.middleware.storage.volcengine_tos_storage_config import VolcengineTOSStorageConfig | |
| from configs.middleware.vdb.analyticdb_config import AnalyticdbConfig | |
| from configs.middleware.vdb.baidu_vector_config import BaiduVectorDBConfig | |
| from configs.middleware.vdb.chroma_config import ChromaConfig | |
| from configs.middleware.vdb.couchbase_config import CouchbaseConfig | |
| from configs.middleware.vdb.elasticsearch_config import ElasticsearchConfig | |
| from configs.middleware.vdb.lindorm_config import LindormConfig | |
| from configs.middleware.vdb.milvus_config import MilvusConfig | |
| from configs.middleware.vdb.myscale_config import MyScaleConfig | |
| from configs.middleware.vdb.oceanbase_config import OceanBaseVectorConfig | |
| from configs.middleware.vdb.opensearch_config import OpenSearchConfig | |
| from configs.middleware.vdb.oracle_config import OracleConfig | |
| from configs.middleware.vdb.pgvector_config import PGVectorConfig | |
| from configs.middleware.vdb.pgvectors_config import PGVectoRSConfig | |
| from configs.middleware.vdb.qdrant_config import QdrantConfig | |
| from configs.middleware.vdb.relyt_config import RelytConfig | |
| from configs.middleware.vdb.tencent_vector_config import TencentVectorDBConfig | |
| from configs.middleware.vdb.tidb_on_qdrant_config import TidbOnQdrantConfig | |
| from configs.middleware.vdb.tidb_vector_config import TiDBVectorConfig | |
| from configs.middleware.vdb.upstash_config import UpstashConfig | |
| from configs.middleware.vdb.vikingdb_config import VikingDBConfig | |
| from configs.middleware.vdb.weaviate_config import WeaviateConfig | |
| class StorageConfig(BaseSettings): | |
| STORAGE_TYPE: str = Field( | |
| description="Type of storage to use." | |
| " Options: 'local', 's3', 'aliyun-oss', 'azure-blob', 'baidu-obs', 'google-storage', 'huawei-obs', " | |
| "'oci-storage', 'tencent-cos', 'volcengine-tos', 'supabase'. Default is 'local'.", | |
| default="local", | |
| ) | |
| STORAGE_LOCAL_PATH: str = Field( | |
| description="Path for local storage when STORAGE_TYPE is set to 'local'.", | |
| default="storage", | |
| ) | |
| class VectorStoreConfig(BaseSettings): | |
| VECTOR_STORE: Optional[str] = Field( | |
| description="Type of vector store to use for efficient similarity search." | |
| " Set to None if not using a vector store.", | |
| default=None, | |
| ) | |
| VECTOR_STORE_WHITELIST_ENABLE: Optional[bool] = Field( | |
| description="Enable whitelist for vector store.", | |
| default=False, | |
| ) | |
| class KeywordStoreConfig(BaseSettings): | |
| KEYWORD_STORE: str = Field( | |
| description="Method for keyword extraction and storage." | |
| " Default is 'jieba', a Chinese text segmentation library.", | |
| default="jieba", | |
| ) | |
| class DatabaseConfig: | |
| DB_HOST: str = Field( | |
| description="Hostname or IP address of the database server.", | |
| default="localhost", | |
| ) | |
| DB_PORT: PositiveInt = Field( | |
| description="Port number for database connection.", | |
| default=5432, | |
| ) | |
| DB_USERNAME: str = Field( | |
| description="Username for database authentication.", | |
| default="postgres", | |
| ) | |
| DB_PASSWORD: str = Field( | |
| description="Password for database authentication.", | |
| default="", | |
| ) | |
| DB_DATABASE: str = Field( | |
| description="Name of the database to connect to.", | |
| default="dify", | |
| ) | |
| DB_CHARSET: str = Field( | |
| description="Character set for database connection.", | |
| default="", | |
| ) | |
| DB_EXTRAS: str = Field( | |
| description="Additional database connection parameters. Example: 'keepalives_idle=60&keepalives=1'", | |
| default="", | |
| ) | |
| SQLALCHEMY_DATABASE_URI_SCHEME: str = Field( | |
| description="Database URI scheme for SQLAlchemy connection.", | |
| default="postgresql", | |
| ) | |
| def SQLALCHEMY_DATABASE_URI(self) -> str: | |
| db_extras = ( | |
| f"{self.DB_EXTRAS}&client_encoding={self.DB_CHARSET}" if self.DB_CHARSET else self.DB_EXTRAS | |
| ).strip("&") | |
| db_extras = f"?{db_extras}" if db_extras else "" | |
| return ( | |
| f"{self.SQLALCHEMY_DATABASE_URI_SCHEME}://" | |
| f"{quote_plus(self.DB_USERNAME)}:{quote_plus(self.DB_PASSWORD)}@{self.DB_HOST}:{self.DB_PORT}/{self.DB_DATABASE}" | |
| f"{db_extras}" | |
| ) | |
| SQLALCHEMY_POOL_SIZE: NonNegativeInt = Field( | |
| description="Maximum number of database connections in the pool.", | |
| default=30, | |
| ) | |
| SQLALCHEMY_MAX_OVERFLOW: NonNegativeInt = Field( | |
| description="Maximum number of connections that can be created beyond the pool_size.", | |
| default=10, | |
| ) | |
| SQLALCHEMY_POOL_RECYCLE: NonNegativeInt = Field( | |
| description="Number of seconds after which a connection is automatically recycled.", | |
| default=3600, | |
| ) | |
| SQLALCHEMY_POOL_PRE_PING: bool = Field( | |
| description="If True, enables connection pool pre-ping feature to check connections.", | |
| default=False, | |
| ) | |
| SQLALCHEMY_ECHO: bool | str = Field( | |
| description="If True, SQLAlchemy will log all SQL statements.", | |
| default=False, | |
| ) | |
| def SQLALCHEMY_ENGINE_OPTIONS(self) -> dict[str, Any]: | |
| return { | |
| "pool_size": self.SQLALCHEMY_POOL_SIZE, | |
| "max_overflow": self.SQLALCHEMY_MAX_OVERFLOW, | |
| "pool_recycle": self.SQLALCHEMY_POOL_RECYCLE, | |
| "pool_pre_ping": self.SQLALCHEMY_POOL_PRE_PING, | |
| "connect_args": {"options": "-c timezone=UTC"}, | |
| } | |
| class CeleryConfig(DatabaseConfig): | |
| CELERY_BACKEND: str = Field( | |
| description="Backend for Celery task results. Options: 'database', 'redis'.", | |
| default="database", | |
| ) | |
| CELERY_BROKER_URL: Optional[str] = Field( | |
| description="URL of the message broker for Celery tasks.", | |
| default=None, | |
| ) | |
| CELERY_USE_SENTINEL: Optional[bool] = Field( | |
| description="Whether to use Redis Sentinel for high availability.", | |
| default=False, | |
| ) | |
| CELERY_SENTINEL_MASTER_NAME: Optional[str] = Field( | |
| description="Name of the Redis Sentinel master.", | |
| default=None, | |
| ) | |
| CELERY_SENTINEL_SOCKET_TIMEOUT: Optional[PositiveFloat] = Field( | |
| description="Timeout for Redis Sentinel socket operations in seconds.", | |
| default=0.1, | |
| ) | |
| def CELERY_RESULT_BACKEND(self) -> str | None: | |
| return ( | |
| "db+{}".format(self.SQLALCHEMY_DATABASE_URI) | |
| if self.CELERY_BACKEND == "database" | |
| else self.CELERY_BROKER_URL | |
| ) | |
| def BROKER_USE_SSL(self) -> bool: | |
| return self.CELERY_BROKER_URL.startswith("rediss://") if self.CELERY_BROKER_URL else False | |
| class InternalTestConfig(BaseSettings): | |
| """ | |
| Configuration settings for Internal Test | |
| """ | |
| AWS_SECRET_ACCESS_KEY: Optional[str] = Field( | |
| description="Internal test AWS secret access key", | |
| default=None, | |
| ) | |
| AWS_ACCESS_KEY_ID: Optional[str] = Field( | |
| description="Internal test AWS access key ID", | |
| default=None, | |
| ) | |
| class MiddlewareConfig( | |
| # place the configs in alphabet order | |
| CeleryConfig, | |
| DatabaseConfig, | |
| KeywordStoreConfig, | |
| RedisConfig, | |
| # configs of storage and storage providers | |
| StorageConfig, | |
| AliyunOSSStorageConfig, | |
| AzureBlobStorageConfig, | |
| BaiduOBSStorageConfig, | |
| GoogleCloudStorageConfig, | |
| HuaweiCloudOBSStorageConfig, | |
| OCIStorageConfig, | |
| S3StorageConfig, | |
| SupabaseStorageConfig, | |
| TencentCloudCOSStorageConfig, | |
| VolcengineTOSStorageConfig, | |
| # configs of vdb and vdb providers | |
| VectorStoreConfig, | |
| AnalyticdbConfig, | |
| ChromaConfig, | |
| MilvusConfig, | |
| MyScaleConfig, | |
| OpenSearchConfig, | |
| OracleConfig, | |
| PGVectorConfig, | |
| PGVectoRSConfig, | |
| QdrantConfig, | |
| RelytConfig, | |
| TencentVectorDBConfig, | |
| TiDBVectorConfig, | |
| WeaviateConfig, | |
| ElasticsearchConfig, | |
| CouchbaseConfig, | |
| InternalTestConfig, | |
| VikingDBConfig, | |
| UpstashConfig, | |
| TidbOnQdrantConfig, | |
| LindormConfig, | |
| OceanBaseVectorConfig, | |
| BaiduVectorDBConfig, | |
| ): | |
| pass | |