mulmocast 2.1.22 → 2.1.24

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.
@@ -59,12 +59,20 @@ export const imageGenAIAgent = async ({ namedInputs, params, config, }) => {
59
59
  const { prompt, referenceImages } = namedInputs;
60
60
  const model = params.model ?? provider2ImageAgent["google"].defaultModel;
61
61
  const apiKey = config?.apiKey;
62
- if (!apiKey) {
63
- throw new Error("Google GenAI API key is required (GEMINI_API_KEY)", {
64
- cause: apiKeyMissingError("imageGenAIAgent", imageAction, "GEMINI_API_KEY"),
65
- });
66
- }
67
- const ai = new GoogleGenAI({ apiKey });
62
+ const ai = params.vertexai_project
63
+ ? new GoogleGenAI({
64
+ vertexai: true,
65
+ project: params.vertexai_project,
66
+ location: params.vertexai_location ?? "us-central1",
67
+ })
68
+ : (() => {
69
+ if (!apiKey) {
70
+ throw new Error("Google GenAI API key is required (GEMINI_API_KEY)", {
71
+ cause: apiKeyMissingError("imageGenAIAgent", imageAction, "GEMINI_API_KEY"),
72
+ });
73
+ }
74
+ return new GoogleGenAI({ apiKey });
75
+ })();
68
76
  if (model === "gemini-2.5-flash-image" || model === "gemini-3-pro-image-preview") {
69
77
  const contentParams = (() => {
70
78
  const contents = getGeminiContents(prompt, referenceImages);
@@ -1,21 +1,22 @@
1
1
  import fs from "fs";
2
2
  import path from "path";
3
3
  import { GraphAILogger } from "graphai";
4
- import OpenAI, { toFile, AuthenticationError, RateLimitError, APIError } from "openai";
4
+ import { toFile, AuthenticationError, RateLimitError, APIError } from "openai";
5
+ import { createOpenAIClient } from "../utils/openai_client.js";
5
6
  import { provider2ImageAgent, gptImages } from "../types/provider2agent.js";
6
7
  import { apiKeyMissingError, agentGenerationError, openAIAgentGenerationError, agentIncorrectAPIKeyError, agentAPIRateLimitError, agentInvalidResponseError, imageAction, imageFileTarget, } from "../utils/error_cause.js";
7
8
  // https://platform.openai.com/docs/guides/image-generation
8
9
  export const imageOpenaiAgent = async ({ namedInputs, params, config, }) => {
9
10
  const { prompt, referenceImages } = namedInputs;
10
11
  const { moderation, canvasSize, quality } = params;
11
- const { apiKey, baseURL } = { ...config };
12
+ const { apiKey, baseURL, apiVersion } = { ...config };
12
13
  if (!apiKey) {
13
14
  throw new Error("OpenAI API key is required (OPENAI_API_KEY)", {
14
15
  cause: apiKeyMissingError("imageOpenaiAgent", imageAction, "OPENAI_API_KEY"),
15
16
  });
16
17
  }
17
18
  const model = params.model ?? provider2ImageAgent["openai"].defaultModel;
18
- const openai = new OpenAI({ apiKey, baseURL });
19
+ const openai = createOpenAIClient({ apiKey, baseURL, apiVersion });
19
20
  const size = (() => {
20
21
  if (gptImages.includes(model)) {
21
22
  if (canvasSize.width > canvasSize.height) {
@@ -1,4 +1,4 @@
1
- import { readFileSync } from "fs";
1
+ import { readFileSync, writeFileSync } from "fs";
2
2
  import { GraphAILogger, sleep } from "graphai";
3
3
  import { GoogleGenAI, PersonGeneration } from "@google/genai";
4
4
  import { apiKeyMissingError, agentGenerationError, agentInvalidResponseError, imageAction, movieFileTarget, videoDurationTarget, hasCause, } from "../utils/error_cause.js";
@@ -35,12 +35,19 @@ const loadImageAsBase64 = (imagePath) => {
35
35
  mimeType: "image/png",
36
36
  };
37
37
  };
38
- const downloadVideo = async (ai, video, movieFile) => {
39
- await ai.files.download({
40
- file: video,
41
- downloadPath: movieFile,
42
- });
43
- await sleep(5000); // HACK: Without this, the file is not ready yet.
38
+ const downloadVideo = async (ai, video, movieFile, isVertexAI) => {
39
+ if (isVertexAI) {
40
+ // Vertex AI returns videoBytes directly
41
+ writeFileSync(movieFile, Buffer.from(video.videoBytes, "base64"));
42
+ }
43
+ else {
44
+ // Gemini API requires download via uri
45
+ await ai.files.download({
46
+ file: video,
47
+ downloadPath: movieFile,
48
+ });
49
+ await sleep(5000); // HACK: Without this, the file is not ready yet.
50
+ }
44
51
  return { saved: movieFile };
45
52
  };
46
53
  const createVeo31Payload = (model, prompt, aspectRatio, source) => ({
@@ -53,7 +60,7 @@ const createVeo31Payload = (model, prompt, aspectRatio, source) => ({
53
60
  },
54
61
  ...source,
55
62
  });
56
- const generateExtendedVideo = async (ai, model, prompt, aspectRatio, imagePath, requestedDuration, movieFile) => {
63
+ const generateExtendedVideo = async (ai, model, prompt, aspectRatio, imagePath, requestedDuration, movieFile, isVertexAI) => {
57
64
  const initialDuration = 8;
58
65
  const maxExtensionDuration = 8;
59
66
  const extensionsNeeded = Math.ceil((requestedDuration - initialDuration) / maxExtensionDuration);
@@ -85,9 +92,9 @@ const generateExtendedVideo = async (ai, model, prompt, aspectRatio, imagePath,
85
92
  cause: agentInvalidResponseError("movieGenAIAgent", imageAction, movieFileTarget),
86
93
  });
87
94
  }
88
- return downloadVideo(ai, result.video, movieFile);
95
+ return downloadVideo(ai, result.video, movieFile, isVertexAI);
89
96
  };
90
- const generateStandardVideo = async (ai, model, prompt, aspectRatio, imagePath, duration, movieFile) => {
97
+ const generateStandardVideo = async (ai, model, prompt, aspectRatio, imagePath, duration, movieFile, isVertexAI) => {
91
98
  const isVeo3 = model === "veo-3.0-generate-001" || model === "veo-3.1-generate-preview";
92
99
  const payload = {
93
100
  model,
@@ -102,18 +109,13 @@ const generateStandardVideo = async (ai, model, prompt, aspectRatio, imagePath,
102
109
  const operation = await ai.models.generateVideos(payload);
103
110
  const response = await pollUntilDone(ai, operation);
104
111
  const video = getVideoFromResponse(response);
105
- return downloadVideo(ai, video, movieFile);
112
+ return downloadVideo(ai, video, movieFile, isVertexAI);
106
113
  };
107
114
  export const movieGenAIAgent = async ({ namedInputs, params, config, }) => {
108
115
  const { prompt, imagePath, movieFile } = namedInputs;
109
116
  const aspectRatio = getAspectRatio(params.canvasSize, ASPECT_RATIOS);
110
117
  const model = params.model ?? provider2MovieAgent.google.defaultModel;
111
118
  const apiKey = config?.apiKey;
112
- if (!apiKey) {
113
- throw new Error("Google GenAI API key is required (GEMINI_API_KEY)", {
114
- cause: apiKeyMissingError("movieGenAIAgent", imageAction, "GEMINI_API_KEY"),
115
- });
116
- }
117
119
  try {
118
120
  const requestedDuration = params.duration ?? 8;
119
121
  const duration = getModelDuration("google", model, requestedDuration);
@@ -122,13 +124,27 @@ export const movieGenAIAgent = async ({ namedInputs, params, config, }) => {
122
124
  cause: agentGenerationError("movieGenAIAgent", imageAction, videoDurationTarget),
123
125
  });
124
126
  }
125
- const ai = new GoogleGenAI({ apiKey });
127
+ const isVertexAI = !!params.vertexai_project;
128
+ const ai = isVertexAI
129
+ ? new GoogleGenAI({
130
+ vertexai: true,
131
+ project: params.vertexai_project,
132
+ location: params.vertexai_location ?? "us-central1",
133
+ })
134
+ : (() => {
135
+ if (!apiKey) {
136
+ throw new Error("Google GenAI API key is required (GEMINI_API_KEY)", {
137
+ cause: apiKeyMissingError("movieGenAIAgent", imageAction, "GEMINI_API_KEY"),
138
+ });
139
+ }
140
+ return new GoogleGenAI({ apiKey });
141
+ })();
126
142
  // Veo 3.1: Video extension mode for videos longer than 8s
127
143
  if (model === "veo-3.1-generate-preview" && requestedDuration > 8 && params.canvasSize) {
128
- return generateExtendedVideo(ai, model, prompt, aspectRatio, imagePath, requestedDuration, movieFile);
144
+ return generateExtendedVideo(ai, model, prompt, aspectRatio, imagePath, requestedDuration, movieFile, isVertexAI);
129
145
  }
130
146
  // Standard mode
131
- return generateStandardVideo(ai, model, prompt, aspectRatio, imagePath, duration, movieFile);
147
+ return generateStandardVideo(ai, model, prompt, aspectRatio, imagePath, duration, movieFile, isVertexAI);
132
148
  }
133
149
  catch (error) {
134
150
  GraphAILogger.info("Failed to generate movie:", error.message);
@@ -1,17 +1,18 @@
1
1
  import { GraphAILogger } from "graphai";
2
- import OpenAI, { AuthenticationError, RateLimitError } from "openai";
2
+ import { AuthenticationError, RateLimitError } from "openai";
3
3
  import { provider2TTSAgent } from "../types/provider2agent.js";
4
+ import { createOpenAIClient } from "../utils/openai_client.js";
4
5
  import { apiKeyMissingError, agentIncorrectAPIKeyError, agentAPIRateLimitError, agentGenerationError, audioAction, audioFileTarget, } from "../utils/error_cause.js";
5
6
  export const ttsOpenaiAgent = async ({ namedInputs, params, config, }) => {
6
7
  const { text } = namedInputs;
7
8
  const { model, voice, suppressError, instructions, speed } = params;
8
- const { apiKey, baseURL } = config ?? {};
9
+ const { apiKey, baseURL, apiVersion } = config ?? {};
9
10
  if (!apiKey) {
10
11
  throw new Error("OpenAI API key is required (OPENAI_API_KEY)", {
11
12
  cause: apiKeyMissingError("ttsOpenaiAgent", audioAction, "OPENAI_API_KEY"),
12
13
  });
13
14
  }
14
- const openai = new OpenAI({ apiKey, baseURL });
15
+ const openai = createOpenAIClient({ apiKey, baseURL, apiVersion });
15
16
  try {
16
17
  const tts_options = {
17
18
  model: model ?? provider2TTSAgent.openai.defaultModel,
@@ -171,6 +171,8 @@ export declare const MulmoPresentationStyleMethods: {
171
171
  type: "custom";
172
172
  filter: string;
173
173
  })[] | undefined;
174
+ vertexai_project?: string | undefined;
175
+ vertexai_location?: string | undefined;
174
176
  speed?: number | undefined;
175
177
  };
176
178
  keyName: string;
@@ -39,6 +39,8 @@ export type ImageAgentParams = {
39
39
  width: number;
40
40
  height: number;
41
41
  };
42
+ vertexai_project?: string;
43
+ vertexai_location?: string;
42
44
  };
43
45
  export type OpenAIImageAgentParams = ImageAgentParams & {
44
46
  moderation: OpenAIImageModeration | null | undefined;
@@ -58,6 +60,7 @@ export type ReplicateImageAgentParams = {
58
60
  export type OpenAIImageAgentConfig = {
59
61
  baseURL?: string;
60
62
  apiKey?: string;
63
+ apiVersion?: string;
61
64
  };
62
65
  export type GoogleImageAgentConfig = {
63
66
  projectId?: string;
@@ -73,6 +76,8 @@ export type MovieAgentInputs = AgentPromptInputs & {
73
76
  };
74
77
  export type GoogleMovieAgentParams = ImageAgentParams & {
75
78
  duration?: number;
79
+ vertexai_project?: string;
80
+ vertexai_location?: string;
76
81
  };
77
82
  export type ReplicateMovieAgentParams = {
78
83
  model: `${string}/${string}` | undefined;
@@ -139,6 +139,7 @@ export declare const provider2LLMAgent: {
139
139
  readonly defaultModel: "gpt-5";
140
140
  readonly keyName: "OPENAI_API_KEY";
141
141
  readonly baseURLKeyName: "OPENAI_BASE_URL";
142
+ readonly apiVersionKeyName: "OPENAI_API_VERSION";
142
143
  readonly max_tokens: 8192;
143
144
  readonly models: readonly ["gpt-5", "gpt-5-nano", "gpt-5-mini", "gpt-4.1", "gpt-4.1-mini", "gpt-4.1-nano", "o3", "o3-mini", "o3-pro", "o1", "o1-pro", "gpt-4o", "gpt-4o-mini"];
144
145
  };
@@ -154,7 +155,7 @@ export declare const provider2LLMAgent: {
154
155
  readonly agentName: "geminiAgent";
155
156
  readonly defaultModel: "gemini-2.5-flash";
156
157
  readonly max_tokens: 8192;
157
- readonly models: readonly ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"];
158
+ readonly models: readonly ["gemini-3-pro-preview", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"];
158
159
  readonly keyName: "GEMINI_API_KEY";
159
160
  };
160
161
  readonly groq: {
@@ -56,7 +56,13 @@ export const provider2ImageAgent = {
56
56
  google: {
57
57
  agentName: "imageGenAIAgent",
58
58
  defaultModel: "gemini-2.5-flash-image",
59
- models: ["imagen-4.0-generate-preview-06-06", "imagen-4.0-ultra-generate-preview-06-06", "gemini-2.5-flash-image", "gemini-3-pro-image-preview"],
59
+ models: [
60
+ "imagen-4.0-generate-001",
61
+ "imagen-4.0-ultra-generate-001",
62
+ "imagen-4.0-fast-generate-001",
63
+ "gemini-2.5-flash-image",
64
+ "gemini-3-pro-image-preview",
65
+ ],
60
66
  keyName: "GEMINI_API_KEY",
61
67
  },
62
68
  replicate: {
@@ -252,6 +258,7 @@ export const provider2LLMAgent = {
252
258
  defaultModel: "gpt-5",
253
259
  keyName: "OPENAI_API_KEY",
254
260
  baseURLKeyName: "OPENAI_BASE_URL",
261
+ apiVersionKeyName: "OPENAI_API_VERSION",
255
262
  max_tokens: 8192,
256
263
  models: [
257
264
  "gpt-5",
@@ -282,7 +289,7 @@ export const provider2LLMAgent = {
282
289
  agentName: "geminiAgent",
283
290
  defaultModel: "gemini-2.5-flash",
284
291
  max_tokens: 8192,
285
- models: ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"],
292
+ models: ["gemini-3-pro-preview", "gemini-3-flash-preview", "gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"],
286
293
  keyName: "GEMINI_API_KEY",
287
294
  },
288
295
  groq: {
@@ -43,6 +43,8 @@ export declare const speakerDataSchema: z.ZodObject<{
43
43
  [x: string]: string;
44
44
  }>>>;
45
45
  model: z.ZodOptional<z.ZodString>;
46
+ baseURL: z.ZodOptional<z.ZodString>;
47
+ apiVersion: z.ZodOptional<z.ZodString>;
46
48
  }, z.core.$strict>;
47
49
  export declare const speakerSchema: z.ZodObject<{
48
50
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -59,6 +61,8 @@ export declare const speakerSchema: z.ZodObject<{
59
61
  [x: string]: string;
60
62
  }>>>;
61
63
  model: z.ZodOptional<z.ZodString>;
64
+ baseURL: z.ZodOptional<z.ZodString>;
65
+ apiVersion: z.ZodOptional<z.ZodString>;
62
66
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
63
67
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
64
68
  voiceId: z.ZodString;
@@ -74,6 +78,8 @@ export declare const speakerSchema: z.ZodObject<{
74
78
  [x: string]: string;
75
79
  }>>>;
76
80
  model: z.ZodOptional<z.ZodString>;
81
+ baseURL: z.ZodOptional<z.ZodString>;
82
+ apiVersion: z.ZodOptional<z.ZodString>;
77
83
  }, z.core.$strict>>>;
78
84
  }, z.core.$strict>;
79
85
  export declare const speakerDictionarySchema: z.ZodRecord<z.ZodString, z.ZodObject<{
@@ -91,6 +97,8 @@ export declare const speakerDictionarySchema: z.ZodRecord<z.ZodString, z.ZodObje
91
97
  [x: string]: string;
92
98
  }>>>;
93
99
  model: z.ZodOptional<z.ZodString>;
100
+ baseURL: z.ZodOptional<z.ZodString>;
101
+ apiVersion: z.ZodOptional<z.ZodString>;
94
102
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
95
103
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
96
104
  voiceId: z.ZodString;
@@ -106,6 +114,8 @@ export declare const speakerDictionarySchema: z.ZodRecord<z.ZodString, z.ZodObje
106
114
  [x: string]: string;
107
115
  }>>>;
108
116
  model: z.ZodOptional<z.ZodString>;
117
+ baseURL: z.ZodOptional<z.ZodString>;
118
+ apiVersion: z.ZodOptional<z.ZodString>;
109
119
  }, z.core.$strict>>>;
110
120
  }, z.core.$strict>>;
111
121
  export declare const mulmoSpeechParamsSchema: z.ZodDefault<z.ZodObject<{
@@ -124,6 +134,8 @@ export declare const mulmoSpeechParamsSchema: z.ZodDefault<z.ZodObject<{
124
134
  [x: string]: string;
125
135
  }>>>;
126
136
  model: z.ZodOptional<z.ZodString>;
137
+ baseURL: z.ZodOptional<z.ZodString>;
138
+ apiVersion: z.ZodOptional<z.ZodString>;
127
139
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
128
140
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
129
141
  voiceId: z.ZodString;
@@ -139,6 +151,8 @@ export declare const mulmoSpeechParamsSchema: z.ZodDefault<z.ZodObject<{
139
151
  [x: string]: string;
140
152
  }>>>;
141
153
  model: z.ZodOptional<z.ZodString>;
154
+ baseURL: z.ZodOptional<z.ZodString>;
155
+ apiVersion: z.ZodOptional<z.ZodString>;
142
156
  }, z.core.$strict>>>;
143
157
  }, z.core.$strict>>;
144
158
  }, z.core.$strip>>;
@@ -437,6 +451,10 @@ export declare const mulmoBeatImageParamsSchema: z.ZodObject<{
437
451
  quality: z.ZodOptional<z.ZodString>;
438
452
  style: z.ZodOptional<z.ZodString>;
439
453
  moderation: z.ZodOptional<z.ZodString>;
454
+ baseURL: z.ZodOptional<z.ZodString>;
455
+ apiVersion: z.ZodOptional<z.ZodString>;
456
+ vertexai_project: z.ZodOptional<z.ZodString>;
457
+ vertexai_location: z.ZodOptional<z.ZodString>;
440
458
  }, z.core.$strict>;
441
459
  export declare const mulmoImageParamsSchema: z.ZodObject<{
442
460
  provider: z.ZodOptional<z.ZodEnum<{
@@ -446,6 +464,10 @@ export declare const mulmoImageParamsSchema: z.ZodObject<{
446
464
  quality: z.ZodOptional<z.ZodString>;
447
465
  style: z.ZodOptional<z.ZodString>;
448
466
  moderation: z.ZodOptional<z.ZodString>;
467
+ baseURL: z.ZodOptional<z.ZodString>;
468
+ apiVersion: z.ZodOptional<z.ZodString>;
469
+ vertexai_project: z.ZodOptional<z.ZodString>;
470
+ vertexai_location: z.ZodOptional<z.ZodString>;
449
471
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
450
472
  type: z.ZodLiteral<"image">;
451
473
  source: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -763,6 +785,8 @@ export declare const mulmoMovieParamsSchema: z.ZodObject<{
763
785
  type: z.ZodLiteral<"custom">;
764
786
  filter: z.ZodString;
765
787
  }, z.core.$strip>]>>>;
788
+ vertexai_project: z.ZodOptional<z.ZodString>;
789
+ vertexai_location: z.ZodOptional<z.ZodString>;
766
790
  }, z.core.$strip>;
767
791
  export declare const mulmoBeatSchema: z.ZodObject<{
768
792
  speaker: z.ZodOptional<z.ZodString>;
@@ -891,6 +915,10 @@ export declare const mulmoBeatSchema: z.ZodObject<{
891
915
  quality: z.ZodOptional<z.ZodString>;
892
916
  style: z.ZodOptional<z.ZodString>;
893
917
  moderation: z.ZodOptional<z.ZodString>;
918
+ baseURL: z.ZodOptional<z.ZodString>;
919
+ apiVersion: z.ZodOptional<z.ZodString>;
920
+ vertexai_project: z.ZodOptional<z.ZodString>;
921
+ vertexai_location: z.ZodOptional<z.ZodString>;
894
922
  }, z.core.$strict>>;
895
923
  audioParams: z.ZodOptional<z.ZodObject<{
896
924
  padding: z.ZodOptional<z.ZodNumber>;
@@ -1123,6 +1151,8 @@ export declare const mulmoBeatSchema: z.ZodObject<{
1123
1151
  type: z.ZodLiteral<"custom">;
1124
1152
  filter: z.ZodString;
1125
1153
  }, z.core.$strip>]>>>;
1154
+ vertexai_project: z.ZodOptional<z.ZodString>;
1155
+ vertexai_location: z.ZodOptional<z.ZodString>;
1126
1156
  speed: z.ZodOptional<z.ZodNumber>;
1127
1157
  }, z.core.$strip>>;
1128
1158
  soundEffectParams: z.ZodOptional<z.ZodObject<{
@@ -1223,6 +1253,8 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
1223
1253
  [x: string]: string;
1224
1254
  }>>>;
1225
1255
  model: z.ZodOptional<z.ZodString>;
1256
+ baseURL: z.ZodOptional<z.ZodString>;
1257
+ apiVersion: z.ZodOptional<z.ZodString>;
1226
1258
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1227
1259
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1228
1260
  voiceId: z.ZodString;
@@ -1238,6 +1270,8 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
1238
1270
  [x: string]: string;
1239
1271
  }>>>;
1240
1272
  model: z.ZodOptional<z.ZodString>;
1273
+ baseURL: z.ZodOptional<z.ZodString>;
1274
+ apiVersion: z.ZodOptional<z.ZodString>;
1241
1275
  }, z.core.$strict>>>;
1242
1276
  }, z.core.$strict>>;
1243
1277
  }, z.core.$strip>>;
@@ -1249,6 +1283,10 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
1249
1283
  quality: z.ZodOptional<z.ZodString>;
1250
1284
  style: z.ZodOptional<z.ZodString>;
1251
1285
  moderation: z.ZodOptional<z.ZodString>;
1286
+ baseURL: z.ZodOptional<z.ZodString>;
1287
+ apiVersion: z.ZodOptional<z.ZodString>;
1288
+ vertexai_project: z.ZodOptional<z.ZodString>;
1289
+ vertexai_location: z.ZodOptional<z.ZodString>;
1252
1290
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
1253
1291
  type: z.ZodLiteral<"image">;
1254
1292
  source: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -1493,6 +1531,8 @@ export declare const mulmoPresentationStyleSchema: z.ZodObject<{
1493
1531
  type: z.ZodLiteral<"custom">;
1494
1532
  filter: z.ZodString;
1495
1533
  }, z.core.$strip>]>>>;
1534
+ vertexai_project: z.ZodOptional<z.ZodString>;
1535
+ vertexai_location: z.ZodOptional<z.ZodString>;
1496
1536
  }, z.core.$strip>>>;
1497
1537
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1498
1538
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
@@ -1584,6 +1624,8 @@ export declare const mulmoScriptSchema: z.ZodObject<{
1584
1624
  [x: string]: string;
1585
1625
  }>>>;
1586
1626
  model: z.ZodOptional<z.ZodString>;
1627
+ baseURL: z.ZodOptional<z.ZodString>;
1628
+ apiVersion: z.ZodOptional<z.ZodString>;
1587
1629
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
1588
1630
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
1589
1631
  voiceId: z.ZodString;
@@ -1599,6 +1641,8 @@ export declare const mulmoScriptSchema: z.ZodObject<{
1599
1641
  [x: string]: string;
1600
1642
  }>>>;
1601
1643
  model: z.ZodOptional<z.ZodString>;
1644
+ baseURL: z.ZodOptional<z.ZodString>;
1645
+ apiVersion: z.ZodOptional<z.ZodString>;
1602
1646
  }, z.core.$strict>>>;
1603
1647
  }, z.core.$strict>>;
1604
1648
  }, z.core.$strip>>;
@@ -1610,6 +1654,10 @@ export declare const mulmoScriptSchema: z.ZodObject<{
1610
1654
  quality: z.ZodOptional<z.ZodString>;
1611
1655
  style: z.ZodOptional<z.ZodString>;
1612
1656
  moderation: z.ZodOptional<z.ZodString>;
1657
+ baseURL: z.ZodOptional<z.ZodString>;
1658
+ apiVersion: z.ZodOptional<z.ZodString>;
1659
+ vertexai_project: z.ZodOptional<z.ZodString>;
1660
+ vertexai_location: z.ZodOptional<z.ZodString>;
1613
1661
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
1614
1662
  type: z.ZodLiteral<"image">;
1615
1663
  source: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -1854,6 +1902,8 @@ export declare const mulmoScriptSchema: z.ZodObject<{
1854
1902
  type: z.ZodLiteral<"custom">;
1855
1903
  filter: z.ZodString;
1856
1904
  }, z.core.$strip>]>>>;
1905
+ vertexai_project: z.ZodOptional<z.ZodString>;
1906
+ vertexai_location: z.ZodOptional<z.ZodString>;
1857
1907
  }, z.core.$strip>>>;
1858
1908
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
1859
1909
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
@@ -2049,6 +2099,10 @@ export declare const mulmoScriptSchema: z.ZodObject<{
2049
2099
  quality: z.ZodOptional<z.ZodString>;
2050
2100
  style: z.ZodOptional<z.ZodString>;
2051
2101
  moderation: z.ZodOptional<z.ZodString>;
2102
+ baseURL: z.ZodOptional<z.ZodString>;
2103
+ apiVersion: z.ZodOptional<z.ZodString>;
2104
+ vertexai_project: z.ZodOptional<z.ZodString>;
2105
+ vertexai_location: z.ZodOptional<z.ZodString>;
2052
2106
  }, z.core.$strict>>;
2053
2107
  audioParams: z.ZodOptional<z.ZodObject<{
2054
2108
  padding: z.ZodOptional<z.ZodNumber>;
@@ -2281,6 +2335,8 @@ export declare const mulmoScriptSchema: z.ZodObject<{
2281
2335
  type: z.ZodLiteral<"custom">;
2282
2336
  filter: z.ZodString;
2283
2337
  }, z.core.$strip>]>>>;
2338
+ vertexai_project: z.ZodOptional<z.ZodString>;
2339
+ vertexai_location: z.ZodOptional<z.ZodString>;
2284
2340
  speed: z.ZodOptional<z.ZodNumber>;
2285
2341
  }, z.core.$strip>>;
2286
2342
  soundEffectParams: z.ZodOptional<z.ZodObject<{
@@ -2456,6 +2512,8 @@ export declare const mulmoStudioSchema: z.ZodObject<{
2456
2512
  [x: string]: string;
2457
2513
  }>>>;
2458
2514
  model: z.ZodOptional<z.ZodString>;
2515
+ baseURL: z.ZodOptional<z.ZodString>;
2516
+ apiVersion: z.ZodOptional<z.ZodString>;
2459
2517
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
2460
2518
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
2461
2519
  voiceId: z.ZodString;
@@ -2471,6 +2529,8 @@ export declare const mulmoStudioSchema: z.ZodObject<{
2471
2529
  [x: string]: string;
2472
2530
  }>>>;
2473
2531
  model: z.ZodOptional<z.ZodString>;
2532
+ baseURL: z.ZodOptional<z.ZodString>;
2533
+ apiVersion: z.ZodOptional<z.ZodString>;
2474
2534
  }, z.core.$strict>>>;
2475
2535
  }, z.core.$strict>>;
2476
2536
  }, z.core.$strip>>;
@@ -2482,6 +2542,10 @@ export declare const mulmoStudioSchema: z.ZodObject<{
2482
2542
  quality: z.ZodOptional<z.ZodString>;
2483
2543
  style: z.ZodOptional<z.ZodString>;
2484
2544
  moderation: z.ZodOptional<z.ZodString>;
2545
+ baseURL: z.ZodOptional<z.ZodString>;
2546
+ apiVersion: z.ZodOptional<z.ZodString>;
2547
+ vertexai_project: z.ZodOptional<z.ZodString>;
2548
+ vertexai_location: z.ZodOptional<z.ZodString>;
2485
2549
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
2486
2550
  type: z.ZodLiteral<"image">;
2487
2551
  source: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -2726,6 +2790,8 @@ export declare const mulmoStudioSchema: z.ZodObject<{
2726
2790
  type: z.ZodLiteral<"custom">;
2727
2791
  filter: z.ZodString;
2728
2792
  }, z.core.$strip>]>>>;
2793
+ vertexai_project: z.ZodOptional<z.ZodString>;
2794
+ vertexai_location: z.ZodOptional<z.ZodString>;
2729
2795
  }, z.core.$strip>>>;
2730
2796
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
2731
2797
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
@@ -2921,6 +2987,10 @@ export declare const mulmoStudioSchema: z.ZodObject<{
2921
2987
  quality: z.ZodOptional<z.ZodString>;
2922
2988
  style: z.ZodOptional<z.ZodString>;
2923
2989
  moderation: z.ZodOptional<z.ZodString>;
2990
+ baseURL: z.ZodOptional<z.ZodString>;
2991
+ apiVersion: z.ZodOptional<z.ZodString>;
2992
+ vertexai_project: z.ZodOptional<z.ZodString>;
2993
+ vertexai_location: z.ZodOptional<z.ZodString>;
2924
2994
  }, z.core.$strict>>;
2925
2995
  audioParams: z.ZodOptional<z.ZodObject<{
2926
2996
  padding: z.ZodOptional<z.ZodNumber>;
@@ -3153,6 +3223,8 @@ export declare const mulmoStudioSchema: z.ZodObject<{
3153
3223
  type: z.ZodLiteral<"custom">;
3154
3224
  filter: z.ZodString;
3155
3225
  }, z.core.$strip>]>>>;
3226
+ vertexai_project: z.ZodOptional<z.ZodString>;
3227
+ vertexai_location: z.ZodOptional<z.ZodString>;
3156
3228
  speed: z.ZodOptional<z.ZodNumber>;
3157
3229
  }, z.core.$strip>>;
3158
3230
  soundEffectParams: z.ZodOptional<z.ZodObject<{
@@ -3264,6 +3336,8 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
3264
3336
  [x: string]: string;
3265
3337
  }>>>;
3266
3338
  model: z.ZodOptional<z.ZodString>;
3339
+ baseURL: z.ZodOptional<z.ZodString>;
3340
+ apiVersion: z.ZodOptional<z.ZodString>;
3267
3341
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
3268
3342
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
3269
3343
  voiceId: z.ZodString;
@@ -3279,6 +3353,8 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
3279
3353
  [x: string]: string;
3280
3354
  }>>>;
3281
3355
  model: z.ZodOptional<z.ZodString>;
3356
+ baseURL: z.ZodOptional<z.ZodString>;
3357
+ apiVersion: z.ZodOptional<z.ZodString>;
3282
3358
  }, z.core.$strict>>>;
