Save Asset (Auto) 🐑
Let the LLM Write the Description — It Fills Blanks, Never Rewrites You
- llm_service_connector
- image
- audio
- name
- description
- voice
- image
- status
- asset
Writing a 60–100 word description of a character's face, hair, build and wardrobe is exactly the kind of chore that makes people skip the asset library and go back to re-prompting. Save Asset (Auto) 🐑 removes it: it's Save Asset 🐑 with an llm_service_connector bolted on, and if you leave description (or voice) empty, the LLM drafts them during the same run that saves the asset.
The rule that makes it trustworthy is the one in the header: it fills blanks, it never rewrites you. Anything you typed is saved verbatim. If you've written half the description and want the model to finish the vibe, that's not what this does - write it yourself or leave it entirely empty.
How the drafting works
Two different calls, and they're not equally good.
The description call is the same multimodal captioner the H3 prompt generator uses for reference images: it looks at the picture and writes a 60–100 word English identity description (for scenes, a place description - space, furniture, lighting, atmosphere). It can see, so it's decent.
The voice call can't hear anything. It's a text call from the name plus the drafted appearance, inferring a plausible timbre. The audio sample, WAV or MP3, is never listened to. That's why voice_prompt exists: it's a free-text author note and the only channel for the real timbre - elderly male, hoarse, slow pace - and you should use it every time you care, because the model is otherwise guessing from a face.
image_prompt is the matching author note for the description call: mood, wardrobe, facts that must make it into the text, any language. Empty means "draft from the picture alone."
The status output tells you what happened - it'll say plainly when the LLM drafted the description and voice, so a week later you know which assets are machine-written and which are yours.
Inputs and outputs
kind (character / scene) reshapes the node exactly as on the plain Save node: collapse to scene and voice, voice_prompt, the audio socket and the audio card all disappear. name is the Existing/New toggle - pick from the dropdown to overwrite, or switch to ✏️ 新建 and type into new_name.
llm_service_connector is required, which is the one place this node is stricter than its sibling. Any of the pack's connector nodes works; with Ollama you don't need an API key, just a local model name.
Media follows the usual priority: image / audio sockets beat the image_upload / audio_upload pickers, and both empty on an overwrite keeps the files already on disk.
Outputs are name, description, voice, image, status, asset. asset is the whole bundle for the generator's sockets or Asset → Assets 🐑.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/MieMieeeee/ComfyUI-MieNodes
pip install -r ComfyUI-MieNodes/requirements.txt
Or ComfyUI Manager, search ComfyUI_MieNodes. No models ship with the pack - the "model" here is whatever LLM you point the connector at. Keys go in mie_llm_keys.json next to the README, or directly in the connector's api_token.
Worth a moment's thought before you wire a paid API key into a captioning node: the picture leaves your machine on every save, and per-call costs add up when you're batching twenty characters. A local Ollama VLM avoids both, and for 60-word descriptions a small vision model is plenty.
Things that go wrong
auto-draft needs a picture to write the description - the drafting pass needs an image, either wired into image or picked via image_upload. Fill the description yourself or give it a picture; it won't invent an appearance from a name.
Voice descriptions coming back generic (all "warm, mid-range, unhurried") is the expected behaviour of a model that can't hear. Put the real answer in voice_prompt.
And remember it's an output node: typed changes and drafts only land when the graph executes. Use the on-node save button rather than assuming the widget change was a save.
Inputs (13)
| Name | Type | Default | Description |
|---|---|---|---|
| kind | COMBO | character | 资产类型 kind:character = 角色(voice 音色 + 音频样本);scene = 场景(只有描述 + 图,音色/音频被忽略)。 Asset kind: character (voice + audio sample) or scene (description + image only; voice/audio are ignored). |
| library_dir | STRING | — | |
| name | COMBO | (下拉选择资产) | 资产名:📋 已有资产 Existing 模式下拉选名字 = 覆盖该资产;✏️ 新建 New 模式输入名字 = 新建(两者互斥二选一)。 Asset name: 📋 Existing mode picks an asset to overwrite; ✏️ New mode types a name to create — the two are mutually exclusive. |
| description | STRING | 资产的英文描述(60–100 词)。角色 = 外观事实(年龄/发型/脸型/着装),场景 = 空间/陈设/光线/氛围。 English description (60-100 words). Character = looks only; scene = space, furniture, lighting, atmosphere. | |
| voice | STRING | 角色音色的英文一行描述(年龄/性别/音域/语速/质感,≤200 字符);场景类型忽略本字段。 One-line English timbre descriptor for characters (age/gender/register/pace/texture, <=200 chars); ignored for scenes. | |
| new_name | STRING | — | |
| llm_service_connector | LLMServiceConnector | 起草空白 description/voice 的 LLM 连接器。LLM connector that drafts the empty fields. | |
| imageopt | IMAGE | — | |
| audioopt | AUDIO | — | |
| image_uploadopt | STRING | — | |
| audio_uploadopt | STRING | — | |
| image_promptopt | STRING | 给描述 LLM 的作者先验(可选):角色 = 气质/着装/必须写进的事实;场景 = 地点/时段/氛围/陈设事实;任意语言。空 = 纯看图起草。 Author prior for the description call (optional): character mood/wardrobe facts or scene place/time/furnishing facts — any language. Empty = draft from the picture alone. | |
| voice_promptopt | STRING | 给音色 LLM 的作者先验(可选,仅角色类型):它听不到音频,真实音色只能在这里告诉它,如「老年男声,沙哑,语速慢」。空 = 从名字+外观推断;场景类型忽略本字段。 Author prior for the voice call (optional, characters only): the LLM cannot hear the sample — ground-truth timbre goes ONLY here, e.g. 'elderly male, hoarse, slow pace'. Empty = inferred from name+looks; ignored for scenes. |
Outputs (6)
| Name | Type | Description |
|---|---|---|
| name | STRING | — |
| description | STRING | — |
| voice | STRING | — |
| image | IMAGE | — |
| status | STRING | — |
| asset | MIE_ASSET | — |