feat: enhance sandbox initializers with async and sync support

This commit is contained in:
Yeuoly
2026-01-22 19:58:38 +08:00
parent a3cf73b220
commit d32996b8c9
4 changed files with 24 additions and 13 deletions

View File

@ -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"),

View File

@ -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

View File

@ -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,
)

View File

@ -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(