3283
3359
  }, z.core.$strict>>;
3284
3360
  }, z.core.$strip>>;
@@ -3290,6 +3366,10 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
3290
3366
  quality: z.ZodOptional<z.ZodString>;
3291
3367
  style: z.ZodOptional<z.ZodString>;
3292
3368
  moderation: z.ZodOptional<z.ZodString>;
3369
+ baseURL: z.ZodOptional<z.ZodString>;
3370
+ apiVersion: z.ZodOptional<z.ZodString>;
3371
+ vertexai_project: z.ZodOptional<z.ZodString>;
3372
+ vertexai_location: z.ZodOptional<z.ZodString>;
3293
3373
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
3294
3374
  type: z.ZodLiteral<"image">;
3295
3375
  source: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -3534,6 +3614,8 @@ export declare const mulmoPromptTemplateSchema: z.ZodObject<{
3534
3614
  type: z.ZodLiteral<"custom">;
3535
3615
  filter: z.ZodString;
3536
3616
  }, z.core.$strip>]>>>;
3617
+ vertexai_project: z.ZodOptional<z.ZodString>;
3618
+ vertexai_location: z.ZodOptional<z.ZodString>;
3537
3619
  }, z.core.$strip>>>;
3538
3620
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
3539
3621
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
@@ -3619,6 +3701,8 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
3619
3701
  [x: string]: string;
