rohitg00/ai-engineering-from-scratch · error · ValueError

unsafe node: {ast.dump(node)}

Error message

unsafe node: {ast.dump(node)}

What it means

Error "unsafe node: {ast.dump(node)}" thrown in rohitg00/ai-engineering-from-scratch.

Source

Thrown at phases/19-capstone-projects/49-lm-eval-harness/code/main.py:146

    ast.USub: operator.neg,
    ast.Pow: operator.pow,
}


def safe_arith_eval(expr: str) -> float:
    """Evaluate a small arithmetic expression without exposing eval."""
    tree = ast.parse(expr, mode="eval")
    return _safe_eval(tree.body)


def _safe_eval(node: ast.AST) -> float:
    if isinstance(node, ast.Constant) and isinstance(node.value, (int, float)):
        return node.value
    if isinstance(node, ast.BinOp) and type(node.op) in _ARITH_OPS:
        return _ARITH_OPS[type(node.op)](_safe_eval(node.left), _safe_eval(node.right))
    if isinstance(node, ast.UnaryOp) and type(node.op) in _ARITH_OPS:
        return _ARITH_OPS[type(node.op)](_safe_eval(node.operand))
    raise ValueError(f"unsafe node: {ast.dump(node)}")


def normalize(s: str) -> str:
    return re.sub(r"\s+", " ", s.strip().lower())


def metric_exact_match(prediction: str, targets: List[str]) -> float:
    norm_pred = normalize(prediction)
    return 1.0 if any(normalize(t) == norm_pred for t in targets) else 0.0


def metric_substring_contains(prediction: str, targets: List[str]) -> float:
    norm_pred = normalize(prediction)
    return 1.0 if any(normalize(t) in norm_pred for t in targets) else 0.0


def metric_multiple_choice(prediction: str, targets: List[str]) -> float:
    pred = prediction.strip()[:1].upper()

View on GitHub (pinned to 39ea8a1c6d)

When it happens

Trigger: Thrown at phases/19-capstone-projects/49-lm-eval-harness/code/main.py:146 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of rohitg00/ai-engineering-from-scratch@39ea8a1c6d (2026-08-26). Data as JSON: /api/errors/3908b0b2734be66a. Report an issue: GitHub.