ComfyUI Node

_.tap

Poke at the data mid-chain, then hand it back unchanged

By sfinktah·Created about a year ago·Updated 10 months ago· 7
_.tap
  • py_dict
  • interceptor
  • *

_.tap exists for one reason: to run a side effect on your data without changing it. It invokes an "interceptor" with your object, and then returns the object exactly as it was. The name comes from tapping a line to check the pressure - you tap into the pipeline, observe or log or write something out, and the value flows on untouched.

In a Comfy graph, that's a debugging superpower. Stuck inside a chain of list operations and want to see what the intermediate result looks like? Drop _.tap in with an interceptor that prints or records the value, and the chain keeps going as if nothing happened. Your downstream nodes get the identical data; you just get visibility. This is the node version of a well-placed print() - and the only node in this family whose entire point is to not transform anything.

Inputs and output

  • py_dict (*) - the primary input, labeled py_dict because the generator classified tap as an object method. Any JSON-serializable value works; lists are the usual target.
  • interceptor (*) - the function (or callable) that receives the object. This is where the WIP reality bites: to actually do something useful, you need to wire in a callable - which means a function-typed output from somewhere, and those are rare in ComfyUI. The tooltip notes JSON is allowed for arrays/objects where applicable, but a plain value doesn't "intercept" anything. Realistically, most people end up using this in a chain where the interceptor is supplied programmatically.

Output is a single * - the same object, unchanged. That's the contract: tap guarantees passthrough. Feed it a _.CHAIN and it returns a chain, preserving the family's chain semantics.

The honest take

This is one of the more "developer-facing" members of the comfy-ovum ovum/underscore family (auto-generated wrappers around the bundled underscore3 Python port). The author's own README says the family is a work in progress and not recommended for production. For _.tap specifically, the gap between the concept and what the UI makes easy is at its widest: the useful part - supplying a real interceptor - is exactly the part the graph doesn't make convenient. If you just want to see a value mid-run, a Preview/Show Text node wired off a temporary branch does the same job without needing a callable.

Install

# via ComfyUI Manager: search "comfy-ovum"
cd ComfyUI/custom_nodes
git clone https://github.com/sfinktah/comfy-ovum
# restart ComfyUI

No model downloads; pure Python, deps (aiohttp, pillow, numpy, requests, etc.) via Manager, underscore3 bundled. If _.tap errors or passes through a chain you didn't expect, check whether your primary input is actually a _.CHAIN - that's the family's dynamic-return switch, and with tap's "unchanged" promise it's easy to misread what came back.

Categoryovum/underscore

Inputs (2)

NameTypeDefaultDescription
py_dictopt*Primary input object (expected object). You can still pass any JSON-serializable value. Also accepts _.CHAIN to continue chaining.
interceptoropt*interceptor: JSON allowed for arrays/objects where applicable.

Outputs (1)

NameTypeDescription
**