import json import math from fastapi.responses import JSONResponse def _sanitize(obj): """Replace NaN/Infinity with None so every payload remains valid JSON.""" if isinstance(obj, float): if math.isnan(obj) or math.isinf(obj): return None if isinstance(obj, dict): return {k: _sanitize(v) for k, v in obj.items()} if isinstance(obj, list): return [_sanitize(i) for i in obj] return obj class SafeJSONResponse(JSONResponse): """JSONResponse variant that normalizes non-JSON float values.""" def render(self, content) -> bytes: return json.dumps(_sanitize(content), ensure_ascii=False).encode("utf-8")