diff --git a/api/config.py b/api/config.py index 2e722c7009..35e8ab5e94 100644 --- a/api/config.py +++ b/api/config.py @@ -3,20 +3,6 @@ import os import dotenv DEFAULTS = { - 'HOSTED_OPENAI_QUOTA_LIMIT': 200, - 'HOSTED_OPENAI_TRIAL_ENABLED': 'False', - 'HOSTED_OPENAI_TRIAL_MODELS': 'gpt-3.5-turbo,gpt-3.5-turbo-1106,gpt-3.5-turbo-instruct,gpt-3.5-turbo-16k,gpt-3.5-turbo-16k-0613,gpt-3.5-turbo-0613,gpt-3.5-turbo-0125,text-davinci-003', - 'HOSTED_OPENAI_PAID_ENABLED': 'False', - 'HOSTED_OPENAI_PAID_MODELS': 'gpt-4,gpt-4-turbo-preview,gpt-4-turbo-2024-04-09,gpt-4-1106-preview,gpt-4-0125-preview,gpt-3.5-turbo,gpt-3.5-turbo-16k,gpt-3.5-turbo-16k-0613,gpt-3.5-turbo-1106,gpt-3.5-turbo-0613,gpt-3.5-turbo-0125,gpt-3.5-turbo-instruct,text-davinci-003', - 'HOSTED_AZURE_OPENAI_ENABLED': 'False', - 'HOSTED_AZURE_OPENAI_QUOTA_LIMIT': 200, - 'HOSTED_ANTHROPIC_QUOTA_LIMIT': 600000, - 'HOSTED_ANTHROPIC_TRIAL_ENABLED': 'False', - 'HOSTED_ANTHROPIC_PAID_ENABLED': 'False', - 'HOSTED_MODERATION_ENABLED': 'False', - 'HOSTED_MODERATION_PROVIDERS': '', - 'HOSTED_FETCH_APP_TEMPLATES_MODE': 'remote', - 'HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN': 'https://tmpl.dify.ai', } @@ -53,37 +39,3 @@ class Config: 'CONSOLE_CORS_ALLOW_ORIGINS', get_env('CONSOLE_WEB_URL')) self.WEB_API_CORS_ALLOW_ORIGINS = get_cors_allow_origins( 'WEB_API_CORS_ALLOW_ORIGINS', '*') - - # ------------------------ - # Platform Configurations. - # ------------------------ - self.HOSTED_OPENAI_API_KEY = get_env('HOSTED_OPENAI_API_KEY') - self.HOSTED_OPENAI_API_BASE = get_env('HOSTED_OPENAI_API_BASE') - self.HOSTED_OPENAI_API_ORGANIZATION = get_env('HOSTED_OPENAI_API_ORGANIZATION') - self.HOSTED_OPENAI_TRIAL_ENABLED = get_bool_env('HOSTED_OPENAI_TRIAL_ENABLED') - self.HOSTED_OPENAI_TRIAL_MODELS = get_env('HOSTED_OPENAI_TRIAL_MODELS') - self.HOSTED_OPENAI_QUOTA_LIMIT = int(get_env('HOSTED_OPENAI_QUOTA_LIMIT')) - self.HOSTED_OPENAI_PAID_ENABLED = get_bool_env('HOSTED_OPENAI_PAID_ENABLED') - self.HOSTED_OPENAI_PAID_MODELS = get_env('HOSTED_OPENAI_PAID_MODELS') - - self.HOSTED_AZURE_OPENAI_ENABLED = get_bool_env('HOSTED_AZURE_OPENAI_ENABLED') - self.HOSTED_AZURE_OPENAI_API_KEY = get_env('HOSTED_AZURE_OPENAI_API_KEY') - self.HOSTED_AZURE_OPENAI_API_BASE = get_env('HOSTED_AZURE_OPENAI_API_BASE') - self.HOSTED_AZURE_OPENAI_QUOTA_LIMIT = int(get_env('HOSTED_AZURE_OPENAI_QUOTA_LIMIT')) - - self.HOSTED_ANTHROPIC_API_BASE = get_env('HOSTED_ANTHROPIC_API_BASE') - self.HOSTED_ANTHROPIC_API_KEY = get_env('HOSTED_ANTHROPIC_API_KEY') - self.HOSTED_ANTHROPIC_TRIAL_ENABLED = get_bool_env('HOSTED_ANTHROPIC_TRIAL_ENABLED') - self.HOSTED_ANTHROPIC_QUOTA_LIMIT = int(get_env('HOSTED_ANTHROPIC_QUOTA_LIMIT')) - self.HOSTED_ANTHROPIC_PAID_ENABLED = get_bool_env('HOSTED_ANTHROPIC_PAID_ENABLED') - - self.HOSTED_MINIMAX_ENABLED = get_bool_env('HOSTED_MINIMAX_ENABLED') - self.HOSTED_SPARK_ENABLED = get_bool_env('HOSTED_SPARK_ENABLED') - self.HOSTED_ZHIPUAI_ENABLED = get_bool_env('HOSTED_ZHIPUAI_ENABLED') - - self.HOSTED_MODERATION_ENABLED = get_bool_env('HOSTED_MODERATION_ENABLED') - self.HOSTED_MODERATION_PROVIDERS = get_env('HOSTED_MODERATION_PROVIDERS') - - # fetch app templates mode, remote, builtin, db(only for dify SaaS), default: remote - self.HOSTED_FETCH_APP_TEMPLATES_MODE = get_env('HOSTED_FETCH_APP_TEMPLATES_MODE') - self.HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN = get_env('HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN') diff --git a/api/configs/feature/__init__.py b/api/configs/feature/__init__.py index 4d7d0dcd1e..e25a17f3b9 100644 --- a/api/configs/feature/__init__.py +++ b/api/configs/feature/__init__.py @@ -2,6 +2,8 @@ from typing import Optional from pydantic import AliasChoices, BaseModel, Field, NonNegativeInt, PositiveInt +from configs.feature.hosted_service import HostedServiceConfig + class SecurityConfig(BaseModel): """ @@ -421,5 +423,8 @@ class FeatureConfig( UpdateConfig, WorkflowConfig, WorkspaceConfig, + + # hosted services config + HostedServiceConfig, ): pass diff --git a/api/configs/feature/hosted_service/__init__.py b/api/configs/feature/hosted_service/__init__.py new file mode 100644 index 0000000000..b09b6fd041 --- /dev/null +++ b/api/configs/feature/hosted_service/__init__.py @@ -0,0 +1,208 @@ +from typing import Optional + +from pydantic import BaseModel, Field, NonNegativeInt + + +class HostedOpenAiConfig(BaseModel): + """ + Hosted OpenAI service config + """ + + HOSTED_OPENAI_API_KEY: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_OPENAI_API_BASE: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_OPENAI_API_ORGANIZATION: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_OPENAI_TRIAL_ENABLED: bool = Field( + description='', + default=False, + ) + + HOSTED_OPENAI_TRIAL_MODELS: str = Field( + description='', + default='gpt-3.5-turbo,' + 'gpt-3.5-turbo-1106,' + 'gpt-3.5-turbo-instruct,' + 'gpt-3.5-turbo-16k,' + 'gpt-3.5-turbo-16k-0613,' + 'gpt-3.5-turbo-0613,' + 'gpt-3.5-turbo-0125,' + 'text-davinci-003', + ) + + HOSTED_OPENAI_QUOTA_LIMIT: NonNegativeInt = Field( + description='', + default=200, + ) + + HOSTED_OPENAI_PAID_ENABLED: bool = Field( + description='', + default=False, + ) + + HOSTED_OPENAI_PAID_MODELS: str = Field( + description='', + default='gpt-4,' + 'gpt-4-turbo-preview,' + 'gpt-4-turbo-2024-04-09,' + 'gpt-4-1106-preview,' + 'gpt-4-0125-preview,' + 'gpt-3.5-turbo,' + 'gpt-3.5-turbo-16k,' + 'gpt-3.5-turbo-16k-0613,' + 'gpt-3.5-turbo-1106,' + 'gpt-3.5-turbo-0613,' + 'gpt-3.5-turbo-0125,' + 'gpt-3.5-turbo-instruct,' + 'text-davinci-003', + ) + + +class HostedAzureOpenAiConfig(BaseModel): + """ + Hosted OpenAI service config + """ + + HOSTED_AZURE_OPENAI_ENABLED: bool = Field( + description='', + default=False, + ) + + HOSTED_OPENAI_API_KEY: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_AZURE_OPENAI_API_BASE: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_AZURE_OPENAI_QUOTA_LIMIT: NonNegativeInt = Field( + description='', + default=200, + ) + + +class HostedAnthropicConfig(BaseModel): + """ + Hosted Azure OpenAI service config + """ + + HOSTED_ANTHROPIC_API_BASE: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_ANTHROPIC_API_KEY: Optional[str] = Field( + description='', + default=None, + ) + + HOSTED_ANTHROPIC_TRIAL_ENABLED: bool = Field( + description='', + default=False, + ) + + HOSTED_ANTHROPIC_QUOTA_LIMIT: NonNegativeInt = Field( + description='', + default=600000, + ) + + HOSTED_ANTHROPIC_PAID_ENABLED: bool = Field( + description='', + default=False, + ) + + +class HostedMinmaxConfig(BaseModel): + """ + Hosted Minmax service config + """ + + HOSTED_MINIMAX_ENABLED: bool = Field( + description='', + default=False, + ) + + +class HostedSparkConfig(BaseModel): + """ + Hosted Spark service config + """ + + HOSTED_SPARK_ENABLED: bool = Field( + description='', + default=False, + ) + + +class HostedZhipuAIConfig(BaseModel): + """ + Hosted Minmax service config + """ + + HOSTED_ZHIPUAI_ENABLED: bool = Field( + description='', + default=False, + ) + + +class HostedModerationConfig(BaseModel): + """ + Hosted Moderation service config + """ + + HOSTED_MODERATION_ENABLED: bool = Field( + description='', + default=False, + ) + + HOSTED_MODERATION_PROVIDERS: str = Field( + description='', + default='', + ) + + +class HostedFetchAppTemplateConfig(BaseModel): + """ + Hosted Moderation service config + """ + + HOSTED_FETCH_APP_TEMPLATES_MODE: str = Field( + description='the mode for fetching app templates,' + ' default to remote,' + ' available values: remote, db, builtin', + default='remote', + ) + + HOSTED_FETCH_APP_TEMPLATES_REMOTE_DOMAIN: str = Field( + description='the domain for fetching remote app templates', + default='https://tmpl.dify.ai', + ) + + +class HostedServiceConfig( + # place the configs in alphabet order + HostedAnthropicConfig, + HostedAzureOpenAiConfig, + HostedFetchAppTemplateConfig, + HostedMinmaxConfig, + HostedOpenAiConfig, + HostedSparkConfig, + HostedZhipuAIConfig, + + # moderation + HostedModerationConfig, +): + pass