1717from core .workflow .context import IExecutionContext
1818from core .workflow .graph import Graph
1919from core .workflow .graph_engine .layers .base import GraphEngineLayer
20- from core .workflow .graph_events import GraphNodeEventBase , NodeRunFailedEvent
20+ from core .workflow .graph_events import GraphNodeEventBase , NodeRunFailedEvent , is_node_result_event
2121from core .workflow .nodes .base .node import Node
2222
2323from .ready_queue import ReadyQueue
@@ -131,6 +131,7 @@ def _execute_node(self, node: Node) -> None:
131131 node .ensure_execution_id ()
132132
133133 error : Exception | None = None
134+ result_event : GraphNodeEventBase | None = None
134135
135136 # Execute the node with preserved context if execution context is provided
136137 if self ._execution_context is not None :
@@ -140,22 +141,26 @@ def _execute_node(self, node: Node) -> None:
140141 node_events = node .run ()
141142 for event in node_events :
142143 self ._event_queue .put (event )
144+ if is_node_result_event (event ):
145+ result_event = event
143146 except Exception as exc :
144147 error = exc
145148 raise
146149 finally :
147- self ._invoke_node_run_end_hooks (node , error )
150+ self ._invoke_node_run_end_hooks (node , error , result_event )
148151 else :
149152 self ._invoke_node_run_start_hooks (node )
150153 try :
151154 node_events = node .run ()
152155 for event in node_events :
153156 self ._event_queue .put (event )
157+ if is_node_result_event (event ):
158+ result_event = event
154159 except Exception as exc :
155160 error = exc
156161 raise
157162 finally :
158- self ._invoke_node_run_end_hooks (node , error )
163+ self ._invoke_node_run_end_hooks (node , error , result_event )
159164
160165 def _invoke_node_run_start_hooks (self , node : Node ) -> None :
161166 """Invoke on_node_run_start hooks for all layers."""
@@ -166,11 +171,13 @@ def _invoke_node_run_start_hooks(self, node: Node) -> None:
166171 # Silently ignore layer errors to prevent disrupting node execution
167172 continue
168173
169- def _invoke_node_run_end_hooks (self , node : Node , error : Exception | None ) -> None :
174+ def _invoke_node_run_end_hooks (
175+ self , node : Node , error : Exception | None , result_event : GraphNodeEventBase | None = None
176+ ) -> None :
170177 """Invoke on_node_run_end hooks for all layers."""
171178 for layer in self ._layers :
172179 try :
173- layer .on_node_run_end (node , error )
180+ layer .on_node_run_end (node , error , result_event )
174181 except Exception :
175182 # Silently ignore layer errors to prevent disrupting node execution
176183 continue
0 commit comments