Parcourir la source

fix(agent node): tool setting and workflow tool. (#14461)

Novice il y a 1 mois
Parent
commit
bb4fecf3d1

+ 43 - 6
api/core/workflow/nodes/agent/agent_node.py

@@ -8,12 +8,12 @@ from core.model_manager import ModelManager
 from core.model_runtime.entities.model_entities import ModelType
 from core.plugin.manager.exc import PluginDaemonClientSideError
 from core.plugin.manager.plugin import PluginInstallationManager
-from core.tools.entities.tool_entities import ToolProviderType
+from core.tools.entities.tool_entities import ToolParameter, ToolProviderType
 from core.tools.tool_manager import ToolManager
 from core.workflow.entities.node_entities import NodeRunResult
 from core.workflow.entities.variable_pool import VariablePool
 from core.workflow.enums import SystemVariableKey
-from core.workflow.nodes.agent.entities import AgentNodeData
+from core.workflow.nodes.agent.entities import AgentNodeData, ParamsAutoGenerated
 from core.workflow.nodes.base.entities import BaseNodeData
 from core.workflow.nodes.enums import NodeType
 from core.workflow.nodes.event.event import RunCompletedEvent
@@ -156,16 +156,38 @@ class AgentNode(ToolNode):
                 value = cast(list[dict[str, Any]], value)
                 value = [tool for tool in value if tool.get("enabled", False)]
 
+                for tool in value:
+                    if "schemas" in tool:
+                        tool.pop("schemas")
+                    parameters = tool.get("parameters", {})
+                    if all(isinstance(v, dict) for _, v in parameters.items()):
+                        params = {}
+                        for key, param in parameters.items():
+                            if param.get("auto", ParamsAutoGenerated.OPEN.value) == ParamsAutoGenerated.CLOSE.value:
+                                value_param = param.get("value", {})
+                                params[key] = value_param.get("value", "") if value_param is not None else None
+                            else:
+                                params[key] = None
+                        parameters = params
+                    tool["settings"] = {k: v.get("value", None) for k, v in tool.get("settings", {}).items()}
+                    tool["parameters"] = parameters
+
             if not for_log:
                 if parameter.type == "array[tools]":
                     value = cast(list[dict[str, Any]], value)
                     tool_value = []
                     for tool in value:
+                        provider_type = ToolProviderType(tool.get("type", ToolProviderType.BUILT_IN.value))
+                        setting_params = tool.get("settings", {})
+                        parameters = tool.get("parameters", {})
+                        manual_input_params = [key for key, value in parameters.items() if value is not None]
+
+                        parameters = {**parameters, **setting_params}
                         entity = AgentToolEntity(
                             provider_id=tool.get("provider_name", ""),
-                            provider_type=ToolProviderType.BUILT_IN,
+                            provider_type=provider_type,
                             tool_name=tool.get("tool_name", ""),
-                            tool_parameters=tool.get("parameters", {}),
+                            tool_parameters=parameters,
                             plugin_unique_identifier=tool.get("plugin_unique_identifier", None),
                         )
 
@@ -178,11 +200,26 @@ class AgentNode(ToolNode):
                             tool_runtime.entity.description.llm = (
                                 extra.get("descrption", "") or tool_runtime.entity.description.llm
                             )
-
+                        for tool_runtime_params in tool_runtime.entity.parameters:
+                            tool_runtime_params.form = (
+                                ToolParameter.ToolParameterForm.FORM
+                                if tool_runtime_params.name in manual_input_params
+                                else tool_runtime_params.form
+                            )
+                        manual_input_value = {}
+                        if tool_runtime.entity.parameters:
+                            manual_input_value = {
+                                key: value for key, value in parameters.items() if key in manual_input_params
+                            }
+                        runtime_parameters = {
+                            **tool_runtime.runtime.runtime_parameters,
+                            **manual_input_value,
+                        }
                         tool_value.append(
                             {
                                 **tool_runtime.entity.model_dump(mode="json"),
-                                "runtime_parameters": tool_runtime.runtime.runtime_parameters,
+                                "runtime_parameters": runtime_parameters,
+                                "provider_type": provider_type.value,
                             }
                         )
                     value = tool_value

+ 6 - 0
api/core/workflow/nodes/agent/entities.py

@@ -1,3 +1,4 @@
+from enum import Enum
 from typing import Any, Literal, Union
 
 from pydantic import BaseModel
@@ -16,3 +17,8 @@ class AgentNodeData(BaseNodeData):
         type: Literal["mixed", "variable", "constant"]
 
     agent_parameters: dict[str, AgentInput]
+
+
+class ParamsAutoGenerated(Enum):
+    CLOSE = 0
+    OPEN = 1