UCLA Daily: Narrator (Qwen2.5)
Qwen2.5 rewrites your dry event list into something readable
- narrated_text
UCLANarrator is the node that turns a dry, semi-colon'd event listing - "SCF 2026, Hammer Museum, Thu 7pm, Free" - into a sentence someone might actually read while waiting for an elevator. It's a local LLM rewriter built on Qwen2.5-Instruct, and it's the only node in the UCLA Daily pack that needs a model download, real VRAM, and the transformers stack. Everything else is stdlib and chill; this one is the heavyweight.
The pack, by Jeffrey A. Brick, aggregates UCLA campus events and news into lobby-display cards and daily briefs. The Narrator slots between a fetcher's segment_text output and the UCLALobbyCard (or a morning-brief text node), so the LLM pass is optional - wire it in when you want the copy polished, bypass it when raw is fine.
How it works
It lazily loads a Qwen2.5-Instruct model in fp16 on CUDA via Hugging Face transformers - no API keys, fully local. First run downloads the model (2–14 GB depending on size), and the author's VRAM math is realistic: Qwen2.5-3B-Instruct ~6GB VRAM, Qwen2.5-7B-Instruct ~14GB. After generation it unloads the model and empties the CUDA cache by default (unload_after), specifically so downstream TTS/video nodes get their VRAM back. That load/unload dance is the survival-guide pattern the author describes as "learned the hard way."
The prompt engineering is baked in per mode. lobby_card tells the model to keep all facts exact while adding one or two sentences of human interest, readable in 15–20 seconds, no emojis, no marketing. morning_brief produces smooth prose under 100 words for email or audio. There's even a guard against the classic LLM refusal outputs ("I cannot…", "as an AI…") - if the model refuses or fails to load, the node returns your original text unchanged. Graceful to the end.
The inputs
- segment_text - required; the raw text from any fetcher's
segment_textoutput. - mode - enum:
lobby_card(default),morning_brief, orpassthrough(return unchanged - useful for testing the wiring). - model_size -
Qwen2.5-3B-Instruct(default, ~6GB, faster) orQwen2.5-7B-Instruct(~14GB, better). - unload_after - boolean, default true. Free VRAM after generation; disable only if chaining multiple Narrators.
Output
One: narrated_text - wire it into UCLALobbyCard's segment_text input or a text display.
Install
ComfyUI Manager → search UCLA Daily, or:
cd ComfyUI/custom_nodes
git clone https://github.com/jbrick2070/ComfyUI-UCLADaily.git
pip install qrcode pillow requests
Then the Narrator needs torch and transformers in your ComfyUI environment (usually already present), plus enough VRAM. Expect a multi-GB model download on first run.
Common issues
This is where people get burned. On a 8GB card, 7B in fp16 will OOM - stick to 3B or skip the node. First-run "download" can look like a hang; give it time. And remember it's an optional garnish, not the pipeline's engine - if VRAM is tight for the rest of your graph, drop the Narrator and let the raw segment_text hit the card. The lobby still looks fine, and you've saved yourself 6GB.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| segment_text | STRING | Raw segment text from any fetcher node's segment_text output. | |
| modeopt | COMBO | lobby_card | lobby_card: punchy on-screen summaries. morning_brief: prose for email/audio. passthrough: return unchanged. |
| model_sizeopt | COMBO | Qwen2.5-3B-Instruct | 3B: ~6GB VRAM, faster. 7B: ~14GB VRAM, better quality. |
| unload_afteropt | BOOLEAN | true | Free VRAM after generation. Disable if chaining multiple narrator nodes. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| narrated_text | STRING | — |