dependencies_analysis.py 4.9 KB

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