| from typing import Annotated, Literal, Optional |
|
|
| from pydantic import ( |
| AliasChoices, |
| Field, |
| HttpUrl, |
| NegativeInt, |
| NonNegativeInt, |
| PositiveFloat, |
| PositiveInt, |
| computed_field, |
| ) |
| from pydantic_settings import BaseSettings |
|
|
| from configs.feature.hosted_service import HostedServiceConfig |
|
|
|
|
| class SecurityConfig(BaseSettings): |
| """ |
| Security-related configurations for the application |
| """ |
|
|
| SECRET_KEY: str = Field( |
| description="Secret key for secure session cookie signing." |
| "Make sure you are changing this key for your deployment with a strong key." |
| "Generate a strong key using `openssl rand -base64 42` or set via the `SECRET_KEY` environment variable.", |
| default="", |
| ) |
|
|
| RESET_PASSWORD_TOKEN_EXPIRY_MINUTES: PositiveInt = Field( |
| description="Duration in minutes for which a password reset token remains valid", |
| default=5, |
| ) |
|
|
| LOGIN_DISABLED: bool = Field( |
| description="Whether to disable login checks", |
| default=False, |
| ) |
|
|
| ADMIN_API_KEY_ENABLE: bool = Field( |
| description="Whether to enable admin api key for authentication", |
| default=False, |
| ) |
|
|
| ADMIN_API_KEY: Optional[str] = Field( |
| description="admin api key for authentication", |
| default=None, |
| ) |
|
|
|
|
| class AppExecutionConfig(BaseSettings): |
| """ |
| Configuration parameters for application execution |
| """ |
|
|
| APP_MAX_EXECUTION_TIME: PositiveInt = Field( |
| description="Maximum allowed execution time for the application in seconds", |
| default=1200, |
| ) |
| APP_MAX_ACTIVE_REQUESTS: NonNegativeInt = Field( |
| description="Maximum number of concurrent active requests per app (0 for unlimited)", |
| default=0, |
| ) |
|
|
|
|
| class CodeExecutionSandboxConfig(BaseSettings): |
| """ |
| Configuration for the code execution sandbox environment |
| """ |
|
|
| CODE_EXECUTION_ENDPOINT: HttpUrl = Field( |
| description="URL endpoint for the code execution service", |
| default="http://sandbox:8194", |
| ) |
|
|
| CODE_EXECUTION_API_KEY: str = Field( |
| description="API key for accessing the code execution service", |
| default="dify-sandbox", |
| ) |
|
|
| CODE_EXECUTION_CONNECT_TIMEOUT: Optional[float] = Field( |
| description="Connection timeout in seconds for code execution requests", |
| default=10.0, |
| ) |
|
|
| CODE_EXECUTION_READ_TIMEOUT: Optional[float] = Field( |
| description="Read timeout in seconds for code execution requests", |
| default=60.0, |
| ) |
|
|
| CODE_EXECUTION_WRITE_TIMEOUT: Optional[float] = Field( |
| description="Write timeout in seconds for code execution request", |
| default=10.0, |
| ) |
|
|
| CODE_MAX_NUMBER: PositiveInt = Field( |
| description="Maximum allowed numeric value in code execution", |
| default=9223372036854775807, |
| ) |
|
|
| CODE_MIN_NUMBER: NegativeInt = Field( |
| description="Minimum allowed numeric value in code execution", |
| default=-9223372036854775807, |
| ) |
|
|
| CODE_MAX_DEPTH: PositiveInt = Field( |
| description="Maximum allowed depth for nested structures in code execution", |
| default=5, |
| ) |
|
|
| CODE_MAX_PRECISION: PositiveInt = Field( |
| description="mMaximum number of decimal places for floating-point numbers in code execution", |
| default=20, |
| ) |
|
|
| CODE_MAX_STRING_LENGTH: PositiveInt = Field( |
| description="Maximum allowed length for strings in code execution", |
| default=80000, |
| ) |
|
|
| CODE_MAX_STRING_ARRAY_LENGTH: PositiveInt = Field( |
| description="Maximum allowed length for string arrays in code execution", |
| default=30, |
| ) |
|
|
| CODE_MAX_OBJECT_ARRAY_LENGTH: PositiveInt = Field( |
| description="Maximum allowed length for object arrays in code execution", |
| default=30, |
| ) |
|
|
| CODE_MAX_NUMBER_ARRAY_LENGTH: PositiveInt = Field( |
| description="Maximum allowed length for numeric arrays in code execution", |
| default=1000, |
| ) |
|
|
|
|
| class EndpointConfig(BaseSettings): |
| """ |
| Configuration for various application endpoints and URLs |
| """ |
|
|
| CONSOLE_API_URL: str = Field( |
| description="Base URL for the console API," |
| "used for login authentication callback or notion integration callbacks", |
| default="", |
| ) |
|
|
| CONSOLE_WEB_URL: str = Field( |
| description="Base URL for the console web interface," "used for frontend references and CORS configuration", |
| default="", |
| ) |
|
|
| SERVICE_API_URL: str = Field( |
| description="Base URL for the service API, displayed to users for API access", |
| default="", |
| ) |
|
|
| APP_WEB_URL: str = Field( |
| description="Base URL for the web application, used for frontend references", |
| default="", |
| ) |
|
|
|
|
| class FileAccessConfig(BaseSettings): |
| """ |
| Configuration for file access and handling |
| """ |
|
|
| FILES_URL: str = Field( |
| description="Base URL for file preview or download," |
| " used for frontend display and multi-model inputs" |
| "Url is signed and has expiration time.", |
| validation_alias=AliasChoices("FILES_URL", "CONSOLE_API_URL"), |
| alias_priority=1, |
| default="", |
| ) |
|
|
| FILES_ACCESS_TIMEOUT: int = Field( |
| description="Expiration time in seconds for file access URLs", |
| default=300, |
| ) |
|
|
|
|
| class FileUploadConfig(BaseSettings): |
| """ |
| Configuration for file upload limitations |
| """ |
|
|
| UPLOAD_FILE_SIZE_LIMIT: NonNegativeInt = Field( |
| description="Maximum allowed file size for uploads in megabytes", |
| default=15, |
| ) |
|
|
| UPLOAD_FILE_BATCH_LIMIT: NonNegativeInt = Field( |
| description="Maximum number of files allowed in a single upload batch", |
| default=5, |
| ) |
|
|
| UPLOAD_IMAGE_FILE_SIZE_LIMIT: NonNegativeInt = Field( |
| description="Maximum allowed image file size for uploads in megabytes", |
| default=10, |
| ) |
|
|
| UPLOAD_VIDEO_FILE_SIZE_LIMIT: NonNegativeInt = Field( |
| description="video file size limit in Megabytes for uploading files", |
| default=100, |
| ) |
|
|
| UPLOAD_AUDIO_FILE_SIZE_LIMIT: NonNegativeInt = Field( |
| description="audio file size limit in Megabytes for uploading files", |
| default=50, |
| ) |
|
|
| BATCH_UPLOAD_LIMIT: NonNegativeInt = Field( |
| description="Maximum number of files allowed in a batch upload operation", |
| default=20, |
| ) |
|
|
| WORKFLOW_FILE_UPLOAD_LIMIT: PositiveInt = Field( |
| description="Maximum number of files allowed in a workflow upload operation", |
| default=10, |
| ) |
|
|
|
|
| class HttpConfig(BaseSettings): |
| """ |
| HTTP-related configurations for the application |
| """ |
|
|
| API_COMPRESSION_ENABLED: bool = Field( |
| description="Enable or disable gzip compression for HTTP responses", |
| default=False, |
| ) |
|
|
| inner_CONSOLE_CORS_ALLOW_ORIGINS: str = Field( |
| description="Comma-separated list of allowed origins for CORS in the console", |
| validation_alias=AliasChoices("CONSOLE_CORS_ALLOW_ORIGINS", "CONSOLE_WEB_URL"), |
| default="", |
| ) |
|
|
| @computed_field |
| @property |
| def CONSOLE_CORS_ALLOW_ORIGINS(self) -> list[str]: |
| return self.inner_CONSOLE_CORS_ALLOW_ORIGINS.split(",") |
|
|
| inner_WEB_API_CORS_ALLOW_ORIGINS: str = Field( |
| description="", |
| validation_alias=AliasChoices("WEB_API_CORS_ALLOW_ORIGINS"), |
| default="*", |
| ) |
|
|
| @computed_field |
| @property |
| def WEB_API_CORS_ALLOW_ORIGINS(self) -> list[str]: |
| return self.inner_WEB_API_CORS_ALLOW_ORIGINS.split(",") |
|
|
| HTTP_REQUEST_MAX_CONNECT_TIMEOUT: Annotated[ |
| PositiveInt, Field(ge=10, description="Maximum connection timeout in seconds for HTTP requests") |
| ] = 10 |
|
|
| HTTP_REQUEST_MAX_READ_TIMEOUT: Annotated[ |
| PositiveInt, Field(ge=60, description="Maximum read timeout in seconds for HTTP requests") |
| ] = 60 |
|
|
| HTTP_REQUEST_MAX_WRITE_TIMEOUT: Annotated[ |
| PositiveInt, Field(ge=10, description="Maximum write timeout in seconds for HTTP requests") |
| ] = 20 |
|
|
| HTTP_REQUEST_NODE_MAX_BINARY_SIZE: PositiveInt = Field( |
| description="Maximum allowed size in bytes for binary data in HTTP requests", |
| default=10 * 1024 * 1024, |
| ) |
|
|
| HTTP_REQUEST_NODE_MAX_TEXT_SIZE: PositiveInt = Field( |
| description="Maximum allowed size in bytes for text data in HTTP requests", |
| default=1 * 1024 * 1024, |
| ) |
|
|
| SSRF_PROXY_HTTP_URL: Optional[str] = Field( |
| description="Proxy URL for HTTP requests to prevent Server-Side Request Forgery (SSRF)", |
| default=None, |
| ) |
|
|
| SSRF_PROXY_HTTPS_URL: Optional[str] = Field( |
| description="Proxy URL for HTTPS requests to prevent Server-Side Request Forgery (SSRF)", |
| default=None, |
| ) |
|
|
| SSRF_DEFAULT_TIME_OUT: PositiveFloat = Field( |
| description="The default timeout period used for network requests (SSRF)", |
| default=5, |
| ) |
|
|
| SSRF_DEFAULT_CONNECT_TIME_OUT: PositiveFloat = Field( |
| description="The default connect timeout period used for network requests (SSRF)", |
| default=5, |
| ) |
|
|
| SSRF_DEFAULT_READ_TIME_OUT: PositiveFloat = Field( |
| description="The default read timeout period used for network requests (SSRF)", |
| default=5, |
| ) |
|
|
| SSRF_DEFAULT_WRITE_TIME_OUT: PositiveFloat = Field( |
| description="The default write timeout period used for network requests (SSRF)", |
| default=5, |
| ) |
|
|
| RESPECT_XFORWARD_HEADERS_ENABLED: bool = Field( |
| description="Enable or disable the X-Forwarded-For Proxy Fix middleware from Werkzeug" |
| " to respect X-* headers to redirect clients", |
| default=False, |
| ) |
|
|
|
|
| class InnerAPIConfig(BaseSettings): |
| """ |
| Configuration for internal API functionality |
| """ |
|
|
| INNER_API: bool = Field( |
| description="Enable or disable the internal API", |
| default=False, |
| ) |
|
|
| INNER_API_KEY: Optional[str] = Field( |
| description="API key for accessing the internal API", |
| default=None, |
| ) |
|
|
|
|
| class LoggingConfig(BaseSettings): |
| """ |
| Configuration for application logging |
| """ |
|
|
| LOG_LEVEL: str = Field( |
| description="Logging level, default to INFO. Set to ERROR for production environments.", |
| default="INFO", |
| ) |
|
|
| LOG_FILE: Optional[str] = Field( |
| description="File path for log output.", |
| default=None, |
| ) |
|
|
| LOG_FILE_MAX_SIZE: PositiveInt = Field( |
| description="Maximum file size for file rotation retention, the unit is megabytes (MB)", |
| default=20, |
| ) |
|
|
| LOG_FILE_BACKUP_COUNT: PositiveInt = Field( |
| description="Maximum file backup count file rotation retention", |
| default=5, |
| ) |
|
|
| LOG_FORMAT: str = Field( |
| description="Format string for log messages", |
| default="%(asctime)s.%(msecs)03d %(levelname)s [%(threadName)s] [%(filename)s:%(lineno)d] - %(message)s", |
| ) |
|
|
| LOG_DATEFORMAT: Optional[str] = Field( |
| description="Date format string for log timestamps", |
| default=None, |
| ) |
|
|
| LOG_TZ: Optional[str] = Field( |
| description="Timezone for log timestamps (e.g., 'America/New_York')", |
| default=None, |
| ) |
|
|
|
|
| class ModelLoadBalanceConfig(BaseSettings): |
| """ |
| Configuration for model load balancing |
| """ |
|
|
| MODEL_LB_ENABLED: bool = Field( |
| description="Enable or disable load balancing for models", |
| default=False, |
| ) |
|
|
|
|
| class BillingConfig(BaseSettings): |
| """ |
| Configuration for platform billing features |
| """ |
|
|
| BILLING_ENABLED: bool = Field( |
| description="Enable or disable billing functionality", |
| default=False, |
| ) |
|
|
|
|
| class UpdateConfig(BaseSettings): |
| """ |
| Configuration for application update checks |
| """ |
|
|
| CHECK_UPDATE_URL: str = Field( |
| description="URL to check for application updates", |
| default="https://updates.dify.ai", |
| ) |
|
|
|
|
| class WorkflowConfig(BaseSettings): |
| """ |
| Configuration for workflow execution |
| """ |
|
|
| WORKFLOW_MAX_EXECUTION_STEPS: PositiveInt = Field( |
| description="Maximum number of steps allowed in a single workflow execution", |
| default=500, |
| ) |
|
|
| WORKFLOW_MAX_EXECUTION_TIME: PositiveInt = Field( |
| description="Maximum execution time in seconds for a single workflow", |
| default=1200, |
| ) |
|
|
| WORKFLOW_CALL_MAX_DEPTH: PositiveInt = Field( |
| description="Maximum allowed depth for nested workflow calls", |
| default=5, |
| ) |
|
|
| MAX_VARIABLE_SIZE: PositiveInt = Field( |
| description="Maximum size in bytes for a single variable in workflows. Default to 200 KB.", |
| default=200 * 1024, |
| ) |
|
|
|
|
| class AuthConfig(BaseSettings): |
| """ |
| Configuration for authentication and OAuth |
| """ |
|
|
| OAUTH_REDIRECT_PATH: str = Field( |
| description="Redirect path for OAuth authentication callbacks", |
| default="/console/api/oauth/authorize", |
| ) |
|
|
| GITHUB_CLIENT_ID: Optional[str] = Field( |
| description="GitHub OAuth client ID", |
| default=None, |
| ) |
|
|
| GITHUB_CLIENT_SECRET: Optional[str] = Field( |
| description="GitHub OAuth client secret", |
| default=None, |
| ) |
|
|
| GOOGLE_CLIENT_ID: Optional[str] = Field( |
| description="Google OAuth client ID", |
| default=None, |
| ) |
|
|
| GOOGLE_CLIENT_SECRET: Optional[str] = Field( |
| description="Google OAuth client secret", |
| default=None, |
| ) |
|
|
| ACCESS_TOKEN_EXPIRE_MINUTES: PositiveInt = Field( |
| description="Expiration time for access tokens in minutes", |
| default=60, |
| ) |
|
|
|
|
| class ModerationConfig(BaseSettings): |
| """ |
| Configuration for content moderation |
| """ |
|
|
| MODERATION_BUFFER_SIZE: PositiveInt = Field( |
| description="Size of the buffer for content moderation processing", |
| default=300, |
| ) |
|
|
|
|
| class ToolConfig(BaseSettings): |
| """ |
| Configuration for tool management |
| """ |
|
|
| TOOL_ICON_CACHE_MAX_AGE: PositiveInt = Field( |
| description="Maximum age in seconds for caching tool icons", |
| default=3600, |
| ) |
|
|
|
|
| class MailConfig(BaseSettings): |
| """ |
| Configuration for email services |
| """ |
|
|
| MAIL_TYPE: Optional[str] = Field( |
| description="Email service provider type ('smtp' or 'resend'), default to None.", |
| default=None, |
| ) |
|
|
| MAIL_DEFAULT_SEND_FROM: Optional[str] = Field( |
| description="Default email address to use as the sender", |
| default=None, |
| ) |
|
|
| RESEND_API_KEY: Optional[str] = Field( |
| description="API key for Resend email service", |
| default=None, |
| ) |
|
|
| RESEND_API_URL: Optional[str] = Field( |
| description="API URL for Resend email service", |
| default=None, |
| ) |
|
|
| SMTP_SERVER: Optional[str] = Field( |
| description="SMTP server hostname", |
| default=None, |
| ) |
|
|
| SMTP_PORT: Optional[int] = Field( |
| description="SMTP server port number", |
| default=465, |
| ) |
|
|
| SMTP_USERNAME: Optional[str] = Field( |
| description="Username for SMTP authentication", |
| default=None, |
| ) |
|
|
| SMTP_PASSWORD: Optional[str] = Field( |
| description="Password for SMTP authentication", |
| default=None, |
| ) |
|
|
| SMTP_USE_TLS: bool = Field( |
| description="Enable TLS encryption for SMTP connections", |
| default=False, |
| ) |
|
|
| SMTP_OPPORTUNISTIC_TLS: bool = Field( |
| description="Enable opportunistic TLS for SMTP connections", |
| default=False, |
| ) |
|
|
| EMAIL_SEND_IP_LIMIT_PER_MINUTE: PositiveInt = Field( |
| description="Maximum number of emails allowed to be sent from the same IP address in a minute", |
| default=50, |
| ) |
|
|
|
|
| class RagEtlConfig(BaseSettings): |
| """ |
| Configuration for RAG ETL processes |
| """ |
|
|
| |
| ETL_TYPE: str = Field( |
| description="RAG ETL type ('dify' or 'Unstructured'), default to 'dify'", |
| default="dify", |
| ) |
|
|
| KEYWORD_DATA_SOURCE_TYPE: str = Field( |
| description="Data source type for keyword extraction" |
| " ('database' or other supported types), default to 'database'", |
| default="database", |
| ) |
|
|
| UNSTRUCTURED_API_URL: Optional[str] = Field( |
| description="API URL for Unstructured.io service", |
| default=None, |
| ) |
|
|
| UNSTRUCTURED_API_KEY: Optional[str] = Field( |
| description="API key for Unstructured.io service", |
| default=None, |
| ) |
|
|
|
|
| class DataSetConfig(BaseSettings): |
| """ |
| Configuration for dataset management |
| """ |
|
|
| PLAN_SANDBOX_CLEAN_DAY_SETTING: PositiveInt = Field( |
| description="Interval in days for dataset cleanup operations - plan: sandbox", |
| default=30, |
| ) |
|
|
| PLAN_PRO_CLEAN_DAY_SETTING: PositiveInt = Field( |
| description="Interval in days for dataset cleanup operations - plan: pro and team", |
| default=7, |
| ) |
|
|
| DATASET_OPERATOR_ENABLED: bool = Field( |
| description="Enable or disable dataset operator functionality", |
| default=False, |
| ) |
|
|
| TIDB_SERVERLESS_NUMBER: PositiveInt = Field( |
| description="number of tidb serverless cluster", |
| default=500, |
| ) |
|
|
|
|
| class WorkspaceConfig(BaseSettings): |
| """ |
| Configuration for workspace management |
| """ |
|
|
| INVITE_EXPIRY_HOURS: PositiveInt = Field( |
| description="Expiration time in hours for workspace invitation links", |
| default=72, |
| ) |
|
|
|
|
| class IndexingConfig(BaseSettings): |
| """ |
| Configuration for indexing operations |
| """ |
|
|
| INDEXING_MAX_SEGMENTATION_TOKENS_LENGTH: PositiveInt = Field( |
| description="Maximum token length for text segmentation during indexing", |
| default=1000, |
| ) |
|
|
|
|
| class ImageFormatConfig(BaseSettings): |
| MULTIMODAL_SEND_IMAGE_FORMAT: Literal["base64", "url"] = Field( |
| description="Format for sending images in multimodal contexts ('base64' or 'url'), default is base64", |
| default="base64", |
| ) |
|
|
|
|
| class CeleryBeatConfig(BaseSettings): |
| CELERY_BEAT_SCHEDULER_TIME: int = Field( |
| description="Interval in days for Celery Beat scheduler execution, default to 1 day", |
| default=1, |
| ) |
|
|
|
|
| class PositionConfig(BaseSettings): |
| POSITION_PROVIDER_PINS: str = Field( |
| description="Comma-separated list of pinned model providers", |
| default="", |
| ) |
|
|
| POSITION_PROVIDER_INCLUDES: str = Field( |
| description="Comma-separated list of included model providers", |
| default="", |
| ) |
|
|
| POSITION_PROVIDER_EXCLUDES: str = Field( |
| description="Comma-separated list of excluded model providers", |
| default="", |
| ) |
|
|
| POSITION_TOOL_PINS: str = Field( |
| description="Comma-separated list of pinned tools", |
| default="", |
| ) |
|
|
| POSITION_TOOL_INCLUDES: str = Field( |
| description="Comma-separated list of included tools", |
| default="", |
| ) |
|
|
| POSITION_TOOL_EXCLUDES: str = Field( |
| description="Comma-separated list of excluded tools", |
| default="", |
| ) |
|
|
| @computed_field |
| def POSITION_PROVIDER_PINS_LIST(self) -> list[str]: |
| return [item.strip() for item in self.POSITION_PROVIDER_PINS.split(",") if item.strip() != ""] |
|
|
| @computed_field |
| def POSITION_PROVIDER_INCLUDES_SET(self) -> set[str]: |
| return {item.strip() for item in self.POSITION_PROVIDER_INCLUDES.split(",") if item.strip() != ""} |
|
|
| @computed_field |
| def POSITION_PROVIDER_EXCLUDES_SET(self) -> set[str]: |
| return {item.strip() for item in self.POSITION_PROVIDER_EXCLUDES.split(",") if item.strip() != ""} |
|
|
| @computed_field |
| def POSITION_TOOL_PINS_LIST(self) -> list[str]: |
| return [item.strip() for item in self.POSITION_TOOL_PINS.split(",") if item.strip() != ""] |
|
|
| @computed_field |
| def POSITION_TOOL_INCLUDES_SET(self) -> set[str]: |
| return {item.strip() for item in self.POSITION_TOOL_INCLUDES.split(",") if item.strip() != ""} |
|
|
| @computed_field |
| def POSITION_TOOL_EXCLUDES_SET(self) -> set[str]: |
| return {item.strip() for item in self.POSITION_TOOL_EXCLUDES.split(",") if item.strip() != ""} |
|
|
|
|
| class LoginConfig(BaseSettings): |
| ENABLE_EMAIL_CODE_LOGIN: bool = Field( |
| description="whether to enable email code login", |
| default=False, |
| ) |
| ENABLE_EMAIL_PASSWORD_LOGIN: bool = Field( |
| description="whether to enable email password login", |
| default=True, |
| ) |
| ENABLE_SOCIAL_OAUTH_LOGIN: bool = Field( |
| description="whether to enable github/google oauth login", |
| default=False, |
| ) |
| EMAIL_CODE_LOGIN_TOKEN_EXPIRY_MINUTES: PositiveInt = Field( |
| description="expiry time in minutes for email code login token", |
| default=5, |
| ) |
| ALLOW_REGISTER: bool = Field( |
| description="whether to enable register", |
| default=False, |
| ) |
| ALLOW_CREATE_WORKSPACE: bool = Field( |
| description="whether to enable create workspace", |
| default=False, |
| ) |
|
|
|
|
| class FeatureConfig( |
| |
| AppExecutionConfig, |
| AuthConfig, |
| BillingConfig, |
| CodeExecutionSandboxConfig, |
| DataSetConfig, |
| EndpointConfig, |
| FileAccessConfig, |
| FileUploadConfig, |
| HttpConfig, |
| ImageFormatConfig, |
| InnerAPIConfig, |
| IndexingConfig, |
| LoggingConfig, |
| MailConfig, |
| ModelLoadBalanceConfig, |
| ModerationConfig, |
| PositionConfig, |
| RagEtlConfig, |
| SecurityConfig, |
| ToolConfig, |
| UpdateConfig, |
| WorkflowConfig, |
| WorkspaceConfig, |
| LoginConfig, |
| |
| HostedServiceConfig, |
| CeleryBeatConfig, |
| ): |
| pass |
|
|