Telegram Workflow Report
The node that DMs you your finished video
- filenames
- base_model_obj
- high_model_obj
- low_model_obj
- high_loras_obj
- low_loras_obj
- reference_image
- filenames
- message_preview
Wan 2.2 is not a one-minute hobby. A 720p clip costs the better part of a work meeting on a 4090, and a VACE 14B generation can run 15–40 minutes. You're going to step away from the box, and when you come back you want the finished file on your phone with its settings attached - not a folder full of ComfyUI_00047_.mp4 to go hunting through. Telegram Workflow Report, the flagship node of the blkot/ComfyUI-tgBridge pack, is that node.
The connection is a single wire:
VideoHelperSuite Video Combine → Telegram Workflow Report
It takes the VHS_FILENAMES output, uploads the finished video to a Telegram chat, group, or channel through the Bot API, and posts a compact caption plus an optional detailed reply. Direction matters: this is the "here's your result" node, not a remote-control bot. People have wired Telegram to ComfyUI for remote control since 2023; this pack only ships results one way.
How it works
The node reads the (save_dir, [file paths]) tuple that VideoHelperSuite's Video Combine emits, checks which files actually exist, and picks what to send. upload_mode = final_only (the default) sends just the last output; all_files sends everything. With send_as = auto it guesses the Telegram method from the extension - .mp4/.mov/.webm/.mkv to video, .png/.jpg/.gif to photo, anything else to document. It's plain HTTP to api.telegram.org via the requests library - no paid API, just the free BotFather token.
The report respects Telegram's limits: the caption is trimmed to 1024 characters and detail messages are split into multiple messages at 4096. The caption is a compact "Generation Complete" header; the reply thread carries prompt, model, LoRA, and settings sections, and message_mode = caption_reply_and_json also attaches a comfyui_generation_metadata.json.
The inputs that actually matter
There are a lot of widgets, and you don't need most of them on day one:
filenames- the VHS_FILENAMES from Video Combine. Technically optional, but without it there's nothing to send.enabled- set tofalseand nothing uploads, butmessage_previewstill builds. This is your test switch.upload_mode/send_as- covered above.failure_mode-warn(default) logs errors and lets the workflow finish;raisestops the run. Useraisewhile debugging.
Everything else is optional metadata: title, prompts, model fields (base_model, high_model, low_model, vae), five LoRA name/strength slots, and seed, steps, cfg, sampler, scheduler, width, height, frames, fps. There's also a reference_image + send_reference_image pair to attach a before-shot to the same thread.
Here's the part that makes it painless for Wan workflows: alongside each string field there's an object variant - base_model_obj, high_model_obj, low_model_obj (WANVIDEOMODEL) and high_loras_obj, low_loras_obj (WANVIDLORA). Wire the object straight out of Kijai's WanVideoWrapper and the node extracts the name and LoRA list itself; the object wins if both are connected. Wan 2.2 is a two-expert MoE, so "high" and "low" map to the high-noise and low-noise passes - the same split behind putting speed LoRAs on the low pass only.
Both outputs are useful: filenames passes through unchanged so your graph stays chainable, and message_preview is a STRING showing exactly what it would have sent.
Installing it
Grab it with ComfyUI Manager (search "tgBridge") or:
cd ComfyUI/custom_nodes
git clone https://github.com/blkot/ComfyUI-tgBridge
cd ComfyUI-tgBridge
pip install -r requirements.txt
Restart ComfyUI; the nodes appear under a Telegram category. Dependencies are just Pillow and requests - no model downloads. The external setup is the Telegram side: a BotFather token, the bot added to the chat with posting rights, and the chat's numeric ID (group/channel IDs look like -1001234567890, not the visible name).
Configure without leaking secrets
The pack deliberately keeps tokens out of workflow JSON. Recommended path is environment variables:
export COMFY_TG_BOT_TOKEN="123456:ABC..."
export COMFY_TG_CHAT_ID="-1001234567890"
For a forum topic, add export COMFY_TG_MESSAGE_THREAD_ID="7". A git-ignored config/telegram.json in the pack folder works too, with the same fields; env vars win if both exist.
Testing without spamming your chat
Set enabled = false, run, and read message_preview - it prints the caption, follow-up messages, and files it would have uploaded. Flip enabled = true when it looks right. The author's framing is worth respecting: this is a usable but early pack built for personal Wan workflows, so test before bolting it onto a production graph.
Two failure modes bite people. "Chat not found" means the bot isn't in that chat, or you pasted the name instead of the numeric ID. And if the node isn't configured at all, it runs a test mode that builds the preview but skips the upload - handy, but easy to misread as "broken". When debugging, set failure_mode = raise so real errors stop the run; once it's stable, warn is right - you don't want a notification node killing a finished render.
Inputs (44)
| Name | Type | Default | Description |
|---|---|---|---|
| enabled | BOOLEAN | true | — |
| upload_mode | COMBO | final_only | 2 options: final_only, all_files |
| send_as | COMBO | auto | 4 options: auto, video, photo, document |
| message_mode | COMBO | caption_and_reply | 3 options: caption_only, caption_and_reply, caption_reply_and_json |
| failure_mode | COMBO | warn | 2 options: warn, raise |
| filenamesopt | VHS_FILENAMES | — | |
| titleopt | STRING | — | |
| positive_promptopt | STRING | — | |
| negative_promptopt | STRING | — | |
| extra_notesopt | STRING | — | |
| base_modelopt | STRING | — | |
| base_model_objopt | WANVIDEOMODEL | — | |
| high_modelopt | STRING | — | |
| high_model_objopt | WANVIDEOMODEL | — | |
| low_modelopt | STRING | — | |
| low_model_objopt | WANVIDEOMODEL | — | |
| vaeopt | STRING | — | |
| lora_1_nameopt | STRING | — | |
| lora_1_strengthopt | FLOAT | 0.00 | — |
| lora_2_nameopt | STRING | — | |
| lora_2_strengthopt | FLOAT | 0.00 | — |
| lora_3_nameopt | STRING | — | |
| lora_3_strengthopt | FLOAT | 0.00 | — |
| lora_4_nameopt | STRING | — | |
| lora_4_strengthopt | FLOAT | 0.00 | — |
| lora_5_nameopt | STRING | — | |
| lora_5_strengthopt | FLOAT | 0.00 | — |
| high_loras_objopt | WANVIDLORA | — | |
| high_lorasopt | STRING | — | |
| low_loras_objopt | WANVIDLORA | — | |
| low_lorasopt | STRING | — | |
| extra_lorasopt | STRING | — | |
| seedopt | INT | -1 | — |
| stepsopt | INT | 0 | — |
| cfgopt | FLOAT | 0.0 | — |
| sampleropt | STRING | — | |
| scheduleropt | STRING | — | |
| widthopt | INT | 0 | — |
| heightopt | INT | 0 | — |
| framesopt | INT | 0 | — |
| fpsopt | FLOAT | 0.00 | — |
| reference_labelopt | STRING | — | |
| reference_imageopt | IMAGE | — | |
| send_reference_imageopt | BOOLEAN | false | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| filenames | VHS_FILENAMES | — |
| message_preview | STRING | — |