Gemma Prompt Expander Native (Tags / Natural Language)
Tags and prose from the same scene
- clip
- image
- vrs_state
- tags
- natural_language
- raw_output
Most prompt-enhancer nodes give you one string and hope you like it. This one gives you two, from the same scene, and lets you decide which one your model actually wanted. That's the whole reason it exists - and it's a sharper design than it sounds.
What you're actually getting
Gemma Prompt Expander Native sits in the prompt category of RS-Seasonal-Prompt-Generator, a nine-node pack from a solo Korean author (raspie) who writes every doc twice, in Korean and English. The pack's nodes are all variations on one idea: use a small Gemma as an in-graph writer, either to turn your rough idea or a reference image into Danbooru tags, or into a plain-English instruction sentence.
Why you'd reach for it: tag models and prose models want opposite things. Illustrious, NoobAI and Anima were trained on the Danbooru vocabulary and reward 1girl, solo, dutch angle over a nicely written paragraph; Flux, Z-Image and Klein read prose and quietly degrade on comma soup. Having both outputs means one node can feed either kind of graph, and you can compare on the same seeded scene instead of guessing. The broader split is covered in the Danbooru tags panel and it's the single most common way people mis-wire a prompt node.
I'll be blunt about the reputation side: there isn't one. Search the community corpora for "Gemma TIPO" or the author's handle and you get nothing - this pack has no Reddit footprint at all. What it does have is documentation that's more honest than most popular packs: the author leads with "outputs may be wrong or not match your taste," and says outright that Korean edits, names and appearance stay unreliable. Take the warnings at face value and you'll have a decent time.
How the two outputs get made
output_format is the switch, and the mechanism matters:
both(default) runs two sequential calls on the same model - first a prose scene, then a second pass that renders that exact scene as tags. The image, if you connected one, is encoded once and not re-encoded for the second call. You load one model, not two, but you pay twice the wall time.tagsruns one call and leavesnatural_languageas an empty string.natural_languageruns one call and leavestagsempty. It asks for aCreate …image instruction, not a description and not a tag list.
Both output languages are English regardless of what you type. Korean, English or Japanese input goes to the model verbatim, and tag post-processing (dedup, ban filtering, conflicting person-count cleanup) is only applied to the tag path - prose is left alone.
The inputs you'll actually touch
Seven required widgets, and honestly most people set three of them.
prompt- what to keep, change, or drop. A line like "keep the blue hair, put her at a winter night market holding tea, coat on, no scarf" works better than a keyword pile.output_format- see above. Start withtagsto judge the model cheaply, then tryboth.tag_length-very_short…very_long, a detail target, not a count. Defaults tolong.max_tokens- per call, default 512. Withbothyou're spending two of these.ban_tags- comma-separated English exclusions. The author's tooltip is precise and worth believing: exact filtering applies to tags only; prose just follows the instruction. It won't reliably remove something from a sentence.temperature/seed- 0.5 default. Keep temperature positive: current ComfyUI ignores repetition penalties attemperature=0, so therepetition_penaltywidget (tag call only, prose stays at 1.05) does nothing at zero.
On the optional side, only three earn their space for a beginner. model_source picks your base - connected_clip (a native Gemma 4 E2B from Load CLIP) or heretic_ara_q4 (downloads its own base on first run). image adds one reference picture, encoded once. And tipo_lora offers three experimental adapters (pilot-001, pilot-002, image-30k) on top of none; pair it with tipo_lora_scope=tags_only so prose stays on the clean base. A LoRA alone cannot run - it needs one of the two bases.
Then the three outputs: tags, natural_language, and raw_output. Wire tags into a tag model's positive prompt, natural_language into a prose model's, and keep raw_output on a text preview when something looks wrong - it's the unfiltered model output, which is how you tell "the model didn't say it" from "the post-processor ate it."
Install
Manager first: search the pack title, install, restart. Manually:
cd ComfyUI/custom_nodes
git clone https://github.com/raspie10032/RS-Seasonal-Prompt-Generator
Watch the folder nesting - the author calls this out because it's the usual reason nodes don't appear; you want custom_nodes/RS-Seasonal-Prompt-Generator/__init__.py, not a nested copy.
The built-in Q4 path needs exactly one extra package, and it's tiny compared to what you'd expect:
python -m pip install -r ComfyUI/custom_nodes/RS-Seasonal-Prompt-Generator/requirements.txt
That's gguf>=0.19.0,<0.20, a pure-Python GGUF parser. No llama.cpp, no CUDA wheels, no torch replacement. Then disconnect clip, set model_source=heretic_ara_q4, leave the path fields blank, and the first run pulls a ~3.19 GiB text GGUF plus a 30.7 MiB tokenizer into ComfyUI/models/text_encoders/rs_gemma_q4/. Add an image and it fetches a ~0.92 GiB FP16 mmproj too. Files are SHA-256 checked against pinned revisions, and partial downloads are discarded rather than kept.
The connected_clip path skips all of that but wants a ComfyUI-format Gemma 4 E2B safetensors (~9.57 GiB) in models/text_encoders/ and a ComfyUI new enough to support Gemma 4 CLIP.generate.
Where people get burned
Two calls isn't free. A both run at 512 tokens is roughly twice the latency of a tags run. If you're iterating on a prompt, work in tags mode.
Connect a VRS state or a state file, never both. vrs_state (from VRS Native Image Recall) and vrs_state_path are mutually exclusive and the node throws if you wire both. If you use a state with a native query in it and also connect an image, the pixel hashes have to match - that's the node refusing to expand a scene you retrieved with a different picture.
The e621 path is a dead end with VRS. tag_set offers danbooru and e621, but an existing VRS generation state is Danbooru-only and gets rejected. Same for a tag dictionary that has no entries for your chosen set.
Silent blank output. If input validation fails, the node returns empty strings for all three ports rather than erroring loudly. If you get an empty prompt downstream and no red box on the node, check the validation path before you blame the model.
Disk size is not VRAM. The author says this in three separate places for a reason. ~3.22 GiB of files still needs restore buffers, image processing, KV cache and possibly a LoRA on top, plus whatever diffusion model is loaded. Tested on 16 GB NVIDIA cards; a 24-image eval on a 5060 Ti had a median call time around 36 seconds, ranging 16–126.
What I'd actually run
model_source=heretic_ara_q4, output_format=tags, temperature=0.5, max_tokens=512, seed fixed so you can compare, and repetition_penalty=1.15 only if you're drowning in repeats. Add both once you trust it, and wire each port to the model family that matches. It's a niche node from an unknown pack, but the dual-output design is the sort of thing bigger packs should have copied.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| prompt | STRING | — | |
| tag_length | COMBO | long | Detail target for tags and prose; not a guaranteed length. |
| max_tokens | INT | 51216–2048 | Output token limit per call; both uses two calls. |
| temperature | FLOAT | 0.500–1.5 | — |
| ban_tags | STRING | English elements to exclude. Exact tag filtering applies only to tags; prose follows the model instruction. | |
| seed | INT | 00–18446744073709550000 | — |
| output_format | COMBO | both | both: expand a scene in prose, then render that same scene as tags (two sequential calls). |
| clipopt | CLIP | For connected_clip: native Gemma 4 E2B Load CLIP. | |
| imageopt | IMAGE | — | |
| tipo_loraopt | COMBO | none | Requires a base: built-in Q4 GGUF (~3.19 GiB + tokenizer; image adds ~0.92 GiB), or native Gemma 4 E2B (~9.57 GiB) connected via Load CLIP. LoRA alone cannot run. 베이스 모델 필요: 내부 Q4 자동 다운로드 또는 네이티브 CLIP 연결. Select none for the base; each adapter downloads ~45.3 MiB on first use. image-30k improves image-tag agreement; use tags_only scope for dual output. Tested on 16GB NVIDIA GPUs. GPU compute/RAM demand is significant; results can omit names or alter appearance. 고사양 GPU 권장. 취향과 다른 결과, 이름 누락·외형 변경 가능. Experimental tag-only adapters; not the default for prose/VRS. Use p-e-w/gemma-4-E2B-it-heretic-ara; do not apply on an already merged pilot model. |
| model_sourceopt | COMBO | connected_clip | heretic_ara_q4: first execution downloads a 3.19 GiB text GGUF + 30.7 MiB tokenizer; IMAGE adds a 0.92 GiB FP16 mmproj. ComfyUI PyTorch execution, no llama.cpp. 첫 실행 시 베이스 모델 다운로드. LoRA는 별도. 고사양 GPU 권장; 결과 품질은 보장하지 않습니다. Validated on 16GB NVIDIA GPUs; download size is not VRAM usage. connected_clip keeps your existing Load CLIP workflow. |
| gguf_pathopt | STRING | Optional local Gemma 4 E2B GGUF; blank downloads pinned Heretic ARA Q4. | |
| mmproj_pathopt | STRING | Optional matching FP16 vision GGUF; only used with IMAGE. | |
| tokenizer_pathopt | STRING | Optional matching tokenizer.json; blank downloads the pinned original. | |
| tag_setopt | COMBO | danbooru | 2 options: danbooru, e621 |
| tag_knowledge_pathopt | STRING | Optional local rs-tag-knowledge/1 JSONL or legacy Danbooru Korean CSV. No automatic download. Leave blank to use model knowledge only. | |
| vrs_state_pathopt | STRING | Optional local VRS generation-state /1 or /2 JSON, exported for this exact prompt. Danbooru only. Saved references, not automatic image search. | |
| vrs_stateopt | VRS_STATE | Connect VRS Native Image Recall. Uses this request and, if supplied, the same IMAGE. | |
| tipo_lora_scopeopt | COMBO | both | both applies the selected adapter to both calls. tags_only leaves prose on the supplied base CLIP and applies the adapter only to tags; use an unpatched base CLIP. |
| repetition_penaltyopt | FLOAT | 1.051–2 | Tag call only; prose keeps 1.05. Current ComfyUI ignores penalties at temperature=0; use a positive temperature. Larger values can also omit useful tags or names. Existing workflows retain 1.05. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| tags | STRING | — |
| natural_language | STRING | — |
| raw_output | STRING | — |