| import os | import os | ||||
| from configs.app_configs import DifyConfigs | |||||
| from configs.app_config import DifyConfig | |||||
| if not os.environ.get("DEBUG") or os.environ.get("DEBUG", "false").lower() != 'true': | if not os.environ.get("DEBUG") or os.environ.get("DEBUG", "false").lower() != 'true': | ||||
| from gevent import monkey | from gevent import monkey | ||||
| """ | """ | ||||
| dify_app = DifyApp(__name__) | dify_app = DifyApp(__name__) | ||||
| dify_app.config.from_object(Config()) | dify_app.config.from_object(Config()) | ||||
| dify_app.config.from_mapping(DifyConfigs().model_dump()) | |||||
| dify_app.config.from_mapping(DifyConfig().model_dump()) | |||||
| return dify_app | return dify_app | ||||
| from pydantic_settings import BaseSettings, SettingsConfigDict | from pydantic_settings import BaseSettings, SettingsConfigDict | ||||
| from configs.deploy import DeploymentConfigs | |||||
| from configs.enterprise import EnterpriseFeatureConfigs | |||||
| from configs.extra import ExtraServiceConfigs | |||||
| from configs.feature import FeatureConfigs | |||||
| from configs.middleware import MiddlewareConfigs | |||||
| from configs.deploy import DeploymentConfig | |||||
| from configs.enterprise import EnterpriseFeatureConfig | |||||
| from configs.extra import ExtraServiceConfig | |||||
| from configs.feature import FeatureConfig | |||||
| from configs.middleware import MiddlewareConfig | |||||
| from configs.packaging import PackagingInfo | from configs.packaging import PackagingInfo | ||||
| class DifyConfigs( | |||||
| class DifyConfig( | |||||
| # based on pydantic-settings | # based on pydantic-settings | ||||
| BaseSettings, | BaseSettings, | ||||
| PackagingInfo, | PackagingInfo, | ||||
| # Deployment configs | # Deployment configs | ||||
| DeploymentConfigs, | |||||
| DeploymentConfig, | |||||
| # Feature configs | # Feature configs | ||||
| FeatureConfigs, | |||||
| FeatureConfig, | |||||
| # Middleware configs | # Middleware configs | ||||
| MiddlewareConfigs, | |||||
| MiddlewareConfig, | |||||
| # Extra service configs | # Extra service configs | ||||
| ExtraServiceConfigs, | |||||
| ExtraServiceConfig, | |||||
| # 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.** | ||||
| EnterpriseFeatureConfigs, | |||||
| EnterpriseFeatureConfig, | |||||
| ): | ): | ||||
| model_config = SettingsConfigDict( | model_config = SettingsConfigDict( |
| from pydantic import BaseModel, Field | from pydantic import BaseModel, Field | ||||
| class DeploymentConfigs(BaseModel): | |||||
| class DeploymentConfig(BaseModel): | |||||
| """ | """ | ||||
| Deployment configs | Deployment configs | ||||
| """ | """ |
| from pydantic import BaseModel, Field | from pydantic import BaseModel, Field | ||||
| class EnterpriseFeatureConfigs(BaseModel): | |||||
| class EnterpriseFeatureConfig(BaseModel): | |||||
| """ | """ | ||||
| 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 pydantic import BaseModel | ||||
| from configs.extra.notion_configs import NotionConfigs | |||||
| from configs.extra.sentry_configs import SentryConfigs | |||||
| from configs.extra.notion_config import NotionConfig | |||||
| from configs.extra.sentry_config import SentryConfig | |||||
| class ExtraServiceConfigs( | |||||
| class ExtraServiceConfig( | |||||
| # place the configs in alphabet order | # place the configs in alphabet order | ||||
| NotionConfigs, | |||||
| SentryConfigs, | |||||
| NotionConfig, | |||||
| SentryConfig, | |||||
| ): | ): | ||||
| pass | pass |
| from pydantic import BaseModel, Field | from pydantic import BaseModel, Field | ||||
| class NotionConfigs(BaseModel): | |||||
| class NotionConfig(BaseModel): | |||||
| """ | """ | ||||
| Notion integration configs | Notion integration configs | ||||
| """ | """ |
| from pydantic import BaseModel, Field, NonNegativeFloat | from pydantic import BaseModel, Field, NonNegativeFloat | ||||
| class SentryConfigs(BaseModel): | |||||
| class SentryConfig(BaseModel): | |||||
| """ | """ | ||||
| Sentry configs | Sentry configs | ||||
| """ | """ |
| from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt | from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt | ||||
| class SecurityConfigs(BaseModel): | |||||
| class SecurityConfig(BaseModel): | |||||
| """ | """ | ||||
| Secret Key configs | Secret Key configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class AppExecutionConfigs(BaseModel): | |||||
| class AppExecutionConfig(BaseModel): | |||||
| """ | """ | ||||
| App Execution configs | App Execution configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class CodeExecutionSandboxConfigs(BaseModel): | |||||
| class CodeExecutionSandboxConfig(BaseModel): | |||||
| """ | """ | ||||
| Code Execution Sandbox configs | Code Execution Sandbox configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class EndpointConfigs(BaseModel): | |||||
| class EndpointConfig(BaseModel): | |||||
| """ | """ | ||||
| Module URL configs | Module URL configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class FileAccessConfigs(BaseModel): | |||||
| class FileAccessConfig(BaseModel): | |||||
| """ | """ | ||||
| File Access configs | File Access configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class FileUploadConfigs(BaseModel): | |||||
| class FileUploadConfig(BaseModel): | |||||
| """ | """ | ||||
| File Uploading configs | File Uploading configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class HttpConfigs(BaseModel): | |||||
| class HttpConfig(BaseModel): | |||||
| """ | """ | ||||
| HTTP configs | HTTP configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class InnerAPIConfigs(BaseModel): | |||||
| class InnerAPIConfig(BaseModel): | |||||
| """ | """ | ||||
| Inner API configs | Inner API configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class LoggingConfigs(BaseModel): | |||||
| class LoggingConfig(BaseModel): | |||||
| """ | """ | ||||
| Logging configs | Logging configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ModelLoadBalanceConfigs(BaseModel): | |||||
| class ModelLoadBalanceConfig(BaseModel): | |||||
| """ | """ | ||||
| Model load balance configs | Model load balance configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class BillingConfigs(BaseModel): | |||||
| class BillingConfig(BaseModel): | |||||
| """ | """ | ||||
| Platform Billing Configurations | Platform Billing Configurations | ||||
| """ | """ | ||||
| ) | ) | ||||
| class UpdateConfigs(BaseModel): | |||||
| class UpdateConfig(BaseModel): | |||||
| """ | """ | ||||
| Update configs | Update configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class WorkflowConfigs(BaseModel): | |||||
| class WorkflowConfig(BaseModel): | |||||
| """ | """ | ||||
| Workflow feature configs | Workflow feature configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class OAuthConfigs(BaseModel): | |||||
| class OAuthConfig(BaseModel): | |||||
| """ | """ | ||||
| oauth configs | oauth configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ModerationConfigs(BaseModel): | |||||
| class ModerationConfig(BaseModel): | |||||
| """ | """ | ||||
| Moderation in app configs. | Moderation in app configs. | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ToolConfigs(BaseModel): | |||||
| class ToolConfig(BaseModel): | |||||
| """ | """ | ||||
| Tool configs | Tool configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class MailConfigs(BaseModel): | |||||
| class MailConfig(BaseModel): | |||||
| """ | """ | ||||
| Mail Configurations | Mail Configurations | ||||
| """ | """ | ||||
| ) | ) | ||||
| class RagEtlConfigs(BaseModel): | |||||
| class RagEtlConfig(BaseModel): | |||||
| """ | """ | ||||
| RAG ETL Configurations. | RAG ETL Configurations. | ||||
| """ | """ | ||||
| ) | ) | ||||
| class DataSetConfigs(BaseModel): | |||||
| class DataSetConfig(BaseModel): | |||||
| """ | """ | ||||
| Dataset configs | Dataset configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class WorkspaceConfigs(BaseModel): | |||||
| class WorkspaceConfig(BaseModel): | |||||
| """ | """ | ||||
| Workspace configs | Workspace configs | ||||
| """ | """ | ||||
| ) | ) | ||||
| class IndexingConfigs(BaseModel): | |||||
| class IndexingConfig(BaseModel): | |||||
| """ | """ | ||||
| Indexing configs. | Indexing configs. | ||||
| """ | """ | ||||
| ) | ) | ||||
| class ImageFormatConfigs(BaseModel): | |||||
| class ImageFormatConfig(BaseModel): | |||||
| 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', | ||||
| ) | ) | ||||
| class FeatureConfigs( | |||||
| class FeatureConfig( | |||||
| # place the configs in alphabet order | # place the configs in alphabet order | ||||
| AppExecutionConfigs, | |||||
| BillingConfigs, | |||||
| CodeExecutionSandboxConfigs, | |||||
| DataSetConfigs, | |||||
| EndpointConfigs, | |||||
| FileAccessConfigs, | |||||
| FileUploadConfigs, | |||||
| HttpConfigs, | |||||
| ImageFormatConfigs, | |||||
| InnerAPIConfigs, | |||||
| IndexingConfigs, | |||||
| LoggingConfigs, | |||||
| MailConfigs, | |||||
| ModelLoadBalanceConfigs, | |||||
| ModerationConfigs, | |||||
| OAuthConfigs, | |||||
| RagEtlConfigs, | |||||
| SecurityConfigs, | |||||
| ToolConfigs, | |||||
| UpdateConfigs, | |||||
| WorkflowConfigs, | |||||
| WorkspaceConfigs, | |||||
| AppExecutionConfig, | |||||
| BillingConfig, | |||||
| CodeExecutionSandboxConfig, | |||||
| DataSetConfig, | |||||
| EndpointConfig, | |||||
| FileAccessConfig, | |||||
| FileUploadConfig, | |||||
| HttpConfig, | |||||
| ImageFormatConfig, | |||||
| InnerAPIConfig, | |||||
| IndexingConfig, | |||||
| LoggingConfig, | |||||
| MailConfig, | |||||
| ModelLoadBalanceConfig, | |||||
| ModerationConfig, | |||||
| OAuthConfig, | |||||
| RagEtlConfig, | |||||
| SecurityConfig, | |||||
| ToolConfig, | |||||
| UpdateConfig, | |||||
| WorkflowConfig, | |||||
| WorkspaceConfig, | |||||
| ): | ): | ||||
| pass | pass |
| from pydantic import BaseModel, Field | from pydantic import BaseModel, Field | ||||
| from configs.middleware.redis_configs import RedisConfigs | |||||
| from configs.middleware.redis_config import RedisConfig | |||||
| from configs.middleware.vdb.chroma_configs import ChromaConfigs | from configs.middleware.vdb.chroma_configs import ChromaConfigs | ||||
| from configs.middleware.vdb.milvus_configs import MilvusConfigs | from configs.middleware.vdb.milvus_configs import MilvusConfigs | ||||
| from configs.middleware.vdb.opensearch_configs import OpenSearchConfigs | from configs.middleware.vdb.opensearch_configs import OpenSearchConfigs | ||||
| ) | ) | ||||
| class MiddlewareConfigs( | |||||
| class MiddlewareConfig( | |||||
| # place the configs in alphabet order | # place the configs in alphabet order | ||||
| KeywordStoreConfigs, | KeywordStoreConfigs, | ||||
| RedisConfigs, | |||||
| RedisConfig, | |||||
| StorageConfigs, | StorageConfigs, | ||||
| # configs of vdb and vdb providers | # configs of vdb and vdb providers |
| from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt | from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt | ||||
| class RedisConfigs(BaseModel): | |||||
| class RedisConfig(BaseModel): | |||||
| """ | """ | ||||
| Redis configs | Redis configs | ||||
| """ | """ |
| import pytest | import pytest | ||||
| from flask import Flask | from flask import Flask | ||||
| from configs.app_configs import DifyConfigs | |||||
| from configs.app_config import DifyConfig | |||||
| EXAMPLE_ENV_FILENAME = '.env' | EXAMPLE_ENV_FILENAME = '.env' | ||||
| return str(file_path) | return str(file_path) | ||||
| def test_dify_configs_undefined_entry(example_env_file): | |||||
| def test_dify_config_undefined_entry(example_env_file): | |||||
| # load dotenv file with pydantic-settings | # load dotenv file with pydantic-settings | ||||
| settings = DifyConfigs(_env_file=example_env_file) | |||||
| config = DifyConfig(_env_file=example_env_file) | |||||
| # entries not defined in app settings | # entries not defined in app settings | ||||
| with pytest.raises(TypeError): | with pytest.raises(TypeError): | ||||
| # TypeError: 'AppSettings' object is not subscriptable | # TypeError: 'AppSettings' object is not subscriptable | ||||
| assert settings['LOG_LEVEL'] == 'INFO' | |||||
| assert config['LOG_LEVEL'] == 'INFO' | |||||
| def test_dify_configs(example_env_file): | |||||
| def test_dify_config(example_env_file): | |||||
| # load dotenv file with pydantic-settings | # load dotenv file with pydantic-settings | ||||
| settings = DifyConfigs(_env_file=example_env_file) | |||||
| config = DifyConfig(_env_file=example_env_file) | |||||
| # constant values | # constant values | ||||
| assert settings.COMMIT_SHA == '' | |||||
| assert config.COMMIT_SHA == '' | |||||
| # default values | # default values | ||||
| assert settings.EDITION == 'SELF_HOSTED' | |||||
| assert settings.API_COMPRESSION_ENABLED is False | |||||
| assert settings.SENTRY_TRACES_SAMPLE_RATE == 1.0 | |||||
| assert config.EDITION == 'SELF_HOSTED' | |||||
| assert config.API_COMPRESSION_ENABLED is False | |||||
| assert config.SENTRY_TRACES_SAMPLE_RATE == 1.0 | |||||
| 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(DifyConfigs(_env_file=example_env_file).model_dump()) | |||||
| flask_app.config.from_mapping(DifyConfig(_env_file=example_env_file).model_dump()) | |||||
| config = flask_app.config | config = flask_app.config | ||||
| # configs read from dotenv directly | # configs read from dotenv directly |