3620
3702
  }>>>;
3621
3703
  model: z.ZodOptional<z.ZodString>;
3704
+ baseURL: z.ZodOptional<z.ZodString>;
3705
+ apiVersion: z.ZodOptional<z.ZodString>;
3622
3706
  lang: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodObject<{
3623
3707
  displayName: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
3624
3708
  voiceId: z.ZodString;
@@ -3634,6 +3718,8 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
3634
3718
  [x: string]: string;
3635
3719
  }>>>;
3636
3720
  model: z.ZodOptional<z.ZodString>;
3721
+ baseURL: z.ZodOptional<z.ZodString>;
3722
+ apiVersion: z.ZodOptional<z.ZodString>;
3637
3723
  }, z.core.$strict>>>;
3638
3724
  }, z.core.$strict>>;
3639
3725
  }, z.core.$strip>>;
@@ -3645,6 +3731,10 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
3645
3731
  quality: z.ZodOptional<z.ZodString>;
3646
3732
  style: z.ZodOptional<z.ZodString>;
3647
3733
  moderation: z.ZodOptional<z.ZodString>;
3734
+ baseURL: z.ZodOptional<z.ZodString>;
3735
+ apiVersion: z.ZodOptional<z.ZodString>;
3736
+ vertexai_project: z.ZodOptional<z.ZodString>;
3737
+ vertexai_location: z.ZodOptional<z.ZodString>;
3648
3738
  images: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodObject<{
3649
3739
  type: z.ZodLiteral<"image">;
3650
3740
  source: z.ZodDiscriminatedUnion<[z.ZodObject<{
@@ -3889,6 +3979,8 @@ export declare const mulmoPromptTemplateFileSchema: z.ZodObject<{
3889
3979
  type: z.ZodLiteral<"custom">;
3890
3980
  filter: z.ZodString;
3891
3981
  }, z.core.$strip>]>>>;
3982
+ vertexai_project: z.ZodOptional<z.ZodString>;
3983
+ vertexai_location: z.ZodOptional<z.ZodString>;
3892
3984
  }, z.core.$strip>>>;
3893
3985
  soundEffectParams: z.ZodDefault<z.ZodOptional<z.ZodObject<{
3894
3986
  provider: z.ZodOptional<z.ZodDefault<z.ZodEnum<{
@@ -39,6 +39,8 @@ export const speakerDataSchema = z
39
39
  speechOptions: speechOptionsSchema.optional(),
40
40
  provider: text2SpeechProviderSchema.optional(),
41
41
  model: z.string().optional().describe("TTS model to use for this speaker"),
42
+ baseURL: z.string().optional(), // Azure/custom endpoint URL
43
+ apiVersion: z.string().optional(), // Azure API version (e.g., "2025-04-01-preview")
42
44
  })
43
45
  .strict();
44
46
  export const speakerSchema = speakerDataSchema.extend({
@@ -240,6 +242,10 @@ export const mulmoBeatImageParamsSchema = z
240
242
  quality: z.string().optional(), // optional image quality (model specific)
241
243
  style: z.string().optional(), // optional image style
242
244
  moderation: z.string().optional(), // optional image style
245
+ baseURL: z.string().optional(), // Azure/custom endpoint URL
246
+ apiVersion: z.string().optional(), // Azure API version (e.g., "2025-04-01-preview")
247
+ vertexai_project: z.string().optional(), // Google Cloud Project ID for Vertex AI
248
+ vertexai_location: z.string().optional(), // Vertex AI location (default: us-central1)
243
249
  })
244
250
  .strict();
245
251
  export const mulmoImageParamsSchema = mulmoBeatImageParamsSchema
@@ -322,6 +328,8 @@ export const mulmoMovieParamsSchema = z.object({
322
328
  fillOption: mulmoFillOptionSchema.optional(), // for movie.ts
323
329
  transition: mulmoTransitionSchema.optional(), // for movie.ts
324
330
  filters: z.array(mulmoVideoFilterSchema).optional(), // for movie.ts
331
+ vertexai_project: z.string().optional(), // Google Cloud Project ID for Vertex AI
332
+ vertexai_location: z.string().optional(), // Vertex AI location (default: us-central1)
325
333
  });
326
334
  export const mulmoBeatSchema = z
327
335
  .object({