| | 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", |
| | ) |
| |
|
| | @computed_field |
| | @property |
| | 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, |
| | ) |
| |
|
| | @computed_field |
| | @property |
| | 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, |
| | ) |
| |
|
| | @computed_field |
| | @property |
| | def CELERY_RESULT_BACKEND(self) -> str | None: |
| | return ( |
| | "db+{}".format(self.SQLALCHEMY_DATABASE_URI) |
| | if self.CELERY_BACKEND == "database" |
| | else self.CELERY_BROKER_URL |
| | ) |
| |
|
| | @computed_field |
| | @property |
| | 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( |
| | |
| | CeleryConfig, |
| | DatabaseConfig, |
| | KeywordStoreConfig, |
| | RedisConfig, |
| | |
| | StorageConfig, |
| | AliyunOSSStorageConfig, |
| | AzureBlobStorageConfig, |
| | BaiduOBSStorageConfig, |
| | GoogleCloudStorageConfig, |
| | HuaweiCloudOBSStorageConfig, |
| | OCIStorageConfig, |
| | S3StorageConfig, |
| | SupabaseStorageConfig, |
| | TencentCloudCOSStorageConfig, |
| | VolcengineTOSStorageConfig, |
| | |
| | VectorStoreConfig, |
| | AnalyticdbConfig, |
| | ChromaConfig, |
| | MilvusConfig, |
| | MyScaleConfig, |
| | OpenSearchConfig, |
| | OracleConfig, |
| | PGVectorConfig, |
| | PGVectoRSConfig, |
| | QdrantConfig, |
| | RelytConfig, |
| | TencentVectorDBConfig, |
| | TiDBVectorConfig, |
| | WeaviateConfig, |
| | ElasticsearchConfig, |
| | CouchbaseConfig, |
| | InternalTestConfig, |
| | VikingDBConfig, |
| | UpstashConfig, |
| | TidbOnQdrantConfig, |
| | LindormConfig, |
| | OceanBaseVectorConfig, |
| | BaiduVectorDBConfig, |
| | ): |
| | pass |
| |
|