feat(3d): expose the Meshy 7 surface and correct the stale model docs - #1
Merged
Conversation
The 3D commands were written when `latest` meant Meshy 6. It has since moved to Meshy 7 on image-to-3d, multi-image-to-3d and retexture, so the CLI has been running Meshy 7 for a while while telling users otherwise — `--model-type` help still advertised "meshy-6 full-detail generation". Corrects every one of those, and adds the two knobs Meshy 7 introduced. Verified against production with zero-credit 400 probes rather than from the changelog, which turned up two things the docs get wrong: - `ultra_mode` does NOT exist on multi-image-to-3d. Unknown fields are silently ignored there, so exposing a flag would have looked like it worked. It is single-image only, hence `--ultra-mode` on image-to-3d alone, rejected locally against `--model-type smart-topology` (the server answers "ultra_mode is only supported for meshy-7"). Omitting ai_model passes that gate, so the no-model-choice contract holds. - `multiview_image_urls` requires the *literal* `ai_model: "meshy-7"`. The endpoint returns "multiview_image_urls requires ai_model meshy-7" for an omitted model AND for "latest", the public docs notwithstanding. So multi-view retexture is the one command here that pins a version — in the defaults layer, so `--data` still wins if the gate loosens. text-to-3d is left alone on purpose: its model set is meshy-5/meshy-6/ latest with no meshy-7 at all, and its `latest` is still Meshy 6. That asymmetry is now written down where someone will read it. Also routes `--multiview-image-urls` through the file-input resolver so local paths work like every other media flag, and refuses more than one of the three mutually exclusive style inputs instead of letting the API silently drop one. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The 3D commands were written when the server's
latestmeant Meshy 6. It has since moved to Meshy 7 onimage-to-3d,multi-image-to-3dandretexture— so the CLI has been running Meshy 7 for a while while telling users otherwise.--model-type --helpstill read "standard (default; meshy-6 full-detail generation)", and three source headers claimedlatest = meshy-6.None of the Meshy 7 knobs were reachable except through
--data.What changed
image-to-3d--ultra-mode <bool>retexture--multiview-image-urls <csv>(1–4 views of the same object)image-to-3d/multi-image-to-3dtext-to-3d--multiview-image-urlsgoes through the normal file-input resolver, so local paths work like every other media flag. The three style inputs (--text-style-prompt/--image-style-url/--multiview-image-urls) now reject each other instead of letting the API silently drop one.Verified against production, not against the changelog
Every claim below came from zero-credit
400probes on the live API. Two of them contradict what was written down:1.
ultra_modedoes not exist onmulti-image-to-3d.Silently ignored is worse than rejected — a flag there would have looked like it worked. So
--ultra-modelands onimage-to-3donly, and a surface test pins it there.Its gate, confirmed:
Omitting
ai_modelpasses, so the "mode is the model" contract survives untouched; the smart-topology combination is refused locally rather than on the wire.2.
multiview_image_urlsrequires the literal"meshy-7".The public docs say "requires
ai_model: "meshy-7"(orlatest)". It does not acceptlatest. Leaving the model to the server — what every other 3D command here does — is a guaranteed 400, so this is the one command that pins a version. It's pinned in the defaults layer, so--data '{"ai_model":"..."}'still wins if the gate ever loosens, and a test locks it because deleting the pin silently breaks the feature.3. Model sets, straight from the enum errors:
text-to-3dis therefore left alone, and that asymmetry is now written down in its header instead of being rediscovered.Notes for review
--ultra-modehelp text carries no credit figure —tests/surface.test.tsforbids prices in the command surface, and pricing stays in the skill/docs.retexture.tsgains one test-only export (retextureSpec) so the meshy-7 pin is assertable. Happy to drop it if you'd rather not open that seam.make(unchanged chain), pricing estimates, version bump.Test plan
pnpm run typecheckcleanpnpm test— 360 pass / 0 fail (3 new)--ultra-mode true --model-type smart-topology→ exit 2, local errorretexturewith no style input → exit 2--text-style-prompt+--multiview-image-urls→ exit 2, mutually exclusiveultra_mode: truepresent in the image-to-3d payload; multi-view retexture payload carriesai_model: "meshy-7"and clears the gate (fails later on my 2×2 test pixels, as it should); non-multi-view retexture carries noai_model🤖 Generated with Claude Code