dependencies_analysis.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from core.plugin.entities.plugin import GenericProviderID, PluginDependency, PluginInstallationSource
  2. from core.plugin.manager.plugin import PluginInstallationManager
  3. class DependenciesAnalysisService:
  4. @classmethod
  5. def analyze_tool_dependency(cls, tool_id: str) -> str:
  6. """
  7. Analyze the dependency of a tool.
  8. Convert the tool id to the plugin_id
  9. """
  10. try:
  11. tool_provider_id = GenericProviderID(tool_id)
  12. return tool_provider_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. generic_provider_id = GenericProviderID(model_provider_id)
  23. return generic_provider_id.plugin_id
  24. except Exception as e:
  25. raise e
  26. @classmethod
  27. def get_leaked_dependencies(cls, tenant_id: str, dependencies: list[PluginDependency]) -> list[PluginDependency]:
  28. """
  29. Check dependencies, returns the leaked dependencies in current workspace
  30. """
  31. required_plugin_unique_identifiers = []
  32. for dependency in dependencies:
  33. required_plugin_unique_identifiers.append(dependency.value.plugin_unique_identifier)
  34. manager = PluginInstallationManager()
  35. missing_plugin_unique_identifiers = manager.fetch_missing_dependencies(
  36. tenant_id, required_plugin_unique_identifiers
  37. )
  38. leaked_dependencies = []
  39. for dependency in dependencies:
  40. unique_identifier = dependency.value.plugin_unique_identifier
  41. if unique_identifier in missing_plugin_unique_identifiers:
  42. leaked_dependencies.append(dependency)
  43. return leaked_dependencies
  44. @classmethod
  45. def generate_dependencies(cls, tenant_id: str, dependencies: list[str]) -> list[PluginDependency]:
  46. """
  47. Generate dependencies through the list of plugin ids
  48. """
  49. dependencies = list(set(dependencies))
  50. manager = PluginInstallationManager()
  51. plugins = manager.fetch_plugin_installation_by_ids(tenant_id, dependencies)
  52. result = []
  53. for plugin in plugins:
  54. if plugin.source == PluginInstallationSource.Github:
  55. result.append(
  56. PluginDependency(
  57. type=PluginDependency.Type.Github,
  58. value=PluginDependency.Github(
  59. repo=plugin.meta["repo"],
  60. version=plugin.meta["version"],
  61. package=plugin.meta["package"],
  62. github_plugin_unique_identifier=plugin.plugin_unique_identifier,
  63. ),
  64. )
  65. )
  66. elif plugin.source == PluginInstallationSource.Marketplace:
  67. result.append(
  68. PluginDependency(
  69. type=PluginDependency.Type.Marketplace,
  70. value=PluginDependency.Marketplace(
  71. marketplace_plugin_unique_identifier=plugin.plugin_unique_identifier
  72. ),
  73. )
  74. )
  75. elif plugin.source == PluginInstallationSource.Package:
  76. result.append(
  77. PluginDependency(
  78. type=PluginDependency.Type.Package,
  79. value=PluginDependency.Package(plugin_unique_identifier=plugin.plugin_unique_identifier),
  80. )
  81. )
  82. elif plugin.source == PluginInstallationSource.Remote:
  83. raise ValueError(
  84. f"You used a remote plugin: {plugin.plugin_unique_identifier} in the app, please remove it first"
  85. " if you want to export the DSL."
  86. )
  87. else:
  88. raise ValueError(f"Unknown plugin source: {plugin.source}")
  89. return result