OC Presentation Expression Block
D to ahegao, ninety-four expressions on tap
- oc_block
- prompt_preview
- debug_text
A character's face does most of the storytelling, and the booru tags for it are a minefield of near-duplicates - ;d vs :d vs :>, blush variants, and the occasional tag that means something very different than it reads. OC Presentation Expression Block wraps ninety-four of them in a single dropdown so you pick the mood and let the pack worry about spelling. It's the face slot in the ComfyUI-OC-Generator presentation layer, sitting alongside the pose, interaction, and camera blocks.
The catalog is organized into six emotional subgroups: 笑 (smiling), 哭 (crying), 不开心 (unhappy), 蔑视 (contempt), 生气 (angry), and 其他表情 (everything else - blush, bored, confused, and the entries that made the dataset fun to build). Every option carries a Chinese label and its English tag, so the dropdown reads like 笑 | 眨眼笑 -> ;d and you know exactly what the model will receive.
Same engine as the other blocks
If you've used any OC block before, this one needs zero new learning. Three required inputs:
- mode -
fixedkeeps your chosen expression,randomizesamples from the current group pool, andincrement/decrementwalk the pool in order (useful for stepping through moods across runs). - option - the static full-catalog dropdown.
- group - narrows the active pool to one emotional subgroup.
Optional: enabled (off silences the block), seed (makes randomize reproducible), and step (how many options increment/decrement jump per run). The oc_block output feeds OC Generator, which slots the expression into the Face part of the assembled prompt; prompt_preview shows the raw fragment like blush or ahegao.
The one trap that costs people an afternoon
The option dropdown is static and never re-filters when you change group. If the option you've selected isn't inside the group you just picked, execution falls back to the first valid item in that group - silently, from the UI's point of view. You'll catch it in debug_text, which prints requested option not in current group; fallback applied. So when your "smug" character suddenly renders as "anguish," the answer is usually that you set a group and left the option pointing elsewhere.
Install
This is the pack's standard zero-friction story: no models, no pip dependencies (requirements.txt declares none), just JSON tag catalogs and pure Python.
cd ComfyUI/custom_nodes
git clone https://github.com/Zhuozhuo-219/ComfyUI-OC-Generator
…or find "ComfyUI-OC-Generator" in ComfyUI Manager and click Install. Restart, and the block appears under OC Generator → Blocks. Remember it's a prompt-builder - feed the final prompt to an anime SDXL model (Illustrious, NoobAI, Pony) where this tag vocabulary actually means something.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| group | COMBO | __all_groups__ | Limit selection to one subgroup. The option dropdown itself is static and will not visually shrink when group changes. |
| mode | COMBO | fixed | fixed keeps the chosen option when valid for the current group. randomize / increment / decrement operate only within the selected group pool. |
| option | COMBO | 笑 | 眨眼笑 -> ;d | Static dropdown for the whole catalog. If the chosen option does not belong to the current group, execution falls back to the first valid item in that group. |
| enabledopt | BOOLEAN | true | Disable this block without deleting it from the workflow. |
| seedopt | INT | 00–4294967295 | Seed used by randomize mode to get reproducible results inside the current group pool. |
| stepopt | INT | 11–1024 | Step size for increment / decrement mode inside the current group pool. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| oc_block | OC_BLOCK | Structured OC block data for downstream aggregation in OC Generator. |
| prompt_preview | STRING | The prompt fragment resolved by this dimension node. |
| debug_text | STRING | Execution details, including group filtering and selection behavior. |