| from .app_config import DifyConfig | from .app_config import DifyConfig | ||||
| dify_config = DifyConfig() | dify_config = DifyConfig() |
| from pydantic import computed_field | |||||
| from pydantic_settings import BaseSettings, SettingsConfigDict | |||||
| from pydantic import Field, computed_field | |||||
| from pydantic_settings import SettingsConfigDict | |||||
| from configs.deploy import DeploymentConfig | from configs.deploy import DeploymentConfig | ||||
| from configs.enterprise import EnterpriseFeatureConfig | from configs.enterprise import EnterpriseFeatureConfig | ||||
| from configs.packaging import PackagingInfo | from configs.packaging import PackagingInfo | ||||
| # TODO: Both `BaseModel` and `BaseSettings` has `model_config` attribute but they are in different types. | |||||
| # This inheritance is depends on the order of the classes. | |||||
| # It is better to use `BaseSettings` as the base class. | |||||
| class DifyConfig( | class DifyConfig( | ||||
| # based on pydantic-settings | |||||
| BaseSettings, | |||||
| # Packaging info | # Packaging info | ||||
| PackagingInfo, | PackagingInfo, | ||||
| # **Before using, please contact business@dify.ai by email to inquire about licensing matters.** | # **Before using, please contact business@dify.ai by email to inquire about licensing matters.** | ||||
| EnterpriseFeatureConfig, | EnterpriseFeatureConfig, | ||||
| ): | ): | ||||
| DEBUG: bool = Field(default=False, description='whether to enable debug mode.') | |||||
| model_config = SettingsConfigDict( | model_config = SettingsConfigDict( | ||||
| # read from dotenv format config file | # read from dotenv format config file | ||||
| env_file='.env', | env_file='.env', | ||||
| env_file_encoding='utf-8', | env_file_encoding='utf-8', | ||||
| frozen=True, | |||||
| # ignore extra attributes | # ignore extra attributes | ||||
| extra='ignore', | extra='ignore', |
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class DeploymentConfig(BaseModel): | |||||
| class DeploymentConfig(BaseSettings): | |||||
| """ | """ | ||||
| Deployment configs | Deployment configs | ||||
| """ | """ |
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class EnterpriseFeatureConfig(BaseModel): | |||||
| class EnterpriseFeatureConfig(BaseSettings): | |||||
| """ | """ | ||||
| Enterprise feature configs. | Enterprise feature configs. | ||||
| **Before using, please contact business@dify.ai by email to inquire about licensing matters.** | **Before using, please contact business@dify.ai by email to inquire about licensing matters.** |
| from pydantic import BaseModel | |||||
| from configs.extra.notion_config import NotionConfig | from configs.extra.notion_config import NotionConfig | ||||
| from configs.extra.sentry_config import SentryConfig | from configs.extra.sentry_config import SentryConfig | ||||
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class NotionConfig(BaseModel): | |||||
| class NotionConfig(BaseSettings): | |||||
| """ | """ | ||||
| Notion integration configs | Notion integration configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, NonNegativeFloat | |||||
| from pydantic import Field, NonNegativeFloat | |||||
| from pydantic_settings import BaseSettings | |||||
| class SentryConfig(BaseModel): | |||||
| class SentryConfig(BaseSettings): | |||||
| """ | """ | ||||
| Sentry configs | Sentry configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt, computed_field | |||||
| from pydantic import AliasChoices, Field, NonNegativeInt, PositiveInt, computed_field | |||||
| from pydantic_settings import BaseSettings | |||||
| from configs.feature.hosted_service import HostedServiceConfig | from configs.feature.hosted_service import HostedServiceConfig | ||||
| class SecurityConfig(BaseModel): | |||||
| class SecurityConfig(BaseSettings): | |||||
| """ | """ | ||||
| Secret Key configs | Secret Key configs | ||||
| """ | """ | ||||
| default=24, | default=24, | ||||
| ) | ) | ||||
| class AppExecutionConfig(BaseModel): | |||||
| class AppExecutionConfig(BaseSettings): | |||||
| """ | """ | ||||
| App Execution configs | App Execution configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class CodeExecutionSandboxConfig(BaseModel): | |||||
| class CodeExecutionSandboxConfig(BaseSettings): | |||||
| """ | """ | ||||
| Code Execution Sandbox configs | Code Execution Sandbox configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class EndpointConfig(BaseModel): | |||||
| class EndpointConfig(BaseSettings): | |||||
| """ | """ | ||||
| Module URL configs | Module URL configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class FileAccessConfig(BaseModel): | |||||
| class FileAccessConfig(BaseSettings): | |||||
| """ | """ | ||||
| File Access configs | File Access configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class FileUploadConfig(BaseModel): | |||||
| class FileUploadConfig(BaseSettings): | |||||
| """ | """ | ||||
| File Uploading configs | File Uploading configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HttpConfig(BaseModel): | |||||
| class HttpConfig(BaseSettings): | |||||
| """ | """ | ||||
| HTTP configs | HTTP configs | ||||
| """ | """ | ||||
| return self.inner_WEB_API_CORS_ALLOW_ORIGINS.split(',') | return self.inner_WEB_API_CORS_ALLOW_ORIGINS.split(',') | ||||
| class InnerAPIConfig(BaseModel): | |||||
| class InnerAPIConfig(BaseSettings): | |||||
| """ | """ | ||||
| Inner API configs | Inner API configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class LoggingConfig(BaseModel): | |||||
| class LoggingConfig(BaseSettings): | |||||
| """ | """ | ||||
| Logging configs | Logging configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ModelLoadBalanceConfig(BaseModel): | |||||
| class ModelLoadBalanceConfig(BaseSettings): | |||||
| """ | """ | ||||
| Model load balance configs | Model load balance configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class BillingConfig(BaseModel): | |||||
| class BillingConfig(BaseSettings): | |||||
| """ | """ | ||||
| Platform Billing Configurations | Platform Billing Configurations | ||||
| """ | """ | ||||
| ) | ) | ||||
| class UpdateConfig(BaseModel): | |||||
| class UpdateConfig(BaseSettings): | |||||
| """ | """ | ||||
| Update configs | Update configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class WorkflowConfig(BaseModel): | |||||
| class WorkflowConfig(BaseSettings): | |||||
| """ | """ | ||||
| Workflow feature configs | Workflow feature configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class OAuthConfig(BaseModel): | |||||
| class OAuthConfig(BaseSettings): | |||||
| """ | """ | ||||
| oauth configs | oauth configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ModerationConfig(BaseModel): | |||||
| class ModerationConfig(BaseSettings): | |||||
| """ | """ | ||||
| Moderation in app configs. | Moderation in app configs. | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ToolConfig(BaseModel): | |||||
| class ToolConfig(BaseSettings): | |||||
| """ | """ | ||||
| Tool configs | Tool configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class MailConfig(BaseModel): | |||||
| class MailConfig(BaseSettings): | |||||
| """ | """ | ||||
| Mail Configurations | Mail Configurations | ||||
| """ | """ | ||||
| ) | ) | ||||
| class RagEtlConfig(BaseModel): | |||||
| class RagEtlConfig(BaseSettings): | |||||
| """ | """ | ||||
| RAG ETL Configurations. | RAG ETL Configurations. | ||||
| """ | """ | ||||
| ) | ) | ||||
| class DataSetConfig(BaseModel): | |||||
| class DataSetConfig(BaseSettings): | |||||
| """ | """ | ||||
| Dataset configs | Dataset configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class WorkspaceConfig(BaseModel): | |||||
| class WorkspaceConfig(BaseSettings): | |||||
| """ | """ | ||||
| Workspace configs | Workspace configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class IndexingConfig(BaseModel): | |||||
| class IndexingConfig(BaseSettings): | |||||
| """ | """ | ||||
| Indexing configs. | Indexing configs. | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ImageFormatConfig(BaseModel): | |||||
| class ImageFormatConfig(BaseSettings): | |||||
| MULTIMODAL_SEND_IMAGE_FORMAT: str = Field( | MULTIMODAL_SEND_IMAGE_FORMAT: str = Field( | ||||
| description='multi model send image format, support base64, url, default is base64', | description='multi model send image format, support base64, url, default is base64', | ||||
| default='base64', | default='base64', |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, NonNegativeInt | |||||
| from pydantic import Field, NonNegativeInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class HostedOpenAiConfig(BaseModel): | |||||
| class HostedOpenAiConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted OpenAI service config | Hosted OpenAI service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedAzureOpenAiConfig(BaseModel): | |||||
| class HostedAzureOpenAiConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted OpenAI service config | Hosted OpenAI service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedAnthropicConfig(BaseModel): | |||||
| class HostedAnthropicConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted Azure OpenAI service config | Hosted Azure OpenAI service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedMinmaxConfig(BaseModel): | |||||
| class HostedMinmaxConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted Minmax service config | Hosted Minmax service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedSparkConfig(BaseModel): | |||||
| class HostedSparkConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted Spark service config | Hosted Spark service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedZhipuAIConfig(BaseModel): | |||||
| class HostedZhipuAIConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted Minmax service config | Hosted Minmax service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedModerationConfig(BaseModel): | |||||
| class HostedModerationConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted Moderation service config | Hosted Moderation service config | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HostedFetchAppTemplateConfig(BaseModel): | |||||
| class HostedFetchAppTemplateConfig(BaseSettings): | |||||
| """ | """ | ||||
| Hosted Moderation service config | Hosted Moderation service config | ||||
| """ | """ |
| from typing import Any, Optional | from typing import Any, Optional | ||||
| from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt, computed_field | |||||
| from pydantic import Field, NonNegativeInt, PositiveInt, computed_field | |||||
| from pydantic_settings import BaseSettings | |||||
| from configs.middleware.cache.redis_config import RedisConfig | from configs.middleware.cache.redis_config import RedisConfig | ||||
| from configs.middleware.storage.aliyun_oss_storage_config import AliyunOSSStorageConfig | from configs.middleware.storage.aliyun_oss_storage_config import AliyunOSSStorageConfig | ||||
| from configs.middleware.vdb.weaviate_config import WeaviateConfig | from configs.middleware.vdb.weaviate_config import WeaviateConfig | ||||
| class StorageConfig(BaseModel): | |||||
| class StorageConfig(BaseSettings): | |||||
| STORAGE_TYPE: str = Field( | STORAGE_TYPE: str = Field( | ||||
| description='storage type,' | description='storage type,' | ||||
| ' default to `local`,' | ' default to `local`,' | ||||
| ) | ) | ||||
| class VectorStoreConfig(BaseModel): | |||||
| class VectorStoreConfig(BaseSettings): | |||||
| VECTOR_STORE: Optional[str] = Field( | VECTOR_STORE: Optional[str] = Field( | ||||
| description='vector store type', | description='vector store type', | ||||
| default=None, | default=None, | ||||
| ) | ) | ||||
| class KeywordStoreConfig(BaseModel): | |||||
| class KeywordStoreConfig(BaseSettings): | |||||
| KEYWORD_STORE: str = Field( | KEYWORD_STORE: str = Field( | ||||
| description='keyword store type', | description='keyword store type', | ||||
| default='jieba', | default='jieba', |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt | |||||
| from pydantic import Field, NonNegativeInt, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class RedisConfig(BaseModel): | |||||
| class RedisConfig(BaseSettings): | |||||
| """ | """ | ||||
| Redis configs | Redis configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class AliyunOSSStorageConfig(BaseModel): | |||||
| class AliyunOSSStorageConfig(BaseSettings): | |||||
| """ | """ | ||||
| Aliyun storage configs | Aliyun storage configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class S3StorageConfig(BaseModel): | |||||
| class S3StorageConfig(BaseSettings): | |||||
| """ | """ | ||||
| S3 storage configs | S3 storage configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class AzureBlobStorageConfig(BaseModel): | |||||
| class AzureBlobStorageConfig(BaseSettings): | |||||
| """ | """ | ||||
| Azure Blob storage configs | Azure Blob storage configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class GoogleCloudStorageConfig(BaseModel): | |||||
| class GoogleCloudStorageConfig(BaseSettings): | |||||
| """ | """ | ||||
| Google Cloud storage configs | Google Cloud storage configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class OCIStorageConfig(BaseModel): | |||||
| class OCIStorageConfig(BaseSettings): | |||||
| """ | """ | ||||
| OCI storage configs | OCI storage configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class TencentCloudCOSStorageConfig(BaseModel): | |||||
| class TencentCloudCOSStorageConfig(BaseSettings): | |||||
| """ | """ | ||||
| Tencent Cloud COS storage configs | Tencent Cloud COS storage configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class ChromaConfig(BaseModel): | |||||
| class ChromaConfig(BaseSettings): | |||||
| """ | """ | ||||
| Chroma configs | Chroma configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class MilvusConfig(BaseModel): | |||||
| class MilvusConfig(BaseSettings): | |||||
| """ | """ | ||||
| Milvus configs | Milvus configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class OpenSearchConfig(BaseModel): | |||||
| class OpenSearchConfig(BaseSettings): | |||||
| """ | """ | ||||
| OpenSearch configs | OpenSearch configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class OracleConfig(BaseModel): | |||||
| class OracleConfig(BaseSettings): | |||||
| """ | """ | ||||
| ORACLE configs | ORACLE configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class PGVectorConfig(BaseModel): | |||||
| class PGVectorConfig(BaseSettings): | |||||
| """ | """ | ||||
| PGVector configs | PGVector configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class PGVectoRSConfig(BaseModel): | |||||
| class PGVectoRSConfig(BaseSettings): | |||||
| """ | """ | ||||
| PGVectoRS configs | PGVectoRS configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt | |||||
| from pydantic import Field, NonNegativeInt, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class QdrantConfig(BaseModel): | |||||
| class QdrantConfig(BaseSettings): | |||||
| """ | """ | ||||
| Qdrant configs | Qdrant configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class RelytConfig(BaseModel): | |||||
| class RelytConfig(BaseSettings): | |||||
| """ | """ | ||||
| Relyt configs | Relyt configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt | |||||
| from pydantic import Field, NonNegativeInt, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class TencentVectorDBConfig(BaseModel): | |||||
| class TencentVectorDBConfig(BaseSettings): | |||||
| """ | """ | ||||
| Tencent Vector configs | Tencent Vector configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class TiDBVectorConfig(BaseModel): | |||||
| class TiDBVectorConfig(BaseSettings): | |||||
| """ | """ | ||||
| TiDB Vector configs | TiDB Vector configs | ||||
| """ | """ |
| from typing import Optional | from typing import Optional | ||||
| from pydantic import BaseModel, Field, PositiveInt | |||||
| from pydantic import Field, PositiveInt | |||||
| from pydantic_settings import BaseSettings | |||||
| class WeaviateConfig(BaseModel): | |||||
| class WeaviateConfig(BaseSettings): | |||||
| """ | """ | ||||
| Weaviate configs | Weaviate configs | ||||
| """ | """ |
| from pydantic import BaseModel, Field | |||||
| from pydantic import Field | |||||
| from pydantic_settings import BaseSettings | |||||
| class PackagingInfo(BaseModel): | |||||
| class PackagingInfo(BaseSettings): | |||||
| """ | """ | ||||
| Packaging build information | Packaging build information | ||||
| """ | """ |
| def test_dify_config_undefined_entry(example_env_file): | def test_dify_config_undefined_entry(example_env_file): | ||||
| # NOTE: See https://github.com/microsoft/pylance-release/issues/6099 for more details about this type error. | |||||
| # load dotenv file with pydantic-settings | # load dotenv file with pydantic-settings | ||||
| config = DifyConfig(_env_file=example_env_file) | config = DifyConfig(_env_file=example_env_file) | ||||
| assert config.SENTRY_TRACES_SAMPLE_RATE == 1.0 | assert config.SENTRY_TRACES_SAMPLE_RATE == 1.0 | ||||
| # NOTE: If there is a `.env` file in your Workspace, this test might not succeed as expected. | |||||
| # This is due to `pymilvus` loading all the variables from the `.env` file into `os.environ`. | |||||
| def test_flask_configs(example_env_file): | def test_flask_configs(example_env_file): | ||||
| flask_app = Flask('app') | flask_app = Flask('app') | ||||
| flask_app.config.from_mapping(DifyConfig(_env_file=example_env_file).model_dump()) | flask_app.config.from_mapping(DifyConfig(_env_file=example_env_file).model_dump()) |