您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

dependencies_analysis.py 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. from configs import dify_config
  2. from core.helper import marketplace
  3. from core.plugin.entities.plugin import PluginDependency, PluginInstallationSource
  4. from core.plugin.impl.plugin import PluginInstaller
  5. from models.provider_ids import ModelProviderID, ToolProviderID
  6. class DependenciesAnalysisService:
  7. @classmethod
  8. def analyze_tool_dependency(cls, tool_id: str) -> str:
  9. """
  10. Analyze the dependency of a tool.
  11. Convert the tool id to the plugin_id
  12. """
  13. try:
  14. return ToolProviderID(tool_id).plugin_id
  15. except Exception as e:
  16. raise e
  17. @classmethod
  18. def analyze_model_provider_dependency(cls, model_provider_id: str) -> str:
  19. """
  20. Analyze the dependency of a model provider.
  21. Convert the model provider id to the plugin_id
  22. """
  23. try:
  24. return ModelProviderID(model_provider_id).plugin_id
  25. except Exception as e:
  26. raise e
  27. @classmethod
  28. def get_leaked_dependencies(cls, tenant_id: str, dependencies: list[PluginDependency]) -> list[PluginDependency]:
  29. """
  30. Check dependencies, returns the leaked dependencies in current workspace
  31. """
  32. required_plugin_unique_identifiers = []
  33. for dependency in dependencies:
  34. required_plugin_unique_identifiers.append(dependency.value.plugin_unique_identifier)
  35. manager = PluginInstaller()
  36. # get leaked dependencies
  37. missing_plugins = manager.fetch_missing_dependencies(tenant_id, required_plugin_unique_identifiers)
  38. missing_plugin_unique_identifiers = {plugin.plugin_unique_identifier: plugin for plugin in missing_plugins}
  39. leaked_dependencies = []
  40. for dependency in dependencies:
  41. unique_identifier = dependency.value.plugin_unique_identifier
  42. if unique_identifier in missing_plugin_unique_identifiers:
  43. leaked_dependencies.append(
  44. PluginDependency(
  45. type=dependency.type,
  46. value=dependency.value,
  47. current_identifier=missing_plugin_unique_identifiers[unique_identifier].current_identifier,
  48. )
  49. )
  50. return leaked_dependencies
  51. @classmethod
  52. def generate_dependencies(cls, tenant_id: str, dependencies: list[str]) -> list[PluginDependency]:
  53. """
  54. Generate dependencies through the list of plugin ids
  55. """
  56. dependencies = list(set(dependencies))
  57. manager = PluginInstaller()
  58. plugins = manager.fetch_plugin_installation_by_ids(tenant_id, dependencies)
  59. result = []
  60. for plugin in plugins:
  61. if plugin.source == PluginInstallationSource.Github:
  62. result.append(
  63. PluginDependency(
  64. type=PluginDependency.Type.Github,
  65. value=PluginDependency.Github(
  66. repo=plugin.meta["repo"],
  67. version=plugin.meta["version"],
  68. package=plugin.meta["package"],
  69. github_plugin_unique_identifier=plugin.plugin_unique_identifier,
  70. ),
  71. )
  72. )
  73. elif plugin.source == PluginInstallationSource.Marketplace:
  74. result.append(
  75. PluginDependency(
  76. type=PluginDependency.Type.Marketplace,
  77. value=PluginDependency.Marketplace(
  78. marketplace_plugin_unique_identifier=plugin.plugin_unique_identifier
  79. ),
  80. )
  81. )
  82. elif plugin.source == PluginInstallationSource.Package:
  83. result.append(
  84. PluginDependency(
  85. type=PluginDependency.Type.Package,
  86. value=PluginDependency.Package(plugin_unique_identifier=plugin.plugin_unique_identifier),
  87. )
  88. )
  89. elif plugin.source == PluginInstallationSource.Remote:
  90. raise ValueError(
  91. f"You used a remote plugin: {plugin.plugin_unique_identifier} in the app, please remove it first"
  92. " if you want to export the DSL."
  93. )
  94. else:
  95. raise ValueError(f"Unknown plugin source: {plugin.source}")
  96. return result
  97. @classmethod
  98. def generate_latest_dependencies(cls, dependencies: list[str]) -> list[PluginDependency]:
  99. """
  100. Generate the latest version of dependencies
  101. """
  102. dependencies = list(set(dependencies))
  103. if not dify_config.MARKETPLACE_ENABLED:
  104. return []
  105. deps = marketplace.batch_fetch_plugin_manifests(dependencies)
  106. return [
  107. PluginDependency(
  108. type=PluginDependency.Type.Marketplace,
  109. value=PluginDependency.Marketplace(marketplace_plugin_unique_identifier=dep.latest_package_identifier),
  110. )
  111. for dep in deps
  112. ]