You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 11 месеца
преди 1 година
преди 7 месеца
преди 11 месеца
преди 11 месеца
преди 2 месеца
преди 11 месеца
преди 2 месеца
преди 7 месеца
преди 8 месеца
преди 8 месеца
преди 1 година
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 месеца
преди 1 година
преди 8 месеца
преди 1 година
преди 1 година
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 месеца
преди 1 година
преди 7 месеца
преди 7 месеца
преди 8 месеца
преди 1 година
преди 1 година
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
преди 11 месеца
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  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 KnowledgePipeline(BaseModel):
  64. publish_enabled: bool = False
  65. class PluginInstallationScope(StrEnum):
  66. NONE = "none"
  67. OFFICIAL_ONLY = "official_only"
  68. OFFICIAL_AND_SPECIFIC_PARTNERS = "official_and_specific_partners"
  69. ALL = "all"
  70. class PluginInstallationPermissionModel(BaseModel):
  71. # Plugin installation scope – possible values:
  72. # none: prohibit all plugin installations
  73. # official_only: allow only Dify official plugins
  74. # official_and_specific_partners: allow official and specific partner plugins
  75. # all: allow installation of all plugins
  76. plugin_installation_scope: PluginInstallationScope = PluginInstallationScope.ALL
  77. # If True, restrict plugin installation to the marketplace only
  78. # Equivalent to ForceEnablePluginVerification
  79. restrict_to_marketplace_only: bool = False
  80. class FeatureModel(BaseModel):
  81. billing: BillingModel = BillingModel()
  82. education: EducationModel = EducationModel()
  83. members: LimitationModel = LimitationModel(size=0, limit=1)
  84. apps: LimitationModel = LimitationModel(size=0, limit=10)
  85. vector_space: LimitationModel = LimitationModel(size=0, limit=5)
  86. knowledge_rate_limit: int = 10
  87. annotation_quota_limit: LimitationModel = LimitationModel(size=0, limit=10)
  88. documents_upload_quota: LimitationModel = LimitationModel(size=0, limit=50)
  89. docs_processing: str = "standard"
  90. can_replace_logo: bool = False
  91. model_load_balancing_enabled: bool = False
  92. dataset_operator_enabled: bool = False
  93. webapp_copyright_enabled: bool = False
  94. workspace_members: LicenseLimitationModel = LicenseLimitationModel(enabled=False, size=0, limit=0)
  95. is_allow_transfer_workspace: bool = True
  96. # pydantic configs
  97. model_config = ConfigDict(protected_namespaces=())
  98. knowledge_pipeline: KnowledgePipeline = KnowledgePipeline()
  99. class KnowledgeRateLimitModel(BaseModel):
  100. enabled: bool = False
  101. limit: int = 10
  102. subscription_plan: str = ""
  103. class SystemFeatureModel(BaseModel):
  104. sso_enforced_for_signin: bool = False
  105. sso_enforced_for_signin_protocol: str = ""
  106. enable_marketplace: bool = False
  107. max_plugin_package_size: int = dify_config.PLUGIN_MAX_PACKAGE_SIZE
  108. enable_email_code_login: bool = False
  109. enable_email_password_login: bool = True
  110. enable_social_oauth_login: bool = False
  111. is_allow_register: bool = False
  112. is_allow_create_workspace: bool = False
  113. is_email_setup: bool = False
  114. license: LicenseModel = LicenseModel()
  115. branding: BrandingModel = BrandingModel()
  116. webapp_auth: WebAppAuthModel = WebAppAuthModel()
  117. plugin_installation_permission: PluginInstallationPermissionModel = PluginInstallationPermissionModel()
  118. enable_change_email: bool = True
  119. class FeatureService:
  120. @classmethod
  121. def get_features(cls, tenant_id: str) -> FeatureModel:
  122. features = FeatureModel()
  123. cls._fulfill_params_from_env(features)
  124. if dify_config.BILLING_ENABLED and tenant_id:
  125. cls._fulfill_params_from_billing_api(features, tenant_id)
  126. if dify_config.ENTERPRISE_ENABLED:
  127. features.webapp_copyright_enabled = True
  128. cls._fulfill_params_from_workspace_info(features, tenant_id)
  129. return features
  130. @classmethod
  131. def get_knowledge_rate_limit(cls, tenant_id: str):
  132. knowledge_rate_limit = KnowledgeRateLimitModel()
  133. if dify_config.BILLING_ENABLED and tenant_id:
  134. knowledge_rate_limit.enabled = True
  135. limit_info = BillingService.get_knowledge_rate_limit(tenant_id)
  136. knowledge_rate_limit.limit = limit_info.get("limit", 10)
  137. knowledge_rate_limit.subscription_plan = limit_info.get("subscription_plan", "sandbox")
  138. return knowledge_rate_limit
  139. @classmethod
  140. def get_system_features(cls) -> SystemFeatureModel:
  141. system_features = SystemFeatureModel()
  142. cls._fulfill_system_params_from_env(system_features)
  143. if dify_config.ENTERPRISE_ENABLED:
  144. system_features.branding.enabled = True
  145. system_features.webapp_auth.enabled = True
  146. system_features.enable_change_email = False
  147. cls._fulfill_params_from_enterprise(system_features)
  148. if dify_config.MARKETPLACE_ENABLED:
  149. system_features.enable_marketplace = True
  150. return system_features
  151. @classmethod
  152. def _fulfill_system_params_from_env(cls, system_features: SystemFeatureModel):
  153. system_features.enable_email_code_login = dify_config.ENABLE_EMAIL_CODE_LOGIN
  154. system_features.enable_email_password_login = dify_config.ENABLE_EMAIL_PASSWORD_LOGIN
  155. system_features.enable_social_oauth_login = dify_config.ENABLE_SOCIAL_OAUTH_LOGIN
  156. system_features.is_allow_register = dify_config.ALLOW_REGISTER
  157. system_features.is_allow_create_workspace = dify_config.ALLOW_CREATE_WORKSPACE
  158. system_features.is_email_setup = dify_config.MAIL_TYPE is not None and dify_config.MAIL_TYPE != ""
  159. @classmethod
  160. def _fulfill_params_from_env(cls, features: FeatureModel):
  161. features.can_replace_logo = dify_config.CAN_REPLACE_LOGO
  162. features.model_load_balancing_enabled = dify_config.MODEL_LB_ENABLED
  163. features.dataset_operator_enabled = dify_config.DATASET_OPERATOR_ENABLED
  164. features.education.enabled = dify_config.EDUCATION_ENABLED
  165. @classmethod
  166. def _fulfill_params_from_workspace_info(cls, features: FeatureModel, tenant_id: str):
  167. workspace_info = EnterpriseService.get_workspace_info(tenant_id)
  168. if "WorkspaceMembers" in workspace_info:
  169. features.workspace_members.size = workspace_info["WorkspaceMembers"]["used"]
  170. features.workspace_members.limit = workspace_info["WorkspaceMembers"]["limit"]
  171. features.workspace_members.enabled = workspace_info["WorkspaceMembers"]["enabled"]
  172. @classmethod
  173. def _fulfill_params_from_billing_api(cls, features: FeatureModel, tenant_id: str):
  174. billing_info = BillingService.get_info(tenant_id)
  175. features.billing.enabled = billing_info["enabled"]
  176. features.billing.subscription.plan = billing_info["subscription"]["plan"]
  177. features.billing.subscription.interval = billing_info["subscription"]["interval"]
  178. features.education.activated = billing_info["subscription"].get("education", False)
  179. if features.billing.subscription.plan != "sandbox":
  180. features.webapp_copyright_enabled = True
  181. else:
  182. features.is_allow_transfer_workspace = False
  183. if "members" in billing_info:
  184. features.members.size = billing_info["members"]["size"]
  185. features.members.limit = billing_info["members"]["limit"]
  186. if "apps" in billing_info:
  187. features.apps.size = billing_info["apps"]["size"]
  188. features.apps.limit = billing_info["apps"]["limit"]
  189. if "vector_space" in billing_info:
  190. features.vector_space.size = billing_info["vector_space"]["size"]
  191. features.vector_space.limit = billing_info["vector_space"]["limit"]
  192. if "documents_upload_quota" in billing_info:
  193. features.documents_upload_quota.size = billing_info["documents_upload_quota"]["size"]
  194. features.documents_upload_quota.limit = billing_info["documents_upload_quota"]["limit"]
  195. if "annotation_quota_limit" in billing_info:
  196. features.annotation_quota_limit.size = billing_info["annotation_quota_limit"]["size"]
  197. features.annotation_quota_limit.limit = billing_info["annotation_quota_limit"]["limit"]
  198. if "docs_processing" in billing_info:
  199. features.docs_processing = billing_info["docs_processing"]
  200. if "can_replace_logo" in billing_info:
  201. features.can_replace_logo = billing_info["can_replace_logo"]
  202. if "model_load_balancing_enabled" in billing_info:
  203. features.model_load_balancing_enabled = billing_info["model_load_balancing_enabled"]
  204. if "knowledge_rate_limit" in billing_info:
  205. features.knowledge_rate_limit = billing_info["knowledge_rate_limit"]["limit"]
  206. if "knowledge_pipeline_publish_enabled" in billing_info:
  207. features.knowledge_pipeline.publish_enabled = billing_info["knowledge_pipeline_publish_enabled"]
  208. @classmethod
  209. def _fulfill_params_from_enterprise(cls, features: SystemFeatureModel):
  210. enterprise_info = EnterpriseService.get_info()
  211. if "SSOEnforcedForSignin" in enterprise_info:
  212. features.sso_enforced_for_signin = enterprise_info["SSOEnforcedForSignin"]
  213. if "SSOEnforcedForSigninProtocol" in enterprise_info:
  214. features.sso_enforced_for_signin_protocol = enterprise_info["SSOEnforcedForSigninProtocol"]
  215. if "EnableEmailCodeLogin" in enterprise_info:
  216. features.enable_email_code_login = enterprise_info["EnableEmailCodeLogin"]
  217. if "EnableEmailPasswordLogin" in enterprise_info:
  218. features.enable_email_password_login = enterprise_info["EnableEmailPasswordLogin"]
  219. if "IsAllowRegister" in enterprise_info:
  220. features.is_allow_register = enterprise_info["IsAllowRegister"]
  221. if "IsAllowCreateWorkspace" in enterprise_info:
  222. features.is_allow_create_workspace = enterprise_info["IsAllowCreateWorkspace"]
  223. if "Branding" in enterprise_info:
  224. features.branding.application_title = enterprise_info["Branding"].get("applicationTitle", "")
  225. features.branding.login_page_logo = enterprise_info["Branding"].get("loginPageLogo", "")
  226. features.branding.workspace_logo = enterprise_info["Branding"].get("workspaceLogo", "")
  227. features.branding.favicon = enterprise_info["Branding"].get("favicon", "")
  228. if "WebAppAuth" in enterprise_info:
  229. features.webapp_auth.allow_sso = enterprise_info["WebAppAuth"].get("allowSso", False)
  230. features.webapp_auth.allow_email_code_login = enterprise_info["WebAppAuth"].get(
  231. "allowEmailCodeLogin", False
  232. )
  233. features.webapp_auth.allow_email_password_login = enterprise_info["WebAppAuth"].get(
  234. "allowEmailPasswordLogin", False
  235. )
  236. features.webapp_auth.sso_config.protocol = enterprise_info.get("SSOEnforcedForWebProtocol", "")
  237. if "License" in enterprise_info:
  238. license_info = enterprise_info["License"]
  239. if "status" in license_info:
  240. features.license.status = LicenseStatus(license_info.get("status", LicenseStatus.INACTIVE))
  241. if "expiredAt" in license_info:
  242. features.license.expired_at = license_info["expiredAt"]
  243. if "workspaces" in license_info:
  244. features.license.workspaces.enabled = license_info["workspaces"]["enabled"]
  245. features.license.workspaces.limit = license_info["workspaces"]["limit"]
  246. features.license.workspaces.size = license_info["workspaces"]["used"]
  247. if "PluginInstallationPermission" in enterprise_info:
  248. plugin_installation_info = enterprise_info["PluginInstallationPermission"]
  249. features.plugin_installation_permission.plugin_installation_scope = plugin_installation_info[
  250. "pluginInstallationScope"
  251. ]
  252. features.plugin_installation_permission.restrict_to_marketplace_only = plugin_installation_info[
  253. "restrictToMarketplaceOnly"
  254. ]