From d32996b8c97a3a49b6e6ceb60f7a6b8379f494c9 Mon Sep 17 00:00:00 2001 From: Yeuoly Date: Thu, 22 Jan 2026 19:58:38 +0800 Subject: [PATCH] feat: enhance sandbox initializers with async and sync support --- api/core/sandbox/__init__.py | 15 ++++++++++++++- .../sandbox/initializer/dify_cli_initializer.py | 2 +- api/core/sandbox/initializer/skill_initializer.py | 11 ++--------- api/core/skill/skill_manager.py | 9 +++++++-- 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/api/core/sandbox/__init__.py b/api/core/sandbox/__init__.py index 77893e20a1..3d175c81cc 100644 --- a/api/core/sandbox/__init__.py +++ b/api/core/sandbox/__init__.py @@ -14,7 +14,14 @@ if TYPE_CHECKING: from .bash.session import SandboxBashSession from .builder import SandboxBuilder, VMConfig from .entities import AppAssets, DifyCli, SandboxProviderApiEntity, SandboxType - from .initializer import AppAssetsInitializer, DifyCliInitializer, SandboxInitializer + from .initializer import ( + AppAssetsInitializer, + AsyncSandboxInitializer, + DifyCliInitializer, + DraftAppAssetsInitializer, + SandboxInitializer, + SyncSandboxInitializer, + ) from .manager import SandboxManager from .sandbox import Sandbox from .storage import ArchiveSandboxStorage, SandboxStorage @@ -25,6 +32,7 @@ __all__ = [ "AppAssets", "AppAssetsInitializer", "ArchiveSandboxStorage", + "AsyncSandboxInitializer", "DifyCli", "DifyCliBinary", "DifyCliConfig", @@ -32,6 +40,7 @@ __all__ = [ "DifyCliInitializer", "DifyCliLocator", "DifyCliToolConfig", + "DraftAppAssetsInitializer", "Sandbox", "SandboxBashSession", "SandboxBuilder", @@ -40,6 +49,7 @@ __all__ = [ "SandboxProviderApiEntity", "SandboxStorage", "SandboxType", + "SyncSandboxInitializer", "VMConfig", "create_sandbox_config_encrypter", "masked_config", @@ -49,6 +59,7 @@ __all__ = [ _LAZY_IMPORTS = { "AppAssets": ("core.sandbox.entities", "AppAssets"), "AppAssetsInitializer": ("core.sandbox.initializer", "AppAssetsInitializer"), + "AsyncSandboxInitializer": ("core.sandbox.initializer", "AsyncSandboxInitializer"), "ArchiveSandboxStorage": ("core.sandbox.storage", "ArchiveSandboxStorage"), "DifyCli": ("core.sandbox.entities", "DifyCli"), "DifyCliBinary": ("core.sandbox.bash.dify_cli", "DifyCliBinary"), @@ -57,6 +68,7 @@ _LAZY_IMPORTS = { "DifyCliInitializer": ("core.sandbox.initializer", "DifyCliInitializer"), "DifyCliLocator": ("core.sandbox.bash.dify_cli", "DifyCliLocator"), "DifyCliToolConfig": ("core.sandbox.bash.dify_cli", "DifyCliToolConfig"), + "DraftAppAssetsInitializer": ("core.sandbox.initializer", "DraftAppAssetsInitializer"), "Sandbox": ("core.sandbox.sandbox", "Sandbox"), "SandboxBashSession": ("core.sandbox.bash.session", "SandboxBashSession"), "SandboxBuilder": ("core.sandbox.builder", "SandboxBuilder"), @@ -65,6 +77,7 @@ _LAZY_IMPORTS = { "SandboxProviderApiEntity": ("core.sandbox.entities", "SandboxProviderApiEntity"), "SandboxStorage": ("core.sandbox.storage", "SandboxStorage"), "SandboxType": ("core.sandbox.entities", "SandboxType"), + "SyncSandboxInitializer": ("core.sandbox.initializer", "SyncSandboxInitializer"), "VMConfig": ("core.sandbox.builder", "VMConfig"), "create_sandbox_config_encrypter": ("core.sandbox.utils.encryption", "create_sandbox_config_encrypter"), "masked_config": ("core.sandbox.utils.encryption", "masked_config"), diff --git a/api/core/sandbox/initializer/dify_cli_initializer.py b/api/core/sandbox/initializer/dify_cli_initializer.py index 816260a264..f9b79dad8e 100644 --- a/api/core/sandbox/initializer/dify_cli_initializer.py +++ b/api/core/sandbox/initializer/dify_cli_initializer.py @@ -61,7 +61,7 @@ class DifyCliInitializer(AsyncSandboxInitializer): logger.info("Dify CLI uploaded to sandbox, path=%s", DifyCli.PATH) artifact = SkillManager.load_artifact(self._tenant_id, self._app_id, self._assets_id) - if artifact is None or not artifact.get_tool_artifact().is_empty: + if not artifact.get_tool_artifact().is_empty(): logger.info("No tools found in artifact for assets_id=%s", self._assets_id) return diff --git a/api/core/sandbox/initializer/skill_initializer.py b/api/core/sandbox/initializer/skill_initializer.py index 2f87fbf22f..17c8a66d08 100644 --- a/api/core/sandbox/initializer/skill_initializer.py +++ b/api/core/sandbox/initializer/skill_initializer.py @@ -24,20 +24,13 @@ class SkillInitializer(SyncSandboxInitializer): self._user_id = user_id self._assets_id = assets_id - def initialize(self, sandbox: Sandbox) -> None: + def initialize(self, env: Sandbox) -> None: artifact_set = SkillManager.load_artifact( self._tenant_id, self._app_id, self._assets_id, ) - if artifact_set is None: - raise ValueError( - f"No skill artifact set found for tenant_id={self._tenant_id}," - f"app_id={self._app_id}, " - f"assets_id={self._assets_id} " - ) - - sandbox.attrs.set( + env.attrs.set( SkillAttrs.ARTIFACT_SET, artifact_set, ) diff --git a/api/core/skill/skill_manager.py b/api/core/skill/skill_manager.py index c222c4b996..7acde32ebc 100644 --- a/api/core/skill/skill_manager.py +++ b/api/core/skill/skill_manager.py @@ -1,7 +1,11 @@ +import logging + from core.app_assets.paths import AssetPaths from core.skill.entities.skill_artifact_set import SkillArtifactSet from extensions.ext_storage import storage +logger = logging.getLogger(__name__) + class SkillManager: @staticmethod @@ -9,13 +13,14 @@ class SkillManager: tenant_id: str, app_id: str, assets_id: str, - ) -> SkillArtifactSet | None: + ) -> SkillArtifactSet: key = AssetPaths.build_skill_artifact_set(tenant_id, app_id, assets_id) try: data = storage.load_once(key) return SkillArtifactSet.model_validate_json(data) except Exception: - return None + logger.info("Skill artifact set missing or invalid for assets_id=%s", assets_id) + return SkillArtifactSet(assets_id=assets_id) @staticmethod def save_artifact(