mirror of
https://git.mirrors.martin98.com/https://github.com/langgenius/dify.git
synced 2025-08-18 05:15:56 +08:00
feat: add agent node log
This commit is contained in:
parent
172c5f19cc
commit
491d641485
@ -329,6 +329,7 @@ class QueueAgentLogEvent(AppQueueEvent):
|
|||||||
error: str | None
|
error: str | None
|
||||||
status: str
|
status: str
|
||||||
data: Mapping[str, Any]
|
data: Mapping[str, Any]
|
||||||
|
metadata: Optional[Mapping[str, Any]] = None
|
||||||
|
|
||||||
|
|
||||||
class QueueNodeRetryEvent(QueueNodeStartedEvent):
|
class QueueNodeRetryEvent(QueueNodeStartedEvent):
|
||||||
|
@ -716,6 +716,7 @@ class AgentLogStreamResponse(StreamResponse):
|
|||||||
error: str | None
|
error: str | None
|
||||||
status: str
|
status: str
|
||||||
data: Mapping[str, Any]
|
data: Mapping[str, Any]
|
||||||
|
metadata: Optional[Mapping[str, Any]] = None
|
||||||
|
|
||||||
event: StreamEvent = StreamEvent.AGENT_LOG
|
event: StreamEvent = StreamEvent.AGENT_LOG
|
||||||
data: Data
|
data: Data
|
||||||
|
@ -862,5 +862,6 @@ class WorkflowCycleManage:
|
|||||||
error=event.error,
|
error=event.error,
|
||||||
status=event.status,
|
status=event.status,
|
||||||
data=event.data,
|
data=event.data,
|
||||||
|
metadata=event.metadata,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -167,6 +167,7 @@ class ToolInvokeMessage(BaseModel):
|
|||||||
error: Optional[str] = Field(default=None, description="The error message")
|
error: Optional[str] = Field(default=None, description="The error message")
|
||||||
status: LogStatus = Field(..., description="The status of the log")
|
status: LogStatus = Field(..., description="The status of the log")
|
||||||
data: Mapping[str, Any] = Field(..., description="Detailed log data")
|
data: Mapping[str, Any] = Field(..., description="Detailed log data")
|
||||||
|
metadata: Optional[Mapping[str, Any]] = Field(default=None, description="The metadata of the log")
|
||||||
|
|
||||||
class MessageType(Enum):
|
class MessageType(Enum):
|
||||||
TEXT = "text"
|
TEXT = "text"
|
||||||
|
@ -203,6 +203,7 @@ class AgentLogEvent(BaseAgentEvent):
|
|||||||
error: str | None = Field(..., description="error")
|
error: str | None = Field(..., description="error")
|
||||||
status: str = Field(..., description="status")
|
status: str = Field(..., description="status")
|
||||||
data: Mapping[str, Any] = Field(..., description="data")
|
data: Mapping[str, Any] = Field(..., description="data")
|
||||||
|
metadata: Optional[Mapping[str, Any]] = Field(default=None, description="metadata")
|
||||||
|
|
||||||
|
|
||||||
InNodeEvent = BaseNodeEvent | BaseParallelBranchEvent | BaseIterationEvent | BaseAgentEvent
|
InNodeEvent = BaseNodeEvent | BaseParallelBranchEvent | BaseIterationEvent | BaseAgentEvent
|
||||||
|
@ -89,7 +89,11 @@ class AgentNode(ToolNode):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
# convert tool messages
|
# convert tool messages
|
||||||
yield from self._transform_message(message_stream, {}, parameters_for_log)
|
yield from self._transform_message(
|
||||||
|
message_stream,
|
||||||
|
{"provider": (cast(AgentNodeData, self.node_data)).agent_strategy_provider_name},
|
||||||
|
parameters_for_log,
|
||||||
|
)
|
||||||
except PluginDaemonClientSideError as e:
|
except PluginDaemonClientSideError as e:
|
||||||
yield RunCompletedEvent(
|
yield RunCompletedEvent(
|
||||||
run_result=NodeRunResult(
|
run_result=NodeRunResult(
|
||||||
@ -170,7 +174,12 @@ class AgentNode(ToolNode):
|
|||||||
extra.get("descrption", "") or tool_runtime.entity.description.llm
|
extra.get("descrption", "") or tool_runtime.entity.description.llm
|
||||||
)
|
)
|
||||||
|
|
||||||
tool_value.append(tool_runtime.entity.model_dump(mode="json"))
|
tool_value.append(
|
||||||
|
{
|
||||||
|
**tool_runtime.entity.model_dump(mode="json"),
|
||||||
|
"runtime_parameters": tool_runtime.runtime.runtime_parameters,
|
||||||
|
}
|
||||||
|
)
|
||||||
value = tool_value
|
value = tool_value
|
||||||
if parameter.type == "model-selector":
|
if parameter.type == "model-selector":
|
||||||
value = cast(dict[str, Any], value)
|
value = cast(dict[str, Any], value)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
from collections.abc import Generator, Mapping, Sequence
|
from collections.abc import Generator, Mapping, Sequence
|
||||||
from typing import Any, cast
|
from typing import Any, Optional, cast
|
||||||
|
|
||||||
from sqlalchemy import select
|
from sqlalchemy import select
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
@ -197,6 +197,7 @@ class ToolNode(BaseNode[ToolNodeData]):
|
|||||||
json: list[dict] = []
|
json: list[dict] = []
|
||||||
|
|
||||||
agent_logs: list[AgentLogEvent] = []
|
agent_logs: list[AgentLogEvent] = []
|
||||||
|
agent_execution_metadata: Optional[Mapping[NodeRunMetadataKey, Any]] = {}
|
||||||
|
|
||||||
variables: dict[str, Any] = {}
|
variables: dict[str, Any] = {}
|
||||||
|
|
||||||
@ -264,6 +265,11 @@ class ToolNode(BaseNode[ToolNodeData]):
|
|||||||
)
|
)
|
||||||
elif message.type == ToolInvokeMessage.MessageType.JSON:
|
elif message.type == ToolInvokeMessage.MessageType.JSON:
|
||||||
assert isinstance(message.message, ToolInvokeMessage.JsonMessage)
|
assert isinstance(message.message, ToolInvokeMessage.JsonMessage)
|
||||||
|
if self.node_type == NodeType.AGENT:
|
||||||
|
msg_metadata = message.message.json_object.pop("execution_metadata", {})
|
||||||
|
agent_execution_metadata = {
|
||||||
|
key: value for key, value in msg_metadata.items() if key in NodeRunMetadataKey
|
||||||
|
}
|
||||||
json.append(message.message.json_object)
|
json.append(message.message.json_object)
|
||||||
elif message.type == ToolInvokeMessage.MessageType.LINK:
|
elif message.type == ToolInvokeMessage.MessageType.LINK:
|
||||||
assert isinstance(message.message, ToolInvokeMessage.TextMessage)
|
assert isinstance(message.message, ToolInvokeMessage.TextMessage)
|
||||||
@ -299,6 +305,7 @@ class ToolNode(BaseNode[ToolNodeData]):
|
|||||||
status=message.message.status.value,
|
status=message.message.status.value,
|
||||||
data=message.message.data,
|
data=message.message.data,
|
||||||
label=message.message.label,
|
label=message.message.label,
|
||||||
|
metadata=message.message.metadata,
|
||||||
)
|
)
|
||||||
|
|
||||||
# check if the agent log is already in the list
|
# check if the agent log is already in the list
|
||||||
@ -309,6 +316,7 @@ class ToolNode(BaseNode[ToolNodeData]):
|
|||||||
log.status = agent_log.status
|
log.status = agent_log.status
|
||||||
log.error = agent_log.error
|
log.error = agent_log.error
|
||||||
log.label = agent_log.label
|
log.label = agent_log.label
|
||||||
|
log.metadata = agent_log.metadata
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
agent_logs.append(agent_log)
|
agent_logs.append(agent_log)
|
||||||
@ -319,7 +327,11 @@ class ToolNode(BaseNode[ToolNodeData]):
|
|||||||
run_result=NodeRunResult(
|
run_result=NodeRunResult(
|
||||||
status=WorkflowNodeExecutionStatus.SUCCEEDED,
|
status=WorkflowNodeExecutionStatus.SUCCEEDED,
|
||||||
outputs={"text": text, "files": files, "json": json, **variables},
|
outputs={"text": text, "files": files, "json": json, **variables},
|
||||||
metadata={NodeRunMetadataKey.TOOL_INFO: tool_info, NodeRunMetadataKey.AGENT_LOG: agent_logs},
|
metadata={
|
||||||
|
**agent_execution_metadata,
|
||||||
|
NodeRunMetadataKey.TOOL_INFO: tool_info,
|
||||||
|
NodeRunMetadataKey.AGENT_LOG: agent_logs,
|
||||||
|
},
|
||||||
inputs=parameters_for_log,
|
inputs=parameters_for_log,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user