Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

feature_service.py 7.0KB

11 месяцев назад
1 год назад
11 месяцев назад
1 год назад
1 год назад
1 год назад
11 месяцев назад
1 год назад
1 год назад
1 год назад
1 год назад
1 год назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
11 месяцев назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. from enum import StrEnum
  2. from pydantic import BaseModel, ConfigDict
  3. from configs import dify_config
  4. from services.billing_service import BillingService
  5. from services.enterprise.enterprise_service import EnterpriseService
  6. class SubscriptionModel(BaseModel):
  7. plan: str = "sandbox"
  8. interval: str = ""
  9. class BillingModel(BaseModel):
  10. enabled: bool = False
  11. subscription: SubscriptionModel = SubscriptionModel()
  12. class LimitationModel(BaseModel):
  13. size: int = 0
  14. limit: int = 0
  15. class LicenseStatus(StrEnum):
  16. NONE = "none"
  17. INACTIVE = "inactive"
  18. ACTIVE = "active"
  19. EXPIRING = "expiring"
  20. EXPIRED = "expired"
  21. LOST = "lost"
  22. class LicenseModel(BaseModel):
  23. status: LicenseStatus = LicenseStatus.NONE
  24. expired_at: str = ""
  25. class FeatureModel(BaseModel):
  26. billing: BillingModel = BillingModel()
  27. members: LimitationModel = LimitationModel(size=0, limit=1)
  28. apps: LimitationModel = LimitationModel(size=0, limit=10)
  29. vector_space: LimitationModel = LimitationModel(size=0, limit=5)
  30. annotation_quota_limit: LimitationModel = LimitationModel(size=0, limit=10)
  31. documents_upload_quota: LimitationModel = LimitationModel(size=0, limit=50)
  32. docs_processing: str = "standard"
  33. can_replace_logo: bool = False
  34. model_load_balancing_enabled: bool = False
  35. dataset_operator_enabled: bool = False
  36. # pydantic configs
  37. model_config = ConfigDict(protected_namespaces=())
  38. class SystemFeatureModel(BaseModel):
  39. sso_enforced_for_signin: bool = False
  40. sso_enforced_for_signin_protocol: str = ""
  41. sso_enforced_for_web: bool = False
  42. sso_enforced_for_web_protocol: str = ""
  43. enable_web_sso_switch_component: bool = False
  44. enable_email_code_login: bool = False
  45. enable_email_password_login: bool = True
  46. enable_social_oauth_login: bool = False
  47. is_allow_register: bool = False
  48. is_allow_create_workspace: bool = False
  49. is_email_setup: bool = False
  50. license: LicenseModel = LicenseModel()
  51. class FeatureService:
  52. @classmethod
  53. def get_features(cls, tenant_id: str) -> FeatureModel:
  54. features = FeatureModel()
  55. cls._fulfill_params_from_env(features)
  56. if dify_config.BILLING_ENABLED and tenant_id:
  57. cls._fulfill_params_from_billing_api(features, tenant_id)
  58. return features
  59. @classmethod
  60. def get_system_features(cls) -> SystemFeatureModel:
  61. system_features = SystemFeatureModel()
  62. cls._fulfill_system_params_from_env(system_features)
  63. if dify_config.ENTERPRISE_ENABLED:
  64. system_features.enable_web_sso_switch_component = True
  65. cls._fulfill_params_from_enterprise(system_features)
  66. return system_features
  67. @classmethod
  68. def _fulfill_system_params_from_env(cls, system_features: SystemFeatureModel):
  69. system_features.enable_email_code_login = dify_config.ENABLE_EMAIL_CODE_LOGIN
  70. system_features.enable_email_password_login = dify_config.ENABLE_EMAIL_PASSWORD_LOGIN
  71. system_features.enable_social_oauth_login = dify_config.ENABLE_SOCIAL_OAUTH_LOGIN
  72. system_features.is_allow_register = dify_config.ALLOW_REGISTER
  73. system_features.is_allow_create_workspace = dify_config.ALLOW_CREATE_WORKSPACE
  74. system_features.is_email_setup = dify_config.MAIL_TYPE is not None and dify_config.MAIL_TYPE != ""
  75. @classmethod
  76. def _fulfill_params_from_env(cls, features: FeatureModel):
  77. features.can_replace_logo = dify_config.CAN_REPLACE_LOGO
  78. features.model_load_balancing_enabled = dify_config.MODEL_LB_ENABLED
  79. features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
  80. @classmethod
  81. def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str):
  82. billing_info = BillingService.get_info(tenant_id)
  83. features.billing.enabled = billing_info["enabled"]
  84. features.billing.subscription.plan = billing_info["subscription"]["plan"]
  85. features.billing.subscription.interval = billing_info["subscription"]["interval"]
  86. if "members" in billing_info:
  87. features.members.size = billing_info["members"]["size"]
  88. features.members.limit = billing_info["members"]["limit"]
  89. if "apps" in billing_info:
  90. features.apps.size = billing_info["apps"]["size"]
  91. features.apps.limit = billing_info["apps"]["limit"]
  92. if "vector_space" in billing_info:
  93. features.vector_space.size = billing_info["vector_space"]["size"]
  94. features.vector_space.limit = billing_info["vector_space"]["limit"]
  95. if "documents_upload_quota" in billing_info:
  96. features.documents_upload_quota.size = billing_info["documents_upload_quota"]["size"]
  97. features.documents_upload_quota.limit = billing_info["documents_upload_quota"]["limit"]
  98. if "annotation_quota_limit" in billing_info:
  99. features.annotation_quota_limit.size = billing_info["annotation_quota_limit"]["size"]
  100. features.annotation_quota_limit.limit = billing_info["annotation_quota_limit"]["limit"]
  101. if "docs_processing" in billing_info:
  102. features.docs_processing = billing_info["docs_processing"]
  103. if "can_replace_logo" in billing_info:
  104. features.can_replace_logo = billing_info["can_replace_logo"]
  105. if "model_load_balancing_enabled" in billing_info:
  106. features.model_load_balancing_enabled = billing_info["model_load_balancing_enabled"]
  107. @classmethod
  108. def _fulfill_params_from_enterprise(cls, features):
  109. enterprise_info = EnterpriseService.get_info()
  110. if "sso_enforced_for_signin" in enterprise_info:
  111. features.sso_enforced_for_signin = enterprise_info["sso_enforced_for_signin"]
  112. if "sso_enforced_for_signin_protocol" in enterprise_info:
  113. features.sso_enforced_for_signin_protocol = enterprise_info["sso_enforced_for_signin_protocol"]
  114. if "sso_enforced_for_web" in enterprise_info:
  115. features.sso_enforced_for_web = enterprise_info["sso_enforced_for_web"]
  116. if "sso_enforced_for_web_protocol" in enterprise_info:
  117. features.sso_enforced_for_web_protocol = enterprise_info["sso_enforced_for_web_protocol"]
  118. if "enable_email_code_login" in enterprise_info:
  119. features.enable_email_code_login = enterprise_info["enable_email_code_login"]
  120. if "enable_email_password_login" in enterprise_info:
  121. features.enable_email_password_login = enterprise_info["enable_email_password_login"]
  122. if "is_allow_register" in enterprise_info:
  123. features.is_allow_register = enterprise_info["is_allow_register"]
  124. if "is_allow_create_workspace" in enterprise_info:
  125. features.is_allow_create_workspace = enterprise_info["is_allow_create_workspace"]
  126. if "license" in enterprise_info:
  127. license_info = enterprise_info["license"]
  128. if "status" in license_info:
  129. features.license.status = LicenseStatus(license_info.get("status", LicenseStatus.INACTIVE))
  130. if "expired_at" in license_info:
  131. features.license.expired_at = license_info["expired_at"]