From 8d5a8f01532b7776a0c7b743db22b362dbbcd782 Mon Sep 17 00:00:00 2001 From: Yeuoly Date: Sat, 8 Feb 2025 14:53:43 +0800 Subject: [PATCH] fix: using latest plugin as the dep of DSL under 0.1.15 --- api/services/app_dsl_service.py | 36 +++++++++++++++----- api/services/plugin/dependencies_analysis.py | 16 +++++++++ 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/api/services/app_dsl_service.py b/api/services/app_dsl_service.py index cb0f3dfbc0..960ce4f7df 100644 --- a/api/services/app_dsl_service.py +++ b/api/services/app_dsl_service.py @@ -1,7 +1,7 @@ import logging import uuid from enum import StrEnum -from typing import Optional +from typing import Mapping, Optional from urllib.parse import urlparse from uuid import uuid4 @@ -256,6 +256,16 @@ class AppDslService: check_dependencies_pending_data = None if dependencies: check_dependencies_pending_data = [PluginDependency.model_validate(d) for d in dependencies] + elif imported_version <= "0.1.5": + if "workflow" in data: + graph = data.get("workflow", {}).get("graph", {}) + dependencies_list = self._extract_dependencies_from_workflow_graph(graph) + else: + dependencies_list = self._extract_dependencies_from_model_config(data.get("model_config", {})) + + check_dependencies_pending_data = DependenciesAnalysisService.generate_latest_dependencies( + dependencies_list + ) # Create or update app app = self._create_or_update_app( @@ -558,7 +568,7 @@ class AppDslService: raise ValueError("Missing app configuration, please check.") export_data["model_config"] = app_model_config.to_dict() - dependencies = cls._extract_dependencies_from_model_config(app_model_config) + dependencies = cls._extract_dependencies_from_model_config(app_model_config.to_dict()) export_data["dependencies"] = [ jsonable_encoder(d.model_dump()) for d in DependenciesAnalysisService.generate_dependencies( @@ -574,6 +584,16 @@ class AppDslService: :return: dependencies list format like ["langgenius/google"] """ graph = workflow.graph_dict + dependencies = cls._extract_dependencies_from_workflow_graph(graph) + return dependencies + + @classmethod + def _extract_dependencies_from_workflow_graph(cls, graph: Mapping) -> list[str]: + """ + Extract dependencies from workflow graph + :param graph: Workflow graph + :return: dependencies list format like ["langgenius/google"] + """ dependencies = [] for node in graph.get("nodes", []): try: @@ -647,24 +667,24 @@ class AppDslService: return dependencies @classmethod - def _extract_dependencies_from_model_config(cls, model_config: AppModelConfig) -> list[str]: + def _extract_dependencies_from_model_config(cls, model_config: Mapping) -> list[str]: """ Extract dependencies from model config - :param model_config: AppModelConfig instance - :return: dependencies list format like ["langgenius/google:1.0.0@abcdef1234567890"] + :param model_config: model config dict + :return: dependencies list format like ["langgenius/google"] """ dependencies = [] try: # completion model - model_dict = model_config.model_dict + model_dict = model_config.get("model", {}) if model_dict: dependencies.append( DependenciesAnalysisService.analyze_model_provider_dependency(model_dict.get("provider", "")) ) # reranking model - dataset_configs = model_config.dataset_configs_dict + dataset_configs = model_config.get("dataset_configs", {}) if dataset_configs: for dataset_config in dataset_configs.get("datasets", {}).get("datasets", []): if dataset_config.get("reranking_model"): @@ -677,7 +697,7 @@ class AppDslService: ) # tools - agent_configs = model_config.agent_mode_dict + agent_configs = model_config.get("agent_mode", {}) if agent_configs: for agent_config in agent_configs.get("tools", []): dependencies.append( diff --git a/api/services/plugin/dependencies_analysis.py b/api/services/plugin/dependencies_analysis.py index d425483863..df0c321a8b 100644 --- a/api/services/plugin/dependencies_analysis.py +++ b/api/services/plugin/dependencies_analysis.py @@ -1,3 +1,4 @@ +from core.helper import marketplace from core.plugin.entities.plugin import GenericProviderID, PluginDependency, PluginInstallationSource from core.plugin.manager.plugin import PluginInstallationManager @@ -98,3 +99,18 @@ class DependenciesAnalysisService: 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 + ]