@doufunao123/asset-gateway 0.24.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +164 -24
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import { AssetForgeError } from "@doufunao123/assetforge-sdk";
|
|
|
15
15
|
|
|
16
16
|
// src/meta.ts
|
|
17
17
|
var CLI_NAME = "asset-gateway";
|
|
18
|
-
var CLI_VERSION = "0.
|
|
18
|
+
var CLI_VERSION = "0.25.1";
|
|
19
19
|
var CLI_DESCRIPTION = "Universal asset generation gateway CLI";
|
|
20
20
|
var DEFAULT_GATEWAY_URL = "https://asset.origingame.dev";
|
|
21
21
|
|
|
@@ -989,16 +989,32 @@ function createGenerateCommand() {
|
|
|
989
989
|
})
|
|
990
990
|
);
|
|
991
991
|
command.addCommand(
|
|
992
|
-
new Command3("model").description(
|
|
992
|
+
new Command3("model").description(
|
|
993
|
+
"Generate a 3D model with Meshy AI. Default --quality=preview returns a single preview mesh (fast); --quality=full chains preview \u2192 refine \u2192 remesh to deliver a production-ready mesh."
|
|
994
|
+
).option("--image <input>", "Reference image path or URL").option("--format <fmt>", "Output format: glb, fbx, obj, usdz, stl, 3mf", "glb").option("--prompt <text>", "Model description prompt").option(
|
|
995
|
+
"--quality <mode>",
|
|
996
|
+
"Pipeline mode: preview (single stage, ~30s) or full (chained: preview \u2192 refine \u2192 remesh, ~5-10min)"
|
|
997
|
+
).option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--polycount <n>", "Target polygon count (full quality only)").option("--pbr", "Enable PBR textures").option("--hd-texture", "Request 4K texture output (requires --ai-model meshy-6)").option("--pose-mode <mode>", "Character pose mode: a-pose or t-pose").option("--auto-size", "Estimate real-world size automatically").option("--negative-prompt <text>", "Negative prompt").option("--multiview <inputs>", "Comma-separated multiview image paths or URLs").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
998
|
+
"--async",
|
|
999
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1000
|
+
).action(async function(options) {
|
|
993
1001
|
try {
|
|
994
1002
|
assertHas3dInput(options.prompt, options.image, options.multiview);
|
|
1003
|
+
if (options.hdTexture && options.aiModel && options.aiModel !== "meshy-6") {
|
|
1004
|
+
throw new Error(
|
|
1005
|
+
"--hd-texture requires --ai-model meshy-6 (got '" + options.aiModel + "'); preview would succeed but refine would 400 and waste credits"
|
|
1006
|
+
);
|
|
1007
|
+
}
|
|
995
1008
|
const ctx = createContext(this);
|
|
996
1009
|
const params = {};
|
|
997
1010
|
if (options.negativePrompt) params.negative_prompt = options.negativePrompt;
|
|
998
1011
|
if (options.multiview) {
|
|
999
1012
|
params.multiview = parseCommaSeparatedValues(options.multiview).map((value) => toInputFile(value)).filter((value) => Boolean(value));
|
|
1000
1013
|
}
|
|
1001
|
-
|
|
1014
|
+
if (options.quality) {
|
|
1015
|
+
params.model3d_quality = options.quality;
|
|
1016
|
+
}
|
|
1017
|
+
const sdkOptions = {
|
|
1002
1018
|
input: toInputFile(options.image),
|
|
1003
1019
|
format: options.format,
|
|
1004
1020
|
ai_model: options.aiModel,
|
|
@@ -1008,7 +1024,19 @@ function createGenerateCommand() {
|
|
|
1008
1024
|
pose_mode: options.poseMode,
|
|
1009
1025
|
auto_size: options.autoSize ? true : void 0,
|
|
1010
1026
|
params: Object.keys(params).length > 0 ? toJsonObject(params) : void 0
|
|
1011
|
-
}
|
|
1027
|
+
};
|
|
1028
|
+
if (options.async) {
|
|
1029
|
+
const ack = await ctx.client.model3d(options.prompt ?? "", {
|
|
1030
|
+
...sdkOptions,
|
|
1031
|
+
async: true
|
|
1032
|
+
});
|
|
1033
|
+
printSuccess("generate.model", ack, ctx);
|
|
1034
|
+
return;
|
|
1035
|
+
}
|
|
1036
|
+
const data = await ctx.client.model3d(
|
|
1037
|
+
options.prompt ?? "",
|
|
1038
|
+
sdkOptions
|
|
1039
|
+
);
|
|
1012
1040
|
const localPath = await saveOutput(data, "model3d", options.outputDir, options.format);
|
|
1013
1041
|
if (localPath) data.local_path = localPath;
|
|
1014
1042
|
printSuccess("generate.model", data, ctx);
|
|
@@ -1018,12 +1046,20 @@ function createGenerateCommand() {
|
|
|
1018
1046
|
})
|
|
1019
1047
|
);
|
|
1020
1048
|
command.addCommand(
|
|
1021
|
-
new Command3("character").description("Generate a fully processed 3D character with Meshy AI").option("--prompt <text>", "Character description prompt").option("--image <input>", "Reference image path or URL").option("--images <inputs>", "Comma-separated reference image paths or URLs").option("--format <fmt>", "Output format: glb, fbx, obj, usdz, stl, 3mf", "glb").option("--polycount <n>", "Target polygon count").option("--pbr", "Enable PBR textures").option("--hd-texture", "Request 4K texture output").option("--pose-mode <mode>", "Character pose mode: a-pose or t-pose").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--auto-size", "Estimate real-world size automatically").option("--output-dir <dir>", "Directory to save output", ".").
|
|
1049
|
+
new Command3("character").description("Generate a fully processed 3D character with Meshy AI (chained preview \u2192 refine \u2192 remesh \u2192 rig)").option("--prompt <text>", "Character description prompt").option("--image <input>", "Reference image path or URL").option("--images <inputs>", "Comma-separated reference image paths or URLs").option("--format <fmt>", "Output format: glb, fbx, obj, usdz, stl, 3mf", "glb").option("--polycount <n>", "Target polygon count").option("--pbr", "Enable PBR textures").option("--hd-texture", "Request 4K texture output (requires --ai-model meshy-6)").option("--pose-mode <mode>", "Character pose mode: a-pose or t-pose").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--auto-size", "Estimate real-world size automatically").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1050
|
+
"--async",
|
|
1051
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1052
|
+
).action(async function(options) {
|
|
1022
1053
|
try {
|
|
1023
1054
|
assertHas3dInput(options.prompt, options.image, options.images);
|
|
1055
|
+
if (options.hdTexture && options.aiModel && options.aiModel !== "meshy-6") {
|
|
1056
|
+
throw new Error(
|
|
1057
|
+
"--hd-texture requires --ai-model meshy-6 (got '" + options.aiModel + "'); preview would succeed but refine would 400 and waste credits"
|
|
1058
|
+
);
|
|
1059
|
+
}
|
|
1024
1060
|
const ctx = createContext(this);
|
|
1025
1061
|
const images = parseCommaSeparatedValues(options.images).map((value) => toInputFile(value)).filter((value) => Boolean(value));
|
|
1026
|
-
const
|
|
1062
|
+
const sdkOptions = {
|
|
1027
1063
|
input: toInputFile(options.image),
|
|
1028
1064
|
images: images.length > 0 ? images : void 0,
|
|
1029
1065
|
format: options.format,
|
|
@@ -1033,7 +1069,19 @@ function createGenerateCommand() {
|
|
|
1033
1069
|
pose_mode: options.poseMode,
|
|
1034
1070
|
ai_model: options.aiModel,
|
|
1035
1071
|
auto_size: options.autoSize ? true : void 0
|
|
1036
|
-
}
|
|
1072
|
+
};
|
|
1073
|
+
if (options.async) {
|
|
1074
|
+
const ack = await ctx.client.character(options.prompt ?? "", {
|
|
1075
|
+
...sdkOptions,
|
|
1076
|
+
async: true
|
|
1077
|
+
});
|
|
1078
|
+
printSuccess("generate.character", ack, ctx);
|
|
1079
|
+
return;
|
|
1080
|
+
}
|
|
1081
|
+
const data = await ctx.client.character(
|
|
1082
|
+
options.prompt ?? "",
|
|
1083
|
+
sdkOptions
|
|
1084
|
+
);
|
|
1037
1085
|
const localPath = await saveOutput(data, "character", options.outputDir, options.format);
|
|
1038
1086
|
if (localPath) data.local_path = localPath;
|
|
1039
1087
|
printSuccess("generate.character", data, ctx);
|
|
@@ -1043,12 +1091,20 @@ function createGenerateCommand() {
|
|
|
1043
1091
|
})
|
|
1044
1092
|
);
|
|
1045
1093
|
command.addCommand(
|
|
1046
|
-
new Command3("prop").description("Generate a fully processed 3D prop with Meshy AI").option("--prompt <text>", "Prop description prompt").option("--image <input>", "Reference image path or URL").option("--images <inputs>", "Comma-separated reference image paths or URLs").option("--format <fmt>", "Output format: glb, fbx, obj, usdz, stl, 3mf", "glb").option("--polycount <n>", "Target polygon count").option("--pbr", "Enable PBR textures").option("--hd-texture", "Request 4K texture output").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--auto-size", "Estimate real-world size automatically").option("--texture-prompt <text>", "Optional texture prompt for the final material pass").option("--output-dir <dir>", "Directory to save output", ".").
|
|
1094
|
+
new Command3("prop").description("Generate a fully processed 3D prop with Meshy AI (chained preview \u2192 refine \u2192 remesh)").option("--prompt <text>", "Prop description prompt").option("--image <input>", "Reference image path or URL").option("--images <inputs>", "Comma-separated reference image paths or URLs").option("--format <fmt>", "Output format: glb, fbx, obj, usdz, stl, 3mf", "glb").option("--polycount <n>", "Target polygon count").option("--pbr", "Enable PBR textures").option("--hd-texture", "Request 4K texture output (requires --ai-model meshy-6)").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--auto-size", "Estimate real-world size automatically").option("--texture-prompt <text>", "Optional texture prompt for the final material pass").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1095
|
+
"--async",
|
|
1096
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1097
|
+
).action(async function(options) {
|
|
1047
1098
|
try {
|
|
1048
1099
|
assertHas3dInput(options.prompt, options.image, options.images);
|
|
1100
|
+
if (options.hdTexture && options.aiModel && options.aiModel !== "meshy-6") {
|
|
1101
|
+
throw new Error(
|
|
1102
|
+
"--hd-texture requires --ai-model meshy-6 (got '" + options.aiModel + "'); preview would succeed but refine would 400 and waste credits"
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1049
1105
|
const ctx = createContext(this);
|
|
1050
1106
|
const images = parseCommaSeparatedValues(options.images).map((value) => toInputFile(value)).filter((value) => Boolean(value));
|
|
1051
|
-
const
|
|
1107
|
+
const sdkOptions = {
|
|
1052
1108
|
input: toInputFile(options.image),
|
|
1053
1109
|
images: images.length > 0 ? images : void 0,
|
|
1054
1110
|
format: options.format,
|
|
@@ -1058,7 +1114,19 @@ function createGenerateCommand() {
|
|
|
1058
1114
|
ai_model: options.aiModel,
|
|
1059
1115
|
auto_size: options.autoSize ? true : void 0,
|
|
1060
1116
|
texture_prompt: options.texturePrompt
|
|
1061
|
-
}
|
|
1117
|
+
};
|
|
1118
|
+
if (options.async) {
|
|
1119
|
+
const ack = await ctx.client.prop(options.prompt ?? "", {
|
|
1120
|
+
...sdkOptions,
|
|
1121
|
+
async: true
|
|
1122
|
+
});
|
|
1123
|
+
printSuccess("generate.prop", ack, ctx);
|
|
1124
|
+
return;
|
|
1125
|
+
}
|
|
1126
|
+
const data = await ctx.client.prop(
|
|
1127
|
+
options.prompt ?? "",
|
|
1128
|
+
sdkOptions
|
|
1129
|
+
);
|
|
1062
1130
|
const localPath = await saveOutput(data, "prop", options.outputDir, options.format);
|
|
1063
1131
|
if (localPath) data.local_path = localPath;
|
|
1064
1132
|
printSuccess("generate.prop", data, ctx);
|
|
@@ -1734,7 +1802,13 @@ async function saveProcess3dOutput(data, operation, outputDir, format) {
|
|
|
1734
1802
|
function createProcess3dCommand() {
|
|
1735
1803
|
const command = new Command8("process3d").description("3D model post-processing via Meshy AI");
|
|
1736
1804
|
command.addCommand(
|
|
1737
|
-
new Command8("remesh").description("Remesh a model and optionally change format or polygon count").option("--task-id <id>", "Meshy task ID").option("--model-url <url>", "Model URL to remesh without an existing task").requiredOption("--format <fmt>", "Target format: glb, fbx, obj, usdz, stl, 3mf").option("--polycount <n>", "Target polygon count").option("--topology <type>", "Topology type: triangle or quad").option("--auto-size", "Estimate real-world size automatically").option("--
|
|
1805
|
+
new Command8("remesh").description("Remesh a model and optionally change format or polygon count").option("--task-id <id>", "Meshy task ID").option("--model-url <url>", "Model URL to remesh without an existing task").requiredOption("--format <fmt>", "Target format: glb, fbx, obj, usdz, stl, 3mf").option("--polycount <n>", "Target polygon count (Meshy target_polycount; result polycount may vary 1.5-2x)").option("--topology <type>", "Topology type: triangle or quad").option("--auto-size", "Estimate real-world size automatically (Meshy auto_size is unreliable on small objects)").option("--resize-height <meters>", "Resize the mesh so its bounding box height equals this many meters").option(
|
|
1806
|
+
"--origin-at <point>",
|
|
1807
|
+
"Move the origin: bottom, top, center, bottom-center, top-center"
|
|
1808
|
+
).option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1809
|
+
"--async",
|
|
1810
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1811
|
+
).action(async function(options) {
|
|
1738
1812
|
try {
|
|
1739
1813
|
if (!options.taskId && !options.modelUrl) {
|
|
1740
1814
|
throw new Error("Either --task-id or --model-url is required");
|
|
@@ -1744,9 +1818,29 @@ function createProcess3dCommand() {
|
|
|
1744
1818
|
target_formats: [options.format]
|
|
1745
1819
|
};
|
|
1746
1820
|
if (options.modelUrl) params.model_url = options.modelUrl;
|
|
1747
|
-
if (options.polycount) params.
|
|
1821
|
+
if (options.polycount) params.target_polycount = Number(options.polycount);
|
|
1748
1822
|
if (options.topology) params.topology = options.topology;
|
|
1749
1823
|
if (options.autoSize) params.auto_size = true;
|
|
1824
|
+
if (options.resizeHeight !== void 0) {
|
|
1825
|
+
const value = Number(options.resizeHeight);
|
|
1826
|
+
if (!Number.isFinite(value)) {
|
|
1827
|
+
throw new Error("--resize-height must be a number (meters)");
|
|
1828
|
+
}
|
|
1829
|
+
params.resize_height = value;
|
|
1830
|
+
}
|
|
1831
|
+
if (options.originAt) params.origin_at = options.originAt;
|
|
1832
|
+
if (options.async) {
|
|
1833
|
+
const ack = await ctx.client.process3d(
|
|
1834
|
+
{
|
|
1835
|
+
task_id: options.taskId ?? "",
|
|
1836
|
+
operation: "remesh",
|
|
1837
|
+
params: toJsonObject2(params)
|
|
1838
|
+
},
|
|
1839
|
+
{ async: true }
|
|
1840
|
+
);
|
|
1841
|
+
printSuccess("process3d.remesh", ack, ctx);
|
|
1842
|
+
return;
|
|
1843
|
+
}
|
|
1750
1844
|
const data = await ctx.client.process3d({
|
|
1751
1845
|
task_id: options.taskId ?? "",
|
|
1752
1846
|
operation: "remesh",
|
|
@@ -1761,8 +1855,16 @@ function createProcess3dCommand() {
|
|
|
1761
1855
|
})
|
|
1762
1856
|
);
|
|
1763
1857
|
command.addCommand(
|
|
1764
|
-
new Command8("retexture").description("Regenerate textures for an existing Meshy model").requiredOption("--task-id <id>", "Meshy task ID").option("--prompt <text>", "Text style prompt for the new material pass").option("--style-image <input>", "Texture style reference image URL or local file path").option("--pbr", "Enable PBR materials").option("--hd-texture", "Request 4K texture output").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--output-dir <dir>", "Directory to save output", ".").
|
|
1858
|
+
new Command8("retexture").description("Regenerate textures for an existing Meshy model").requiredOption("--task-id <id>", "Meshy task ID").option("--prompt <text>", "Text style prompt for the new material pass").option("--style-image <input>", "Texture style reference image URL or local file path").option("--pbr", "Enable PBR materials").option("--hd-texture", "Request 4K texture output (requires --ai-model meshy-6)").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1859
|
+
"--async",
|
|
1860
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1861
|
+
).action(async function(options) {
|
|
1765
1862
|
try {
|
|
1863
|
+
if (options.hdTexture && options.aiModel && options.aiModel !== "meshy-6") {
|
|
1864
|
+
throw new Error(
|
|
1865
|
+
"--hd-texture requires --ai-model meshy-6 (got '" + options.aiModel + "')"
|
|
1866
|
+
);
|
|
1867
|
+
}
|
|
1766
1868
|
const ctx = createContext(this);
|
|
1767
1869
|
const params = {};
|
|
1768
1870
|
if (options.prompt) params.text_style_prompt = options.prompt;
|
|
@@ -1770,11 +1872,17 @@ function createProcess3dCommand() {
|
|
|
1770
1872
|
if (options.pbr) params.pbr = true;
|
|
1771
1873
|
if (options.hdTexture) params.hd_texture = true;
|
|
1772
1874
|
if (options.aiModel) params.ai_model = options.aiModel;
|
|
1773
|
-
const
|
|
1875
|
+
const request = {
|
|
1774
1876
|
task_id: options.taskId,
|
|
1775
1877
|
operation: "retexture",
|
|
1776
1878
|
params: toJsonObject2(params)
|
|
1777
|
-
}
|
|
1879
|
+
};
|
|
1880
|
+
if (options.async) {
|
|
1881
|
+
const ack = await ctx.client.process3d(request, { async: true });
|
|
1882
|
+
printSuccess("process3d.retexture", ack, ctx);
|
|
1883
|
+
return;
|
|
1884
|
+
}
|
|
1885
|
+
const data = await ctx.client.process3d(request);
|
|
1778
1886
|
const localPath = await saveProcess3dOutput(data, "retexture", options.outputDir);
|
|
1779
1887
|
if (localPath) data.local_path = localPath;
|
|
1780
1888
|
printSuccess("process3d.retexture", data, ctx);
|
|
@@ -1784,7 +1892,10 @@ function createProcess3dCommand() {
|
|
|
1784
1892
|
})
|
|
1785
1893
|
);
|
|
1786
1894
|
command.addCommand(
|
|
1787
|
-
new Command8("rig").description("Rig a Meshy model for character animation").option("--task-id <id>", "Meshy task ID").option("--height <meters>", "Estimated character height in meters").option("--model-url <url>", "Model URL to rig without an existing task").option("--output-dir <dir>", "Directory to save output", ".").
|
|
1895
|
+
new Command8("rig").description("Rig a Meshy model for character animation").option("--task-id <id>", "Meshy task ID").option("--height <meters>", "Estimated character height in meters").option("--model-url <url>", "Model URL to rig without an existing task").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1896
|
+
"--async",
|
|
1897
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1898
|
+
).action(async function(options) {
|
|
1788
1899
|
try {
|
|
1789
1900
|
if (!options.taskId && !options.modelUrl) {
|
|
1790
1901
|
throw new Error("Either --task-id or --model-url is required");
|
|
@@ -1793,11 +1904,17 @@ function createProcess3dCommand() {
|
|
|
1793
1904
|
const params = {};
|
|
1794
1905
|
if (options.height) params.height_meters = Number(options.height);
|
|
1795
1906
|
if (options.modelUrl) params.model_url = options.modelUrl;
|
|
1796
|
-
const
|
|
1907
|
+
const request = {
|
|
1797
1908
|
task_id: options.taskId ?? "",
|
|
1798
1909
|
operation: "rig",
|
|
1799
1910
|
params: toJsonObject2(params)
|
|
1800
|
-
}
|
|
1911
|
+
};
|
|
1912
|
+
if (options.async) {
|
|
1913
|
+
const ack = await ctx.client.process3d(request, { async: true });
|
|
1914
|
+
printSuccess("process3d.rig", ack, ctx);
|
|
1915
|
+
return;
|
|
1916
|
+
}
|
|
1917
|
+
const data = await ctx.client.process3d(request);
|
|
1801
1918
|
const localPath = await saveProcess3dOutput(data, "rig", options.outputDir);
|
|
1802
1919
|
if (localPath) data.local_path = localPath;
|
|
1803
1920
|
printSuccess("process3d.rig", data, ctx);
|
|
@@ -1807,7 +1924,10 @@ function createProcess3dCommand() {
|
|
|
1807
1924
|
})
|
|
1808
1925
|
);
|
|
1809
1926
|
command.addCommand(
|
|
1810
|
-
new Command8("animate").description("Apply a preset animation to a rigged Meshy character").requiredOption("--task-id <id>", "Meshy rigging task ID").requiredOption("--action-id <n>", "Animation preset ID (see docs for full list)").option("--fps <n>", "Target frame rate: 24, 25, 30, or 60").option("--output-dir <dir>", "Directory to save output", ".").
|
|
1927
|
+
new Command8("animate").description("Apply a preset animation to a rigged Meshy character").requiredOption("--task-id <id>", "Meshy rigging task ID").requiredOption("--action-id <n>", "Animation preset ID (see docs for full list)").option("--fps <n>", "Target frame rate: 24, 25, 30, or 60").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1928
|
+
"--async",
|
|
1929
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1930
|
+
).action(async function(options) {
|
|
1811
1931
|
try {
|
|
1812
1932
|
const ctx = createContext(this);
|
|
1813
1933
|
const params = {
|
|
@@ -1816,11 +1936,17 @@ function createProcess3dCommand() {
|
|
|
1816
1936
|
if (options.fps) {
|
|
1817
1937
|
params.fps = Number(options.fps);
|
|
1818
1938
|
}
|
|
1819
|
-
const
|
|
1939
|
+
const request = {
|
|
1820
1940
|
task_id: options.taskId,
|
|
1821
1941
|
operation: "animate",
|
|
1822
1942
|
params: toJsonObject2(params)
|
|
1823
|
-
}
|
|
1943
|
+
};
|
|
1944
|
+
if (options.async) {
|
|
1945
|
+
const ack = await ctx.client.process3d(request, { async: true });
|
|
1946
|
+
printSuccess("process3d.animate", ack, ctx);
|
|
1947
|
+
return;
|
|
1948
|
+
}
|
|
1949
|
+
const data = await ctx.client.process3d(request);
|
|
1824
1950
|
const localPath = await saveProcess3dOutput(data, "animate", options.outputDir);
|
|
1825
1951
|
if (localPath) data.local_path = localPath;
|
|
1826
1952
|
printSuccess("process3d.animate", data, ctx);
|
|
@@ -1830,19 +1956,33 @@ function createProcess3dCommand() {
|
|
|
1830
1956
|
})
|
|
1831
1957
|
);
|
|
1832
1958
|
command.addCommand(
|
|
1833
|
-
new Command8("refine").description("Refine a Meshy preview model into a higher quality result").requiredOption("--task-id <id>", "Meshy preview task ID").option("--pbr", "Enable PBR materials").option("--hd-texture", "Request 4K texture output").option("--texture-prompt <text>", "Optional texture prompt for the refinement pass").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--output-dir <dir>", "Directory to save output", ".").
|
|
1959
|
+
new Command8("refine").description("Refine a Meshy preview model into a higher quality result").requiredOption("--task-id <id>", "Meshy preview task ID").option("--pbr", "Enable PBR materials").option("--hd-texture", "Request 4K texture output (requires --ai-model meshy-6)").option("--texture-prompt <text>", "Optional texture prompt for the refinement pass").option("--ai-model <name>", "Meshy model: meshy-5, meshy-6, latest").option("--output-dir <dir>", "Directory to save output", ".").option(
|
|
1960
|
+
"--async",
|
|
1961
|
+
"Submit asynchronously; return job_id immediately without waiting. Poll with: asset-gateway job status <id>"
|
|
1962
|
+
).action(async function(options) {
|
|
1834
1963
|
try {
|
|
1964
|
+
if (options.hdTexture && options.aiModel && options.aiModel !== "meshy-6") {
|
|
1965
|
+
throw new Error(
|
|
1966
|
+
"--hd-texture requires --ai-model meshy-6 (got '" + options.aiModel + "')"
|
|
1967
|
+
);
|
|
1968
|
+
}
|
|
1835
1969
|
const ctx = createContext(this);
|
|
1836
1970
|
const params = {};
|
|
1837
1971
|
if (options.pbr) params.pbr = true;
|
|
1838
1972
|
if (options.hdTexture) params.hd_texture = true;
|
|
1839
1973
|
if (options.texturePrompt) params.texture_prompt = options.texturePrompt;
|
|
1840
1974
|
if (options.aiModel) params.ai_model = options.aiModel;
|
|
1841
|
-
const
|
|
1975
|
+
const request = {
|
|
1842
1976
|
task_id: options.taskId,
|
|
1843
1977
|
operation: "refine",
|
|
1844
1978
|
params: toJsonObject2(params)
|
|
1845
|
-
}
|
|
1979
|
+
};
|
|
1980
|
+
if (options.async) {
|
|
1981
|
+
const ack = await ctx.client.process3d(request, { async: true });
|
|
1982
|
+
printSuccess("process3d.refine", ack, ctx);
|
|
1983
|
+
return;
|
|
1984
|
+
}
|
|
1985
|
+
const data = await ctx.client.process3d(request);
|
|
1846
1986
|
const localPath = await saveProcess3dOutput(data, "refine", options.outputDir);
|
|
1847
1987
|
if (localPath) data.local_path = localPath;
|
|
1848
1988
|
printSuccess("process3d.refine", data, ctx);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@doufunao123/asset-gateway",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.25.1",
|
|
4
4
|
"description": "Universal asset generation gateway CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"node": ">=20"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@doufunao123/assetforge-sdk": "^0.
|
|
30
|
+
"@doufunao123/assetforge-sdk": "^0.11.1",
|
|
31
31
|
"commander": "^13.1.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|