|
|
|
@ -267,7 +267,7 @@ class GraphEngine:
|
|
|
|
previous_node_id = previous_route_node_state.node_id if previous_route_node_state else None
|
|
|
|
previous_node_id = previous_route_node_state.node_id if previous_route_node_state else None
|
|
|
|
|
|
|
|
|
|
|
|
# init workflow run state
|
|
|
|
# init workflow run state
|
|
|
|
node_instance = node_cls(
|
|
|
|
node = node_cls(
|
|
|
|
id=route_node_state.id,
|
|
|
|
id=route_node_state.id,
|
|
|
|
config=node_config,
|
|
|
|
config=node_config,
|
|
|
|
graph_init_params=self.init_params,
|
|
|
|
graph_init_params=self.init_params,
|
|
|
|
@ -276,11 +276,11 @@ class GraphEngine:
|
|
|
|
previous_node_id=previous_node_id,
|
|
|
|
previous_node_id=previous_node_id,
|
|
|
|
thread_pool_id=self.thread_pool_id,
|
|
|
|
thread_pool_id=self.thread_pool_id,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
node_instance.init_node_data(node_config.get("data", {}))
|
|
|
|
node.init_node_data(node_config.get("data", {}))
|
|
|
|
try:
|
|
|
|
try:
|
|
|
|
# run node
|
|
|
|
# run node
|
|
|
|
generator = self._run_node(
|
|
|
|
generator = self._run_node(
|
|
|
|
node_instance=node_instance,
|
|
|
|
node=node,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
parallel_id=in_parallel_id,
|
|
|
|
parallel_id=in_parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
@ -308,16 +308,16 @@ class GraphEngine:
|
|
|
|
route_node_state.failed_reason = str(e)
|
|
|
|
route_node_state.failed_reason = str(e)
|
|
|
|
yield NodeRunFailedEvent(
|
|
|
|
yield NodeRunFailedEvent(
|
|
|
|
error=str(e),
|
|
|
|
error=str(e),
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=next_node_id,
|
|
|
|
node_id=next_node_id,
|
|
|
|
node_type=node_type,
|
|
|
|
node_type=node_type,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
parallel_id=in_parallel_id,
|
|
|
|
parallel_id=in_parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
raise e
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
|
|
@ -339,7 +339,7 @@ class GraphEngine:
|
|
|
|
edge = edge_mappings[0]
|
|
|
|
edge = edge_mappings[0]
|
|
|
|
if (
|
|
|
|
if (
|
|
|
|
previous_route_node_state.status == RouteNodeState.Status.EXCEPTION
|
|
|
|
previous_route_node_state.status == RouteNodeState.Status.EXCEPTION
|
|
|
|
and node_instance.error_strategy == ErrorStrategy.FAIL_BRANCH
|
|
|
|
and node.error_strategy == ErrorStrategy.FAIL_BRANCH
|
|
|
|
and edge.run_condition is None
|
|
|
|
and edge.run_condition is None
|
|
|
|
):
|
|
|
|
):
|
|
|
|
break
|
|
|
|
break
|
|
|
|
@ -415,8 +415,8 @@ class GraphEngine:
|
|
|
|
|
|
|
|
|
|
|
|
next_node_id = final_node_id
|
|
|
|
next_node_id = final_node_id
|
|
|
|
elif (
|
|
|
|
elif (
|
|
|
|
node_instance.error_strategy == ErrorStrategy.FAIL_BRANCH
|
|
|
|
node.continue_on_error
|
|
|
|
and node_instance.continue_on_error
|
|
|
|
and node.error_strategy == ErrorStrategy.FAIL_BRANCH
|
|
|
|
and previous_route_node_state.status == RouteNodeState.Status.EXCEPTION
|
|
|
|
and previous_route_node_state.status == RouteNodeState.Status.EXCEPTION
|
|
|
|
):
|
|
|
|
):
|
|
|
|
break
|
|
|
|
break
|
|
|
|
@ -599,7 +599,7 @@ class GraphEngine:
|
|
|
|
|
|
|
|
|
|
|
|
def _run_node(
|
|
|
|
def _run_node(
|
|
|
|
self,
|
|
|
|
self,
|
|
|
|
node_instance: BaseNode,
|
|
|
|
node: BaseNode,
|
|
|
|
route_node_state: RouteNodeState,
|
|
|
|
route_node_state: RouteNodeState,
|
|
|
|
parallel_id: Optional[str] = None,
|
|
|
|
parallel_id: Optional[str] = None,
|
|
|
|
parallel_start_node_id: Optional[str] = None,
|
|
|
|
parallel_start_node_id: Optional[str] = None,
|
|
|
|
@ -613,29 +613,29 @@ class GraphEngine:
|
|
|
|
# trigger node run start event
|
|
|
|
# trigger node run start event
|
|
|
|
agent_strategy = (
|
|
|
|
agent_strategy = (
|
|
|
|
AgentNodeStrategyInit(
|
|
|
|
AgentNodeStrategyInit(
|
|
|
|
name=cast(AgentNodeData, node_instance.get_base_node_data()).agent_strategy_name,
|
|
|
|
name=cast(AgentNodeData, node._get_base_node_data()).agent_strategy_name,
|
|
|
|
icon=cast(AgentNode, node_instance).agent_strategy_icon,
|
|
|
|
icon=cast(AgentNode, node).agent_strategy_icon,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
if node_instance.node_type == NodeType.AGENT
|
|
|
|
if node.type_ == NodeType.AGENT
|
|
|
|
else None
|
|
|
|
else None
|
|
|
|
)
|
|
|
|
)
|
|
|
|
yield NodeRunStartedEvent(
|
|
|
|
yield NodeRunStartedEvent(
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
predecessor_node_id=node_instance.previous_node_id,
|
|
|
|
predecessor_node_id=node.previous_node_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
agent_strategy=agent_strategy,
|
|
|
|
agent_strategy=agent_strategy,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
max_retries = node_instance.node_retry_config.max_retries
|
|
|
|
max_retries = node.retry_config.max_retries
|
|
|
|
retry_interval = node_instance.node_retry_config.retry_interval_seconds
|
|
|
|
retry_interval = node.retry_config.retry_interval_seconds
|
|
|
|
retries = 0
|
|
|
|
retries = 0
|
|
|
|
should_continue_retry = True
|
|
|
|
should_continue_retry = True
|
|
|
|
while should_continue_retry and retries <= max_retries:
|
|
|
|
while should_continue_retry and retries <= max_retries:
|
|
|
|
@ -644,7 +644,7 @@ class GraphEngine:
|
|
|
|
retry_start_at = datetime.now(UTC).replace(tzinfo=None)
|
|
|
|
retry_start_at = datetime.now(UTC).replace(tzinfo=None)
|
|
|
|
# yield control to other threads
|
|
|
|
# yield control to other threads
|
|
|
|
time.sleep(0.001)
|
|
|
|
time.sleep(0.001)
|
|
|
|
event_stream = node_instance.run()
|
|
|
|
event_stream = node.run()
|
|
|
|
for event in event_stream:
|
|
|
|
for event in event_stream:
|
|
|
|
if isinstance(event, GraphEngineEvent):
|
|
|
|
if isinstance(event, GraphEngineEvent):
|
|
|
|
# add parallel info to iteration event
|
|
|
|
# add parallel info to iteration event
|
|
|
|
@ -660,21 +660,21 @@ class GraphEngine:
|
|
|
|
if run_result.status == WorkflowNodeExecutionStatus.FAILED:
|
|
|
|
if run_result.status == WorkflowNodeExecutionStatus.FAILED:
|
|
|
|
if (
|
|
|
|
if (
|
|
|
|
retries == max_retries
|
|
|
|
retries == max_retries
|
|
|
|
and node_instance.node_type == NodeType.HTTP_REQUEST
|
|
|
|
and node.type_ == NodeType.HTTP_REQUEST
|
|
|
|
and run_result.outputs
|
|
|
|
and run_result.outputs
|
|
|
|
and not node_instance.continue_on_error
|
|
|
|
and not node.continue_on_error
|
|
|
|
):
|
|
|
|
):
|
|
|
|
run_result.status = WorkflowNodeExecutionStatus.SUCCEEDED
|
|
|
|
run_result.status = WorkflowNodeExecutionStatus.SUCCEEDED
|
|
|
|
if node_instance.retry and retries < max_retries:
|
|
|
|
if node.retry and retries < max_retries:
|
|
|
|
retries += 1
|
|
|
|
retries += 1
|
|
|
|
route_node_state.node_run_result = run_result
|
|
|
|
route_node_state.node_run_result = run_result
|
|
|
|
yield NodeRunRetryEvent(
|
|
|
|
yield NodeRunRetryEvent(
|
|
|
|
id=str(uuid.uuid4()),
|
|
|
|
id=str(uuid.uuid4()),
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
predecessor_node_id=node_instance.previous_node_id,
|
|
|
|
predecessor_node_id=node.previous_node_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
@ -682,17 +682,17 @@ class GraphEngine:
|
|
|
|
error=run_result.error or "Unknown error",
|
|
|
|
error=run_result.error or "Unknown error",
|
|
|
|
retry_index=retries,
|
|
|
|
retry_index=retries,
|
|
|
|
start_at=retry_start_at,
|
|
|
|
start_at=retry_start_at,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
time.sleep(retry_interval)
|
|
|
|
time.sleep(retry_interval)
|
|
|
|
break
|
|
|
|
break
|
|
|
|
route_node_state.set_finished(run_result=run_result)
|
|
|
|
route_node_state.set_finished(run_result=run_result)
|
|
|
|
|
|
|
|
|
|
|
|
if run_result.status == WorkflowNodeExecutionStatus.FAILED:
|
|
|
|
if run_result.status == WorkflowNodeExecutionStatus.FAILED:
|
|
|
|
if node_instance.continue_on_error:
|
|
|
|
if node.continue_on_error:
|
|
|
|
# if run failed, handle error
|
|
|
|
# if run failed, handle error
|
|
|
|
run_result = self._handle_continue_on_error(
|
|
|
|
run_result = self._handle_continue_on_error(
|
|
|
|
node_instance,
|
|
|
|
node,
|
|
|
|
event.run_result,
|
|
|
|
event.run_result,
|
|
|
|
self.graph_runtime_state.variable_pool,
|
|
|
|
self.graph_runtime_state.variable_pool,
|
|
|
|
handle_exceptions=handle_exceptions,
|
|
|
|
handle_exceptions=handle_exceptions,
|
|
|
|
@ -703,44 +703,44 @@ class GraphEngine:
|
|
|
|
for variable_key, variable_value in run_result.outputs.items():
|
|
|
|
for variable_key, variable_value in run_result.outputs.items():
|
|
|
|
# append variables to variable pool recursively
|
|
|
|
# append variables to variable pool recursively
|
|
|
|
self._append_variables_recursively(
|
|
|
|
self._append_variables_recursively(
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
variable_key_list=[variable_key],
|
|
|
|
variable_key_list=[variable_key],
|
|
|
|
variable_value=variable_value,
|
|
|
|
variable_value=variable_value,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
yield NodeRunExceptionEvent(
|
|
|
|
yield NodeRunExceptionEvent(
|
|
|
|
error=run_result.error or "System Error",
|
|
|
|
error=run_result.error or "System Error",
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
should_continue_retry = False
|
|
|
|
should_continue_retry = False
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
yield NodeRunFailedEvent(
|
|
|
|
yield NodeRunFailedEvent(
|
|
|
|
error=route_node_state.failed_reason or "Unknown error.",
|
|
|
|
error=route_node_state.failed_reason or "Unknown error.",
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
should_continue_retry = False
|
|
|
|
should_continue_retry = False
|
|
|
|
elif run_result.status == WorkflowNodeExecutionStatus.SUCCEEDED:
|
|
|
|
elif run_result.status == WorkflowNodeExecutionStatus.SUCCEEDED:
|
|
|
|
if (
|
|
|
|
if (
|
|
|
|
node_instance.continue_on_error
|
|
|
|
node.continue_on_error
|
|
|
|
and self.graph.edge_mapping.get(node_instance.node_id)
|
|
|
|
and self.graph.edge_mapping.get(node.node_id)
|
|
|
|
and node_instance.error_strategy is ErrorStrategy.FAIL_BRANCH
|
|
|
|
and node.error_strategy is ErrorStrategy.FAIL_BRANCH
|
|
|
|
):
|
|
|
|
):
|
|
|
|
run_result.edge_source_handle = FailBranchSourceHandle.SUCCESS
|
|
|
|
run_result.edge_source_handle = FailBranchSourceHandle.SUCCESS
|
|
|
|
if run_result.metadata and run_result.metadata.get(
|
|
|
|
if run_result.metadata and run_result.metadata.get(
|
|
|
|
@ -760,7 +760,7 @@ class GraphEngine:
|
|
|
|
for variable_key, variable_value in run_result.outputs.items():
|
|
|
|
for variable_key, variable_value in run_result.outputs.items():
|
|
|
|
# append variables to variable pool recursively
|
|
|
|
# append variables to variable pool recursively
|
|
|
|
self._append_variables_recursively(
|
|
|
|
self._append_variables_recursively(
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
variable_key_list=[variable_key],
|
|
|
|
variable_key_list=[variable_key],
|
|
|
|
variable_value=variable_value,
|
|
|
|
variable_value=variable_value,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
@ -785,26 +785,26 @@ class GraphEngine:
|
|
|
|
run_result.metadata = metadata_dict
|
|
|
|
run_result.metadata = metadata_dict
|
|
|
|
|
|
|
|
|
|
|
|
yield NodeRunSucceededEvent(
|
|
|
|
yield NodeRunSucceededEvent(
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
should_continue_retry = False
|
|
|
|
should_continue_retry = False
|
|
|
|
|
|
|
|
|
|
|
|
break
|
|
|
|
break
|
|
|
|
elif isinstance(event, RunStreamChunkEvent):
|
|
|
|
elif isinstance(event, RunStreamChunkEvent):
|
|
|
|
yield NodeRunStreamChunkEvent(
|
|
|
|
yield NodeRunStreamChunkEvent(
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
chunk_content=event.chunk_content,
|
|
|
|
chunk_content=event.chunk_content,
|
|
|
|
from_variable_selector=event.from_variable_selector,
|
|
|
|
from_variable_selector=event.from_variable_selector,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
@ -812,14 +812,14 @@ class GraphEngine:
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
elif isinstance(event, RunRetrieverResourceEvent):
|
|
|
|
elif isinstance(event, RunRetrieverResourceEvent):
|
|
|
|
yield NodeRunRetrieverResourceEvent(
|
|
|
|
yield NodeRunRetrieverResourceEvent(
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
retriever_resources=event.retriever_resources,
|
|
|
|
retriever_resources=event.retriever_resources,
|
|
|
|
context=event.context,
|
|
|
|
context=event.context,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
@ -827,7 +827,7 @@ class GraphEngine:
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
except GenerateTaskStoppedError:
|
|
|
|
except GenerateTaskStoppedError:
|
|
|
|
# trigger node run failed event
|
|
|
|
# trigger node run failed event
|
|
|
|
@ -835,20 +835,20 @@ class GraphEngine:
|
|
|
|
route_node_state.failed_reason = "Workflow stopped."
|
|
|
|
route_node_state.failed_reason = "Workflow stopped."
|
|
|
|
yield NodeRunFailedEvent(
|
|
|
|
yield NodeRunFailedEvent(
|
|
|
|
error="Workflow stopped.",
|
|
|
|
error="Workflow stopped.",
|
|
|
|
id=node_instance.id,
|
|
|
|
id=node.id,
|
|
|
|
node_id=node_instance.node_id,
|
|
|
|
node_id=node.node_id,
|
|
|
|
node_type=node_instance.node_type,
|
|
|
|
node_type=node.type_,
|
|
|
|
node_data=node_instance.get_base_node_data(),
|
|
|
|
node_data=node._get_base_node_data(),
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
route_node_state=route_node_state,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_id=parallel_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parallel_start_node_id=parallel_start_node_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_id=parent_parallel_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
parent_parallel_start_node_id=parent_parallel_start_node_id,
|
|
|
|
node_version=node_instance.version(),
|
|
|
|
node_version=node.version(),
|
|
|
|
)
|
|
|
|
)
|
|
|
|
return
|
|
|
|
return
|
|
|
|
except Exception as e:
|
|
|
|
except Exception as e:
|
|
|
|
logger.exception(f"Node {node_instance.node_title} run failed")
|
|
|
|
logger.exception(f"Node {node.title} run failed")
|
|
|
|
raise e
|
|
|
|
raise e
|
|
|
|
|
|
|
|
|
|
|
|
def _append_variables_recursively(self, node_id: str, variable_key_list: list[str], variable_value: VariableValue):
|
|
|
|
def _append_variables_recursively(self, node_id: str, variable_key_list: list[str], variable_value: VariableValue):
|
|
|
|
@ -888,22 +888,14 @@ class GraphEngine:
|
|
|
|
|
|
|
|
|
|
|
|
def _handle_continue_on_error(
|
|
|
|
def _handle_continue_on_error(
|
|
|
|
self,
|
|
|
|
self,
|
|
|
|
node_instance: BaseNode,
|
|
|
|
node: BaseNode,
|
|
|
|
error_result: NodeRunResult,
|
|
|
|
error_result: NodeRunResult,
|
|
|
|
variable_pool: VariablePool,
|
|
|
|
variable_pool: VariablePool,
|
|
|
|
handle_exceptions: list[str] = [],
|
|
|
|
handle_exceptions: list[str] = [],
|
|
|
|
) -> NodeRunResult:
|
|
|
|
) -> NodeRunResult:
|
|
|
|
"""
|
|
|
|
|
|
|
|
handle continue on error when self._should_continue_on_error is True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
:param error_result (NodeRunResult): error run result
|
|
|
|
|
|
|
|
:param variable_pool (VariablePool): variable pool
|
|
|
|
|
|
|
|
:return: excption run result
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
# add error message and error type to variable pool
|
|
|
|
# add error message and error type to variable pool
|
|
|
|
variable_pool.add([node_instance.node_id, "error_message"], error_result.error)
|
|
|
|
variable_pool.add([node.node_id, "error_message"], error_result.error)
|
|
|
|
variable_pool.add([node_instance.node_id, "error_type"], error_result.error_type)
|
|
|
|
variable_pool.add([node.node_id, "error_type"], error_result.error_type)
|
|
|
|
# add error message to handle_exceptions
|
|
|
|
# add error message to handle_exceptions
|
|
|
|
handle_exceptions.append(error_result.error or "")
|
|
|
|
handle_exceptions.append(error_result.error or "")
|
|
|
|
node_error_args: dict[str, Any] = {
|
|
|
|
node_error_args: dict[str, Any] = {
|
|
|
|
@ -911,21 +903,21 @@ class GraphEngine:
|
|
|
|
"error": error_result.error,
|
|
|
|
"error": error_result.error,
|
|
|
|
"inputs": error_result.inputs,
|
|
|
|
"inputs": error_result.inputs,
|
|
|
|
"metadata": {
|
|
|
|
"metadata": {
|
|
|
|
WorkflowNodeExecutionMetadataKey.ERROR_STRATEGY: node_instance.error_strategy,
|
|
|
|
WorkflowNodeExecutionMetadataKey.ERROR_STRATEGY: node.error_strategy,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if node_instance.error_strategy is ErrorStrategy.DEFAULT_VALUE:
|
|
|
|
if node.error_strategy is ErrorStrategy.DEFAULT_VALUE:
|
|
|
|
return NodeRunResult(
|
|
|
|
return NodeRunResult(
|
|
|
|
**node_error_args,
|
|
|
|
**node_error_args,
|
|
|
|
outputs={
|
|
|
|
outputs={
|
|
|
|
**node_instance.default_value_dict,
|
|
|
|
**node.default_value_dict,
|
|
|
|
"error_message": error_result.error,
|
|
|
|
"error_message": error_result.error,
|
|
|
|
"error_type": error_result.error_type,
|
|
|
|
"error_type": error_result.error_type,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
)
|
|
|
|
)
|
|
|
|
elif node_instance.error_strategy is ErrorStrategy.FAIL_BRANCH:
|
|
|
|
elif node.error_strategy is ErrorStrategy.FAIL_BRANCH:
|
|
|
|
if self.graph.edge_mapping.get(node_instance.node_id):
|
|
|
|
if self.graph.edge_mapping.get(node.node_id):
|
|
|
|
node_error_args["edge_source_handle"] = FailBranchSourceHandle.FAILED
|
|
|
|
node_error_args["edge_source_handle"] = FailBranchSourceHandle.FAILED
|
|
|
|
return NodeRunResult(
|
|
|
|
return NodeRunResult(
|
|
|
|
**node_error_args,
|
|
|
|
**node_error_args,
|
|
|
|
|