mirror of
https://github.com/langgenius/dify.git
synced 2026-05-13 08:57:28 +08:00
Close 3 integration gaps between the ported Sandbox system and Agent V2: 1. Fix _invoke_tool_in_sandbox to use SandboxBashSession context manager API correctly (keyword args, bash_tool, ToolReference), with graceful fallback to direct invocation when DifyCli binary is unavailable. 2. Inject sandbox into run_context via _resolve_sandbox_context() in WorkflowBasedAppRunner — automatically creates a sandbox when a tenant has an active sandbox provider configured. 3. Register SandboxLayer in both advanced_chat and workflow app runners for proper sandbox lifecycle cleanup on graph end. Also: make SkillInitializer non-fatal when no skill bundle exists, add node_id to ExecutionContext for sandbox session scoping. Made-with: Cursor
38 lines
1.3 KiB
Python
38 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from core.sandbox.sandbox import Sandbox
|
|
from core.skill import SkillAttrs
|
|
from core.skill.skill_manager import SkillManager
|
|
|
|
from .base import SandboxInitializeContext, SyncSandboxInitializer
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class SkillInitializer(SyncSandboxInitializer):
|
|
"""Ensure ``sandbox.attrs[BUNDLE]`` is populated for downstream consumers.
|
|
|
|
In the draft path ``DraftAppAssetsInitializer`` already sets the
|
|
bundle on attrs from the in-memory build result, so this initializer
|
|
becomes a no-op. In the published path no prior initializer sets
|
|
it, so we fall back to ``SkillManager.load_bundle()`` (Redis/S3).
|
|
"""
|
|
|
|
def initialize(self, sandbox: Sandbox, ctx: SandboxInitializeContext) -> None:
|
|
if sandbox.attrs.has(SkillAttrs.BUNDLE):
|
|
return
|
|
|
|
try:
|
|
bundle = SkillManager.load_bundle(
|
|
ctx.tenant_id,
|
|
ctx.app_id,
|
|
ctx.assets_id,
|
|
)
|
|
sandbox.attrs.set(SkillAttrs.BUNDLE, bundle)
|
|
except FileNotFoundError:
|
|
logger.debug("No skill bundle found for app %s, skipping skill initialization", ctx.app_id)
|
|
except Exception:
|
|
logger.warning("Failed to load skill bundle for app %s, skipping", ctx.app_id, exc_info=True)
|