| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | 
							- from core.helper import marketplace
 
- from core.plugin.entities.plugin import ModelProviderID, PluginDependency, PluginInstallationSource, ToolProviderID
 
- from core.plugin.manager.plugin import PluginInstallationManager
 
- class DependenciesAnalysisService:
 
-     @classmethod
 
-     def analyze_tool_dependency(cls, tool_id: str) -> str:
 
-         """
 
-         Analyze the dependency of a tool.
 
-         Convert the tool id to the plugin_id
 
-         """
 
-         try:
 
-             return ToolProviderID(tool_id).plugin_id
 
-         except Exception as e:
 
-             raise e
 
-     @classmethod
 
-     def analyze_model_provider_dependency(cls, model_provider_id: str) -> str:
 
-         """
 
-         Analyze the dependency of a model provider.
 
-         Convert the model provider id to the plugin_id
 
-         """
 
-         try:
 
-             return ModelProviderID(model_provider_id).plugin_id
 
-         except Exception as e:
 
-             raise e
 
-     @classmethod
 
-     def get_leaked_dependencies(cls, tenant_id: str, dependencies: list[PluginDependency]) -> list[PluginDependency]:
 
-         """
 
-         Check dependencies, returns the leaked dependencies in current workspace
 
-         """
 
-         required_plugin_unique_identifiers = []
 
-         for dependency in dependencies:
 
-             required_plugin_unique_identifiers.append(dependency.value.plugin_unique_identifier)
 
-         manager = PluginInstallationManager()
 
-         # get leaked dependencies
 
-         missing_plugins = manager.fetch_missing_dependencies(tenant_id, required_plugin_unique_identifiers)
 
-         missing_plugin_unique_identifiers = {plugin.plugin_unique_identifier: plugin for plugin in missing_plugins}
 
-         leaked_dependencies = []
 
-         for dependency in dependencies:
 
-             unique_identifier = dependency.value.plugin_unique_identifier
 
-             if unique_identifier in missing_plugin_unique_identifiers:
 
-                 leaked_dependencies.append(
 
-                     PluginDependency(
 
-                         type=dependency.type,
 
-                         value=dependency.value,
 
-                         current_identifier=missing_plugin_unique_identifiers[unique_identifier].current_identifier,
 
-                     )
 
-                 )
 
-         return leaked_dependencies
 
-     @classmethod
 
-     def generate_dependencies(cls, tenant_id: str, dependencies: list[str]) -> list[PluginDependency]:
 
-         """
 
-         Generate dependencies through the list of plugin ids
 
-         """
 
-         dependencies = list(set(dependencies))
 
-         manager = PluginInstallationManager()
 
-         plugins = manager.fetch_plugin_installation_by_ids(tenant_id, dependencies)
 
-         result = []
 
-         for plugin in plugins:
 
-             if plugin.source == PluginInstallationSource.Github:
 
-                 result.append(
 
-                     PluginDependency(
 
-                         type=PluginDependency.Type.Github,
 
-                         value=PluginDependency.Github(
 
-                             repo=plugin.meta["repo"],
 
-                             version=plugin.meta["version"],
 
-                             package=plugin.meta["package"],
 
-                             github_plugin_unique_identifier=plugin.plugin_unique_identifier,
 
-                         ),
 
-                     )
 
-                 )
 
-             elif plugin.source == PluginInstallationSource.Marketplace:
 
-                 result.append(
 
-                     PluginDependency(
 
-                         type=PluginDependency.Type.Marketplace,
 
-                         value=PluginDependency.Marketplace(
 
-                             marketplace_plugin_unique_identifier=plugin.plugin_unique_identifier
 
-                         ),
 
-                     )
 
-                 )
 
-             elif plugin.source == PluginInstallationSource.Package:
 
-                 result.append(
 
-                     PluginDependency(
 
-                         type=PluginDependency.Type.Package,
 
-                         value=PluginDependency.Package(plugin_unique_identifier=plugin.plugin_unique_identifier),
 
-                     )
 
-                 )
 
-             elif plugin.source == PluginInstallationSource.Remote:
 
-                 raise ValueError(
 
-                     f"You used a remote plugin: {plugin.plugin_unique_identifier} in the app, please remove it first"
 
-                     " if you want to export the DSL."
 
-                 )
 
-             else:
 
-                 raise ValueError(f"Unknown plugin source: {plugin.source}")
 
-         return result
 
-     @classmethod
 
-     def generate_latest_dependencies(cls, dependencies: list[str]) -> list[PluginDependency]:
 
-         """
 
-         Generate the latest version of dependencies
 
-         """
 
-         dependencies = list(set(dependencies))
 
-         deps = marketplace.batch_fetch_plugin_manifests(dependencies)
 
-         return [
 
-             PluginDependency(
 
-                 type=PluginDependency.Type.Marketplace,
 
-                 value=PluginDependency.Marketplace(marketplace_plugin_unique_identifier=dep.latest_package_identifier),
 
-             )
 
-             for dep in deps
 
-         ]
 
 
  |