From 5a85e11bb852af1faa2b70a39f7236d5ba7b2ed9 Mon Sep 17 00:00:00 2001 From: Vishal Doshi Date: Mon, 1 Jun 2026 10:31:16 -0400 Subject: [PATCH] Get full traceback on errors. --- src/modelplane/evaluator/dag.py | 4 +++- tests/unit/evaluator/test_safety.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/modelplane/evaluator/dag.py b/src/modelplane/evaluator/dag.py index 3a86b51..6768b5a 100644 --- a/src/modelplane/evaluator/dag.py +++ b/src/modelplane/evaluator/dag.py @@ -4,6 +4,7 @@ import functools import json import os +import traceback from concurrent.futures import ThreadPoolExecutor from dataclasses import dataclass from itertools import product @@ -50,9 +51,10 @@ class FailedDAGOutput(_DAGOutput): class NodeExecutionError(Exception): def __init__(self, node_name: str, original_error: Exception): + formatted = traceback.format_exception(original_error) self.node_name = node_name self.original_error = original_error - super().__init__(f"Error while executing node '{node_name}': {original_error}") + super().__init__(f"Error executing node '{node_name}': {''.join(formatted)}") class ComposerColumnNames: diff --git a/tests/unit/evaluator/test_safety.py b/tests/unit/evaluator/test_safety.py index e714723..f46543c 100644 --- a/tests/unit/evaluator/test_safety.py +++ b/tests/unit/evaluator/test_safety.py @@ -54,10 +54,11 @@ def test_safety_dag_with_bad_node(sample_ctx, threshold_arbiter): dag_annotator = SafetyDAGAnnotator("safety_annotator", dag) with pytest.raises( - NodeExecutionError, match="Error while executing node 'failing_node': I'm afraid I can't do that, Dave." + NodeExecutionError, match=r"Error executing node 'failing_node'" ) as e: dag_annotator.process( prompt=TextPrompt(text=sample_ctx.prompt), response=SUTResponse(text=sample_ctx.response), ) assert type(e.value.original_error) == type(dag_output.error) + assert "Traceback" in str(e.value)