@nodetool-ai/minimax-nodes 0.8.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/README.md +27 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/minimax-base.d.ts +140 -0
- package/dist/minimax-base.d.ts.map +1 -0
- package/dist/minimax-base.js +315 -0
- package/dist/minimax-base.js.map +1 -0
- package/dist/nodes/image-to-video.d.ts +32 -0
- package/dist/nodes/image-to-video.d.ts.map +1 -0
- package/dist/nodes/image-to-video.js +105 -0
- package/dist/nodes/image-to-video.js.map +1 -0
- package/dist/nodes/music.d.ts +31 -0
- package/dist/nodes/music.d.ts.map +1 -0
- package/dist/nodes/music.js +102 -0
- package/dist/nodes/music.js.map +1 -0
- package/dist/nodes/text-to-image.d.ts +32 -0
- package/dist/nodes/text-to-image.d.ts.map +1 -0
- package/dist/nodes/text-to-image.js +116 -0
- package/dist/nodes/text-to-image.js.map +1 -0
- package/dist/nodes/text-to-speech.d.ts +36 -0
- package/dist/nodes/text-to-speech.d.ts.map +1 -0
- package/dist/nodes/text-to-speech.js +168 -0
- package/dist/nodes/text-to-speech.js.map +1 -0
- package/dist/nodes/text-to-video.d.ts +31 -0
- package/dist/nodes/text-to-video.d.ts.map +1 -0
- package/dist/nodes/text-to-video.js +81 -0
- package/dist/nodes/text-to-video.js.map +1 -0
- package/dist/nodes/voice.d.ts +22 -0
- package/dist/nodes/voice.d.ts.map +1 -0
- package/dist/nodes/voice.js +37 -0
- package/dist/nodes/voice.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseNode, prop } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { loadMediaRefBytes } from "@nodetool-ai/runtime";
|
|
9
|
+
import { bytesToBase64, generateVideo, getMinimaxApiKey, inferImageMime, MINIMAX_I2V_MODELS, MINIMAX_VIDEO_DURATIONS, MINIMAX_VIDEO_RESOLUTIONS, videoRefFromBytes, videoRenderSettings } from "../minimax-base.js";
|
|
10
|
+
export class MinimaxImageToVideoNode extends BaseNode {
|
|
11
|
+
static nodeType = "minimax.ImageToVideo";
|
|
12
|
+
static body = "content_card";
|
|
13
|
+
static title = "MiniMax Image to Video";
|
|
14
|
+
static description = "Animate a still image into a video using MiniMax Hailuo and Director " +
|
|
15
|
+
"models. The image becomes the first frame (or the character reference " +
|
|
16
|
+
"for S2V-01).\n" +
|
|
17
|
+
"video, generation, image-to-video, i2v, hailuo, minimax\n\n" +
|
|
18
|
+
"Use cases:\n" +
|
|
19
|
+
"- Bring a photo or render to life\n" +
|
|
20
|
+
"- Add motion to product or character art\n" +
|
|
21
|
+
"- Create animated intros from a key frame";
|
|
22
|
+
static metadataOutputTypes = { output: "video" };
|
|
23
|
+
static inlineFields = [];
|
|
24
|
+
static inputFields = ["image", "prompt"];
|
|
25
|
+
static requiredSettings = ["MINIMAX_API_KEY"];
|
|
26
|
+
static autoSaveAsset = true;
|
|
27
|
+
async process(context) {
|
|
28
|
+
const apiKey = getMinimaxApiKey(this._secrets);
|
|
29
|
+
const imageBytes = await loadMediaRefBytes(this.image, context);
|
|
30
|
+
if (!imageBytes || imageBytes.length === 0) {
|
|
31
|
+
throw new Error("An input image is required");
|
|
32
|
+
}
|
|
33
|
+
const mime = inferImageMime(imageBytes);
|
|
34
|
+
const model = String(this.model ?? "MiniMax-Hailuo-02");
|
|
35
|
+
const dataUrl = `data:${mime};base64,${bytesToBase64(imageBytes)}`;
|
|
36
|
+
const body = {
|
|
37
|
+
model,
|
|
38
|
+
...videoRenderSettings(model, Number(this.duration ?? 6), String(this.resolution ?? "768P"))
|
|
39
|
+
};
|
|
40
|
+
if (model === "S2V-01") {
|
|
41
|
+
// S2V-01 animates a character reference, not a first frame, and
|
|
42
|
+
// rejects first_frame_image.
|
|
43
|
+
body.subject_reference = [{ type: "character", image: [dataUrl] }];
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
body.first_frame_image = dataUrl;
|
|
47
|
+
}
|
|
48
|
+
const prompt = String(this.prompt ?? "");
|
|
49
|
+
if (prompt)
|
|
50
|
+
body.prompt = prompt;
|
|
51
|
+
const bytes = await generateVideo(apiKey, body, {
|
|
52
|
+
signal: context?.signal
|
|
53
|
+
});
|
|
54
|
+
return { output: videoRefFromBytes(bytes) };
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
__decorate([
|
|
58
|
+
prop({
|
|
59
|
+
type: "enum",
|
|
60
|
+
default: "MiniMax-Hailuo-02",
|
|
61
|
+
title: "Model",
|
|
62
|
+
description: "The MiniMax video model to use.",
|
|
63
|
+
values: MINIMAX_I2V_MODELS
|
|
64
|
+
})
|
|
65
|
+
], MinimaxImageToVideoNode.prototype, "model", void 0);
|
|
66
|
+
__decorate([
|
|
67
|
+
prop({
|
|
68
|
+
type: "image",
|
|
69
|
+
default: { type: "image", uri: "", asset_id: null, data: null },
|
|
70
|
+
title: "Image",
|
|
71
|
+
description: "The image to use as the first frame of the video (S2V-01 uses it as " +
|
|
72
|
+
"a character reference instead)."
|
|
73
|
+
})
|
|
74
|
+
], MinimaxImageToVideoNode.prototype, "image", void 0);
|
|
75
|
+
__decorate([
|
|
76
|
+
prop({
|
|
77
|
+
type: "str",
|
|
78
|
+
default: "",
|
|
79
|
+
title: "Prompt",
|
|
80
|
+
description: "Optional text prompt guiding the motion. Director models support camera " +
|
|
81
|
+
"moves like [Push in], [Pan left], [Truck left]."
|
|
82
|
+
})
|
|
83
|
+
], MinimaxImageToVideoNode.prototype, "prompt", void 0);
|
|
84
|
+
__decorate([
|
|
85
|
+
prop({
|
|
86
|
+
type: "int",
|
|
87
|
+
default: 6,
|
|
88
|
+
title: "Duration",
|
|
89
|
+
description: "Video duration in seconds.",
|
|
90
|
+
values: MINIMAX_VIDEO_DURATIONS
|
|
91
|
+
})
|
|
92
|
+
], MinimaxImageToVideoNode.prototype, "duration", void 0);
|
|
93
|
+
__decorate([
|
|
94
|
+
prop({
|
|
95
|
+
type: "enum",
|
|
96
|
+
default: "768P",
|
|
97
|
+
title: "Resolution",
|
|
98
|
+
description: "Output resolution.",
|
|
99
|
+
values: MINIMAX_VIDEO_RESOLUTIONS
|
|
100
|
+
})
|
|
101
|
+
], MinimaxImageToVideoNode.prototype, "resolution", void 0);
|
|
102
|
+
export const IMAGE_TO_VIDEO_NODES = [
|
|
103
|
+
MinimaxImageToVideoNode
|
|
104
|
+
];
|
|
105
|
+
//# sourceMappingURL=image-to-video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-to-video.js","sourceRoot":"","sources":["../../src/nodes/image-to-video.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { BaseNode } from "@nodetool-ai/node-sdk";
|
|
2
|
+
import type { NodeClass } from "@nodetool-ai/node-sdk";
|
|
3
|
+
/** Output handles MinimaxMusicNode.process() emits. */
|
|
4
|
+
type MinimaxMusicNodeOutputs = {
|
|
5
|
+
output: {
|
|
6
|
+
type: string;
|
|
7
|
+
data: string;
|
|
8
|
+
content_type: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare class MinimaxMusicNode extends BaseNode {
|
|
12
|
+
static readonly nodeType = "minimax.MusicGeneration";
|
|
13
|
+
static readonly body = "content_card";
|
|
14
|
+
static readonly title = "MiniMax Music Generation";
|
|
15
|
+
static readonly description: string;
|
|
16
|
+
static readonly metadataOutputTypes: {
|
|
17
|
+
output: string;
|
|
18
|
+
};
|
|
19
|
+
static readonly inlineFields: string[];
|
|
20
|
+
static readonly inputFields: string[];
|
|
21
|
+
static readonly requiredSettings: string[];
|
|
22
|
+
static readonly autoSaveAsset = true;
|
|
23
|
+
prompt: any;
|
|
24
|
+
lyrics: any;
|
|
25
|
+
model: any;
|
|
26
|
+
format: any;
|
|
27
|
+
process(): Promise<MinimaxMusicNodeOutputs>;
|
|
28
|
+
}
|
|
29
|
+
export declare const MUSIC_NODES: readonly NodeClass[];
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=music.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"music.d.ts","sourceRoot":"","sources":["../../src/nodes/music.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAqBvD,uDAAuD;AACvD,KAAK,uBAAuB,GAAG;IAC7B,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,MAAM,CAAC,QAAQ,CAAC,QAAQ,6BAA6B;IACrD,MAAM,CAAC,QAAQ,CAAC,IAAI,kBAAkB;IACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,8BAA8B;IACnD,MAAM,CAAC,QAAQ,CAAC,WAAW,SAQW;IACtC,MAAM,CAAC,QAAQ,CAAC,mBAAmB;QAAK,MAAM;MAAY;IAC1D,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAwB;IAC9D,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAwB;IAC7D,MAAM,CAAC,QAAQ,CAAC,gBAAgB,WAAuB;IACvD,MAAM,CAAC,QAAQ,CAAC,aAAa,QAAQ;IAS7B,MAAM,EAAE,GAAG,CAAC;IAWZ,MAAM,EAAE,GAAG,CAAC;IASZ,KAAK,EAAE,GAAG,CAAC;IASX,MAAM,EAAE,GAAG,CAAC;IAEd,OAAO,IAAI,OAAO,CAAC,uBAAuB,CAAC,CA8ChD;CACF;AAED,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAAuB,CAAC"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseNode, prop } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { audioRefFromBytes, assertBaseResp, getMinimaxApiKey, MINIMAX_BASE_URL, MINIMAX_MUSIC_MODELS, minimaxHeaders, resolveAudioPayload } from "../minimax-base.js";
|
|
9
|
+
const MUSIC_FORMATS = ["mp3", "wav"];
|
|
10
|
+
export class MinimaxMusicNode extends BaseNode {
|
|
11
|
+
static nodeType = "minimax.MusicGeneration";
|
|
12
|
+
static body = "content_card";
|
|
13
|
+
static title = "MiniMax Music Generation";
|
|
14
|
+
static description = "Generate a full song with vocals from a style description and lyrics " +
|
|
15
|
+
"using MiniMax music models.\n" +
|
|
16
|
+
"audio, music, song, generation, lyrics, vocals, minimax\n\n" +
|
|
17
|
+
"Use cases:\n" +
|
|
18
|
+
"- Turn lyrics into a finished song\n" +
|
|
19
|
+
"- Prototype melodies and arrangements\n" +
|
|
20
|
+
"- Create background music for videos\n" +
|
|
21
|
+
"- Produce jingles and theme songs";
|
|
22
|
+
static metadataOutputTypes = { output: "audio" };
|
|
23
|
+
static inlineFields = ["prompt", "lyrics"];
|
|
24
|
+
static inputFields = ["prompt", "lyrics"];
|
|
25
|
+
static requiredSettings = ["MINIMAX_API_KEY"];
|
|
26
|
+
static autoSaveAsset = true;
|
|
27
|
+
async process() {
|
|
28
|
+
const apiKey = getMinimaxApiKey(this._secrets);
|
|
29
|
+
const prompt = String(this.prompt ?? "");
|
|
30
|
+
if (!prompt)
|
|
31
|
+
throw new Error("Prompt is required");
|
|
32
|
+
const lyrics = String(this.lyrics ?? "");
|
|
33
|
+
if (!lyrics)
|
|
34
|
+
throw new Error("Lyrics are required");
|
|
35
|
+
const model = String(this.model ?? "music-2.6");
|
|
36
|
+
const format = String(this.format ?? "mp3");
|
|
37
|
+
const body = {
|
|
38
|
+
model,
|
|
39
|
+
prompt,
|
|
40
|
+
lyrics,
|
|
41
|
+
audio_setting: {
|
|
42
|
+
sample_rate: 44100,
|
|
43
|
+
bitrate: 256000,
|
|
44
|
+
format
|
|
45
|
+
},
|
|
46
|
+
output_format: "hex"
|
|
47
|
+
};
|
|
48
|
+
const res = await fetch(`${MINIMAX_BASE_URL}/v1/music_generation`, {
|
|
49
|
+
method: "POST",
|
|
50
|
+
headers: minimaxHeaders(apiKey),
|
|
51
|
+
body: JSON.stringify(body)
|
|
52
|
+
});
|
|
53
|
+
if (!res.ok) {
|
|
54
|
+
throw new Error(`MiniMax music_generation failed: ${res.status} ${await res.text()}`);
|
|
55
|
+
}
|
|
56
|
+
const data = await res.json();
|
|
57
|
+
assertBaseResp(data, "music_generation");
|
|
58
|
+
const audio = data.data?.audio;
|
|
59
|
+
if (!audio) {
|
|
60
|
+
throw new Error(`MiniMax music_generation returned no audio data: ${JSON.stringify(data)}`);
|
|
61
|
+
}
|
|
62
|
+
const bytes = await resolveAudioPayload(audio);
|
|
63
|
+
return { output: audioRefFromBytes(bytes, format) };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
__decorate([
|
|
67
|
+
prop({
|
|
68
|
+
type: "str",
|
|
69
|
+
default: "An upbeat pop song with bright synths and a catchy chorus",
|
|
70
|
+
title: "Prompt",
|
|
71
|
+
description: "Describe the style, mood, genre, and instrumentation of the music."
|
|
72
|
+
})
|
|
73
|
+
], MinimaxMusicNode.prototype, "prompt", void 0);
|
|
74
|
+
__decorate([
|
|
75
|
+
prop({
|
|
76
|
+
type: "str",
|
|
77
|
+
default: "[Verse]\nWalking down the city street\n[Chorus]\nThis is our moment, shining bright",
|
|
78
|
+
title: "Lyrics",
|
|
79
|
+
description: "Song lyrics. Use newlines between lines and structure tags like " +
|
|
80
|
+
"[Intro], [Verse], [Chorus], [Bridge], [Outro]."
|
|
81
|
+
})
|
|
82
|
+
], MinimaxMusicNode.prototype, "lyrics", void 0);
|
|
83
|
+
__decorate([
|
|
84
|
+
prop({
|
|
85
|
+
type: "enum",
|
|
86
|
+
default: "music-2.6",
|
|
87
|
+
title: "Model",
|
|
88
|
+
description: "The MiniMax music model to use.",
|
|
89
|
+
values: MINIMAX_MUSIC_MODELS
|
|
90
|
+
})
|
|
91
|
+
], MinimaxMusicNode.prototype, "model", void 0);
|
|
92
|
+
__decorate([
|
|
93
|
+
prop({
|
|
94
|
+
type: "enum",
|
|
95
|
+
default: "mp3",
|
|
96
|
+
title: "Format",
|
|
97
|
+
description: "Output audio format.",
|
|
98
|
+
values: MUSIC_FORMATS
|
|
99
|
+
})
|
|
100
|
+
], MinimaxMusicNode.prototype, "format", void 0);
|
|
101
|
+
export const MUSIC_NODES = [MinimaxMusicNode];
|
|
102
|
+
//# sourceMappingURL=music.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"music.js","sourceRoot":"","sources":["../../src/nodes/music.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { BaseNode } from "@nodetool-ai/node-sdk";
|
|
2
|
+
import type { NodeClass } from "@nodetool-ai/node-sdk";
|
|
3
|
+
/** Output handles MinimaxTextToImageNode.process() emits. */
|
|
4
|
+
type MinimaxTextToImageNodeOutputs = {
|
|
5
|
+
output: {
|
|
6
|
+
type: string;
|
|
7
|
+
data: string;
|
|
8
|
+
mimeType: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare class MinimaxTextToImageNode extends BaseNode {
|
|
12
|
+
static readonly nodeType = "minimax.TextToImage";
|
|
13
|
+
static readonly body = "content_card";
|
|
14
|
+
static readonly title = "MiniMax Text to Image";
|
|
15
|
+
static readonly description: string;
|
|
16
|
+
static readonly metadataOutputTypes: {
|
|
17
|
+
output: string;
|
|
18
|
+
};
|
|
19
|
+
static readonly inlineFields: string[];
|
|
20
|
+
static readonly inputFields: string[];
|
|
21
|
+
static readonly requiredSettings: string[];
|
|
22
|
+
static readonly autoSaveAsset = true;
|
|
23
|
+
model: any;
|
|
24
|
+
prompt: any;
|
|
25
|
+
negative_prompt: any;
|
|
26
|
+
aspect_ratio: any;
|
|
27
|
+
prompt_optimizer: any;
|
|
28
|
+
process(): Promise<MinimaxTextToImageNodeOutputs>;
|
|
29
|
+
}
|
|
30
|
+
export declare const TEXT_TO_IMAGE_NODES: readonly NodeClass[];
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=text-to-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-to-image.d.ts","sourceRoot":"","sources":["../../src/nodes/text-to-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAuBvD,6DAA6D;AAC7D,KAAK,6BAA6B,GAAG;IACnC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,QAAQ;IAClD,MAAM,CAAC,QAAQ,CAAC,QAAQ,yBAAyB;IACjD,MAAM,CAAC,QAAQ,CAAC,IAAI,kBAAkB;IACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,2BAA2B;IAChD,MAAM,CAAC,QAAQ,CAAC,WAAW,SAMmB;IAC9C,MAAM,CAAC,QAAQ,CAAC,mBAAmB;QAAK,MAAM;MAAY;IAC1D,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAM;IAC5C,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAc;IACnD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,WAAuB;IACvD,MAAM,CAAC,QAAQ,CAAC,aAAa,QAAQ;IAS7B,KAAK,EAAE,GAAG,CAAC;IAQX,MAAM,EAAE,GAAG,CAAC;IAQZ,eAAe,EAAE,GAAG,CAAC;IASrB,YAAY,EAAE,GAAG,CAAC;IAQlB,gBAAgB,EAAE,GAAG,CAAC;IAExB,OAAO,IAAI,OAAO,CAAC,6BAA6B,CAAC,CAoDtD;CACF;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,SAAS,EAEnD,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseNode, prop } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { safeFetch } from "@nodetool-ai/runtime";
|
|
9
|
+
import { assertBaseResp, getMinimaxApiKey, imageRefFromBytes, MINIMAX_BASE_URL, MINIMAX_IMAGE_ASPECTS, minimaxHeaders } from "../minimax-base.js";
|
|
10
|
+
export class MinimaxTextToImageNode extends BaseNode {
|
|
11
|
+
static nodeType = "minimax.TextToImage";
|
|
12
|
+
static body = "content_card";
|
|
13
|
+
static title = "MiniMax Text to Image";
|
|
14
|
+
static description = "Generate images from text prompts using MiniMax image-01.\n" +
|
|
15
|
+
"image, generation, text-to-image, t2i, minimax\n\n" +
|
|
16
|
+
"Use cases:\n" +
|
|
17
|
+
"- Create illustrations and concept art\n" +
|
|
18
|
+
"- Generate marketing visuals\n" +
|
|
19
|
+
"- Produce images at a chosen aspect ratio";
|
|
20
|
+
static metadataOutputTypes = { output: "image" };
|
|
21
|
+
static inlineFields = [];
|
|
22
|
+
static inputFields = ["prompt"];
|
|
23
|
+
static requiredSettings = ["MINIMAX_API_KEY"];
|
|
24
|
+
static autoSaveAsset = true;
|
|
25
|
+
async process() {
|
|
26
|
+
const apiKey = getMinimaxApiKey(this._secrets);
|
|
27
|
+
const basePrompt = String(this.prompt ?? "");
|
|
28
|
+
if (!basePrompt)
|
|
29
|
+
throw new Error("Prompt is required");
|
|
30
|
+
const negative = String(this.negative_prompt ?? "").trim();
|
|
31
|
+
const prompt = negative
|
|
32
|
+
? `${basePrompt.trim()}\n\nDo not include: ${negative}`
|
|
33
|
+
: basePrompt;
|
|
34
|
+
const body = {
|
|
35
|
+
model: String(this.model ?? "image-01") || "image-01",
|
|
36
|
+
prompt,
|
|
37
|
+
aspect_ratio: String(this.aspect_ratio ?? "1:1"),
|
|
38
|
+
n: 1,
|
|
39
|
+
response_format: "base64",
|
|
40
|
+
prompt_optimizer: Boolean(this.prompt_optimizer ?? true)
|
|
41
|
+
};
|
|
42
|
+
const res = await fetch(`${MINIMAX_BASE_URL}/v1/image_generation`, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: minimaxHeaders(apiKey),
|
|
45
|
+
body: JSON.stringify(body)
|
|
46
|
+
});
|
|
47
|
+
if (!res.ok) {
|
|
48
|
+
throw new Error(`MiniMax image_generation failed: ${res.status} ${await res.text()}`);
|
|
49
|
+
}
|
|
50
|
+
const data = await res.json();
|
|
51
|
+
assertBaseResp(data, "image_generation");
|
|
52
|
+
const payload = data.data;
|
|
53
|
+
const b64List = payload?.image_base64;
|
|
54
|
+
if (b64List && b64List.length > 0) {
|
|
55
|
+
const bytes = new Uint8Array(Buffer.from(b64List[0], "base64"));
|
|
56
|
+
return { output: imageRefFromBytes(bytes) };
|
|
57
|
+
}
|
|
58
|
+
const urls = payload?.image_urls;
|
|
59
|
+
if (urls && urls.length > 0) {
|
|
60
|
+
// Provider-returned download URL — screened like every other one.
|
|
61
|
+
const dl = await safeFetch(urls[0]);
|
|
62
|
+
if (!dl.ok) {
|
|
63
|
+
throw new Error(`Failed to download MiniMax image from ${urls[0]}`);
|
|
64
|
+
}
|
|
65
|
+
const bytes = new Uint8Array(await dl.arrayBuffer());
|
|
66
|
+
return { output: imageRefFromBytes(bytes) };
|
|
67
|
+
}
|
|
68
|
+
throw new Error("MiniMax image_generation returned no image data");
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
__decorate([
|
|
72
|
+
prop({
|
|
73
|
+
type: "str",
|
|
74
|
+
default: "image-01",
|
|
75
|
+
title: "Model",
|
|
76
|
+
description: "The MiniMax image model to use.",
|
|
77
|
+
values: ["image-01"]
|
|
78
|
+
})
|
|
79
|
+
], MinimaxTextToImageNode.prototype, "model", void 0);
|
|
80
|
+
__decorate([
|
|
81
|
+
prop({
|
|
82
|
+
type: "str",
|
|
83
|
+
default: "A cat holding a sign that says hello world",
|
|
84
|
+
title: "Prompt",
|
|
85
|
+
description: "Text prompt describing the desired image."
|
|
86
|
+
})
|
|
87
|
+
], MinimaxTextToImageNode.prototype, "prompt", void 0);
|
|
88
|
+
__decorate([
|
|
89
|
+
prop({
|
|
90
|
+
type: "str",
|
|
91
|
+
default: "",
|
|
92
|
+
title: "Negative Prompt",
|
|
93
|
+
description: "Describe what to avoid in the image."
|
|
94
|
+
})
|
|
95
|
+
], MinimaxTextToImageNode.prototype, "negative_prompt", void 0);
|
|
96
|
+
__decorate([
|
|
97
|
+
prop({
|
|
98
|
+
type: "enum",
|
|
99
|
+
default: "1:1",
|
|
100
|
+
title: "Aspect Ratio",
|
|
101
|
+
description: "Aspect ratio of the generated image.",
|
|
102
|
+
values: MINIMAX_IMAGE_ASPECTS
|
|
103
|
+
})
|
|
104
|
+
], MinimaxTextToImageNode.prototype, "aspect_ratio", void 0);
|
|
105
|
+
__decorate([
|
|
106
|
+
prop({
|
|
107
|
+
type: "bool",
|
|
108
|
+
default: true,
|
|
109
|
+
title: "Prompt Optimizer",
|
|
110
|
+
description: "Let MiniMax automatically refine the prompt before generating."
|
|
111
|
+
})
|
|
112
|
+
], MinimaxTextToImageNode.prototype, "prompt_optimizer", void 0);
|
|
113
|
+
export const TEXT_TO_IMAGE_NODES = [
|
|
114
|
+
MinimaxTextToImageNode
|
|
115
|
+
];
|
|
116
|
+
//# sourceMappingURL=text-to-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-to-image.js","sourceRoot":"","sources":["../../src/nodes/text-to-image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { BaseNode } from "@nodetool-ai/node-sdk";
|
|
2
|
+
import type { NodeClass } from "@nodetool-ai/node-sdk";
|
|
3
|
+
/** Output handles MinimaxTextToSpeechNode.process() emits. */
|
|
4
|
+
type MinimaxTextToSpeechNodeOutputs = {
|
|
5
|
+
output: {
|
|
6
|
+
type: string;
|
|
7
|
+
data: string;
|
|
8
|
+
content_type: string;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare class MinimaxTextToSpeechNode extends BaseNode {
|
|
12
|
+
static readonly nodeType = "minimax.TextToSpeech";
|
|
13
|
+
static readonly body = "content_card";
|
|
14
|
+
static readonly title = "MiniMax Text to Speech";
|
|
15
|
+
static readonly description: string;
|
|
16
|
+
static readonly metadataOutputTypes: {
|
|
17
|
+
output: string;
|
|
18
|
+
};
|
|
19
|
+
static readonly inlineFields: string[];
|
|
20
|
+
static readonly inputFields: string[];
|
|
21
|
+
static readonly requiredSettings: string[];
|
|
22
|
+
static readonly autoSaveAsset = true;
|
|
23
|
+
text: any;
|
|
24
|
+
voice_id: any;
|
|
25
|
+
model: any;
|
|
26
|
+
emotion: any;
|
|
27
|
+
speed: any;
|
|
28
|
+
volume: any;
|
|
29
|
+
pitch: any;
|
|
30
|
+
language_boost: any;
|
|
31
|
+
format: any;
|
|
32
|
+
process(): Promise<MinimaxTextToSpeechNodeOutputs>;
|
|
33
|
+
}
|
|
34
|
+
export declare const TEXT_TO_SPEECH_NODES: readonly NodeClass[];
|
|
35
|
+
export {};
|
|
36
|
+
//# sourceMappingURL=text-to-speech.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-to-speech.d.ts","sourceRoot":"","sources":["../../src/nodes/text-to-speech.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAQ,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAmDvD,8DAA8D;AAC9D,KAAK,8BAA8B,GAAG;IACpC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D,CAAC;AAEF,qBAAa,uBAAwB,SAAQ,QAAQ;IACnD,MAAM,CAAC,QAAQ,CAAC,QAAQ,0BAA0B;IAClD,MAAM,CAAC,QAAQ,CAAC,IAAI,kBAAkB;IACtC,MAAM,CAAC,QAAQ,CAAC,KAAK,4BAA4B;IACjD,MAAM,CAAC,QAAQ,CAAC,WAAW,SAQS;IACpC,MAAM,CAAC,QAAQ,CAAC,mBAAmB;QAAK,MAAM;MAAY;IAC1D,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,CAAY;IAClD,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAgB;IACrD,MAAM,CAAC,QAAQ,CAAC,gBAAgB,WAAuB;IACvD,MAAM,CAAC,QAAQ,CAAC,aAAa,QAAQ;IAQ7B,IAAI,EAAE,GAAG,CAAC;IAWV,QAAQ,EAAE,GAAG,CAAC;IASd,KAAK,EAAE,GAAG,CAAC;IAUX,OAAO,EAAE,GAAG,CAAC;IAUb,KAAK,EAAE,GAAG,CAAC;IAUX,MAAM,EAAE,GAAG,CAAC;IAUZ,KAAK,EAAE,GAAG,CAAC;IAUX,cAAc,EAAE,GAAG,CAAC;IASpB,MAAM,EAAE,GAAG,CAAC;IAEd,OAAO,IAAI,OAAO,CAAC,8BAA8B,CAAC,CA4DvD;CACF;AAED,eAAO,MAAM,oBAAoB,EAAE,SAAS,SAAS,EAEpD,CAAC"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { BaseNode, prop } from "@nodetool-ai/node-sdk";
|
|
8
|
+
import { audioRefFromBytes, assertBaseResp, DEFAULT_VOICE, getMinimaxApiKey, MINIMAX_BASE_URL, MINIMAX_EMOTIONS, MINIMAX_LANGUAGE_BOOST, MINIMAX_TTS_MODELS, MINIMAX_VOICES, minimaxHeaders, resolveAudioPayload } from "../minimax-base.js";
|
|
9
|
+
const TTS_FORMATS = ["mp3", "wav", "flac"];
|
|
10
|
+
export class MinimaxTextToSpeechNode extends BaseNode {
|
|
11
|
+
static nodeType = "minimax.TextToSpeech";
|
|
12
|
+
static body = "content_card";
|
|
13
|
+
static title = "MiniMax Text to Speech";
|
|
14
|
+
static description = "Generate natural-sounding speech with MiniMax T2A, including emotion and " +
|
|
15
|
+
"fine voice control.\n" +
|
|
16
|
+
"audio, tts, speech, synthesis, voice, emotion, minimax\n\n" +
|
|
17
|
+
"Use cases:\n" +
|
|
18
|
+
"- Create expressive voiceovers with emotion control\n" +
|
|
19
|
+
"- Produce multilingual narration\n" +
|
|
20
|
+
"- Generate character voices\n" +
|
|
21
|
+
"- Build audiobooks and podcasts";
|
|
22
|
+
static metadataOutputTypes = { output: "audio" };
|
|
23
|
+
static inlineFields = ["text"];
|
|
24
|
+
static inputFields = ["voice_id"];
|
|
25
|
+
static requiredSettings = ["MINIMAX_API_KEY"];
|
|
26
|
+
static autoSaveAsset = true;
|
|
27
|
+
async process() {
|
|
28
|
+
const apiKey = getMinimaxApiKey(this._secrets);
|
|
29
|
+
const text = String(this.text ?? "");
|
|
30
|
+
if (!text)
|
|
31
|
+
throw new Error("Text is required");
|
|
32
|
+
const voiceId = String(this.voice_id ?? DEFAULT_VOICE);
|
|
33
|
+
if (!voiceId)
|
|
34
|
+
throw new Error("voice_id is required");
|
|
35
|
+
const model = String(this.model ?? "speech-2.6-hd");
|
|
36
|
+
const emotion = String(this.emotion ?? "auto");
|
|
37
|
+
const languageBoost = String(this.language_boost ?? "auto");
|
|
38
|
+
const format = String(this.format ?? "mp3");
|
|
39
|
+
const voiceSetting = {
|
|
40
|
+
voice_id: voiceId,
|
|
41
|
+
speed: Math.max(0.5, Math.min(2.0, Number(this.speed ?? 1.0))),
|
|
42
|
+
vol: Math.max(0.1, Math.min(10.0, Number(this.volume ?? 1.0))),
|
|
43
|
+
pitch: Math.max(-12, Math.min(12, Math.trunc(Number(this.pitch ?? 0))))
|
|
44
|
+
};
|
|
45
|
+
if (emotion && emotion !== "auto") {
|
|
46
|
+
voiceSetting.emotion = emotion;
|
|
47
|
+
}
|
|
48
|
+
const body = {
|
|
49
|
+
model,
|
|
50
|
+
text,
|
|
51
|
+
stream: false,
|
|
52
|
+
voice_setting: voiceSetting,
|
|
53
|
+
audio_setting: {
|
|
54
|
+
sample_rate: 32000,
|
|
55
|
+
bitrate: 128000,
|
|
56
|
+
format,
|
|
57
|
+
channel: 1
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
if (languageBoost && languageBoost !== "auto") {
|
|
61
|
+
body.language_boost = languageBoost;
|
|
62
|
+
}
|
|
63
|
+
const res = await fetch(`${MINIMAX_BASE_URL}/v1/t2a_v2`, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
headers: minimaxHeaders(apiKey),
|
|
66
|
+
body: JSON.stringify(body)
|
|
67
|
+
});
|
|
68
|
+
if (!res.ok) {
|
|
69
|
+
throw new Error(`MiniMax t2a_v2 failed: ${res.status} ${await res.text()}`);
|
|
70
|
+
}
|
|
71
|
+
const data = await res.json();
|
|
72
|
+
assertBaseResp(data, "t2a_v2");
|
|
73
|
+
const audio = data.data?.audio;
|
|
74
|
+
if (!audio) {
|
|
75
|
+
throw new Error(`MiniMax t2a_v2 returned no audio data: ${JSON.stringify(data)}`);
|
|
76
|
+
}
|
|
77
|
+
const bytes = await resolveAudioPayload(audio);
|
|
78
|
+
return { output: audioRefFromBytes(bytes, format) };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
__decorate([
|
|
82
|
+
prop({
|
|
83
|
+
type: "str",
|
|
84
|
+
default: "Hello, how are you?",
|
|
85
|
+
title: "Text",
|
|
86
|
+
description: "The text to convert to speech (up to 10,000 characters)."
|
|
87
|
+
})
|
|
88
|
+
], MinimaxTextToSpeechNode.prototype, "text", void 0);
|
|
89
|
+
__decorate([
|
|
90
|
+
prop({
|
|
91
|
+
type: "str",
|
|
92
|
+
default: DEFAULT_VOICE,
|
|
93
|
+
title: "Voice ID",
|
|
94
|
+
description: "MiniMax voice ID. Connect a MiniMax Voice node, pick from the list, or " +
|
|
95
|
+
"provide a custom/cloned voice ID.",
|
|
96
|
+
values: MINIMAX_VOICES
|
|
97
|
+
})
|
|
98
|
+
], MinimaxTextToSpeechNode.prototype, "voice_id", void 0);
|
|
99
|
+
__decorate([
|
|
100
|
+
prop({
|
|
101
|
+
type: "enum",
|
|
102
|
+
default: "speech-2.6-hd",
|
|
103
|
+
title: "Model",
|
|
104
|
+
description: "The MiniMax speech model to use.",
|
|
105
|
+
values: MINIMAX_TTS_MODELS
|
|
106
|
+
})
|
|
107
|
+
], MinimaxTextToSpeechNode.prototype, "model", void 0);
|
|
108
|
+
__decorate([
|
|
109
|
+
prop({
|
|
110
|
+
type: "enum",
|
|
111
|
+
default: "auto",
|
|
112
|
+
title: "Emotion",
|
|
113
|
+
description: "Emotional tone of the speech. 'auto' lets the model decide from the text.",
|
|
114
|
+
values: MINIMAX_EMOTIONS
|
|
115
|
+
})
|
|
116
|
+
], MinimaxTextToSpeechNode.prototype, "emotion", void 0);
|
|
117
|
+
__decorate([
|
|
118
|
+
prop({
|
|
119
|
+
type: "float",
|
|
120
|
+
default: 1.0,
|
|
121
|
+
title: "Speed",
|
|
122
|
+
description: "Speech speed multiplier.",
|
|
123
|
+
min: 0.5,
|
|
124
|
+
max: 2.0
|
|
125
|
+
})
|
|
126
|
+
], MinimaxTextToSpeechNode.prototype, "speed", void 0);
|
|
127
|
+
__decorate([
|
|
128
|
+
prop({
|
|
129
|
+
type: "float",
|
|
130
|
+
default: 1.0,
|
|
131
|
+
title: "Volume",
|
|
132
|
+
description: "Output volume.",
|
|
133
|
+
min: 0.1,
|
|
134
|
+
max: 10.0
|
|
135
|
+
})
|
|
136
|
+
], MinimaxTextToSpeechNode.prototype, "volume", void 0);
|
|
137
|
+
__decorate([
|
|
138
|
+
prop({
|
|
139
|
+
type: "int",
|
|
140
|
+
default: 0,
|
|
141
|
+
title: "Pitch",
|
|
142
|
+
description: "Pitch shift in semitones.",
|
|
143
|
+
min: -12,
|
|
144
|
+
max: 12
|
|
145
|
+
})
|
|
146
|
+
], MinimaxTextToSpeechNode.prototype, "pitch", void 0);
|
|
147
|
+
__decorate([
|
|
148
|
+
prop({
|
|
149
|
+
type: "enum",
|
|
150
|
+
default: "auto",
|
|
151
|
+
title: "Language Boost",
|
|
152
|
+
description: "Bias pronunciation toward a language. 'auto' autodetects from the text.",
|
|
153
|
+
values: MINIMAX_LANGUAGE_BOOST
|
|
154
|
+
})
|
|
155
|
+
], MinimaxTextToSpeechNode.prototype, "language_boost", void 0);
|
|
156
|
+
__decorate([
|
|
157
|
+
prop({
|
|
158
|
+
type: "enum",
|
|
159
|
+
default: "mp3",
|
|
160
|
+
title: "Format",
|
|
161
|
+
description: "Output audio format.",
|
|
162
|
+
values: TTS_FORMATS
|
|
163
|
+
})
|
|
164
|
+
], MinimaxTextToSpeechNode.prototype, "format", void 0);
|
|
165
|
+
export const TEXT_TO_SPEECH_NODES = [
|
|
166
|
+
MinimaxTextToSpeechNode
|
|
167
|
+
];
|
|
168
|
+
//# sourceMappingURL=text-to-speech.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-to-speech.js","sourceRoot":"","sources":["../../src/nodes/text-to-speech.ts"],"names":[],"mappings":"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"}
|