mulmocast 2.1.11 → 2.1.13
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/assets/templates/ani.json +5 -9
- package/assets/templates/leda.json +35 -0
- package/lib/agents/image_genai_agent.d.ts +0 -1
- package/lib/agents/image_genai_agent.js +3 -24
- package/lib/data/promptTemplates.d.ts +67 -25
- package/lib/data/promptTemplates.js +55 -8
- package/lib/data/templateDataSet.d.ts +1 -0
- package/lib/data/templateDataSet.js +5 -1
- package/lib/utils/const.d.ts +1 -0
- package/lib/utils/const.js +1 -0
- package/package.json +1 -1
|
@@ -12,17 +12,11 @@
|
|
|
12
12
|
"model": "bytedance/seedance-1-lite"
|
|
13
13
|
},
|
|
14
14
|
"speechParams": {
|
|
15
|
-
"provider": "openai",
|
|
16
15
|
"speakers": {
|
|
17
16
|
"Presenter": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"ja": {
|
|
22
|
-
"provider": "nijivoice",
|
|
23
|
-
"voiceId": "9d9ed276-49ee-443a-bc19-26e6136d05f0"
|
|
24
|
-
}
|
|
25
|
-
}
|
|
17
|
+
"provider": "gemini",
|
|
18
|
+
"voiceId": "Leda",
|
|
19
|
+
"speechOptions": { "instruction": "Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl." }
|
|
26
20
|
}
|
|
27
21
|
}
|
|
28
22
|
},
|
|
@@ -37,6 +31,8 @@
|
|
|
37
31
|
"height": 1536
|
|
38
32
|
},
|
|
39
33
|
"imageParams": {
|
|
34
|
+
"provider": "google",
|
|
35
|
+
"model": "gemini-2.5-flash-image",
|
|
40
36
|
"style": "<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>",
|
|
41
37
|
"images": {
|
|
42
38
|
"ani": {
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Presentation by Leda",
|
|
3
|
+
"description": "Template for presentation with Gemini voice Leda.",
|
|
4
|
+
"systemPrompt": "",
|
|
5
|
+
"presentationStyle": {
|
|
6
|
+
"$mulmocast": {
|
|
7
|
+
"version": "1.1",
|
|
8
|
+
"credit": "closing"
|
|
9
|
+
},
|
|
10
|
+
"speechParams": {
|
|
11
|
+
"speakers": {
|
|
12
|
+
"Presenter": {
|
|
13
|
+
"provider": "gemini",
|
|
14
|
+
"voiceId": "Leda",
|
|
15
|
+
"speechOptions": { "instruction": "Speak like a professional news presenter." }
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"audioParams": {
|
|
20
|
+
"bgm": {
|
|
21
|
+
"kind": "url",
|
|
22
|
+
"url": "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"canvasSize": {
|
|
26
|
+
"width": 1024,
|
|
27
|
+
"height": 1536
|
|
28
|
+
},
|
|
29
|
+
"imageParams": {
|
|
30
|
+
"provider": "google",
|
|
31
|
+
"model": "gemini-2.5-flash-image"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"scriptName": "image_prompts_template.json"
|
|
35
|
+
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type { AgentFunction, AgentFunctionInfo } from "graphai";
|
|
2
2
|
import type { AgentBufferResult, ImageAgentInputs, ImageAgentParams, GenAIImageAgentConfig } from "../types/agent.js";
|
|
3
|
-
export declare const ratio2BlankPath: (aspectRatio: string) => string;
|
|
4
3
|
export declare const imageGenAIAgent: AgentFunction<ImageAgentParams, AgentBufferResult, ImageAgentInputs, GenAIImageAgentConfig>;
|
|
5
4
|
declare const imageGenAIAgentInfo: AgentFunctionInfo;
|
|
6
5
|
export default imageGenAIAgentInfo;
|
|
@@ -3,25 +3,11 @@ import { GraphAILogger } from "graphai";
|
|
|
3
3
|
import { provider2ImageAgent } from "../utils/provider2agent.js";
|
|
4
4
|
import { apiKeyMissingError, agentIncorrectAPIKeyError, agentGenerationError, agentInvalidResponseError, imageAction, imageFileTarget, hasCause, getGenAIErrorReason, resultify, } from "../utils/error_cause.js";
|
|
5
5
|
import { getAspectRatio } from "../utils/utils.js";
|
|
6
|
-
import { ASPECT_RATIOS } from "../utils/const.js";
|
|
6
|
+
import { ASPECT_RATIOS, PRO_ASPECT_RATIOS } from "../utils/const.js";
|
|
7
7
|
import { GoogleGenAI, PersonGeneration } from "@google/genai";
|
|
8
|
-
|
|
9
|
-
export const ratio2BlankPath = (aspectRatio) => {
|
|
10
|
-
if (aspectRatio === "9:16") {
|
|
11
|
-
return blankVerticalImagePath();
|
|
12
|
-
}
|
|
13
|
-
else if (aspectRatio === "1:1") {
|
|
14
|
-
return blankSquareImagePath();
|
|
15
|
-
}
|
|
16
|
-
return blankImagePath();
|
|
17
|
-
};
|
|
18
|
-
const getGeminiContents = (prompt, referenceImages, aspectRatio) => {
|
|
8
|
+
const getGeminiContents = (prompt, referenceImages) => {
|
|
19
9
|
const contents = [{ text: prompt }];
|
|
20
10
|
const images = [...(referenceImages ?? [])];
|
|
21
|
-
// NOTE: There is no way to explicitly specify the aspect ratio for Gemini. This is just a hint.
|
|
22
|
-
if (aspectRatio) {
|
|
23
|
-
images.push(ratio2BlankPath(aspectRatio));
|
|
24
|
-
}
|
|
25
11
|
images.forEach((imagePath) => {
|
|
26
12
|
const imageData = fs.readFileSync(imagePath);
|
|
27
13
|
const base64Image = imageData.toString("base64");
|
|
@@ -71,7 +57,6 @@ const errorProcess = (error) => {
|
|
|
71
57
|
};
|
|
72
58
|
export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
|
|
73
59
|
const { prompt, referenceImages } = namedInputs;
|
|
74
|
-
const aspectRatio = getAspectRatio(params.canvasSize, ASPECT_RATIOS);
|
|
75
60
|
const model = params.model ?? provider2ImageAgent["google"].defaultModel;
|
|
76
61
|
const apiKey = config?.apiKey;
|
|
77
62
|
if (!apiKey) {
|
|
@@ -82,13 +67,7 @@ export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
|
|
|
82
67
|
const ai = new GoogleGenAI({ apiKey });
|
|
83
68
|
if (model === "gemini-2.5-flash-image" || model === "gemini-3-pro-image-preview") {
|
|
84
69
|
const contentParams = (() => {
|
|
85
|
-
if (model === "gemini-2.5-flash-image") {
|
|
86
|
-
const contents = getGeminiContents(prompt, referenceImages, aspectRatio);
|
|
87
|
-
return { model, contents };
|
|
88
|
-
}
|
|
89
|
-
// gemini-3-pro-image-preview
|
|
90
70
|
const contents = getGeminiContents(prompt, referenceImages);
|
|
91
|
-
const PRO_ASPECT_RATIOS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"];
|
|
92
71
|
return {
|
|
93
72
|
model,
|
|
94
73
|
contents,
|
|
@@ -111,7 +90,7 @@ export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
|
|
|
111
90
|
prompt,
|
|
112
91
|
config: {
|
|
113
92
|
numberOfImages: 1, // default is 4!
|
|
114
|
-
aspectRatio,
|
|
93
|
+
aspectRatio: getAspectRatio(params.canvasSize, ASPECT_RATIOS),
|
|
115
94
|
personGeneration: PersonGeneration.ALLOW_ALL,
|
|
116
95
|
// safetyFilterLevel: SafetyFilterLevel.BLOCK_ONLY_HIGH,
|
|
117
96
|
},
|
|
@@ -36,8 +36,8 @@ export declare const promptTemplates: ({
|
|
|
36
36
|
"[CHARACTER_2_ID]"?: undefined;
|
|
37
37
|
};
|
|
38
38
|
style: string;
|
|
39
|
-
provider?: undefined;
|
|
40
39
|
model?: undefined;
|
|
40
|
+
provider?: undefined;
|
|
41
41
|
};
|
|
42
42
|
movieParams: {
|
|
43
43
|
provider: string;
|
|
@@ -54,7 +54,6 @@ export declare const promptTemplates: ({
|
|
|
54
54
|
};
|
|
55
55
|
provider: string;
|
|
56
56
|
voiceId: string;
|
|
57
|
-
lang?: undefined;
|
|
58
57
|
speechOptions?: undefined;
|
|
59
58
|
};
|
|
60
59
|
Announcer?: undefined;
|
|
@@ -106,9 +105,9 @@ export declare const promptTemplates: ({
|
|
|
106
105
|
"[CHARACTER_1_ID]"?: undefined;
|
|
107
106
|
"[CHARACTER_2_ID]"?: undefined;
|
|
108
107
|
};
|
|
108
|
+
model: string;
|
|
109
|
+
provider: string;
|
|
109
110
|
style: string;
|
|
110
|
-
provider?: undefined;
|
|
111
|
-
model?: undefined;
|
|
112
111
|
};
|
|
113
112
|
movieParams: {
|
|
114
113
|
model: string;
|
|
@@ -120,12 +119,6 @@ export declare const promptTemplates: ({
|
|
|
120
119
|
speechParams: {
|
|
121
120
|
speakers: {
|
|
122
121
|
Presenter: {
|
|
123
|
-
lang: {
|
|
124
|
-
ja: {
|
|
125
|
-
provider: string;
|
|
126
|
-
voiceId: string;
|
|
127
|
-
};
|
|
128
|
-
};
|
|
129
122
|
provider: string;
|
|
130
123
|
speechOptions: {
|
|
131
124
|
instruction: string;
|
|
@@ -199,7 +192,6 @@ export declare const promptTemplates: ({
|
|
|
199
192
|
};
|
|
200
193
|
provider: string;
|
|
201
194
|
voiceId: string;
|
|
202
|
-
lang?: undefined;
|
|
203
195
|
speechOptions?: undefined;
|
|
204
196
|
};
|
|
205
197
|
Announcer?: undefined;
|
|
@@ -236,8 +228,8 @@ export declare const promptTemplates: ({
|
|
|
236
228
|
imageParams: {
|
|
237
229
|
style: string;
|
|
238
230
|
images?: undefined;
|
|
239
|
-
provider?: undefined;
|
|
240
231
|
model?: undefined;
|
|
232
|
+
provider?: undefined;
|
|
241
233
|
};
|
|
242
234
|
movieParams: {
|
|
243
235
|
provider: string;
|
|
@@ -254,7 +246,6 @@ export declare const promptTemplates: ({
|
|
|
254
246
|
};
|
|
255
247
|
provider: string;
|
|
256
248
|
voiceId: string;
|
|
257
|
-
lang?: undefined;
|
|
258
249
|
speechOptions?: undefined;
|
|
259
250
|
};
|
|
260
251
|
Announcer?: undefined;
|
|
@@ -304,8 +295,8 @@ export declare const promptTemplates: ({
|
|
|
304
295
|
"[CHARACTER_2_ID]"?: undefined;
|
|
305
296
|
};
|
|
306
297
|
style: string;
|
|
307
|
-
provider?: undefined;
|
|
308
298
|
model?: undefined;
|
|
299
|
+
provider?: undefined;
|
|
309
300
|
};
|
|
310
301
|
movieParams: {
|
|
311
302
|
provider: string;
|
|
@@ -322,7 +313,6 @@ export declare const promptTemplates: ({
|
|
|
322
313
|
};
|
|
323
314
|
provider: string;
|
|
324
315
|
voiceId: string;
|
|
325
|
-
lang?: undefined;
|
|
326
316
|
speechOptions?: undefined;
|
|
327
317
|
};
|
|
328
318
|
Announcer?: undefined;
|
|
@@ -390,7 +380,6 @@ export declare const promptTemplates: ({
|
|
|
390
380
|
};
|
|
391
381
|
provider: string;
|
|
392
382
|
voiceId: string;
|
|
393
|
-
lang?: undefined;
|
|
394
383
|
speechOptions?: undefined;
|
|
395
384
|
};
|
|
396
385
|
Announcer?: undefined;
|
|
@@ -446,8 +435,8 @@ export declare const promptTemplates: ({
|
|
|
446
435
|
"[CHARACTER_2_ID]"?: undefined;
|
|
447
436
|
};
|
|
448
437
|
style: string;
|
|
449
|
-
provider?: undefined;
|
|
450
438
|
model?: undefined;
|
|
439
|
+
provider?: undefined;
|
|
451
440
|
};
|
|
452
441
|
movieParams: {
|
|
453
442
|
provider: string;
|
|
@@ -464,7 +453,6 @@ export declare const promptTemplates: ({
|
|
|
464
453
|
};
|
|
465
454
|
provider: string;
|
|
466
455
|
voiceId: string;
|
|
467
|
-
lang?: undefined;
|
|
468
456
|
speechOptions?: undefined;
|
|
469
457
|
};
|
|
470
458
|
Announcer?: undefined;
|
|
@@ -476,6 +464,63 @@ export declare const promptTemplates: ({
|
|
|
476
464
|
scriptName: string;
|
|
477
465
|
systemPrompt: string;
|
|
478
466
|
title: string;
|
|
467
|
+
} | {
|
|
468
|
+
description: string;
|
|
469
|
+
filename: string;
|
|
470
|
+
presentationStyle: {
|
|
471
|
+
$mulmocast: {
|
|
472
|
+
credit: string;
|
|
473
|
+
version: string;
|
|
474
|
+
};
|
|
475
|
+
audioParams: {
|
|
476
|
+
audioVolume: number;
|
|
477
|
+
bgm: {
|
|
478
|
+
kind: string;
|
|
479
|
+
url: string;
|
|
480
|
+
};
|
|
481
|
+
bgmVolume: number;
|
|
482
|
+
closingPadding: number;
|
|
483
|
+
introPadding: number;
|
|
484
|
+
outroPadding: number;
|
|
485
|
+
padding: number;
|
|
486
|
+
suppressSpeech: boolean;
|
|
487
|
+
};
|
|
488
|
+
canvasSize: {
|
|
489
|
+
height: number;
|
|
490
|
+
width: number;
|
|
491
|
+
};
|
|
492
|
+
imageParams: {
|
|
493
|
+
model: string;
|
|
494
|
+
provider: string;
|
|
495
|
+
images?: undefined;
|
|
496
|
+
style?: undefined;
|
|
497
|
+
};
|
|
498
|
+
movieParams: {
|
|
499
|
+
provider: string;
|
|
500
|
+
model?: undefined;
|
|
501
|
+
};
|
|
502
|
+
soundEffectParams: {
|
|
503
|
+
provider: string;
|
|
504
|
+
};
|
|
505
|
+
speechParams: {
|
|
506
|
+
speakers: {
|
|
507
|
+
Presenter: {
|
|
508
|
+
provider: string;
|
|
509
|
+
speechOptions: {
|
|
510
|
+
instruction: string;
|
|
511
|
+
};
|
|
512
|
+
voiceId: string;
|
|
513
|
+
displayName?: undefined;
|
|
514
|
+
};
|
|
515
|
+
Announcer?: undefined;
|
|
516
|
+
Student?: undefined;
|
|
517
|
+
Teacher?: undefined;
|
|
518
|
+
};
|
|
519
|
+
};
|
|
520
|
+
};
|
|
521
|
+
scriptName: string;
|
|
522
|
+
systemPrompt: string;
|
|
523
|
+
title: string;
|
|
479
524
|
} | {
|
|
480
525
|
description: string;
|
|
481
526
|
filename: string;
|
|
@@ -501,8 +546,8 @@ export declare const promptTemplates: ({
|
|
|
501
546
|
imageParams: {
|
|
502
547
|
style: string;
|
|
503
548
|
images?: undefined;
|
|
504
|
-
provider?: undefined;
|
|
505
549
|
model?: undefined;
|
|
550
|
+
provider?: undefined;
|
|
506
551
|
};
|
|
507
552
|
movieParams: {
|
|
508
553
|
provider: string;
|
|
@@ -566,8 +611,8 @@ export declare const promptTemplates: ({
|
|
|
566
611
|
imageParams: {
|
|
567
612
|
style: string;
|
|
568
613
|
images?: undefined;
|
|
569
|
-
provider?: undefined;
|
|
570
614
|
model?: undefined;
|
|
615
|
+
provider?: undefined;
|
|
571
616
|
};
|
|
572
617
|
movieParams: {
|
|
573
618
|
provider: string;
|
|
@@ -584,7 +629,6 @@ export declare const promptTemplates: ({
|
|
|
584
629
|
};
|
|
585
630
|
provider: string;
|
|
586
631
|
voiceId: string;
|
|
587
|
-
lang?: undefined;
|
|
588
632
|
speechOptions?: undefined;
|
|
589
633
|
};
|
|
590
634
|
Announcer?: undefined;
|
|
@@ -634,8 +678,8 @@ export declare const promptTemplates: ({
|
|
|
634
678
|
optimus?: undefined;
|
|
635
679
|
};
|
|
636
680
|
style: string;
|
|
637
|
-
provider?: undefined;
|
|
638
681
|
model?: undefined;
|
|
682
|
+
provider?: undefined;
|
|
639
683
|
};
|
|
640
684
|
movieParams: {
|
|
641
685
|
provider: string;
|
|
@@ -652,7 +696,6 @@ export declare const promptTemplates: ({
|
|
|
652
696
|
};
|
|
653
697
|
provider: string;
|
|
654
698
|
voiceId: string;
|
|
655
|
-
lang?: undefined;
|
|
656
699
|
speechOptions?: undefined;
|
|
657
700
|
};
|
|
658
701
|
Announcer?: undefined;
|
|
@@ -692,8 +735,8 @@ export declare const promptTemplates: ({
|
|
|
692
735
|
imageParams: {
|
|
693
736
|
style: string;
|
|
694
737
|
images?: undefined;
|
|
695
|
-
provider?: undefined;
|
|
696
738
|
model?: undefined;
|
|
739
|
+
provider?: undefined;
|
|
697
740
|
};
|
|
698
741
|
movieParams: {
|
|
699
742
|
provider: string;
|
|
@@ -710,7 +753,6 @@ export declare const promptTemplates: ({
|
|
|
710
753
|
};
|
|
711
754
|
provider: string;
|
|
712
755
|
voiceId: string;
|
|
713
|
-
lang?: undefined;
|
|
714
756
|
speechOptions?: undefined;
|
|
715
757
|
};
|
|
716
758
|
Announcer?: undefined;
|
|
@@ -89,6 +89,8 @@ export const promptTemplates = [
|
|
|
89
89
|
type: "image",
|
|
90
90
|
},
|
|
91
91
|
},
|
|
92
|
+
model: "gemini-2.5-flash-image",
|
|
93
|
+
provider: "google",
|
|
92
94
|
style: "<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>",
|
|
93
95
|
},
|
|
94
96
|
movieParams: {
|
|
@@ -101,17 +103,11 @@ export const promptTemplates = [
|
|
|
101
103
|
speechParams: {
|
|
102
104
|
speakers: {
|
|
103
105
|
Presenter: {
|
|
104
|
-
|
|
105
|
-
ja: {
|
|
106
|
-
provider: "nijivoice",
|
|
107
|
-
voiceId: "9d9ed276-49ee-443a-bc19-26e6136d05f0",
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
provider: "openai",
|
|
106
|
+
provider: "gemini",
|
|
111
107
|
speechOptions: {
|
|
112
108
|
instruction: "Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl.",
|
|
113
109
|
},
|
|
114
|
-
voiceId: "
|
|
110
|
+
voiceId: "Leda",
|
|
115
111
|
},
|
|
116
112
|
},
|
|
117
113
|
},
|
|
@@ -642,6 +638,57 @@ export const promptTemplates = [
|
|
|
642
638
|
systemPrompt: "Another AI will generate images for each beat based on the image prompt of that beat. Movie prompts must be written in English. Mention the reference in one of beats, if it exists. Use the JSON below as a template.",
|
|
643
639
|
title: "Plain Image Prompt",
|
|
644
640
|
},
|
|
641
|
+
{
|
|
642
|
+
description: "Template for presentation with Gemini voice Leda.",
|
|
643
|
+
filename: "leda",
|
|
644
|
+
presentationStyle: {
|
|
645
|
+
$mulmocast: {
|
|
646
|
+
credit: "closing",
|
|
647
|
+
version: "1.1",
|
|
648
|
+
},
|
|
649
|
+
audioParams: {
|
|
650
|
+
audioVolume: 1,
|
|
651
|
+
bgm: {
|
|
652
|
+
kind: "url",
|
|
653
|
+
url: "https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3",
|
|
654
|
+
},
|
|
655
|
+
bgmVolume: 0.2,
|
|
656
|
+
closingPadding: 0.8,
|
|
657
|
+
introPadding: 1,
|
|
658
|
+
outroPadding: 1,
|
|
659
|
+
padding: 0.3,
|
|
660
|
+
suppressSpeech: false,
|
|
661
|
+
},
|
|
662
|
+
canvasSize: {
|
|
663
|
+
height: 1536,
|
|
664
|
+
width: 1024,
|
|
665
|
+
},
|
|
666
|
+
imageParams: {
|
|
667
|
+
model: "gemini-2.5-flash-image",
|
|
668
|
+
provider: "google",
|
|
669
|
+
},
|
|
670
|
+
movieParams: {
|
|
671
|
+
provider: "replicate",
|
|
672
|
+
},
|
|
673
|
+
soundEffectParams: {
|
|
674
|
+
provider: "replicate",
|
|
675
|
+
},
|
|
676
|
+
speechParams: {
|
|
677
|
+
speakers: {
|
|
678
|
+
Presenter: {
|
|
679
|
+
provider: "gemini",
|
|
680
|
+
speechOptions: {
|
|
681
|
+
instruction: "Speak like a professional news presenter.",
|
|
682
|
+
},
|
|
683
|
+
voiceId: "Leda",
|
|
684
|
+
},
|
|
685
|
+
},
|
|
686
|
+
},
|
|
687
|
+
},
|
|
688
|
+
scriptName: "image_prompts_template.json",
|
|
689
|
+
systemPrompt: "",
|
|
690
|
+
title: "Presentation by Leda",
|
|
691
|
+
},
|
|
645
692
|
{
|
|
646
693
|
description: "Template for One Piece style comic presentation.",
|
|
647
694
|
filename: "onepiece_comic",
|
|
@@ -5,7 +5,7 @@ export const templateDataSet = {
|
|
|
5
5
|
"```",
|
|
6
6
|
ani: "言葉づかいは思いっきりツンデレにして。Another AI will generate comic for each beat based on the image prompt of that beat. You don't need to specify the style of the image, just describe the scene. Mention the reference in one of beats, if it exists. Use the JSON below as a template. Create appropriate amount of beats, and make sure the beats are coherent and flow well.\n" +
|
|
7
7
|
"```JSON\n" +
|
|
8
|
-
`{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"movieParams":{"provider":"replicate","model":"bytedance/seedance-1-lite"},"speechParams":{"
|
|
8
|
+
`{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"movieParams":{"provider":"replicate","model":"bytedance/seedance-1-lite"},"speechParams":{"speakers":{"Presenter":{"provider":"gemini","voiceId":"Leda","speechOptions":{"instruction":"Speak in a slightly high-pitched, curt tone with sudden flustered shifts—like a tsundere anime girl."}}}},"audioParams":{"bgm":{"kind":"url","url":"https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"}},"canvasSize":{"width":1024,"height":1536},"imageParams":{"provider":"google","model":"gemini-2.5-flash-image","style":"<style>A highly polished 2D digital illustration in anime and manga style, featuring clean linework, soft shading, vivid colors, and expressive facial detailing. The composition emphasizes clarity and visual impact with a minimalistic background and a strong character focus. The lighting is even and bright, giving the image a crisp and energetic feel, reminiscent of high-quality character art used in Japanese visual novels or mobile games.</style>","images":{"ani":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/ani.png"}}}}}\n` +
|
|
9
9
|
"```",
|
|
10
10
|
business: "Use textSlides, markdown, mermaid, or chart to show slides. Extract image links in the article (from <img> tag) to reuse them in the presentation. Mention the reference in one of beats, if it exists. Use the JSON below as a template. chartData is the data for Chart.js\n" +
|
|
11
11
|
"```JSON\n" +
|
|
@@ -55,6 +55,10 @@ export const templateDataSet = {
|
|
|
55
55
|
"```JSON\n" +
|
|
56
56
|
`{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"canvasSize":{"width":1536,"height":1024}}\n` +
|
|
57
57
|
"```",
|
|
58
|
+
leda: "\n" +
|
|
59
|
+
"```JSON\n" +
|
|
60
|
+
`{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"speechParams":{"speakers":{"Presenter":{"provider":"gemini","voiceId":"Leda","speechOptions":{"instruction":"Speak like a professional news presenter."}}}},"audioParams":{"bgm":{"kind":"url","url":"https://github.com/receptron/mulmocast-media/raw/refs/heads/main/bgms/morning001.mp3"}},"canvasSize":{"width":1024,"height":1536},"imageParams":{"provider":"google","model":"gemini-2.5-flash-image"}}\n` +
|
|
61
|
+
"```",
|
|
58
62
|
onepiece_comic: "Another AI will generate images for each beat based on the image prompt of that beat. Mention the reference in one of beats, if it exists. Use the JSON below as a template.\n" +
|
|
59
63
|
"```JSON\n" +
|
|
60
64
|
`{"$mulmocast":{"version":"1.1","credit":"closing"},"title":"[TITLE: Brief, engaging title for the topic]","lang":"en","references":[{"url":"[SOURCE_URL: URL of the source material]","title":"[SOURCE_TITLE: Title of the referenced article, or paper]","type":"[SOURCE_TYPE: article, paper]"}],"beats":[{"text":"[OPENING_BEAT: Introduce the topic with a hook. Reference the source material and set up why this topic matters. Usually 2-3 sentences that grab attention and provide context.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[MAIN_CONCEPT: Define or explain the core concept/idea. This should be the central focus of your narrative. Keep it clear and accessible.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_1: Additional context, examples, or elaboration that helps illustrate the main concept. This could include how it works, why it's important, or real-world applications.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[SUPPORTING_DETAIL_2: Continue with more examples, deeper explanation, or different aspects of the topic if needed.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[ADDITIONAL_BEATS: Add more beats as necessary to fully explore the topic. Complex topics may require 6-10+ beats to cover adequately. Each beat should advance the narrative or provide valuable information.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"},{"text":"[CONCLUSION/IMPACT: Wrap up with the significance, implications, or key takeaway. Help the audience understand why this matters to them.]","imagePrompt":"[IMAGE_PROMPT: A prompt for the image to be generated for this beat.]"}],"canvasSize":{"width":1536,"height":1024},"imageParams":{"style":"<style>One Piece aesthetic.</style>","images":{"presenter":{"type":"image","source":{"kind":"url","url":"https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/onepiece_presenter.png"}}}}}\n` +
|
package/lib/utils/const.d.ts
CHANGED
package/lib/utils/const.js
CHANGED