diff --git a/api/core/plugin/entities/plugin.py b/api/core/plugin/entities/plugin.py index 57012bf495..c504e0e11f 100644 --- a/api/core/plugin/entities/plugin.py +++ b/api/core/plugin/entities/plugin.py @@ -178,6 +178,7 @@ class PluginDependency(BaseModel): class Marketplace(BaseModel): marketplace_plugin_unique_identifier: str + version: str | None = None @property def plugin_unique_identifier(self) -> str: diff --git a/api/services/plugin/dependencies_analysis.py b/api/services/plugin/dependencies_analysis.py index 9879248bbd..623fa2740f 100644 --- a/api/services/plugin/dependencies_analysis.py +++ b/api/services/plugin/dependencies_analysis.py @@ -1,9 +1,14 @@ +import re + from configs import dify_config from core.helper import marketplace from core.plugin.entities.plugin import PluginDependency, PluginInstallationSource from core.plugin.impl.plugin import PluginInstaller from models.provider_ids import ModelProviderID, ToolProviderID +# Compile regex pattern for version extraction at module level for better performance +_VERSION_REGEX = re.compile(r":(?P[0-9]+(?:\.[0-9]+){2}(?:[+-][0-9A-Za-z.-]+)?)(?:@|$)") + class DependenciesAnalysisService: @classmethod @@ -49,6 +54,13 @@ class DependenciesAnalysisService: for dependency in dependencies: unique_identifier = dependency.value.plugin_unique_identifier if unique_identifier in missing_plugin_unique_identifiers: + # Extract version for Marketplace dependencies + if dependency.type == PluginDependency.Type.Marketplace: + version_match = _VERSION_REGEX.search(unique_identifier) + if version_match: + dependency.value.version = version_match.group("version") + + # Create and append the dependency (same for all types) leaked_dependencies.append( PluginDependency( type=dependency.type,