MOSS-Image Official Text Encode
MOSS-Image Reads Your Prompt With a 9B LLM — So Stop Writing Tags
- text_encoder
- conditioning
Your prompt does not go into CLIP here. It goes into a Qwen3.5 chat template, gets tokenized up to 4096 tokens, and comes out as the LLM's last hidden state. Which means every habit you built on CLIP-era models - (word:1.4), BREAK, quality-tag spam, negative embeddings - is somewhere between useless and actively harmful. This node is where you find out.
Why it exists as its own node
On an LLM-encoded model the prompt no longer turns into a fixed 77-token block. It turns into a variable-length sequence with an attention mask, and the mask has to survive all the way into the sampler - otherwise the model attends to padding and your prompt quality quietly drops for no visible reason. That's why the pack gives you a MOSS_IMAGE_CONDITIONING type instead of vanilla CONDITIONING: it carries positive and negative embeddings plus their masks, and the sampler consumes them directly. You can't route it through a stock CLIP Text Encode node, and you don't want to.
The node description says "official Qwen chat template and last hidden state, without prompt-weight rewriting," and that last clause is the author being straight with you. No rewriting means ((face:1.4)) isn't parsed and applied - it's tokenized as literal punctuation inside your instructions. You're not gaining weight, you're giving the model junk to read.
The mechanism, briefly
Positive and negative are encoded in separate passes through the full text encoder, using the tokenizer assets that sit in the .assets/tokenizer folder beside the TE weights. Then the encoder is let go - released from VRAM before the sampler runs. That's the pack's staged lifecycle: encode, free, sample, free, decode. On a 16.79 GB text encoder this is not a cosmetic detail, it's the difference between fitting and not.
The inputs you'll touch
Four required fields, and two of them are just prompt boxes.
text_encoder comes from the MOSS-Image Official TE Loader. positive and negative are multiline strings. The default positive is a small red fox in a meadow - the author's smoke test, and worth keeping for your first run so you can tell generation problems from prompt problems.
max_sequence_length defaults to 4096 and caps at 4096. Leave it. Shortening it saves a little encoder time and costs you the ability to describe anything complicated; long prompts are genuinely this model's strength, so there's no reason to truncate.
The negative box is the interesting one, because unlike most 2026 models this one runs real CFG at 3.0 by default, so the negative isn't decorative. It does mean you finally have a use for it - but resist importing six lines of blurry, ugly, deformed, bad anatomy from an SDXL workflow. Plain, specific statements about what you don't want beat the ritual word salad, and the default empty string is a fine starting point.
Output is a single conditioning - straight into the Official Sampler. Nowhere else.
Install
ComfyUI Manager → ComfyUI MOSS-Image T8 (publisher t8star, package moss-image-t8) → restart. Manually, from your ComfyUI directory:
cd ComfyUI
git clone https://github.com/T8mars/Comfyui-Moss-Image-T8 custom_nodes/Comfyui-Moss-Image-T8
python -m pip install -r custom_nodes/Comfyui-Moss-Image-T8/requirements.txt
The text encoder is the one download you can't skip: 16.79 GB, BF16, shared by Base and SFT.
hf download t8star/Moss-Image-Comfy --local-dir models --include "text_encoders/*"
Unlike the DiT and VAE folders, the TE's .assets directory carries the tokenizer - tokenizer.json, tokenizer_config.json, chat_template.jinja. Keep it beside the weights.
Where people get burned
Prompt weighting does nothing. Covered above, but it bears repeating because people report it as a bug weekly on every LLM-encoded model. Write sentences with explicit ownership - "a woman in a red coat holding a blue umbrella" beats any bracket syntax, and word order is what binds attributes now.
The tokenizer folder got "cleaned up." The loader accepts exactly those three files in .assets/tokenizer and rejects extras or subdirectories. If you tossed in a spare vocab file or your sync tool added a .DS_Store, you get an "expected only the three verified official tokenizer files" error. Delete the extra, don't re-download 17 GB.
You assumed the encoder stays loaded. It doesn't. Each run re-encodes and re-releases, so tweaking only the seed while the prompt stays identical still costs you an encode pass. Cheap enough in practice, but it explains the startup delay between hitting Run and seeing sampling progress - and it explains why a batch of one prompt is much cheaper per image than a batch of ten different prompts.
First run on a card that barely fits. device lives on the TE Loader, and auto will fall back to CPU if the weights don't fit with headroom. It works; it's just slow enough that you'll think it hung. It checks for cancellation between encoder blocks, so it hasn't frozen - give it a minute before reaching for the interrupt button.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| text_encoder | MOSS_IMAGE_TE | — | |
| positive | STRING | A small red fox sitting in a green meadow, soft morning light. | — |
| negative | STRING | — | |
| max_sequence_length | INT | 40961–4096 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| conditioning | MOSS_IMAGE_CONDITIONING | — |