| | 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 |
| |
|