Meshy - Text to 3D (Refine)
Turning a Meshy Preview Into the Real Model
- api_key
- thumbnail
- base_color
- normal
- metallic_roughness
- model_path
Preview gets you the draft. MeshyTextTo3DRefine gets you the finished piece. The pack's two-stage design mirrors how Meshy's own API works: generate geometry cheap, then spend more credits to add the texture and detail that makes a model actually usable. If you've run a Preview and thought "that's a lumpy untextured mess," this is the node that fixes it.
How it works
The refine node doesn't re-run the whole generation. You feed it the task_id string that the Preview node output, and it submits a refine task to the same text-to-3D endpoint, then polls and downloads exactly like Preview does - every five seconds, up to a ten-minute window, with a progress bar. The heavy lifting of re-texturing and adding detail happens on Meshy's servers; your machine just waits and then collects the files.
The inputs that matter
There are only three, and only one of them is required:
- preview_task_id - a plain string, required, and empty by default. This is the
task_idoutput from Meshy Text to 3D (Preview). Wire it across. - texture_prompt - optional. A short description of how the surface should look ("brushed aluminum", "worn leather") to steer the texturing pass. Leave it empty and Meshy just does its thing.
- enable_pbr - optional, default on. Physically-based rendering textures (base color, normal, metallic/roughness), which is what you want if the model is headed into a renderer or game engine.
The outputs mirror Preview minus one: thumbnail, base_color, normal, metallic_roughness (all IMAGE tensors) and model_path (the path to the downloaded .glb). Note there's no task_id output here - refinement is the end of the chain, so you can't re-refine a refine without going back to a fresh preview.
The trap: empty task id
This is the failure mode you will hit the first time, because the node validates that preview_task_id isn't blank and politely refuses to do anything if it is - you get the red error placeholder on every output and an empty model_path, plus a console message telling you to run Preview first and connect its task_id. It's a friendly error, but it can look like a crash if you're not expecting it. The workflow shape is: Preview → its task_id output → Refine's preview_task_id input. Don't try to paste in a task id from a previous session's log either; these task references are meant to be live in the graph.
Why it's a separate node (the economics)
Refinement costs extra credits on top of the preview - you're paying twice, which is exactly why it's not just toggled on by default. The sensible loop is to generate several previews cheaply, pick the winner, and refine only that one. Treat every Preview run as a paid candidate and you'll feel the difference in your credit balance fast. The README quotes preview pricing (roughly 20 credits on meshy-6, ~5 on others) and bills refine as "additional credits" - the exact number depends on model and settings, so check the pricing page before you go wild.
Installing and the rest of the pack
Same install as everything in this pack - no model downloads, it's all cloud API. Via ComfyUI Manager, search "ComfyUI-Meshy", or:
cd ComfyUI/custom_nodes
git clone https://github.com/Kazama-Suichiku/ComfyUI-Meshy
pip install -r ComfyUI-Meshy/requirements.txt
then restart. Dependencies are numpy, Pillow, requests, torch, pyhocon; the only non-standard one is pyhocon. You need a Meshy API key (wired through the Meshy API Key node) and a credit balance. It's a young pack - single commit, late 2025 - so if Manager's registry lags, clone by hand. Result files land in a meshy_<timestamp>_<short-task-id>/ folder under your ComfyUI output directory.
Troubleshooting
Beyond the empty-task-id trap: refine runs can fail if the preview task is no longer valid or was generated under a different account/key, so keep the whole Preview→Refine chain on one API key. Content-filtered prompts and an empty credit balance will fail just like they do at Preview. And since this is a paid call that can run for minutes, it's worth checking the console periodically - the progress bar tells you if you're polling a dead task or a live one.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| api_key | APIKEY | — | |
| preview_task_id | STRING | Task ID from Meshy - Text to 3D (Preview) node output | |
| texture_promptopt | STRING | Additional prompt for texturing (optional) | |
| enable_pbropt | BOOLEAN | true | Enable PBR textures |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| thumbnail | IMAGE | — |
| base_color | IMAGE | — |
| normal | IMAGE | — |
| metallic_roughness | IMAGE | — |
| model_path | STRING | — |