ExportBlendshapes
The manual bridge between Shape Flow and your glTF export
- blendshapes
If you're staring at this node wondering what it actually computes: nothing. ExportBlendshapes doesn't touch your data at all - it takes a string in, and hands the exact same string back out, just relabeled from a plain STRING socket to the blendshapes socket type that ExportGLTF expects on its optional input. That's the entire node. I only point this out because it looks like it should be doing something clever, and the honest answer is it's a type-cast, not a processor.
Why it exists
Avatar Graph builds interactive 2.5D avatars: you segment a face into flat mesh layers (eyes, mouth), rig them with shape keys, and wire those shape keys into the pack's own Shape Flow runtime graph so they animate live (blink, lip-sync) instead of sitting static. When you export the final result to glTF, the morph targets need to line up with names Shape Flow actually references at runtime - and that mapping has to get from "the graph you built" into "the export node" somehow. ExportBlendshapes is that somehow: a manual pass-through socket you type a mapping string into by hand.
The input and output that matter
There's exactly one field, and it's the only thing on this node:
blendshapes(STRING, default{node: ''}) - the mapping you write yourself. The default value is a template hint, not a working example: it's telling you the shape is roughly "a node reference paired with a name," not handing you something to run as-is.
The output, also called blendshapes, is typed blendshapes and exists for exactly one reason: plugging into ExportGLTF's optional blendshapes input.
Because the node performs zero validation, a malformed string won't error here - it'll either silently do nothing downstream or throw wherever the export step tries to actually read it. If your glTF comes out with no morph targets, this is the first thing to check: did you actually wire the output into ExportGLTF, and is the string well-formed?
How to install it
Via ComfyUI Manager: search "Avatar Graph" (or avatar-graph-comfyui), install, restart.
Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/avatechai/avatar-graph-comfyui
cd avatar-graph-comfyui
pip install -r requirements.txt
The one install detail that trips people before they even get this far: the pack pins bpy==3.6.0, Blender's Python API, and that wheel only resolves on Python 3.10.x - not 3.11, not 3.12. If your ComfyUI environment isn't 3.10, pip install -r requirements.txt will fail before you ever see this node. On Windows the README's fix is to grab Avatech's own bundled Python 3.10 ComfyUI zip; on Mac/Linux, spin up a dedicated conda env (conda create --name comfyui python=3.10) rather than fighting an existing one. It also pulls in segment-anything, mediapipe, and opencv-contrib-python - a genuinely heavier install than your average node pack, budget some time and disk space for it.
Common issues & troubleshooting
Nothing changed in the exported model. You almost certainly forgot to wire ExportBlendshapes' output into ExportGLTF's optional blendshapes slot - it's optional, so ComfyUI won't complain if you skip it, it just won't carry any morph-target mapping through.
You're not sure what to type in the field. There's no schema enforcement on this node to hint you toward - this is intentionally a manual escape hatch rather than a structured UI, which is honest but not beginner-friendly. If you're new to Shape Flow, work from one of the pack's example workflow templates (linked in the README) rather than writing this string from scratch.
Package/Python errors before you even see the node. That's the Python 3.10 requirement above, not this node specifically - check your interpreter version first.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| blendshapes | STRING | {node: ''} | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| blendshapes | blendshapes | — |