mulmocast 2.0.0 → 2.0.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/lib/actions/image_agents.js +1 -1
- package/lib/agents/movie_genai_agent.js +2 -4
- package/lib/types/schema.d.ts +36 -36
- package/lib/types/schema.js +9 -10
- package/lib/utils/agent_error_handler.d.ts +24 -0
- package/lib/utils/agent_error_handler.js +59 -0
- package/lib/utils/agent_info_factory.d.ts +12 -0
- package/lib/utils/agent_info_factory.js +23 -0
- package/lib/utils/context.d.ts +9 -9
- package/package.json +4 -4
- package/scripts/test/test_movie2.json +27 -0
- package/scripts/test/test_movie2.json~ +40 -0
- package/scripts/test/test_movie3.json +56 -0
- package/scripts/test/test_play_to_end.json~ +65 -0
|
@@ -76,7 +76,7 @@ export const imagePreprocessAgent = async (namedInputs) => {
|
|
|
76
76
|
...returnValue,
|
|
77
77
|
// imagePath: isTypeMovie ? undefined : pluginPath,
|
|
78
78
|
imagePath: isTypeMovie ? imagePath : pluginPath,
|
|
79
|
-
movieFile: isTypeMovie ? pluginPath :
|
|
79
|
+
movieFile: isTypeMovie ? pluginPath : returnValue.movieFile,
|
|
80
80
|
imageFromMovie: isTypeMovie,
|
|
81
81
|
referenceImageForMovie: pluginPath,
|
|
82
82
|
markdown,
|
|
@@ -2,7 +2,7 @@ import { readFileSync } from "fs";
|
|
|
2
2
|
import { GraphAILogger, sleep } from "graphai";
|
|
3
3
|
import { apiKeyMissingError, agentGenerationError, agentInvalidResponseError, imageAction, movieFileTarget, videoDurationTarget, hasCause, } from "../utils/error_cause.js";
|
|
4
4
|
import { GoogleGenAI, PersonGeneration } from "@google/genai";
|
|
5
|
-
import { getModelDuration } from "../utils/provider2agent.js";
|
|
5
|
+
import { getModelDuration, provider2MovieAgent } from "../utils/provider2agent.js";
|
|
6
6
|
export const getAspectRatio = (canvasSize) => {
|
|
7
7
|
if (canvasSize.width > canvasSize.height) {
|
|
8
8
|
return "16:9";
|
|
@@ -17,8 +17,7 @@ export const getAspectRatio = (canvasSize) => {
|
|
|
17
17
|
export const movieGenAIAgent = async ({ namedInputs, params, config, }) => {
|
|
18
18
|
const { prompt, imagePath, movieFile } = namedInputs;
|
|
19
19
|
const aspectRatio = getAspectRatio(params.canvasSize);
|
|
20
|
-
const model = params.model ??
|
|
21
|
-
// const duration = params.duration ?? 8;
|
|
20
|
+
const model = params.model ?? provider2MovieAgent.google.defaultModel;
|
|
22
21
|
const apiKey = config?.apiKey;
|
|
23
22
|
if (!apiKey) {
|
|
24
23
|
throw new Error("Google GenAI API key is required (GEMINI_API_KEY)", {
|
|
@@ -102,7 +101,6 @@ const movieGenAIAgentInfo = {
|
|
|
102
101
|
category: ["movie"],
|
|
103
102
|
author: "Receptron Team",
|
|
104
103
|
repository: "https://github.com/receptron/mulmocast-cli/",
|
|
105
|
-
// source: "https://github.com/receptron/mulmocast-cli/blob/main/src/agents/image_google_agent.ts",
|
|
106
104
|
license: "MIT",
|
|
107
105
|
environmentVariables: [],
|
|
108
106
|
};
|
package/lib/types/schema.d.ts
CHANGED
|
@@ -685,6 +685,12 @@ export declare const mulmoMovieParamsSchema: z.ZodObject<{
|
|
|
685
685
|
[x: string]: string;
|
|
686
686
|
}>>>;
|
|
687
687
|
model: z.ZodOptional<z.ZodString>;
|
|
688
|
+
fillOption: z.ZodOptional<z.ZodObject<{
|
|
689
|
+
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
690
|
+
aspectFit: "aspectFit";
|
|
691
|
+
aspectFill: "aspectFill";
|
|
692
|
+
}>>>;
|
|
693
|
+
}, z.core.$strip>>;
|
|
688
694
|
transition: z.ZodOptional<z.ZodObject<{
|
|
689
695
|
type: z.ZodEnum<{
|
|
690
696
|
fade: "fade";
|
|
@@ -692,12 +698,6 @@ export declare const mulmoMovieParamsSchema: z.ZodObject<{
|
|
|
692
698
|
}>;
|
|
693
699
|
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
694
700
|
}, z.core.$strip>>;
|
|
695
|
-
fillOption: z.ZodOptional<z.ZodObject<{
|
|
696
|
-
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
697
|
-
aspectFit: "aspectFit";
|
|
698
|
-
aspectFill: "aspectFill";
|
|
699
|
-
}>>>;
|
|
700
|
-
}, z.core.$strip>>;
|
|
701
701
|
}, z.core.$strict>;
|
|
702
702
|
export declare const mulmoPresentationStyleSchema: z.ZodObject<{
|
|
703
703
|
$mulmocast: z.ZodObject<{
|
|
@@ -766,6 +766,12 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
|
|
|
766
766
|
[x: string]: string;
|
|
767
767
|
}>>>;
|
|
768
768
|
model: z.ZodOptional<z.ZodString>;
|
|
769
|
+
fillOption: z.ZodOptional<z.ZodObject<{
|
|
770
|
+
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
771
|
+
aspectFit: "aspectFit";
|
|
772
|
+
aspectFill: "aspectFill";
|
|
773
|
+
}>>>;
|
|
774
|
+
}, z.core.$strip>>;
|
|
769
775
|
transition: z.ZodOptional<z.ZodObject<{
|
|
770
776
|
type: z.ZodEnum<{
|
|
771
777
|
fade: "fade";
|
|
@@ -773,12 +779,6 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
|
|
|
773
779
|
}>;
|
|
774
780
|
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
775
781
|
}, z.core.$strip>>;
|
|
776
|
-
fillOption: z.ZodOptional<z.ZodObject<{
|
|
777
|
-
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
778
|
-
aspectFit: "aspectFit";
|
|
779
|
-
aspectFill: "aspectFill";
|
|
780
|
-
}>>>;
|
|
781
|
-
}, z.core.$strip>>;
|
|
782
782
|
}, z.core.$strict>>;
|
|
783
783
|
soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
784
784
|
provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
@@ -902,6 +902,12 @@ export declare const mulmoScriptSchema: z.ZodObject<{
|
|
|
902
902
|
[x: string]: string;
|
|
903
903
|
}>>>;
|
|
904
904
|
model: z.ZodOptional<z.ZodString>;
|
|
905
|
+
fillOption: z.ZodOptional<z.ZodObject<{
|
|
906
|
+
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
907
|
+
aspectFit: "aspectFit";
|
|
908
|
+
aspectFill: "aspectFill";
|
|
909
|
+
}>>>;
|
|
910
|
+
}, z.core.$strip>>;
|
|
905
911
|
transition: z.ZodOptional<z.ZodObject<{
|
|
906
912
|
type: z.ZodEnum<{
|
|
907
913
|
fade: "fade";
|
|
@@ -909,12 +915,6 @@ export declare const mulmoScriptSchema: z.ZodObject<{
|
|
|
909
915
|
}>;
|
|
910
916
|
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
911
917
|
}, z.core.$strip>>;
|
|
912
|
-
fillOption: z.ZodOptional<z.ZodObject<{
|
|
913
|
-
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
914
|
-
aspectFit: "aspectFit";
|
|
915
|
-
aspectFill: "aspectFill";
|
|
916
|
-
}>>>;
|
|
917
|
-
}, z.core.$strip>>;
|
|
918
918
|
}, z.core.$strict>>;
|
|
919
919
|
soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
920
920
|
provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
@@ -1314,6 +1314,12 @@ export declare const mulmoStudioSchema: z.ZodObject<{
|
|
|
1314
1314
|
[x: string]: string;
|
|
1315
1315
|
}>>>;
|
|
1316
1316
|
model: z.ZodOptional<z.ZodString>;
|
|
1317
|
+
fillOption: z.ZodOptional<z.ZodObject<{
|
|
1318
|
+
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
1319
|
+
aspectFit: "aspectFit";
|
|
1320
|
+
aspectFill: "aspectFill";
|
|
1321
|
+
}>>>;
|
|
1322
|
+
}, z.core.$strip>>;
|
|
1317
1323
|
transition: z.ZodOptional<z.ZodObject<{
|
|
1318
1324
|
type: z.ZodEnum<{
|
|
1319
1325
|
fade: "fade";
|
|
@@ -1321,12 +1327,6 @@ export declare const mulmoStudioSchema: z.ZodObject<{
|
|
|
1321
1327
|
}>;
|
|
1322
1328
|
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
1323
1329
|
}, z.core.$strip>>;
|
|
1324
|
-
fillOption: z.ZodOptional<z.ZodObject<{
|
|
1325
|
-
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
1326
|
-
aspectFit: "aspectFit";
|
|
1327
|
-
aspectFill: "aspectFill";
|
|
1328
|
-
}>>>;
|
|
1329
|
-
}, z.core.$strip>>;
|
|
1330
1330
|
}, z.core.$strict>>;
|
|
1331
1331
|
soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1332
1332
|
provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
@@ -1662,6 +1662,12 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
|
|
|
1662
1662
|
[x: string]: string;
|
|
1663
1663
|
}>>>;
|
|
1664
1664
|
model: z.ZodOptional<z.ZodString>;
|
|
1665
|
+
fillOption: z.ZodOptional<z.ZodObject<{
|
|
1666
|
+
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
1667
|
+
aspectFit: "aspectFit";
|
|
1668
|
+
aspectFill: "aspectFill";
|
|
1669
|
+
}>>>;
|
|
1670
|
+
}, z.core.$strip>>;
|
|
1665
1671
|
transition: z.ZodOptional<z.ZodObject<{
|
|
1666
1672
|
type: z.ZodEnum<{
|
|
1667
1673
|
fade: "fade";
|
|
@@ -1669,12 +1675,6 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
|
|
|
1669
1675
|
}>;
|
|
1670
1676
|
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
1671
1677
|
}, z.core.$strip>>;
|
|
1672
|
-
fillOption: z.ZodOptional<z.ZodObject<{
|
|
1673
|
-
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
1674
|
-
aspectFit: "aspectFit";
|
|
1675
|
-
aspectFill: "aspectFill";
|
|
1676
|
-
}>>>;
|
|
1677
|
-
}, z.core.$strip>>;
|
|
1678
1678
|
}, z.core.$strict>>;
|
|
1679
1679
|
soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1680
1680
|
provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
|
@@ -1792,6 +1792,12 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
|
|
|
1792
1792
|
[x: string]: string;
|
|
1793
1793
|
}>>>;
|
|
1794
1794
|
model: z.ZodOptional<z.ZodString>;
|
|
1795
|
+
fillOption: z.ZodOptional<z.ZodObject<{
|
|
1796
|
+
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
1797
|
+
aspectFit: "aspectFit";
|
|
1798
|
+
aspectFill: "aspectFill";
|
|
1799
|
+
}>>>;
|
|
1800
|
+
}, z.core.$strip>>;
|
|
1795
1801
|
transition: z.ZodOptional<z.ZodObject<{
|
|
1796
1802
|
type: z.ZodEnum<{
|
|
1797
1803
|
fade: "fade";
|
|
@@ -1799,12 +1805,6 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
|
|
|
1799
1805
|
}>;
|
|
1800
1806
|
duration: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
1801
1807
|
}, z.core.$strip>>;
|
|
1802
|
-
fillOption: z.ZodOptional<z.ZodObject<{
|
|
1803
|
-
style: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
1804
|
-
aspectFit: "aspectFit";
|
|
1805
|
-
aspectFill: "aspectFill";
|
|
1806
|
-
}>>>;
|
|
1807
|
-
}, z.core.$strip>>;
|
|
1808
1808
|
}, z.core.$strict>>;
|
|
1809
1809
|
soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
|
|
1810
1810
|
provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
|
package/lib/types/schema.js
CHANGED
|
@@ -278,6 +278,11 @@ export const mulmoLipSyncParamsSchema = z.object({
|
|
|
278
278
|
provider: z.string().optional(), // lip sync provider
|
|
279
279
|
model: z.string().optional(), // default: provider specific
|
|
280
280
|
});
|
|
281
|
+
const movieParamsSchema = z.object({
|
|
282
|
+
provider: text2MovieProviderSchema.optional(),
|
|
283
|
+
model: z.string().optional(),
|
|
284
|
+
fillOption: mulmoFillOptionSchema.optional(), // for movie.ts
|
|
285
|
+
});
|
|
281
286
|
export const mulmoBeatSchema = z
|
|
282
287
|
.object({
|
|
283
288
|
speaker: speakerIdSchema.optional(),
|
|
@@ -289,11 +294,8 @@ export const mulmoBeatSchema = z
|
|
|
289
294
|
duration: z.number().optional().describe("Duration of the beat. Used only when the text is empty"),
|
|
290
295
|
imageParams: mulmoBeatImageParamsSchema.optional(), // beat specific parameters
|
|
291
296
|
audioParams: beatAudioParamsSchema.optional(), // beat specific parameters
|
|
292
|
-
movieParams:
|
|
293
|
-
.
|
|
294
|
-
provider: text2MovieProviderSchema.optional(),
|
|
295
|
-
model: z.string().optional(),
|
|
296
|
-
fillOption: mulmoFillOptionSchema.optional(), // for movie.ts
|
|
297
|
+
movieParams: movieParamsSchema
|
|
298
|
+
.extend({
|
|
297
299
|
speed: z.number().optional().describe("Speed of the video. 1.0 is normal speed. 0.5 is half speed. 2.0 is double speed."), // for movie.ts
|
|
298
300
|
})
|
|
299
301
|
.optional(),
|
|
@@ -344,12 +346,9 @@ export const mulmoTransitionSchema = z.object({
|
|
|
344
346
|
type: z.enum(["fade", "slideout_left"]),
|
|
345
347
|
duration: z.number().min(0).max(2).optional().default(0.3), // transition duration in seconds
|
|
346
348
|
});
|
|
347
|
-
export const mulmoMovieParamsSchema =
|
|
348
|
-
.
|
|
349
|
-
provider: text2MovieProviderSchema.optional(), // for agent
|
|
350
|
-
model: z.string().optional(), // default: provider specific. for agent
|
|
349
|
+
export const mulmoMovieParamsSchema = movieParamsSchema
|
|
350
|
+
.extend({
|
|
351
351
|
transition: mulmoTransitionSchema.optional(), // for movie.ts
|
|
352
|
-
fillOption: mulmoFillOptionSchema.optional(), // for movie.ts
|
|
353
352
|
})
|
|
354
353
|
.strict();
|
|
355
354
|
export const mulmoPresentationStyleSchema = z.object({
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps agent execution with standardized error handling
|
|
3
|
+
*
|
|
4
|
+
* @param agentName - Name of the agent for error reporting
|
|
5
|
+
* @param action - Action being performed (e.g., "audio", "image", "movie")
|
|
6
|
+
* @param target - Target of the action (e.g., "audioFile", "imageFile")
|
|
7
|
+
* @param suppressError - If true, returns error object instead of throwing
|
|
8
|
+
* @param fn - Async function to execute
|
|
9
|
+
* @returns Result of fn or error object if suppressError is true
|
|
10
|
+
*/
|
|
11
|
+
export declare const wrapAgentError: <T>(agentName: string, action: string, target: string, suppressError: boolean | undefined, fn: () => Promise<T>) => Promise<T | {
|
|
12
|
+
error: unknown;
|
|
13
|
+
}>;
|
|
14
|
+
/**
|
|
15
|
+
* Validates that an API key is present, throwing an error if missing
|
|
16
|
+
*
|
|
17
|
+
* @param apiKey - API key to validate
|
|
18
|
+
* @param agentName - Name of the agent for error reporting
|
|
19
|
+
* @param action - Action being performed
|
|
20
|
+
* @param envVarName - Environment variable name for the API key
|
|
21
|
+
* @returns The validated API key
|
|
22
|
+
* @throws Error if API key is missing
|
|
23
|
+
*/
|
|
24
|
+
export declare const requireApiKey: (apiKey: string | undefined, agentName: string, action: string, envVarName: string) => string;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { GraphAILogger } from "graphai";
|
|
2
|
+
import { AuthenticationError, RateLimitError } from "openai";
|
|
3
|
+
import { agentIncorrectAPIKeyError, agentAPIRateLimitError, agentGenerationError, hasCause, } from "./error_cause.js";
|
|
4
|
+
/**
|
|
5
|
+
* Wraps agent execution with standardized error handling
|
|
6
|
+
*
|
|
7
|
+
* @param agentName - Name of the agent for error reporting
|
|
8
|
+
* @param action - Action being performed (e.g., "audio", "image", "movie")
|
|
9
|
+
* @param target - Target of the action (e.g., "audioFile", "imageFile")
|
|
10
|
+
* @param suppressError - If true, returns error object instead of throwing
|
|
11
|
+
* @param fn - Async function to execute
|
|
12
|
+
* @returns Result of fn or error object if suppressError is true
|
|
13
|
+
*/
|
|
14
|
+
export const wrapAgentError = async (agentName, action, target, suppressError, fn) => {
|
|
15
|
+
try {
|
|
16
|
+
return await fn();
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (suppressError) {
|
|
20
|
+
return { error };
|
|
21
|
+
}
|
|
22
|
+
GraphAILogger.info(error);
|
|
23
|
+
if (error instanceof AuthenticationError) {
|
|
24
|
+
throw new Error(`Failed: 401 Incorrect API key provided`, {
|
|
25
|
+
cause: agentIncorrectAPIKeyError(agentName, action, target),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
if (error instanceof RateLimitError) {
|
|
29
|
+
throw new Error("You exceeded your current quota, please check your plan and billing details", {
|
|
30
|
+
cause: agentAPIRateLimitError(agentName, action, target),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (hasCause(error)) {
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
throw new Error(`Failed with ${agentName}`, {
|
|
37
|
+
cause: agentGenerationError(agentName, action, target),
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Validates that an API key is present, throwing an error if missing
|
|
43
|
+
*
|
|
44
|
+
* @param apiKey - API key to validate
|
|
45
|
+
* @param agentName - Name of the agent for error reporting
|
|
46
|
+
* @param action - Action being performed
|
|
47
|
+
* @param envVarName - Environment variable name for the API key
|
|
48
|
+
* @returns The validated API key
|
|
49
|
+
* @throws Error if API key is missing
|
|
50
|
+
*/
|
|
51
|
+
export const requireApiKey = (apiKey, agentName, action, envVarName) => {
|
|
52
|
+
if (!apiKey) {
|
|
53
|
+
const { apiKeyMissingError } = require("./error_cause.js");
|
|
54
|
+
throw new Error(`${envVarName} is required`, {
|
|
55
|
+
cause: apiKeyMissingError(agentName, action, envVarName),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return apiKey;
|
|
59
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AgentFunction, AgentFunctionInfo } from "graphai";
|
|
2
|
+
/**
|
|
3
|
+
* Creates standardized AgentFunctionInfo metadata for agents
|
|
4
|
+
*
|
|
5
|
+
* @param name - Agent name (e.g., "ttsOpenaiAgent")
|
|
6
|
+
* @param agent - Agent function implementation
|
|
7
|
+
* @param category - Agent categories (e.g., ["tts"], ["image"])
|
|
8
|
+
* @param description - Human-readable description
|
|
9
|
+
* @param environmentVariables - Required environment variables (e.g., ["OPENAI_API_KEY"])
|
|
10
|
+
* @returns AgentFunctionInfo with standardized metadata
|
|
11
|
+
*/
|
|
12
|
+
export declare const createAgentInfo: <P = unknown, R = unknown, I = unknown, C = unknown>(name: string, agent: AgentFunction<P, R, I, C>, category: string[], description: string, environmentVariables?: string[]) => AgentFunctionInfo;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PROJECT_METADATA } from "./const.js";
|
|
2
|
+
/**
|
|
3
|
+
* Creates standardized AgentFunctionInfo metadata for agents
|
|
4
|
+
*
|
|
5
|
+
* @param name - Agent name (e.g., "ttsOpenaiAgent")
|
|
6
|
+
* @param agent - Agent function implementation
|
|
7
|
+
* @param category - Agent categories (e.g., ["tts"], ["image"])
|
|
8
|
+
* @param description - Human-readable description
|
|
9
|
+
* @param environmentVariables - Required environment variables (e.g., ["OPENAI_API_KEY"])
|
|
10
|
+
* @returns AgentFunctionInfo with standardized metadata
|
|
11
|
+
*/
|
|
12
|
+
export const createAgentInfo = (name, agent, category, description, environmentVariables = []) => ({
|
|
13
|
+
name,
|
|
14
|
+
agent,
|
|
15
|
+
mock: agent,
|
|
16
|
+
samples: [],
|
|
17
|
+
description,
|
|
18
|
+
category,
|
|
19
|
+
author: PROJECT_METADATA.author,
|
|
20
|
+
repository: PROJECT_METADATA.repository,
|
|
21
|
+
license: PROJECT_METADATA.license,
|
|
22
|
+
environmentVariables,
|
|
23
|
+
});
|
package/lib/utils/context.d.ts
CHANGED
|
@@ -255,13 +255,13 @@ export declare const createStudioData: (_mulmoScript: MulmoScript, fileName: str
|
|
|
255
255
|
movieParams?: {
|
|
256
256
|
provider?: string | undefined;
|
|
257
257
|
model?: string | undefined;
|
|
258
|
+
fillOption?: {
|
|
259
|
+
style: "aspectFit" | "aspectFill";
|
|
260
|
+
} | undefined;
|
|
258
261
|
transition?: {
|
|
259
262
|
type: "fade" | "slideout_left";
|
|
260
263
|
duration: number;
|
|
261
264
|
} | undefined;
|
|
262
|
-
fillOption?: {
|
|
263
|
-
style: "aspectFit" | "aspectFill";
|
|
264
|
-
} | undefined;
|
|
265
265
|
} | undefined;
|
|
266
266
|
lipSyncParams?: {
|
|
267
267
|
provider?: string | undefined;
|
|
@@ -570,13 +570,13 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
|
|
|
570
570
|
movieParams?: {
|
|
571
571
|
provider?: string | undefined;
|
|
572
572
|
model?: string | undefined;
|
|
573
|
+
fillOption?: {
|
|
574
|
+
style: "aspectFit" | "aspectFill";
|
|
575
|
+
} | undefined;
|
|
573
576
|
transition?: {
|
|
574
577
|
type: "fade" | "slideout_left";
|
|
575
578
|
duration: number;
|
|
576
579
|
} | undefined;
|
|
577
|
-
fillOption?: {
|
|
578
|
-
style: "aspectFit" | "aspectFill";
|
|
579
|
-
} | undefined;
|
|
580
580
|
} | undefined;
|
|
581
581
|
lipSyncParams?: {
|
|
582
582
|
provider?: string | undefined;
|
|
@@ -719,13 +719,13 @@ export declare const initializeContextFromFiles: (files: FileObject, raiseError:
|
|
|
719
719
|
movieParams?: {
|
|
720
720
|
provider?: string | undefined;
|
|
721
721
|
model?: string | undefined;
|
|
722
|
+
fillOption?: {
|
|
723
|
+
style: "aspectFit" | "aspectFill";
|
|
724
|
+
} | undefined;
|
|
722
725
|
transition?: {
|
|
723
726
|
type: "fade" | "slideout_left";
|
|
724
727
|
duration: number;
|
|
725
728
|
} | undefined;
|
|
726
|
-
fillOption?: {
|
|
727
|
-
style: "aspectFit" | "aspectFill";
|
|
728
|
-
} | undefined;
|
|
729
729
|
} | undefined;
|
|
730
730
|
lipSyncParams?: {
|
|
731
731
|
provider?: string | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mulmocast",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.node.js",
|
|
@@ -84,13 +84,13 @@
|
|
|
84
84
|
"@graphai/stream_agent_filter": "^2.0.2",
|
|
85
85
|
"@graphai/vanilla": "^2.0.12",
|
|
86
86
|
"@graphai/vanilla_node_agents": "^2.0.4",
|
|
87
|
-
"@inquirer/input": "^4.
|
|
88
|
-
"@inquirer/select": "^4.4.
|
|
87
|
+
"@inquirer/input": "^4.3.0",
|
|
88
|
+
"@inquirer/select": "^4.4.1",
|
|
89
89
|
"@modelcontextprotocol/sdk": "^1.21.1",
|
|
90
90
|
"@mozilla/readability": "^0.6.0",
|
|
91
91
|
"@tavily/core": "^0.5.11",
|
|
92
92
|
"archiver": "^7.0.1",
|
|
93
|
-
"clipboardy": "^
|
|
93
|
+
"clipboardy": "^5.0.0",
|
|
94
94
|
"dotenv": "^17.2.3",
|
|
95
95
|
"fluent-ffmpeg": "^2.1.3",
|
|
96
96
|
"graphai": "^2.0.16",
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": {
|
|
3
|
+
"version": "1.1"
|
|
4
|
+
},
|
|
5
|
+
"lang": "en",
|
|
6
|
+
"movieParams": {
|
|
7
|
+
"provider": "google"
|
|
8
|
+
},
|
|
9
|
+
"canvasSize": {
|
|
10
|
+
"width": 1280,
|
|
11
|
+
"height": 720
|
|
12
|
+
},
|
|
13
|
+
"beats": [
|
|
14
|
+
{
|
|
15
|
+
"text": "Hello, I'm macoro",
|
|
16
|
+
"image": {
|
|
17
|
+
"type": "image",
|
|
18
|
+
"source": {
|
|
19
|
+
"kind": "url",
|
|
20
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/macoro.png"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"moviePrompt": "Jump and bounce",
|
|
24
|
+
"duration": 5
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": {
|
|
3
|
+
"version": "1.1"
|
|
4
|
+
},
|
|
5
|
+
"lang": "en",
|
|
6
|
+
"movieParams": {
|
|
7
|
+
"provider": "google"
|
|
8
|
+
},
|
|
9
|
+
"canvasSize": {
|
|
10
|
+
"width": 720,
|
|
11
|
+
"height": 1280
|
|
12
|
+
},
|
|
13
|
+
"imageParams": {
|
|
14
|
+
"provider": "openai",
|
|
15
|
+
"model": "dall-e-3",
|
|
16
|
+
"style": "Photo realistic, cinematic style.",
|
|
17
|
+
"images": {
|
|
18
|
+
"optimus": {
|
|
19
|
+
"type": "image",
|
|
20
|
+
"source": {
|
|
21
|
+
"kind": "url",
|
|
22
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/optimus.png"
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"beats": [
|
|
28
|
+
{
|
|
29
|
+
"text": "Image with both image and movie prompt",
|
|
30
|
+
"imagePrompt": "巨大なロケット「Starship」が発射台から打ち上がろうとしている様子。空には星と火星が浮かんでいる。",
|
|
31
|
+
"moviePrompt": "Startship lifts off.",
|
|
32
|
+
"duration": 5
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"text": "Image with only movie prompt",
|
|
36
|
+
"moviePrompt": "Startship lifts off.",
|
|
37
|
+
"duration": 5
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": {
|
|
3
|
+
"version": "1.1"
|
|
4
|
+
},
|
|
5
|
+
"lang": "en",
|
|
6
|
+
"movieParams": {
|
|
7
|
+
"provider": "google"
|
|
8
|
+
},
|
|
9
|
+
"lipSyncParams": {
|
|
10
|
+
"provider": "replicate",
|
|
11
|
+
"model": "bytedance/latentsync"
|
|
12
|
+
},
|
|
13
|
+
"canvasSize": {
|
|
14
|
+
"width": 1280,
|
|
15
|
+
"height": 720
|
|
16
|
+
},
|
|
17
|
+
"beats": [
|
|
18
|
+
{
|
|
19
|
+
"text": "Hello, I'm macoro",
|
|
20
|
+
"image": {
|
|
21
|
+
"type": "image",
|
|
22
|
+
"source": {
|
|
23
|
+
"kind": "url",
|
|
24
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/macoro.png"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"moviePrompt": "Jump and bounce",
|
|
28
|
+
"duration": 5
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"text": "こんにちは、マコロです",
|
|
32
|
+
"image": {
|
|
33
|
+
"type": "image",
|
|
34
|
+
"source": {
|
|
35
|
+
"kind": "url",
|
|
36
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/macoro.png"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"enableLipSync": true,
|
|
40
|
+
"duration": 5
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"text": "こんにちは、マコロです",
|
|
44
|
+
"image": {
|
|
45
|
+
"type": "image",
|
|
46
|
+
"source": {
|
|
47
|
+
"kind": "url",
|
|
48
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/macoro.png"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"moviePrompt": "Jump and bounce",
|
|
52
|
+
"enableLipSync": true,
|
|
53
|
+
"duration": 5
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$mulmocast": {
|
|
3
|
+
"version": "1.1",
|
|
4
|
+
"credit": "closing"
|
|
5
|
+
},
|
|
6
|
+
"canvasSize": {
|
|
7
|
+
"width": 1536,
|
|
8
|
+
"height": 1024
|
|
9
|
+
},
|
|
10
|
+
"speechParams": {
|
|
11
|
+
"speakers": {
|
|
12
|
+
"Presenter": {
|
|
13
|
+
"displayName": {
|
|
14
|
+
"en": "Presenter"
|
|
15
|
+
},
|
|
16
|
+
"voiceId": "shimmer"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"imageParams": {
|
|
21
|
+
"provider": "openai",
|
|
22
|
+
"style": "<style>Vibrant 3D animation style inspired by K-pop aesthetics, with glossy, stylized characters. The overall visual style combines elements of modern animation, game cinematics, and fashion-forward character design, with sleek outlines, glowing effects, and a polished, cinematic finish.</style>",
|
|
23
|
+
"images": {
|
|
24
|
+
"min": {
|
|
25
|
+
"type": "image",
|
|
26
|
+
"source": {
|
|
27
|
+
"kind": "url",
|
|
28
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/characters/min_anime.png"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"movieParams": {
|
|
34
|
+
"provider": "replicate"
|
|
35
|
+
},
|
|
36
|
+
"soundEffectParams": {
|
|
37
|
+
"provider": "replicate"
|
|
38
|
+
},
|
|
39
|
+
"captionParams": {
|
|
40
|
+
"lang": "en",
|
|
41
|
+
"styles": ["font-size: 64px", "width: 90%", "padding-left: 5%", "padding-right: 5%"]
|
|
42
|
+
},
|
|
43
|
+
"audioParams": {
|
|
44
|
+
"padding": 0,
|
|
45
|
+
"introPadding": 0,
|
|
46
|
+
"closingPadding": 0,
|
|
47
|
+
"outroPadding": 0,
|
|
48
|
+
"bgm": {
|
|
49
|
+
"kind": "url",
|
|
50
|
+
"url": "https://raw.githubusercontent.com/receptron/mulmocast-media/refs/heads/main/music/finetuning_with_you.mp3"
|
|
51
|
+
},
|
|
52
|
+
"bgmVolume": 1,
|
|
53
|
+
"audioVolume": 0,
|
|
54
|
+
"suppressSpeech": true
|
|
55
|
+
},
|
|
56
|
+
"title": "Music Video",
|
|
57
|
+
"lang": "en",
|
|
58
|
+
"beats": [
|
|
59
|
+
{
|
|
60
|
+
"text": "Finetuning with you",
|
|
61
|
+
"moviePrompt": "The singer preparing to sing a song.",
|
|
62
|
+
"playGenMovieToEnd": true
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|