dependencies_analysis.py 5.2 KB

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