Agent Report Sink
The exit door for the JSON your graph computes and then throws away
- reports
Your graph knows things your agent never hears
Run a model-bending sweep and the pack hands you a report and a resolved_json. Run an activation probe, or build a layer catalogue, and you get a fat structured blob of exactly the information an agent would need to decide what to do next. In a normal graph that blob goes into a preview box, you squint at it, and it dies with the tab.
Agent Report Sink is a terminal node that takes anything you connect and forwards it, as an event, to whoever is listening. No outputs. No fan-out. It's a drain, and that's the point.
How it works
The reports input is an autogrow slot - it grows as you connect, from one up to eight, and it's typed as any type. Each connected item gets converted to strict JSON: dictionaries, lists, numbers and strings pass through (deep, up to 500 keys or items per level), floats that aren't finite become null, and anything with a .shape - a tensor, an array - is summarised as {"type": ..., "shape": [...]} rather than dumped. So you can point this at almost anything without it exploding.
Strings get one extra courtesy: if the trimmed value starts with { or [, it's parsed as JSON first. That's why a node that hands you a JSON string arrives at the agent as a real object, not a quoted blob. A string that starts with anything else comes through as a string, which is what you want for log lines.
The three inputs are all you get:
reports- the autogrow slots. Connect as many sources as you like; they arrive as one array, in slot order.channel(defaultreport) - a free-text tag. This is your routing label. If you're forwarding both a layer catalogue and a bend report, usechannelto say which is which instead of making the agent sniff the payload.session_id- the bucket the event is filed under, same as everywhere else in this pack. Set it, or setextra.agentin an agent-proposed workflow, otherwise everything lumps into the default session.
On execution the node emits a single report event carrying channel, its own node id, and the array of items. It writes nothing downstream, and it draws a preview of what it sent so you can confirm it did something.
The trap: run summaries carry a count, not the payload
This catches everyone once. The pack's run events - the tidy summary an agent gets after a finished queue item - summarise reports as {"node": "28", "channel": "bends", "count": 3}. That's it. count, no items.
So if your agent only polls for run events, it will see that a report happened and never see what was in it. The actual payload arrives on the live report event:
TOKEN=$(cat ComfyUI/user/agent_bridge/token)
curl -s -H "X-Agent-Bridge-Token: $TOKEN" \
"http://127.0.0.1:8188/api/agent_bridge/events?kinds=report&since=0&wait=30"
Subscribe to report (long-poll wait up to 60 seconds, since = the last id you saw) and you get the items. Events are also appended as JSON lines to ComfyUI/user/agent_bridge/sessions/<session>.jsonl, so a session's reports survive a restart and you can read them back afterwards.
Since it has no outputs
There's nothing to wire out of it. Which means two practical consequences. First, put it at the end of a branch - it's an output node, so ComfyUI will run it, but only if its upstream nodes actually execute. If you've muted the branch that feeds it, or the value comes from a lazy switch's unselected side, the sink reports nothing and looks broken when it's just starved. Second, don't expect it to replace a preview node - the preview is capped and exists for you, the event is uncapped-ish and exists for the agent. Both are useful.
Install
Zero Python dependencies, but it needs ComfyUI ≥ 0.18 with frontend ≥ 1.40 - reports is a V3 autogrow input, so on an older build the slots may not grow or the node won't load at all. The pack doesn't pin your frontend, so nothing here will upgrade it quietly.
cd ComfyUI/custom_nodes
git clone https://github.com/abuzreq/ComfyUI-Agent-Bridge
Or install Agent Bridge from ComfyUI Manager, or comfy node install comfyui-agent-bridge. Restart after. Nodes land under the agent_bridge category, and Settings → Agent Bridge holds the two switches (open proposals without asking, share the canvas) - neither is needed for the sink.
Where people get burned
The preview box truncates. The node caps what it draws at around 4,000 characters and sticks an ellipsis on the end. Judges by the preview and you'll conclude your report got cut, when the event log has the whole thing. Read the event, not the node.
A tensor came through as {"type": "Tensor", "shape": [...]}. That's by design - the sink never serialises raw pixel data. If you actually need the numbers, reduce upstream (a sum, a mean, a small probe dict) and forward that.
Reports land but your agent never sees items. You're reading run events. See the trap above.
The node runs but sends nothing. Every slot was left unconnected, or the connected value was None - nulls are filtered out silently.
Token 403s. Agent routes need the header. The token file is generated on first start; if you reinstalled or wiped the user directory, it's a new token.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| reports | COMFY_AUTOGROW_V3 | — | |
| channel | STRING | report | — |
| session_id | STRING | — |
Outputs (0)
No outputs