mirror of
https://github.com/langgenius/dify.git
synced 2026-05-03 08:58:09 +08:00
feat: enhance sandbox initializers with async and sync support
This commit is contained in:
@ -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"),
|
||||
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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,
|
||||
)
|
||||
|
||||
@ -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(
|
||||
|
||||
Reference in New Issue
Block a user