Trusapien Creative Validation
The attention-heatmap node that hasn't shipped the heatmap yet
- image
- image
- status
What it is, and what it wants to be
The pitch is good: instead of exporting a render and squinting at it, you drop one node after your sampler that scores the image the way a marketing team would - where a human eye lands in the first few seconds, how well the asset matches the brief. The README calls it "enterprise-grade consumer-neuroscience models" and draws the flow as sampler → validation → heatmap + impact score.
That's the promise. What's on disk is a placeholder: it installs, appears in the menu, hands your image straight back, and never talks to anything. A private-beta waitlist gate wearing an analysis node's clothes.
What the code actually does
The pack is one class in one file, trusapien_node.py, and its whole execution path is a method called validate_creative. Two branches:
- Key empty, or still the default placeholder → it prints
[Trusapien] Private Beta Active. Join waitlist at trusapien.comto the console and returns a status string pointing you at the waitlist. - Any other key → it returns the string
"Creative validation processed successfully."
Either way, the image output is the tensor you fed in, unchanged. There is no HTTP request in the file at all - requests sits in requirements.txt, but nothing imports it. No heatmap, no score, no key check: aaa gets the same cheerful "processed successfully" as a real key. The README's advertised extras (a mode dropdown, a JSON metrics output) aren't in the node's schema either - it documents the intended API, not the shipped one.
The failure is silent: nothing errors - green queue, unchanged image, a status string that reads like success.
The inputs and outputs that matter
Two required inputs:
image(IMAGE) - wire from anything that emits an image tensor: a KSampler, a Load Image, an upscale. Batches are fine.api_key(STRING) - a single-line text widget, defaulting to the literalPASTE_YOUR_API_KEY_HERE. Per the README, real beta keys look liketru_live_…ortru_test_…. The placeholder exists so the node can tell "I forgot" from "I pasted something".
Two outputs:
image(IMAGE) - your input, untouched. Chain it to Preview Image or Save Image, as the bundled example workflow does (Load Image → validation → Preview).status(STRING) - the only new thing this node produces. A plain string, so Preview/Save won't display it: read it in the console, or hang a string-display node off it.
Installing it
ComfyUI Manager: search ComfyUI-Trusapien, Install, restart the server. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/trusapien/ComfyUI-Trusapien
cd ComfyUI-Trusapien
pip install -r requirements.txt
Windows portable build: python_embedded\python.exe -m pip install -r custom_nodes\ComfyUI-Trusapien\requirements.txt. Restart ComfyUI, hard-refresh the tab, and look under the Trusapien category. Dependencies are three ordinary PyPI packages (requests, Pillow, numpy) - no model download, no CUDA extension, no VRAM cost.
Traps, and the honest security note
"It says processed successfully but the image didn't change." Correct - that's the current behavior. You also can't diagnose a bad key from inside the node, since the key is never sent anywhere: don't paste a production credential in hoping for a test call.
Read the source before you trust it, and again after updates. API-wrapper nodes hold a credential and phone home by design, which is why that category has been weaponized before. This one takes two minutes: one class, no imports beyond torch, zero network calls. Watch for the day a requests.post shows up.
Node missing from the menu after install? Check the ComfyUI console for an import error before reinstalling anything. In a pack this small it's nearly always a forgotten restart.
Where it fits - and what to use instead
Two different things get called "attention heatmap" in ComfyUI, and mixing them up is how people end up disappointed. The first is model attention: DAAM-style maps showing which prompt tokens influenced which pixels. Mature, local, free, and purely a prompt-debugging aid - you reach for it when a token bleeds into the background.
The second is human attention - saliency or gaze, where a person's eyes go. That's the harder problem Trusapien is selling. The closest thing the community has built is GenGaze, which webcam-tracks your own eyes and feeds your fixations into an inpaint mask or outpainting guide: one subject, so personal rather than statistical, but real data and no key. And if what you need is automated in-graph scoring - triage fifty ad variants, keep the top few - a local aesthetic-scoring node does that today.
Verdict
Install cost is near zero, so if you're already on the waitlist, cloning it now just means the node is waiting in your menu when the API goes live. Don't build a pipeline around the README's output names yet - what ships is a pass-through with a status string. Re-read that one small file in a month and see whether it grew a network call.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| api_key | STRING | PASTE_YOUR_API_KEY_HERE | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |
| status | STRING | — |