From e7c89b6153f20b530bbca41e2f2426fb93dfd2ce Mon Sep 17 00:00:00 2001 From: Harry Date: Mon, 12 Jan 2026 13:36:15 +0800 Subject: [PATCH] refactor(sandbox): update imports and remove unused bash tool files, adjust DIFY_CLI_CONFIG_PATH --- api/core/sandbox/__init__.py | 2 ++ .../builtin_tool/providers => }/sandbox/bash_tool.py | 0 api/core/sandbox/constants.py | 2 +- api/{services => core}/sandbox/encryption.py | 0 api/core/sandbox/initializer.py | 9 +++------ api/core/sandbox/session.py | 2 +- .../tools/builtin_tool/providers/sandbox/__init__.py | 3 --- api/core/workflow/nodes/llm/entities.py | 2 +- api/core/workflow/nodes/llm/node.py | 2 +- api/services/sandbox/sandbox_provider_service.py | 2 +- 10 files changed, 10 insertions(+), 14 deletions(-) rename api/core/{tools/builtin_tool/providers => }/sandbox/bash_tool.py (100%) rename api/{services => core}/sandbox/encryption.py (100%) delete mode 100644 api/core/tools/builtin_tool/providers/sandbox/__init__.py diff --git a/api/core/sandbox/__init__.py b/api/core/sandbox/__init__.py index 0382c89d2c..c620d04f87 100644 --- a/api/core/sandbox/__init__.py +++ b/api/core/sandbox/__init__.py @@ -1,3 +1,4 @@ +from core.sandbox.bash_tool import SandboxBashTool from core.sandbox.constants import ( DIFY_CLI_CONFIG_PATH, DIFY_CLI_PATH, @@ -25,6 +26,7 @@ __all__ = [ "DifyCliInitializer", "DifyCliLocator", "DifyCliToolConfig", + "SandboxBashTool", "SandboxInitializer", "SandboxSession", ] diff --git a/api/core/tools/builtin_tool/providers/sandbox/bash_tool.py b/api/core/sandbox/bash_tool.py similarity index 100% rename from api/core/tools/builtin_tool/providers/sandbox/bash_tool.py rename to api/core/sandbox/bash_tool.py diff --git a/api/core/sandbox/constants.py b/api/core/sandbox/constants.py index 8b9ab79bc2..9c0e2dfe51 100644 --- a/api/core/sandbox/constants.py +++ b/api/core/sandbox/constants.py @@ -6,4 +6,4 @@ DIFY_CLI_PATH: Final[str] = "/work/.dify/bin/dify" DIFY_CLI_PATH_PATTERN: Final[str] = "dify-cli-{os}-{arch}" -DIFY_CLI_CONFIG_PATH: Final[str] = "/work/config.json" +DIFY_CLI_CONFIG_PATH: Final[str] = "/work/.dify_cli.json" diff --git a/api/services/sandbox/encryption.py b/api/core/sandbox/encryption.py similarity index 100% rename from api/services/sandbox/encryption.py rename to api/core/sandbox/encryption.py diff --git a/api/core/sandbox/initializer.py b/api/core/sandbox/initializer.py index 05b9b845b3..ae44949469 100644 --- a/api/core/sandbox/initializer.py +++ b/api/core/sandbox/initializer.py @@ -2,20 +2,17 @@ import logging from abc import ABC, abstractmethod from io import BytesIO from pathlib import Path -from typing import TYPE_CHECKING from core.sandbox.constants import DIFY_CLI_PATH from core.sandbox.dify_cli import DifyCliLocator - -if TYPE_CHECKING: - from core.virtual_environment.__base.virtual_environment import VirtualEnvironment +from core.virtual_environment.__base.virtual_environment import VirtualEnvironment logger = logging.getLogger(__name__) class SandboxInitializer(ABC): @abstractmethod - def initialize(self, env: "VirtualEnvironment") -> None: + def initialize(self, env: VirtualEnvironment) -> None: ... @@ -23,7 +20,7 @@ class DifyCliInitializer(SandboxInitializer): def __init__(self, cli_root: str | Path | None = None) -> None: self._locator = DifyCliLocator(root=cli_root) - def initialize(self, env: "VirtualEnvironment") -> None: + def initialize(self, env: VirtualEnvironment) -> None: binary = self._locator.resolve(env.metadata.os, env.metadata.arch) env.upload_file(DIFY_CLI_PATH, BytesIO(binary.path.read_bytes())) diff --git a/api/core/sandbox/session.py b/api/core/sandbox/session.py index 15051ecf93..53d0f0d376 100644 --- a/api/core/sandbox/session.py +++ b/api/core/sandbox/session.py @@ -5,12 +5,12 @@ import logging from io import BytesIO from types import TracebackType +from core.sandbox.bash_tool import SandboxBashTool from core.sandbox.constants import DIFY_CLI_CONFIG_PATH, DIFY_CLI_PATH from core.sandbox.dify_cli import DifyCliConfig from core.sandbox.manager import SandboxManager from core.session.inner_api import InnerApiSessionManager from core.tools.__base.tool import Tool -from core.tools.builtin_tool.providers.sandbox.bash_tool import SandboxBashTool from core.virtual_environment.__base.virtual_environment import VirtualEnvironment logger = logging.getLogger(__name__) diff --git a/api/core/tools/builtin_tool/providers/sandbox/__init__.py b/api/core/tools/builtin_tool/providers/sandbox/__init__.py deleted file mode 100644 index 039f0311ca..0000000000 --- a/api/core/tools/builtin_tool/providers/sandbox/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from core.tools.builtin_tool.providers.sandbox.bash_tool import SandboxBashTool - -__all__ = ["SandboxBashTool"] diff --git a/api/core/workflow/nodes/llm/entities.py b/api/core/workflow/nodes/llm/entities.py index 0d61e45003..a04da8b6e0 100644 --- a/api/core/workflow/nodes/llm/entities.py +++ b/api/core/workflow/nodes/llm/entities.py @@ -357,7 +357,7 @@ class LLMNodeData(BaseNodeData): # Tool support tools: Sequence[ToolMetadata] = Field(default_factory=list) - max_iterations: int | None = Field(default=None, description="Maximum number of iterations for the LLM node") + max_iterations: int | None = Field(default=100, description="Maximum number of iterations for the LLM node") @field_validator("prompt_config", mode="before") @classmethod diff --git a/api/core/workflow/nodes/llm/node.py b/api/core/workflow/nodes/llm/node.py index 123da76b58..221210bb6e 100644 --- a/api/core/workflow/nodes/llm/node.py +++ b/api/core/workflow/nodes/llm/node.py @@ -1609,7 +1609,7 @@ class LLMNode(Node[LLMNodeData]): model_instance=model_instance, tools=[sandbox_session.bash_tool], files=prompt_files, - max_iterations=self._node_data.max_iterations or 10, + max_iterations=self._node_data.max_iterations or 100, context=ExecutionContext(user_id=self.user_id, app_id=self.app_id, tenant_id=self.tenant_id), ) diff --git a/api/services/sandbox/sandbox_provider_service.py b/api/services/sandbox/sandbox_provider_service.py index 21df858b04..5c11b9390b 100644 --- a/api/services/sandbox/sandbox_provider_service.py +++ b/api/services/sandbox/sandbox_provider_service.py @@ -19,6 +19,7 @@ from sqlalchemy.orm import Session from configs import dify_config from constants import HIDDEN_VALUE from core.entities.provider_entities import BasicProviderConfig +from core.sandbox.encryption import create_sandbox_config_encrypter, masked_config from core.sandbox.factory import VMFactory, VMType from core.sandbox.initializer import DifyCliInitializer from core.tools.utils.system_encryption import ( @@ -27,7 +28,6 @@ from core.tools.utils.system_encryption import ( from core.virtual_environment.__base.virtual_environment import VirtualEnvironment from extensions.ext_database import db from models.sandbox import SandboxProvider, SandboxProviderSystemConfig -from services.sandbox.encryption import create_sandbox_config_encrypter, masked_config logger = logging.getLogger(__name__)