griptape-ai / griptape-ai/griptape-nodes-library-diffusers
Decode HDR Latents reports success but writes no EXR sequence to the configured folder
@ladipobaruwa-fn is already working on this.
Since Aug 13, 2026.
- Dominant language
- Python
- Stars
- 0
- Forks
- 0
- Avg merge
- 1d 15h
- Merged PRs (30d)
- 11
Description
Problem
DecodeHdrNode reports "Decoded successfully" in cases where it writes no EXR files at all, and when it does write them they can land outside the user's project directory. Either way the user is told the decode succeeded and then finds nothing at the path they configured in exr_output_folder.
Two distinct paths produce that same symptom:
- EXR export is silently skipped.
_save_exr_if_requestedis only reached from thenp.ndarraybranches of_encode_video_output/_handle_image_output(decode_hdr_node.py:110,:124). When the driver returns PIL frames instead, both methods delegate tosuper()and return early — EXR export never runs, nothing is logged about it, and the node still reports success. A user whose latents didn't come from the HDR pipeline gets an MP4 and zero EXRs with no indication why. - Files are written to an unanchored path.
_resolve_exr_output_pathapplies onlyPath(path_value).expanduser()(decode_hdr_node.py:170) — no.absolute()and no workspace anchoring, andexpand_path_macrosis a no-op unless the value contains{. A relative path therefore resolves against the engine process's CWD rather than the project, and the writer'sout_dir.mkdir(parents=True, exist_ok=True)(utils/hdr_video_utils.py:46) silently creates it there. The sibling helperFilePathParameter.get_file_path()does call.absolute(); this node doesn't use it.
Desired outcome: when the node says it decoded successfully, the EXR sequence either exists at a path the user can predict from what they entered, or the node tells them plainly that no EXR sequence was written and why.
Origin
Reported by James Clarendon, relaying a community report: a user converting SDR to HDR locally with a custom diffusion setup found that the Decode HDR Latents node logged a successful decode but produced no .exr files at the folder configured on the node.
Impact
Silent data loss from the user's perspective — the expensive part of the workflow completes and its primary artifact is either missing or unfindable, with no error to act on. There is no way to tell the two causes apart from the node's own success message, so the failure is not self-diagnosable. It also blocks any downstream use of the sequence: encode_linear_hdr_exr_sequence returns the list of absolute paths it wrote (utils/hdr_video_utils.py:95) and _save_exr_if_requested discards them, so the written paths exist only inside the logs string and no output parameter carries them.
Repro / evidence
- Set
exr_output_folderto a relative path on Decode HDR Latents and run a decode where the incoming latents were not produced by the HDR pipeline. The node logs a successful decode; no EXR files appear at the configured location and no warning is emitted. - The node writes EXRs straight to the filesystem —
OpenEXR.OutputFile(str(path), header)plusout_dir.mkdir(parents=True, exist_ok=True)(utils/hdr_video_utils.py:46,:71). - Contributing confusion:
docs/nodes/decode_hdr_latents.mddocuments the output filenames asframe_0000.exr,frame_0001.exr, … but the writer emitsframe.0001.exr— dot separator, 1-indexed (utils/hdr_video_utils.py:70). A user checking for the documented filename would conclude nothing was written even in the case where the files are present.
Possible direction
One option, and not the decision: route the EXR write through the engine's file/project system rather than writing to disk from the node, the way SaveEXR in griptape-nodes-library-openexr builds a destination via ProjectFileParameter.build_file() and writes through WriteFileRequest. That would anchor the output in the project and remove the unanchored-relative-path case. Note that it does not by itself address the silent-skip case, which is about the node not surfacing that the HDR branch was never taken.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.