fix: using latest plugin as the dep of DSL under 0.1.15

This commit is contained in:
Yeuoly 2025-02-08 14:53:43 +08:00
parent 3e9c3d0bb7
commit 8d5a8f0153
2 changed files with 44 additions and 8 deletions

View File

@ -1,7 +1,7 @@
import logging import logging
import uuid import uuid
from enum import StrEnum from enum import StrEnum
from typing import Optional from typing import Mapping, Optional
from urllib.parse import urlparse from urllib.parse import urlparse
from uuid import uuid4 from uuid import uuid4
@ -256,6 +256,16 @@ class AppDslService:
check_dependencies_pending_data = None check_dependencies_pending_data = None
if dependencies: if dependencies:
check_dependencies_pending_data = [PluginDependency.model_validate(d) for d in 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 # Create or update app
app = self._create_or_update_app( app = self._create_or_update_app(
@ -558,7 +568,7 @@ class AppDslService:
raise ValueError("Missing app configuration, please check.") raise ValueError("Missing app configuration, please check.")
export_data["model_config"] = app_model_config.to_dict() 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"] = [ export_data["dependencies"] = [
jsonable_encoder(d.model_dump()) jsonable_encoder(d.model_dump())
for d in DependenciesAnalysisService.generate_dependencies( for d in DependenciesAnalysisService.generate_dependencies(
@ -574,6 +584,16 @@ class AppDslService:
:return: dependencies list format like ["langgenius/google"] :return: dependencies list format like ["langgenius/google"]
""" """
graph = workflow.graph_dict 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 = [] dependencies = []
for node in graph.get("nodes", []): for node in graph.get("nodes", []):
try: try:
@ -647,24 +667,24 @@ class AppDslService:
return dependencies return dependencies
@classmethod @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 Extract dependencies from model config
:param model_config: AppModelConfig instance :param model_config: model config dict
:return: dependencies list format like ["langgenius/google:1.0.0@abcdef1234567890"] :return: dependencies list format like ["langgenius/google"]
""" """
dependencies = [] dependencies = []
try: try:
# completion model # completion model
model_dict = model_config.model_dict model_dict = model_config.get("model", {})
if model_dict: if model_dict:
dependencies.append( dependencies.append(
DependenciesAnalysisService.analyze_model_provider_dependency(model_dict.get("provider", "")) DependenciesAnalysisService.analyze_model_provider_dependency(model_dict.get("provider", ""))
) )
# reranking model # reranking model
dataset_configs = model_config.dataset_configs_dict dataset_configs = model_config.get("dataset_configs", {})
if dataset_configs: if dataset_configs:
for dataset_config in dataset_configs.get("datasets", {}).get("datasets", []): for dataset_config in dataset_configs.get("datasets", {}).get("datasets", []):
if dataset_config.get("reranking_model"): if dataset_config.get("reranking_model"):
@ -677,7 +697,7 @@ class AppDslService:
) )
# tools # tools
agent_configs = model_config.agent_mode_dict agent_configs = model_config.get("agent_mode", {})
if agent_configs: if agent_configs:
for agent_config in agent_configs.get("tools", []): for agent_config in agent_configs.get("tools", []):
dependencies.append( dependencies.append(

View File

@ -1,3 +1,4 @@
from core.helper import marketplace
from core.plugin.entities.plugin import GenericProviderID, PluginDependency, PluginInstallationSource from core.plugin.entities.plugin import GenericProviderID, PluginDependency, PluginInstallationSource
from core.plugin.manager.plugin import PluginInstallationManager from core.plugin.manager.plugin import PluginInstallationManager
@ -98,3 +99,18 @@ class DependenciesAnalysisService:
raise ValueError(f"Unknown plugin source: {plugin.source}") raise ValueError(f"Unknown plugin source: {plugin.source}")
return result 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
]