Merge branch 'feat/support-agent-sandbox' into sandboxed-agent-rebase

This commit is contained in:
Novice
2026-03-23 20:19:16 +08:00
48 changed files with 322 additions and 2149 deletions

View File

@ -4,7 +4,6 @@ import json
from collections.abc import Generator, Mapping, Sequence
from typing import TYPE_CHECKING, Any, cast
from dify_graph.nodes.agent.entities import AgentNodeData, AgentOldVersionModelFeatures, ParamsAutoGenerated
from packaging.version import Version
from pydantic import ValidationError
from sqlalchemy import select
@ -26,6 +25,16 @@ from core.tools.entities.tool_entities import (
)
from core.tools.tool_manager import ToolManager
from core.tools.utils.message_transformer import ToolFileMessageTransformer
from core.workflow.nodes.agent.entities import AgentNodeData, AgentOldVersionModelFeatures, ParamsAutoGenerated
from core.workflow.nodes.agent.exceptions import (
AgentInputTypeError,
AgentInvocationError,
AgentMessageTransformError,
AgentNodeError,
AgentVariableNotFoundError,
AgentVariableTypeError,
ToolFileNotFoundError,
)
from dify_graph.enums import (
NodeType,
SystemVariableKey,
@ -60,16 +69,6 @@ from models import ToolFile
from models.model import Conversation
from services.tools.builtin_tools_manage_service import BuiltinToolManageService
from .exc import (
AgentInputTypeError,
AgentInvocationError,
AgentMessageTransformError,
AgentNodeError,
AgentVariableNotFoundError,
AgentVariableTypeError,
ToolFileNotFoundError,
)
if TYPE_CHECKING:
from core.agent.strategy.plugin import PluginAgentStrategy
from core.plugin.entities.request import InvokeCredentials
@ -387,10 +386,9 @@ class AgentNode(Node[AgentNodeData]):
*,
graph_config: Mapping[str, Any],
node_id: str,
node_data: Mapping[str, Any],
node_data: AgentNodeData,
) -> Mapping[str, Sequence[str]]:
# Create typed NodeData from dict
typed_node_data = AgentNodeData.model_validate(node_data)
typed_node_data = node_data
result: dict[str, Any] = {}
for parameter_name in typed_node_data.agent_parameters:

View File

@ -321,6 +321,18 @@ class Node(Generic[NodeDataT]):
return cast(DifyRunContextProtocol, raw_ctx)
@property
def tenant_id(self) -> str:
return self.require_dify_context().tenant_id
@property
def app_id(self) -> str:
return self.require_dify_context().app_id
@property
def user_id(self) -> str:
return self.require_dify_context().user_id
@property
def execution_id(self) -> str:
return self._node_execution_id

File diff suppressed because it is too large Load Diff

View File

@ -165,12 +165,12 @@ class QuestionClassifierNode(Node[QuestionClassifierNodeData]):
try:
# handle invoke result
generator = LLMNode.invoke_llm(
node_data_model=node_data.model,
model_instance=model_instance,
prompt_messages=prompt_messages,
stop=stop,
user_id=self.require_dify_context().user_id,
structured_output_enabled=False,
structured_output=None,
structured_output_schema=None,
file_saver=self._llm_file_saver,
file_outputs=self._file_outputs,
node_id=self._node_id,

View File

@ -10,6 +10,7 @@ from core.tools.utils.message_transformer import ToolFileMessageTransformer
from dify_graph.entities.graph_config import NodeConfigDict
from dify_graph.enums import (
BuiltinNodeTypes,
NodeType,
SystemVariableKey,
WorkflowNodeExecutionMetadataKey,
WorkflowNodeExecutionStatus,
@ -578,7 +579,7 @@ class ToolNode(Node[ToolNodeData]):
:param parent_node_id: the parent node id to find nested nodes for
:return: mapping of variable key to variable selector
"""
from dify_graph.nodes.node_mapping import NODE_TYPE_CLASSES_MAPPING
from core.workflow.node_factory import NODE_TYPE_CLASSES_MAPPING
result: dict[str, Sequence[str]] = {}
nodes = graph_config.get("nodes", [])