ExecutionDAG over persisted artifacts using the aggregation engine.layer_router and before AnswerSynthesizerNode.EngineAggregatorNodepackages/nl2sql/src/nl2sql/pipeline/nodes/aggregator/node.pyartifact_refs.AggregatorResponse with terminal results.Upstream:
layer_router (after all scan artifacts are available)Downstream:
AnswerSynthesizerNodeTrigger conditions:
flowchart LR
Router[layer_router] --> Aggregator[EngineAggregatorNode] --> Synth[AnswerSynthesizerNode]
From GraphState:
global_planner_response.execution_dag (required)artifact_refs (required)Validation performed:
Mutations to GraphState:
aggregator_response (AggregatorResponse)reasoning and errorsSide effects:
execution_dag and artifact_refs.AggregationService.execute(dag, artifact_refs).AggregatorResponse with terminal_results.AGGREGATOR_FAILED.Implements a LangGraph node callable:
def __call__(self, state: GraphState) -> Dict[str, Any]
Key contracts:
AggregatorResponseExecutionDAGEmits PipelineError with:
AGGREGATOR_FAILEDLogs failures via logger.error.
aggregatorPolarsDuckdbEngine; no direct settings consumed by the node.AggregationService.build_graph() for alternate aggregation behavior.packages/nl2sql/src/nl2sql/pipeline/nodes/aggregator/node.pypackages/nl2sql/src/nl2sql/aggregation/aggregator.py