LingBot TI2V Plaintext + Image + Qwen Encode
Give it an image, tell it what happens next
- model
- first_frame
- conditioning
- structured_json
- expanded_caption
- conditioned_first_frame
Image-to-video is where the LingBot demo GIFs actually shine - the README's showcase is an anime character animating a continuous expression from a single starting frame, with the style and identity holding together. LingBotTI2VPromptEncode is the node that makes that happen. You feed it an image plus a plaintext description of the motion that should follow it, and it builds the conditioning for the TI2V sampler - including encoding your image into the latent that gets fixed as frame 0.
Why you'd reach for it over the plain LingBotPromptEncode: because the prompt node and the image conditioning have to agree. This node handles both in one place, and it makes sure the "what happens after the first frame" text and the "this is what frame 0 looks like" pixels end up in the same conditioning object. Do it separately and you'll fight resolution and timing mismatches all afternoon.
How it works
Three things happen when it runs:
- Frame prep. Your
first_frameimage is center-cropped to the selected video aspect ratio (the tooltip spells it out: "The first image in the batch is center-cropped to the selected video aspect ratio and fixed as frame 0") and normalized to the resolution you set viawidth/height. - Rewrite. Your
plaintext_promptis expanded by Qwen into the LingBot JSON, exactly like the T2V prompt node - but here Qwen is Qwen3VL, and it sees the image during both rewrite stages. That's the trick: the model isn't blindly writing a generic motion prompt, it's describing motion relative to the actual pixels it's looking at. Identity, clothing, lighting - those stay consistent because the text encoder isn't guessing them. - Encode. Both the structured JSON and the frame are encoded into a
LINGBOT_CONDITIONINGthat carries the frame along as conditioning (first_frame_pixel), which the TI2V sampler later uses to pin the first latent during denoising.
Outputs are conditioning, structured_json, expanded_caption, and - handy - conditioned_first_frame, the actual processed image after crop/resize. Wire that into a preview node if you want to confirm the crop didn't butcher your subject before burning GPU time.
Inputs worth knowing
- first_frame - an
IMAGE. One RGB image; the sampler will reject multi-image batches ("TI2V currently supports one RGB first frame"). - plaintext_prompt - what should happen after the first frame. The default is a decent template: "The subject begins from the supplied first frame, then moves naturally while preserving identity, clothing, lighting, and scene layout. Stable cinematic camera motion."
- structured_json_override - non-empty JSON bypasses the rewrite; the image is still used both for Qwen-VL conditioning and as frame-0 conditioning.
- duration_seconds - connect it to Generation Settings so action timestamps match the clip. Same rule as the T2V node.
- negative_prompt - JSON only; empty uses LingBot's vendored default.
- width / height - the target video resolution, and they must match what the sampler runs at.
Install and the workflow-required bits
Ships with the pack:
cd ComfyUI/custom_nodes
git clone https://github.com/ALX-CODE/lingbot-video-1.3b-fp8
pip install -r requirements.txt # with ComfyUI's python
or ComfyUI Manager → search "LingBot" → restart. Needs the model's text_encoder/processor (for Qwen3VL) and a working model load first. Two pack-specific gotchas for TI2V:
- The published TI2V workflow ships with placeholder
Load Imagenodes - intentionally nonexistent filenames so personal images aren't published. Replace every one before queueing, or you'll get "missing image" errors that look like the node is broken. - The sampler will refuse to run if the conditioning frame's resolution doesn't match the sampler's width/height. Keep the same Generation Settings connections feeding both.
Also worth knowing: TI2V is the supported image mode. The flashier first-and-last-frame mode is a separate experimental pair of nodes, and it's genuinely risky - LingBot wasn't trained for it. If you want reliable animated-from-an-image results, this node is the one to use.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| model | LINGBOT_MODEL | — | |
| first_frame | IMAGE | The first image in the batch is center-cropped to the selected video aspect ratio and fixed as frame 0. | |
| plaintext_prompt | STRING | The subject begins from the supplied first frame, then moves naturally while preserving identity, clothing, lighting, and scene layout. Stable cinematic camera motion. | Describe what should happen after the supplied first frame. Qwen sees the image during both rewrite stages. |
| structured_json_override | STRING | Optional advanced override. The supplied image is still used by Qwen-VL and as frame-0 conditioning. | |
| duration_seconds | FLOAT | 3.00.1–120 | — |
| negative_prompt | STRING | JSON only. Leave empty to use LingBot's vendored default negative prompt. | |
| width | INT | 64016–4096 | — |
| height | INT | 35216–4096 | — |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| conditioning | LINGBOT_CONDITIONING | — |
| structured_json | STRING | — |
| expanded_caption | STRING | — |
| conditioned_first_frame | IMAGE | — |