Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

11 місяці тому
7 місяці тому
11 місяці тому
11 місяці тому
7 місяці тому
7 місяці тому
7 місяці тому
Introduce Plugins (#13836) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: xhe <xw897002528@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: takatost <takatost@gmail.com> Co-authored-by: kurokobo <kuro664@gmail.com> Co-authored-by: Novice Lee <novicelee@NoviPro.local> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: AkaraChen <akarachen@outlook.com> Co-authored-by: Yi <yxiaoisme@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: Hiroshi Fujita <fujita-h@users.noreply.github.com> Co-authored-by: AkaraChen <85140972+AkaraChen@users.noreply.github.com> Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Novice <857526207@qq.com> Co-authored-by: Hiroki Nagai <82458324+nagaihiroki-git@users.noreply.github.com> Co-authored-by: Gen Sato <52241300+halogen22@users.noreply.github.com> Co-authored-by: eux <euxuuu@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: lotsik <lotsik@mail.ru> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gakkiyomi <gakkiyomi@aliyun.com> Co-authored-by: CN-P5 <heibai2006@gmail.com> Co-authored-by: CN-P5 <heibai2006@qq.com> Co-authored-by: Chuehnone <1897025+chuehnone@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Kevin9703 <51311316+Kevin9703@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Boris Feld <lothiraldan@gmail.com> Co-authored-by: mbo <himabo@gmail.com> Co-authored-by: mabo <mabo@aeyes.ai> Co-authored-by: Warren Chen <warren.chen830@gmail.com> Co-authored-by: JzoNgKVO <27049666+JzoNgKVO@users.noreply.github.com> Co-authored-by: jiandanfeng <chenjh3@wangsu.com> Co-authored-by: zhu-an <70234959+xhdd123321@users.noreply.github.com> Co-authored-by: zhaoqingyu.1075 <zhaoqingyu.1075@bytedance.com> Co-authored-by: 海狸大師 <86974027+yenslife@users.noreply.github.com> Co-authored-by: Xu Song <xusong.vip@gmail.com> Co-authored-by: rayshaw001 <396301947@163.com> Co-authored-by: Ding Jiatong <dingjiatong@gmail.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: JasonVV <jasonwangiii@outlook.com> Co-authored-by: le0zh <newlight@qq.com> Co-authored-by: zhuxinliang <zhuxinliang@didiglobal.com> Co-authored-by: k-zaku <zaku99@outlook.jp> Co-authored-by: luckylhb90 <luckylhb90@gmail.com> Co-authored-by: hobo.l <hobo.l@binance.com> Co-authored-by: jiangbo721 <365065261@qq.com> Co-authored-by: 刘江波 <jiangbo721@163.com> Co-authored-by: Shun Miyazawa <34241526+miya@users.noreply.github.com> Co-authored-by: EricPan <30651140+Egfly@users.noreply.github.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Jhvcc <37662342+Jhvcc@users.noreply.github.com> Co-authored-by: lowell <lowell.hu@zkteco.in> Co-authored-by: Boris Polonsky <BorisPolonsky@users.noreply.github.com> Co-authored-by: Ademílson Tonato <ademilsonft@outlook.com> Co-authored-by: Ademílson Tonato <ademilson.tonato@refurbed.com> Co-authored-by: IWAI, Masaharu <iwaim.sub@gmail.com> Co-authored-by: Yueh-Po Peng (Yabi) <94939112+y10ab1@users.noreply.github.com> Co-authored-by: Jason <ggbbddjm@gmail.com> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: yjc980121 <3898524+yjc980121@users.noreply.github.com> Co-authored-by: heyszt <36215648+hieheihei@users.noreply.github.com> Co-authored-by: Abdullah AlOsaimi <osaimiacc@gmail.com> Co-authored-by: Abdullah AlOsaimi <189027247+osaimi@users.noreply.github.com> Co-authored-by: Yingchun Lai <laiyingchun@apache.org> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: zuodongxu <192560071+zuodongxu@users.noreply.github.com> Co-authored-by: Masashi Tomooka <tmokmss@users.noreply.github.com> Co-authored-by: aplio <ryo.091219@gmail.com> Co-authored-by: Obada Khalili <54270856+obadakhalili@users.noreply.github.com> Co-authored-by: Nam Vu <zuzoovn@gmail.com> Co-authored-by: Kei YAMAZAKI <1715090+kei-yamazaki@users.noreply.github.com> Co-authored-by: TechnoHouse <13776377+deephbz@users.noreply.github.com> Co-authored-by: Riddhimaan-Senapati <114703025+Riddhimaan-Senapati@users.noreply.github.com> Co-authored-by: MaFee921 <31881301+2284730142@users.noreply.github.com> Co-authored-by: te-chan <t-nakanome@sakura-is.co.jp> Co-authored-by: HQidea <HQidea@users.noreply.github.com> Co-authored-by: Joshbly <36315710+Joshbly@users.noreply.github.com> Co-authored-by: xhe <xw897002528@gmail.com> Co-authored-by: weiwenyan-dev <154779315+weiwenyan-dev@users.noreply.github.com> Co-authored-by: ex_wenyan.wei <ex_wenyan.wei@tcl.com> Co-authored-by: engchina <12236799+engchina@users.noreply.github.com> Co-authored-by: engchina <atjapan2015@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Kemal <kemalmeler@outlook.com> Co-authored-by: Lazy_Frog <4590648+lazyFrogLOL@users.noreply.github.com> Co-authored-by: Yi Xiao <54782454+YIXIAO0@users.noreply.github.com> Co-authored-by: Steven sun <98230804+Tuyohai@users.noreply.github.com> Co-authored-by: steven <sunzwj@digitalchina.com> Co-authored-by: Kalo Chin <91766386+fdb02983rhy@users.noreply.github.com> Co-authored-by: Katy Tao <34019945+KatyTao@users.noreply.github.com> Co-authored-by: depy <42985524+h4ckdepy@users.noreply.github.com> Co-authored-by: 胡春东 <gycm520@gmail.com> Co-authored-by: Junjie.M <118170653@qq.com> Co-authored-by: MuYu <mr.muzea@gmail.com> Co-authored-by: Naoki Takashima <39912547+takatea@users.noreply.github.com> Co-authored-by: Summer-Gu <37869445+gubinjie@users.noreply.github.com> Co-authored-by: Fei He <droxer.he@gmail.com> Co-authored-by: ybalbert001 <120714773+ybalbert001@users.noreply.github.com> Co-authored-by: Yuanbo Li <ybalbert@amazon.com> Co-authored-by: douxc <7553076+douxc@users.noreply.github.com> Co-authored-by: liuzhenghua <1090179900@qq.com> Co-authored-by: Wu Jiayang <62842862+Wu-Jiayang@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: kimjion <45935338+kimjion@users.noreply.github.com> Co-authored-by: AugNSo <song.tiankai@icloud.com> Co-authored-by: llinvokerl <38915183+llinvokerl@users.noreply.github.com> Co-authored-by: liusurong.lsr <liusurong.lsr@alibaba-inc.com> Co-authored-by: Vasu Negi <vasu-negi@users.noreply.github.com> Co-authored-by: Hundredwz <1808096180@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
8 місяці тому
11 місяці тому
7 місяці тому
Introduce Plugins (#13836) Signed-off-by: yihong0618 <zouzou0208@gmail.com> Signed-off-by: -LAN- <laipz8200@outlook.com> Signed-off-by: xhe <xw897002528@gmail.com> Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: takatost <takatost@gmail.com> Co-authored-by: kurokobo <kuro664@gmail.com> Co-authored-by: Novice Lee <novicelee@NoviPro.local> Co-authored-by: zxhlyh <jasonapring2015@outlook.com> Co-authored-by: AkaraChen <akarachen@outlook.com> Co-authored-by: Yi <yxiaoisme@gmail.com> Co-authored-by: Joel <iamjoel007@gmail.com> Co-authored-by: JzoNg <jzongcode@gmail.com> Co-authored-by: twwu <twwu@dify.ai> Co-authored-by: Hiroshi Fujita <fujita-h@users.noreply.github.com> Co-authored-by: AkaraChen <85140972+AkaraChen@users.noreply.github.com> Co-authored-by: NFish <douxc512@gmail.com> Co-authored-by: Wu Tianwei <30284043+WTW0313@users.noreply.github.com> Co-authored-by: 非法操作 <hjlarry@163.com> Co-authored-by: Novice <857526207@qq.com> Co-authored-by: Hiroki Nagai <82458324+nagaihiroki-git@users.noreply.github.com> Co-authored-by: Gen Sato <52241300+halogen22@users.noreply.github.com> Co-authored-by: eux <euxuuu@gmail.com> Co-authored-by: huangzhuo1949 <167434202+huangzhuo1949@users.noreply.github.com> Co-authored-by: huangzhuo <huangzhuo1@xiaomi.com> Co-authored-by: lotsik <lotsik@mail.ru> Co-authored-by: crazywoola <100913391+crazywoola@users.noreply.github.com> Co-authored-by: nite-knite <nkCoding@gmail.com> Co-authored-by: Jyong <76649700+JohnJyong@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: gakkiyomi <gakkiyomi@aliyun.com> Co-authored-by: CN-P5 <heibai2006@gmail.com> Co-authored-by: CN-P5 <heibai2006@qq.com> Co-authored-by: Chuehnone <1897025+chuehnone@users.noreply.github.com> Co-authored-by: yihong <zouzou0208@gmail.com> Co-authored-by: Kevin9703 <51311316+Kevin9703@users.noreply.github.com> Co-authored-by: -LAN- <laipz8200@outlook.com> Co-authored-by: Boris Feld <lothiraldan@gmail.com> Co-authored-by: mbo <himabo@gmail.com> Co-authored-by: mabo <mabo@aeyes.ai> Co-authored-by: Warren Chen <warren.chen830@gmail.com> Co-authored-by: JzoNgKVO <27049666+JzoNgKVO@users.noreply.github.com> Co-authored-by: jiandanfeng <chenjh3@wangsu.com> Co-authored-by: zhu-an <70234959+xhdd123321@users.noreply.github.com> Co-authored-by: zhaoqingyu.1075 <zhaoqingyu.1075@bytedance.com> Co-authored-by: 海狸大師 <86974027+yenslife@users.noreply.github.com> Co-authored-by: Xu Song <xusong.vip@gmail.com> Co-authored-by: rayshaw001 <396301947@163.com> Co-authored-by: Ding Jiatong <dingjiatong@gmail.com> Co-authored-by: Bowen Liang <liangbowen@gf.com.cn> Co-authored-by: JasonVV <jasonwangiii@outlook.com> Co-authored-by: le0zh <newlight@qq.com> Co-authored-by: zhuxinliang <zhuxinliang@didiglobal.com> Co-authored-by: k-zaku <zaku99@outlook.jp> Co-authored-by: luckylhb90 <luckylhb90@gmail.com> Co-authored-by: hobo.l <hobo.l@binance.com> Co-authored-by: jiangbo721 <365065261@qq.com> Co-authored-by: 刘江波 <jiangbo721@163.com> Co-authored-by: Shun Miyazawa <34241526+miya@users.noreply.github.com> Co-authored-by: EricPan <30651140+Egfly@users.noreply.github.com> Co-authored-by: crazywoola <427733928@qq.com> Co-authored-by: sino <sino2322@gmail.com> Co-authored-by: Jhvcc <37662342+Jhvcc@users.noreply.github.com> Co-authored-by: lowell <lowell.hu@zkteco.in> Co-authored-by: Boris Polonsky <BorisPolonsky@users.noreply.github.com> Co-authored-by: Ademílson Tonato <ademilsonft@outlook.com> Co-authored-by: Ademílson Tonato <ademilson.tonato@refurbed.com> Co-authored-by: IWAI, Masaharu <iwaim.sub@gmail.com> Co-authored-by: Yueh-Po Peng (Yabi) <94939112+y10ab1@users.noreply.github.com> Co-authored-by: Jason <ggbbddjm@gmail.com> Co-authored-by: Xin Zhang <sjhpzx@gmail.com> Co-authored-by: yjc980121 <3898524+yjc980121@users.noreply.github.com> Co-authored-by: heyszt <36215648+hieheihei@users.noreply.github.com> Co-authored-by: Abdullah AlOsaimi <osaimiacc@gmail.com> Co-authored-by: Abdullah AlOsaimi <189027247+osaimi@users.noreply.github.com> Co-authored-by: Yingchun Lai <laiyingchun@apache.org> Co-authored-by: Hash Brown <hi@xzd.me> Co-authored-by: zuodongxu <192560071+zuodongxu@users.noreply.github.com> Co-authored-by: Masashi Tomooka <tmokmss@users.noreply.github.com> Co-authored-by: aplio <ryo.091219@gmail.com> Co-authored-by: Obada Khalili <54270856+obadakhalili@users.noreply.github.com> Co-authored-by: Nam Vu <zuzoovn@gmail.com> Co-authored-by: Kei YAMAZAKI <1715090+kei-yamazaki@users.noreply.github.com> Co-authored-by: TechnoHouse <13776377+deephbz@users.noreply.github.com> Co-authored-by: Riddhimaan-Senapati <114703025+Riddhimaan-Senapati@users.noreply.github.com> Co-authored-by: MaFee921 <31881301+2284730142@users.noreply.github.com> Co-authored-by: te-chan <t-nakanome@sakura-is.co.jp> Co-authored-by: HQidea <HQidea@users.noreply.github.com> Co-authored-by: Joshbly <36315710+Joshbly@users.noreply.github.com> Co-authored-by: xhe <xw897002528@gmail.com> Co-authored-by: weiwenyan-dev <154779315+weiwenyan-dev@users.noreply.github.com> Co-authored-by: ex_wenyan.wei <ex_wenyan.wei@tcl.com> Co-authored-by: engchina <12236799+engchina@users.noreply.github.com> Co-authored-by: engchina <atjapan2015@gmail.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: 呆萌闷油瓶 <253605712@qq.com> Co-authored-by: Kemal <kemalmeler@outlook.com> Co-authored-by: Lazy_Frog <4590648+lazyFrogLOL@users.noreply.github.com> Co-authored-by: Yi Xiao <54782454+YIXIAO0@users.noreply.github.com> Co-authored-by: Steven sun <98230804+Tuyohai@users.noreply.github.com> Co-authored-by: steven <sunzwj@digitalchina.com> Co-authored-by: Kalo Chin <91766386+fdb02983rhy@users.noreply.github.com> Co-authored-by: Katy Tao <34019945+KatyTao@users.noreply.github.com> Co-authored-by: depy <42985524+h4ckdepy@users.noreply.github.com> Co-authored-by: 胡春东 <gycm520@gmail.com> Co-authored-by: Junjie.M <118170653@qq.com> Co-authored-by: MuYu <mr.muzea@gmail.com> Co-authored-by: Naoki Takashima <39912547+takatea@users.noreply.github.com> Co-authored-by: Summer-Gu <37869445+gubinjie@users.noreply.github.com> Co-authored-by: Fei He <droxer.he@gmail.com> Co-authored-by: ybalbert001 <120714773+ybalbert001@users.noreply.github.com> Co-authored-by: Yuanbo Li <ybalbert@amazon.com> Co-authored-by: douxc <7553076+douxc@users.noreply.github.com> Co-authored-by: liuzhenghua <1090179900@qq.com> Co-authored-by: Wu Jiayang <62842862+Wu-Jiayang@users.noreply.github.com> Co-authored-by: Your Name <you@example.com> Co-authored-by: kimjion <45935338+kimjion@users.noreply.github.com> Co-authored-by: AugNSo <song.tiankai@icloud.com> Co-authored-by: llinvokerl <38915183+llinvokerl@users.noreply.github.com> Co-authored-by: liusurong.lsr <liusurong.lsr@alibaba-inc.com> Co-authored-by: Vasu Negi <vasu-negi@users.noreply.github.com> Co-authored-by: Hundredwz <1808096180@qq.com> Co-authored-by: Xiyuan Chen <52963600+GareArc@users.noreply.github.com>
8 місяці тому
7 місяці тому
7 місяці тому
7 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
11 місяці тому
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. from enum import StrEnum
  2. from pydantic import BaseModel, ConfigDict, Field
  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 EducationModel(BaseModel):
  13. enabled: bool = False
  14. activated: bool = False
  15. class LimitationModel(BaseModel):
  16. size: int = 0
  17. limit: int = 0
  18. class LicenseLimitationModel(BaseModel):
  19. """
  20. - enabled: whether this limit is enforced
  21. - size: current usage count
  22. - limit: maximum allowed count; 0 means unlimited
  23. """
  24. enabled: bool = Field(False, description="Whether this limit is currently active")
  25. size: int = Field(0, description="Number of resources already consumed")
  26. limit: int = Field(0, description="Maximum number of resources allowed; 0 means no limit")
  27. def is_available(self, required: int = 1) -> bool:
  28. """
  29. Determine whether the requested amount can be allocated.
  30. Returns True if:
  31. - this limit is not active, or
  32. - the limit is zero (unlimited), or
  33. - there is enough remaining quota.
  34. """
  35. if not self.enabled or self.limit == 0:
  36. return True
  37. return (self.limit - self.size) >= required
  38. class LicenseStatus(StrEnum):
  39. NONE = "none"
  40. INACTIVE = "inactive"
  41. ACTIVE = "active"
  42. EXPIRING = "expiring"
  43. EXPIRED = "expired"
  44. LOST = "lost"
  45. class LicenseModel(BaseModel):
  46. status: LicenseStatus = LicenseStatus.NONE
  47. expired_at: str = ""
  48. workspaces: LicenseLimitationModel = LicenseLimitationModel(enabled=False, size=0, limit=0)
  49. class BrandingModel(BaseModel):
  50. enabled: bool = False
  51. application_title: str = ""
  52. login_page_logo: str = ""
  53. workspace_logo: str = ""
  54. favicon: str = ""
  55. class WebAppAuthSSOModel(BaseModel):
  56. protocol: str = ""
  57. class WebAppAuthModel(BaseModel):
  58. enabled: bool = False
  59. allow_sso: bool = False
  60. sso_config: WebAppAuthSSOModel = WebAppAuthSSOModel()
  61. allow_email_code_login: bool = False
  62. allow_email_password_login: bool = False
  63. class PluginInstallationScope(StrEnum):
  64. NONE = "none"
  65. OFFICIAL_ONLY = "official_only"
  66. OFFICIAL_AND_SPECIFIC_PARTNERS = "official_and_specific_partners"
  67. ALL = "all"
  68. class PluginInstallationPermissionModel(BaseModel):
  69. # Plugin installation scope – possible values:
  70. # none: prohibit all plugin installations
  71. # official_only: allow only Dify official plugins
  72. # official_and_specific_partners: allow official and specific partner plugins
  73. # all: allow installation of all plugins
  74. plugin_installation_scope: PluginInstallationScope = PluginInstallationScope.ALL
  75. # If True, restrict plugin installation to the marketplace only
  76. # Equivalent to ForceEnablePluginVerification
  77. restrict_to_marketplace_only: bool = False
  78. class FeatureModel(BaseModel):
  79. billing: BillingModel = BillingModel()
  80. education: EducationModel = EducationModel()
  81. members: LimitationModel = LimitationModel(size=0, limit=1)
  82. apps: LimitationModel = LimitationModel(size=0, limit=10)
  83. vector_space: LimitationModel = LimitationModel(size=0, limit=5)
  84. knowledge_rate_limit: int = 10
  85. annotation_quota_limit: LimitationModel = LimitationModel(size=0, limit=10)
  86. documents_upload_quota: LimitationModel = LimitationModel(size=0, limit=50)
  87. docs_processing: str = "standard"
  88. can_replace_logo: bool = False
  89. model_load_balancing_enabled: bool = False
  90. dataset_operator_enabled: bool = False
  91. webapp_copyright_enabled: bool = False
  92. workspace_members: LicenseLimitationModel = LicenseLimitationModel(enabled=False, size=0, limit=0)
  93. is_allow_transfer_workspace: bool = True
  94. # pydantic configs
  95. model_config = ConfigDict(protected_namespaces=())
  96. class KnowledgeRateLimitModel(BaseModel):
  97. enabled: bool = False
  98. limit: int = 10
  99. subscription_plan: str = ""
  100. class SystemFeatureModel(BaseModel):
  101. sso_enforced_for_signin: bool = False
  102. sso_enforced_for_signin_protocol: str = ""
  103. enable_marketplace: bool = False
  104. max_plugin_package_size: int = dify_config.PLUGIN_MAX_PACKAGE_SIZE
  105. enable_email_code_login: bool = False
  106. enable_email_password_login: bool = True
  107. enable_social_oauth_login: bool = False
  108. is_allow_register: bool = False
  109. is_allow_create_workspace: bool = False
  110. is_email_setup: bool = False
  111. license: LicenseModel = LicenseModel()
  112. branding: BrandingModel = BrandingModel()
  113. webapp_auth: WebAppAuthModel = WebAppAuthModel()
  114. plugin_installation_permission: PluginInstallationPermissionModel = PluginInstallationPermissionModel()
  115. enable_change_email: bool = True
  116. class FeatureService:
  117. @classmethod
  118. def get_features(cls, tenant_id: str) -> FeatureModel:
  119. features = FeatureModel()
  120. cls._fulfill_params_from_env(features)
  121. if dify_config.BILLING_ENABLED and tenant_id:
  122. cls._fulfill_params_from_billing_api(features, tenant_id)
  123. if dify_config.ENTERPRISE_ENABLED:
  124. features.webapp_copyright_enabled = True
  125. cls._fulfill_params_from_workspace_info(features, tenant_id)
  126. return features
  127. @classmethod
  128. def get_knowledge_rate_limit(cls, tenant_id: str):
  129. knowledge_rate_limit = KnowledgeRateLimitModel()
  130. if dify_config.BILLING_ENABLED and tenant_id:
  131. knowledge_rate_limit.enabled = True
  132. limit_info = BillingService.get_knowledge_rate_limit(tenant_id)
  133. knowledge_rate_limit.limit = limit_info.get("limit", 10)
  134. knowledge_rate_limit.subscription_plan = limit_info.get("subscription_plan", "sandbox")
  135. return knowledge_rate_limit
  136. @classmethod
  137. def get_system_features(cls) -> SystemFeatureModel:
  138. system_features = SystemFeatureModel()
  139. cls._fulfill_system_params_from_env(system_features)
  140. if dify_config.ENTERPRISE_ENABLED:
  141. system_features.branding.enabled = True
  142. system_features.webapp_auth.enabled = True
  143. system_features.enable_change_email = False
  144. cls._fulfill_params_from_enterprise(system_features)
  145. if dify_config.MARKETPLACE_ENABLED:
  146. system_features.enable_marketplace = True
  147. return system_features
  148. @classmethod
  149. def _fulfill_system_params_from_env(cls, system_features: SystemFeatureModel):
  150. system_features.enable_email_code_login = dify_config.ENABLE_EMAIL_CODE_LOGIN
  151. system_features.enable_email_password_login = dify_config.ENABLE_EMAIL_PASSWORD_LOGIN
  152. system_features.enable_social_oauth_login = dify_config.ENABLE_SOCIAL_OAUTH_LOGIN
  153. system_features.is_allow_register = dify_config.ALLOW_REGISTER
  154. system_features.is_allow_create_workspace = dify_config.ALLOW_CREATE_WORKSPACE
  155. system_features.is_email_setup = dify_config.MAIL_TYPE is not None and dify_config.MAIL_TYPE != ""
  156. @classmethod
  157. def _fulfill_params_from_env(cls, features: FeatureModel):
  158. features.can_replace_logo = dify_config.CAN_REPLACE_LOGO
  159. features.model_load_balancing_enabled = dify_config.MODEL_LB_ENABLED
  160. features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
  161. features.education.enabled = dify_config.EDUCATION_ENABLED
  162. @classmethod
  163. def _fulfill_params_from_workspace_info(cls, features: FeatureModel, tenant_id: str):
  164. workspace_info = EnterpriseService.get_workspace_info(tenant_id)
  165. if "WorkspaceMembers" in workspace_info:
  166. features.workspace_members.size = workspace_info["WorkspaceMembers"]["used"]
  167. features.workspace_members.limit = workspace_info["WorkspaceMembers"]["limit"]
  168. features.workspace_members.enabled = workspace_info["WorkspaceMembers"]["enabled"]
  169. @classmethod
  170. def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str):
  171. billing_info = BillingService.get_info(tenant_id)
  172. features.billing.enabled = billing_info["enabled"]
  173. features.billing.subscription.plan = billing_info["subscription"]["plan"]
  174. features.billing.subscription.interval = billing_info["subscription"]["interval"]
  175. features.education.activated = billing_info["subscription"].get("education", False)
  176. if features.billing.subscription.plan != "sandbox":
  177. features.webapp_copyright_enabled = True
  178. else:
  179. features.is_allow_transfer_workspace = False
  180. if "members" in billing_info:
  181. features.members.size = billing_info["members"]["size"]
  182. features.members.limit = billing_info["members"]["limit"]
  183. if "apps" in billing_info:
  184. features.apps.size = billing_info["apps"]["size"]
  185. features.apps.limit = billing_info["apps"]["limit"]
  186. if "vector_space" in billing_info:
  187. features.vector_space.size = billing_info["vector_space"]["size"]
  188. features.vector_space.limit = billing_info["vector_space"]["limit"]
  189. if "documents_upload_quota" in billing_info:
  190. features.documents_upload_quota.size = billing_info["documents_upload_quota"]["size"]
  191. features.documents_upload_quota.limit = billing_info["documents_upload_quota"]["limit"]
  192. if "annotation_quota_limit" in billing_info:
  193. features.annotation_quota_limit.size = billing_info["annotation_quota_limit"]["size"]
  194. features.annotation_quota_limit.limit = billing_info["annotation_quota_limit"]["limit"]
  195. if "docs_processing" in billing_info:
  196. features.docs_processing = billing_info["docs_processing"]
  197. if "can_replace_logo" in billing_info:
  198. features.can_replace_logo = billing_info["can_replace_logo"]
  199. if "model_load_balancing_enabled" in billing_info:
  200. features.model_load_balancing_enabled = billing_info["model_load_balancing_enabled"]
  201. if "knowledge_rate_limit" in billing_info:
  202. features.knowledge_rate_limit = billing_info["knowledge_rate_limit"]["limit"]
  203. @classmethod
  204. def _fulfill_params_from_enterprise(cls, features: SystemFeatureModel):
  205. enterprise_info = EnterpriseService.get_info()
  206. if "SSOEnforcedForSignin" in enterprise_info:
  207. features.sso_enforced_for_signin = enterprise_info["SSOEnforcedForSignin"]
  208. if "SSOEnforcedForSigninProtocol" in enterprise_info:
  209. features.sso_enforced_for_signin_protocol = enterprise_info["SSOEnforcedForSigninProtocol"]
  210. if "EnableEmailCodeLogin" in enterprise_info:
  211. features.enable_email_code_login = enterprise_info["EnableEmailCodeLogin"]
  212. if "EnableEmailPasswordLogin" in enterprise_info:
  213. features.enable_email_password_login = enterprise_info["EnableEmailPasswordLogin"]
  214. if "IsAllowRegister" in enterprise_info:
  215. features.is_allow_register = enterprise_info["IsAllowRegister"]
  216. if "IsAllowCreateWorkspace" in enterprise_info:
  217. features.is_allow_create_workspace = enterprise_info["IsAllowCreateWorkspace"]
  218. if "Branding" in enterprise_info:
  219. features.branding.application_title = enterprise_info["Branding"].get("applicationTitle", "")
  220. features.branding.login_page_logo = enterprise_info["Branding"].get("loginPageLogo", "")
  221. features.branding.workspace_logo = enterprise_info["Branding"].get("workspaceLogo", "")
  222. features.branding.favicon = enterprise_info["Branding"].get("favicon", "")
  223. if "WebAppAuth" in enterprise_info:
  224. features.webapp_auth.allow_sso = enterprise_info["WebAppAuth"].get("allowSso", False)
  225. features.webapp_auth.allow_email_code_login = enterprise_info["WebAppAuth"].get(
  226. "allowEmailCodeLogin", False
  227. )
  228. features.webapp_auth.allow_email_password_login = enterprise_info["WebAppAuth"].get(
  229. "allowEmailPasswordLogin", False
  230. )
  231. features.webapp_auth.sso_config.protocol = enterprise_info.get("SSOEnforcedForWebProtocol", "")
  232. if "License" in enterprise_info:
  233. license_info = enterprise_info["License"]
  234. if "status" in license_info:
  235. features.license.status = LicenseStatus(license_info.get("status", LicenseStatus.INACTIVE))
  236. if "expiredAt" in license_info:
  237. features.license.expired_at = license_info["expiredAt"]
  238. if "workspaces" in license_info:
  239. features.license.workspaces.enabled = license_info["workspaces"]["enabled"]
  240. features.license.workspaces.limit = license_info["workspaces"]["limit"]
  241. features.license.workspaces.size = license_info["workspaces"]["used"]
  242. if "PluginInstallationPermission" in enterprise_info:
  243. plugin_installation_info = enterprise_info["PluginInstallationPermission"]
  244. features.plugin_installation_permission.plugin_installation_scope = plugin_installation_info[
  245. "pluginInstallationScope"
  246. ]
  247. features.plugin_installation_permission.restrict_to_marketplace_only = plugin_installation_info[
  248. "restrictToMarketplaceOnly"
  249. ]