ComfyUI Node

AnyAngleTextReadT8

How a String Gets Out of Your Graph and Into the Studio

By T8mars·Created 24 days ago·Updated 3 days ago· 85
AnyAngleTextReadT8
      ◄text—►

      Drop AnyAngleTextReadT8 on a canvas and it will look like a bug: one socket, no outputs, no options. It only makes sense once you know it's plumbing. It's the STRING flavour of a trick the AnyAngle Studio pack uses to reach values sitting in your node graph - and it's why you can keep your prompt in a text primitive or a concatenate node and still have the Studio's camera work use it.

      The mechanism, which is genuinely a bit sneaky

      The Studio is a browser app living inside one ComfyUI node: camera widget, reference library, pose tools. It needs values that live on your links, and ComfyUI's web-extension API has no clean way for a browser panel to ask "what's on the other end of this input?".

      So the frontend builds a fake prompt. It walks the executable graph upstream of the input you're reading, appends one extra terminal node with a UUID id and the class AnyAngleTextReadT8, POSTs the whole thing to /prompt, polls /history, and pulls the answer out of that node's ui payload - outputs[<uuid>].anyangle_text[0].

      Two consequences fall out of that design, and both are in the node's schema. It's marked as an output node with outputs=[], because the ui payload is the only channel ComfyUI keeps from a custom node back to the frontend - there's no socket running to JavaScript. And it passes text through byte-for-byte: whitespace, newlines and <image3>-style image markers all survive the trip untouched. If your prompt has a specific <image1> reference in it, it arrives intact.

      What you'd actually use it for

      Batch camera runs. The Studio generates its own prompt ("Change the camera angle from <image2> to <image1>") and the pack's multi-person encoder has a prompt_mode: studio-plus-input keeps the Studio's text and appends yours, input-full uses your wired text verbatim, empty string included, with nothing implicitly appended. When you fire off 12 camera angles, the run freezes the Studio's text and yours once, so every view is described identically. That's how the batch stays reproducible instead of drifting prompt by prompt.

      The practical setup is therefore: build your prompt where you always build it - a primitive, a Concatenate, a dynamic-prompt wildcard node - wire that into the Studio's prompt input, click read, and let the encoder's own prompt widget handle the rest. You don't wire the reader into an encoder. It's not in your prompt path at all.

      The one input

      text (STRING, and it's a forced input - socket only, no text box). ComfyUI enforces this: it declares a STRING socket type, so a STRING-producing node connects and nothing else does. Add the node by hand and you get an orphan socket that errors as a missing required input; that's not a broken install, it's a node that was never meant to be hand-placed. It has no outputs, because the value comes back through the UI channel described above.

      Install

      It ships with the pack, so you install the pack:

      cd ComfyUI/custom_nodes
      git clone https://github.com/T8mars/Comfyui-Qwen-Image-2.1-MultiAngle-T8.git ComfyUI-AnyAngle-Studio-T8
      cd ComfyUI-AnyAngle-Studio-T8
      python -m pip install -r requirements.txt
      python install_assets.py --download-lora
      

      Then restart ComfyUI and hard-refresh the browser. Use a folder name without a dot in it (as above) - a 2.1 in the directory name makes the current frontend truncate the node's source badge to Comfyui-Qwen-Image-2, which looks broken and isn't. The --download-lora flag gets the optional AnyAngle LoRA; skip it if you're running the base Qwen Image 2.1 model with structure guides, and skip install_reconstruction.py (3.78 GB) unless you want the image-to-3D route.

      Common issues

      Clicking read runs a real job. The probe executes the entire upstream subgraph of whatever you wired - the frontend even rejects chains containing a non-executable node. Point it at a text primitive and reads are instant. Point it at a chain that ends in a sampler and you'll queue the sampler every time you want to borrow a sentence. This is the single most common surprise with these reader nodes.

      "上游没有输出可用文本" means the upstream node produced nothing usable. If the upstream node itself failed, you get its own exception message instead - read the ComfyUI history for that probe job if the toast is terse.

      "人物参考清单与提示词不同步" ("reference list and prompt are out of sync") is the encoder refusing to run when the Studio's saved prompt no longer matches its material list. Open the Studio, re-apply, and run again.

      Changing your text node doesn't change the next batch. Prepared camera batches freeze external text once, at prepare time. Edit the text mid-run and the queued views still use the frozen copy - re-prepare the batch.

      It never shows up in your saved workflow, and that's fine. The frontend constructs it inside a throwaway prompt; the node you see in history is a ghost of a read, not part of your graph.

      CategoryT8/AnyAngle

      Inputs (1)

      NameTypeDefaultDescription
      textSTRING—

      Outputs (0)

      No outputs