google-veo3-1-mcp-server 1.0.0

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.
Files changed (52) hide show
  1. package/README.md +257 -0
  2. package/dist/cli/batch.d.ts +8 -0
  3. package/dist/cli/batch.d.ts.map +1 -0
  4. package/dist/cli/batch.js +289 -0
  5. package/dist/cli/batch.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +372 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tools/extend.d.ts +14 -0
  11. package/dist/tools/extend.d.ts.map +1 -0
  12. package/dist/tools/extend.js +153 -0
  13. package/dist/tools/extend.js.map +1 -0
  14. package/dist/tools/generate.d.ts +10 -0
  15. package/dist/tools/generate.d.ts.map +1 -0
  16. package/dist/tools/generate.js +210 -0
  17. package/dist/tools/generate.js.map +1 -0
  18. package/dist/tools/interpolate.d.ts +12 -0
  19. package/dist/tools/interpolate.d.ts.map +1 -0
  20. package/dist/tools/interpolate.js +170 -0
  21. package/dist/tools/interpolate.js.map +1 -0
  22. package/dist/types/batch.d.ts +121 -0
  23. package/dist/types/batch.d.ts.map +1 -0
  24. package/dist/types/batch.js +37 -0
  25. package/dist/types/batch.js.map +1 -0
  26. package/dist/types/tools.d.ts +154 -0
  27. package/dist/types/tools.d.ts.map +1 -0
  28. package/dist/types/tools.js +134 -0
  29. package/dist/types/tools.js.map +1 -0
  30. package/dist/utils/batch-config.d.ts +26 -0
  31. package/dist/utils/batch-config.d.ts.map +1 -0
  32. package/dist/utils/batch-config.js +283 -0
  33. package/dist/utils/batch-config.js.map +1 -0
  34. package/dist/utils/batch-manager.d.ts +43 -0
  35. package/dist/utils/batch-manager.d.ts.map +1 -0
  36. package/dist/utils/batch-manager.js +310 -0
  37. package/dist/utils/batch-manager.js.map +1 -0
  38. package/dist/utils/debug.d.ts +16 -0
  39. package/dist/utils/debug.d.ts.map +1 -0
  40. package/dist/utils/debug.js +44 -0
  41. package/dist/utils/debug.js.map +1 -0
  42. package/dist/utils/path.d.ts +36 -0
  43. package/dist/utils/path.d.ts.map +1 -0
  44. package/dist/utils/path.js +97 -0
  45. package/dist/utils/path.js.map +1 -0
  46. package/dist/utils/video.d.ts +44 -0
  47. package/dist/utils/video.d.ts.map +1 -0
  48. package/dist/utils/video.js +261 -0
  49. package/dist/utils/video.js.map +1 -0
  50. package/docs/GOOGLE_VEO_3.1_API_SPECIFICATION.md +392 -0
  51. package/examples/batch-config.json +44 -0
  52. package/package.json +48 -0
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Google Veo 3.1 API Type Definitions
3
+ */
4
+ export declare const MODELS: readonly ["veo-3.1-generate-preview", "veo-3.1-fast-generate-preview"];
5
+ export type Model = typeof MODELS[number];
6
+ export declare const DEFAULT_MODEL: Model;
7
+ export declare const RESOLUTIONS: readonly ["720p", "1080p", "4k"];
8
+ export type Resolution = typeof RESOLUTIONS[number];
9
+ export declare const DEFAULT_RESOLUTION: Resolution;
10
+ export declare const ASPECT_RATIOS: readonly ["16:9", "9:16"];
11
+ export type AspectRatio = typeof ASPECT_RATIOS[number];
12
+ export declare const DEFAULT_ASPECT_RATIO: AspectRatio;
13
+ export declare const DURATIONS: readonly [4, 6, 8];
14
+ export type Duration = typeof DURATIONS[number];
15
+ export declare const DEFAULT_DURATION: Duration;
16
+ export declare const EXTENSION_DURATION = 7;
17
+ export declare const EXTENSION_RESOLUTION: Resolution;
18
+ export declare const PERSON_GENERATION_OPTIONS: readonly ["allow_adult", "dont_allow", "allow_all"];
19
+ export type PersonGeneration = typeof PERSON_GENERATION_OPTIONS[number];
20
+ export declare const COMPRESSION_QUALITY_OPTIONS: readonly ["optimized", "lossless"];
21
+ export type CompressionQuality = typeof COMPRESSION_QUALITY_OPTIONS[number];
22
+ export declare const RESIZE_MODES: readonly ["pad", "crop"];
23
+ export type ResizeMode = typeof RESIZE_MODES[number];
24
+ export declare const REFERENCE_TYPES: readonly ["asset", "style"];
25
+ export type ReferenceType = typeof REFERENCE_TYPES[number];
26
+ export interface ReferenceImage {
27
+ image: string;
28
+ reference_type: ReferenceType;
29
+ }
30
+ export declare const PRICING: Record<Model, Partial<Record<Resolution, {
31
+ video: number;
32
+ video_audio: number;
33
+ }>>>;
34
+ export declare const DEFAULT_POLL_INTERVAL = 15000;
35
+ export declare const DEFAULT_MAX_POLL_ATTEMPTS = 120;
36
+ export declare const GEMINI_API_BASE_URL = "https://generativelanguage.googleapis.com/v1beta";
37
+ export interface GenerateVideoParams {
38
+ prompt: string;
39
+ model?: Model | string;
40
+ aspect_ratio?: AspectRatio | string;
41
+ resolution?: Resolution | string;
42
+ duration_seconds?: Duration | number | string;
43
+ generate_audio?: boolean;
44
+ negative_prompt?: string;
45
+ image?: string;
46
+ reference_images?: ReferenceImage[];
47
+ sample_count?: number | string;
48
+ person_generation?: PersonGeneration | string;
49
+ seed?: number | string;
50
+ compression_quality?: CompressionQuality | string;
51
+ resize_mode?: ResizeMode | string;
52
+ storage_uri?: string;
53
+ output_path?: string;
54
+ }
55
+ export interface ExtendVideoParams {
56
+ video: string;
57
+ prompt?: string;
58
+ output_path?: string;
59
+ }
60
+ export interface InterpolateFramesParams {
61
+ first_frame: string;
62
+ last_frame: string;
63
+ prompt?: string;
64
+ duration_seconds?: Duration | number | string;
65
+ generate_audio?: boolean;
66
+ output_path?: string;
67
+ }
68
+ export interface GetVideoStatusParams {
69
+ operation_name: string;
70
+ }
71
+ export interface VeoImageInput {
72
+ bytesBase64Encoded?: string;
73
+ gcsUri?: string;
74
+ }
75
+ export interface VeoVideoInput {
76
+ bytesBase64Encoded?: string;
77
+ uri?: string;
78
+ }
79
+ export interface VeoReferenceImageInput {
80
+ image: VeoImageInput;
81
+ referenceType: ReferenceType;
82
+ }
83
+ export interface VeoGenerateRequest {
84
+ instances: Array<{
85
+ prompt?: string;
86
+ image?: VeoImageInput;
87
+ lastFrame?: VeoImageInput;
88
+ video?: VeoVideoInput;
89
+ referenceImages?: VeoReferenceImageInput[];
90
+ }>;
91
+ parameters: {
92
+ aspectRatio?: string;
93
+ resolution?: string;
94
+ durationSeconds?: number;
95
+ sampleCount?: number;
96
+ generateAudio?: boolean;
97
+ negativePrompt?: string;
98
+ personGeneration?: string;
99
+ seed?: number;
100
+ compressionQuality?: string;
101
+ resizeMode?: string;
102
+ storageUri?: string;
103
+ };
104
+ }
105
+ export interface VeoGeneratedVideo {
106
+ video: {
107
+ uri?: string;
108
+ bytesBase64Encoded?: string;
109
+ };
110
+ }
111
+ export interface VeoOperationResponse {
112
+ name: string;
113
+ done?: boolean;
114
+ metadata?: Record<string, unknown>;
115
+ response?: {
116
+ generatedVideos?: VeoGeneratedVideo[];
117
+ };
118
+ error?: {
119
+ code: number;
120
+ message: string;
121
+ details?: Array<Record<string, unknown>>;
122
+ };
123
+ }
124
+ export interface VideoGenerationResult {
125
+ success: boolean;
126
+ operation_name?: string;
127
+ video_url?: string;
128
+ video_path?: string;
129
+ duration_seconds?: number;
130
+ estimated_cost?: number;
131
+ error?: string;
132
+ failure_reason?: string;
133
+ }
134
+ export interface VideoStatusResult {
135
+ success: boolean;
136
+ operation_name: string;
137
+ done: boolean;
138
+ video_url?: string;
139
+ error?: string;
140
+ failure_reason?: string;
141
+ }
142
+ export declare function isValidModel(model: string): model is Model;
143
+ export declare function isValidResolution(resolution: string): resolution is Resolution;
144
+ export declare function isValidAspectRatio(ratio: string): ratio is AspectRatio;
145
+ export declare function isValidDuration(duration: number): duration is Duration;
146
+ export declare function isValidReferenceType(type: string): type is ReferenceType;
147
+ export declare function isValidPersonGeneration(value: string): value is PersonGeneration;
148
+ export declare function isValidResolutionForModel(resolution: Resolution, model: Model): boolean;
149
+ export declare function calculateCost(model: Model, resolution: Resolution, durationSeconds: number, generateAudio: boolean): number;
150
+ export declare function normalizeModel(model?: string): Model;
151
+ export declare function normalizeResolution(resolution?: string): Resolution;
152
+ export declare function normalizeAspectRatio(ratio?: string): AspectRatio;
153
+ export declare function normalizeDuration(duration?: number | string): Duration;
154
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Google Veo 3.1 API Type Definitions
3
+ */
4
+ // =============================================================================
5
+ // Model Definitions
6
+ // =============================================================================
7
+ export const MODELS = [
8
+ 'veo-3.1-generate-preview',
9
+ 'veo-3.1-fast-generate-preview'
10
+ ];
11
+ export const DEFAULT_MODEL = 'veo-3.1-generate-preview';
12
+ // =============================================================================
13
+ // Video Configuration
14
+ // =============================================================================
15
+ export const RESOLUTIONS = ['720p', '1080p', '4k'];
16
+ export const DEFAULT_RESOLUTION = '720p';
17
+ export const ASPECT_RATIOS = ['16:9', '9:16'];
18
+ export const DEFAULT_ASPECT_RATIO = '16:9';
19
+ export const DURATIONS = [4, 6, 8];
20
+ export const DEFAULT_DURATION = 8;
21
+ export const EXTENSION_DURATION = 7; // Video extension is always 7 seconds
22
+ export const EXTENSION_RESOLUTION = '720p'; // Extension is always 720p
23
+ export const PERSON_GENERATION_OPTIONS = ['allow_adult', 'dont_allow', 'allow_all'];
24
+ export const COMPRESSION_QUALITY_OPTIONS = ['optimized', 'lossless'];
25
+ export const RESIZE_MODES = ['pad', 'crop'];
26
+ // =============================================================================
27
+ // Reference Image Types
28
+ // =============================================================================
29
+ export const REFERENCE_TYPES = ['asset', 'style'];
30
+ // =============================================================================
31
+ // Pricing (USD per second)
32
+ // =============================================================================
33
+ export const PRICING = {
34
+ 'veo-3.1-generate-preview': {
35
+ '720p': { video: 0.20, video_audio: 0.40 },
36
+ '1080p': { video: 0.20, video_audio: 0.40 },
37
+ '4k': { video: 0.40, video_audio: 0.60 }
38
+ },
39
+ 'veo-3.1-fast-generate-preview': {
40
+ '720p': { video: 0.10, video_audio: 0.20 },
41
+ '1080p': { video: 0.10, video_audio: 0.20 }
42
+ // 4k not available for fast model
43
+ }
44
+ };
45
+ // =============================================================================
46
+ // Polling Configuration
47
+ // =============================================================================
48
+ export const DEFAULT_POLL_INTERVAL = 15000; // 15 seconds
49
+ export const DEFAULT_MAX_POLL_ATTEMPTS = 120; // ~30 minutes with 15s interval
50
+ // =============================================================================
51
+ // API Configuration
52
+ // =============================================================================
53
+ export const GEMINI_API_BASE_URL = 'https://generativelanguage.googleapis.com/v1beta';
54
+ // =============================================================================
55
+ // Validation Functions
56
+ // =============================================================================
57
+ export function isValidModel(model) {
58
+ return MODELS.includes(model);
59
+ }
60
+ export function isValidResolution(resolution) {
61
+ return RESOLUTIONS.includes(resolution);
62
+ }
63
+ export function isValidAspectRatio(ratio) {
64
+ return ASPECT_RATIOS.includes(ratio);
65
+ }
66
+ export function isValidDuration(duration) {
67
+ return DURATIONS.includes(duration);
68
+ }
69
+ export function isValidReferenceType(type) {
70
+ return REFERENCE_TYPES.includes(type);
71
+ }
72
+ export function isValidPersonGeneration(value) {
73
+ return PERSON_GENERATION_OPTIONS.includes(value);
74
+ }
75
+ export function isValidResolutionForModel(resolution, model) {
76
+ if (model === 'veo-3.1-fast-generate-preview' && resolution === '4k') {
77
+ return false; // 4k not available for fast model
78
+ }
79
+ return true;
80
+ }
81
+ // =============================================================================
82
+ // Cost Calculation
83
+ // =============================================================================
84
+ export function calculateCost(model, resolution, durationSeconds, generateAudio) {
85
+ const modelPricing = PRICING[model];
86
+ const resolutionPricing = modelPricing[resolution];
87
+ if (!resolutionPricing) {
88
+ // Fall back to 1080p pricing if resolution not found
89
+ const fallbackPricing = modelPricing['1080p'];
90
+ if (!fallbackPricing)
91
+ return 0;
92
+ const pricePerSecond = generateAudio ? fallbackPricing.video_audio : fallbackPricing.video;
93
+ return pricePerSecond * durationSeconds;
94
+ }
95
+ const pricePerSecond = generateAudio ? resolutionPricing.video_audio : resolutionPricing.video;
96
+ return pricePerSecond * durationSeconds;
97
+ }
98
+ // =============================================================================
99
+ // Parameter Normalization
100
+ // =============================================================================
101
+ export function normalizeModel(model) {
102
+ if (!model)
103
+ return DEFAULT_MODEL;
104
+ if (isValidModel(model))
105
+ return model;
106
+ return DEFAULT_MODEL;
107
+ }
108
+ export function normalizeResolution(resolution) {
109
+ if (!resolution)
110
+ return DEFAULT_RESOLUTION;
111
+ if (isValidResolution(resolution))
112
+ return resolution;
113
+ return DEFAULT_RESOLUTION;
114
+ }
115
+ export function normalizeAspectRatio(ratio) {
116
+ if (!ratio)
117
+ return DEFAULT_ASPECT_RATIO;
118
+ if (isValidAspectRatio(ratio))
119
+ return ratio;
120
+ return DEFAULT_ASPECT_RATIO;
121
+ }
122
+ export function normalizeDuration(duration) {
123
+ if (duration === undefined || duration === null)
124
+ return DEFAULT_DURATION;
125
+ const numDuration = typeof duration === 'string' ? parseInt(duration, 10) : duration;
126
+ if (isNaN(numDuration))
127
+ return DEFAULT_DURATION;
128
+ if (isValidDuration(numDuration))
129
+ return numDuration;
130
+ // Find closest valid duration
131
+ const sorted = [...DURATIONS].sort((a, b) => Math.abs(a - numDuration) - Math.abs(b - numDuration));
132
+ return sorted[0];
133
+ }
134
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/types/tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,0BAA0B;IAC1B,+BAA+B;CACvB,CAAC;AAIX,MAAM,CAAC,MAAM,aAAa,GAAU,0BAA0B,CAAC;AAE/D,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAU,CAAC;AAE5D,MAAM,CAAC,MAAM,kBAAkB,GAAe,MAAM,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,MAAM,CAAU,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAgB,MAAM,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC;AAE5C,MAAM,CAAC,MAAM,gBAAgB,GAAa,CAAC,CAAC;AAE5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,CAAC,sCAAsC;AAC3E,MAAM,CAAC,MAAM,oBAAoB,GAAe,MAAM,CAAC,CAAC,2BAA2B;AAEnF,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;AAG7F,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,WAAW,EAAE,UAAU,CAAU,CAAC;AAG9E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAC;AAGrD,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,CAAU,CAAC;AAQ3D,gFAAgF;AAChF,2BAA2B;AAC3B,gFAAgF;AAEhF,MAAM,CAAC,MAAM,OAAO,GAAuF;IACzG,0BAA0B,EAAE;QAC1B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAC1C,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAC3C,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;KACzC;IACD,+BAA+B,EAAE;QAC/B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAC1C,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAC3C,kCAAkC;KACnC;CACF,CAAC;AAEF,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,CAAC,aAAa;AACzD,MAAM,CAAC,MAAM,yBAAyB,GAAG,GAAG,CAAC,CAAC,gCAAgC;AAE9E,gFAAgF;AAChF,oBAAoB;AACpB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,mBAAmB,GAAG,kDAAkD,CAAC;AAmItF,gFAAgF;AAChF,uBAAuB;AACvB,gFAAgF;AAEhF,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAc,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAwB,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa;IAC9C,OAAO,aAAa,CAAC,QAAQ,CAAC,KAAoB,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,SAAS,CAAC,QAAQ,CAAC,QAAoB,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,OAAO,eAAe,CAAC,QAAQ,CAAC,IAAqB,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa;IACnD,OAAO,yBAAyB,CAAC,QAAQ,CAAC,KAAyB,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,UAAsB,EAAE,KAAY;IAC5E,IAAI,KAAK,KAAK,+BAA+B,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC,CAAC,kCAAkC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF,MAAM,UAAU,aAAa,CAC3B,KAAY,EACZ,UAAsB,EACtB,eAAuB,EACvB,aAAsB;IAEtB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,iBAAiB,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IAEnD,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,qDAAqD;QACrD,MAAM,eAAe,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,eAAe;YAAE,OAAO,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC;QAC3F,OAAO,cAAc,GAAG,eAAe,CAAC;IAC1C,CAAC;IAED,MAAM,cAAc,GAAG,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC;IAC/F,OAAO,cAAc,GAAG,eAAe,CAAC;AAC1C,CAAC;AAED,gFAAgF;AAChF,0BAA0B;AAC1B,gFAAgF;AAEhF,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,aAAa,CAAC;IACjC,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAmB;IACrD,IAAI,CAAC,UAAU;QAAE,OAAO,kBAAkB,CAAC;IAC3C,IAAI,iBAAiB,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IACrD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,oBAAoB,CAAC;IACxC,IAAI,kBAAkB,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAA0B;IAC1D,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,gBAAgB,CAAC;IACzE,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACrF,IAAI,KAAK,CAAC,WAAW,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAChD,IAAI,eAAe,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IACrD,8BAA8B;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IACpG,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Batch Configuration Loading and Validation
3
+ */
4
+ import { type BatchConfig, type BatchJob, type BatchExecutionOptions } from '../types/batch.js';
5
+ /**
6
+ * Load batch configuration from a JSON file
7
+ */
8
+ export declare function loadBatchConfig(configPath: string): BatchConfig;
9
+ /**
10
+ * Validate batch configuration
11
+ */
12
+ export declare function validateBatchConfig(config: BatchConfig): string[];
13
+ /**
14
+ * Merge configuration with CLI options and environment variables
15
+ * Priority: CLI options > Environment > Config file > Defaults
16
+ */
17
+ export declare function mergeBatchConfig(config: BatchConfig, cliOptions: Partial<BatchExecutionOptions>): BatchExecutionOptions;
18
+ /**
19
+ * Resolve output path for a job
20
+ */
21
+ export declare function resolveOutputPath(job: BatchJob, index: number, outputDir: string, configDir: string): string;
22
+ /**
23
+ * Apply defaults from config to a job
24
+ */
25
+ export declare function applyJobDefaults(job: BatchJob, config: BatchConfig): BatchJob;
26
+ //# sourceMappingURL=batch-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-config.d.ts","sourceRoot":"","sources":["../../src/utils/batch-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACb,KAAK,qBAAqB,EAO3B,MAAM,mBAAmB,CAAC;AAc3B;;GAEG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW,CAkB/D;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,EAAE,CA0FjE;AAoFD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACzC,qBAAqB,CA+BvB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,CAcR;AAiBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CA0B7E"}
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Batch Configuration Loading and Validation
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as path from 'path';
6
+ import { DEFAULT_BATCH_OPTIONS, DEFAULT_RETRY_POLICY, BATCH_CONSTRAINTS } from '../types/batch.js';
7
+ import { DEFAULT_MODEL, DEFAULT_RESOLUTION, DEFAULT_ASPECT_RATIO, DEFAULT_DURATION, isValidModel, isValidResolution, isValidAspectRatio, isValidDuration, isValidReferenceType } from '../types/tools.js';
8
+ import { debugLog } from './debug.js';
9
+ /**
10
+ * Load batch configuration from a JSON file
11
+ */
12
+ export function loadBatchConfig(configPath) {
13
+ const absolutePath = path.isAbsolute(configPath)
14
+ ? configPath
15
+ : path.resolve(process.cwd(), configPath);
16
+ if (!fs.existsSync(absolutePath)) {
17
+ throw new Error(`Configuration file not found: ${absolutePath}`);
18
+ }
19
+ const content = fs.readFileSync(absolutePath, 'utf-8');
20
+ try {
21
+ const config = JSON.parse(content);
22
+ debugLog('Loaded batch config', config);
23
+ return config;
24
+ }
25
+ catch (error) {
26
+ throw new Error(`Failed to parse configuration file: ${error instanceof Error ? error.message : String(error)}`);
27
+ }
28
+ }
29
+ /**
30
+ * Validate batch configuration
31
+ */
32
+ export function validateBatchConfig(config) {
33
+ const errors = [];
34
+ // Validate jobs array
35
+ if (!config.jobs || !Array.isArray(config.jobs)) {
36
+ errors.push('Configuration must have a "jobs" array');
37
+ return errors;
38
+ }
39
+ if (config.jobs.length < BATCH_CONSTRAINTS.minJobs) {
40
+ errors.push(`At least ${BATCH_CONSTRAINTS.minJobs} job is required`);
41
+ }
42
+ if (config.jobs.length > BATCH_CONSTRAINTS.maxJobs) {
43
+ errors.push(`Maximum ${BATCH_CONSTRAINTS.maxJobs} jobs allowed`);
44
+ }
45
+ // Validate each job
46
+ config.jobs.forEach((job, index) => {
47
+ const jobErrors = validateJob(job, index);
48
+ errors.push(...jobErrors);
49
+ });
50
+ // Validate default model
51
+ if (config.default_model && !isValidModel(config.default_model)) {
52
+ errors.push(`Invalid default_model: ${config.default_model}`);
53
+ }
54
+ // Validate default resolution
55
+ if (config.default_resolution && !isValidResolution(config.default_resolution)) {
56
+ errors.push(`Invalid default_resolution: ${config.default_resolution}`);
57
+ }
58
+ // Validate default aspect ratio
59
+ if (config.default_aspect_ratio && !isValidAspectRatio(config.default_aspect_ratio)) {
60
+ errors.push(`Invalid default_aspect_ratio: ${config.default_aspect_ratio}`);
61
+ }
62
+ // Validate default duration
63
+ if (config.default_duration_seconds !== undefined) {
64
+ const duration = typeof config.default_duration_seconds === 'number'
65
+ ? config.default_duration_seconds
66
+ : parseInt(String(config.default_duration_seconds), 10);
67
+ if (!isValidDuration(duration)) {
68
+ errors.push(`Invalid default_duration_seconds: ${config.default_duration_seconds}. Must be 4, 6, or 8`);
69
+ }
70
+ }
71
+ // Validate max_concurrent
72
+ if (config.max_concurrent !== undefined) {
73
+ if (config.max_concurrent < BATCH_CONSTRAINTS.minConcurrent ||
74
+ config.max_concurrent > BATCH_CONSTRAINTS.maxConcurrent) {
75
+ errors.push(`max_concurrent must be between ${BATCH_CONSTRAINTS.minConcurrent} and ${BATCH_CONSTRAINTS.maxConcurrent}`);
76
+ }
77
+ }
78
+ // Validate poll_interval
79
+ if (config.poll_interval !== undefined) {
80
+ if (config.poll_interval < BATCH_CONSTRAINTS.minPollInterval ||
81
+ config.poll_interval > BATCH_CONSTRAINTS.maxPollInterval) {
82
+ errors.push(`poll_interval must be between ${BATCH_CONSTRAINTS.minPollInterval} and ${BATCH_CONSTRAINTS.maxPollInterval}ms`);
83
+ }
84
+ }
85
+ // Validate timeout
86
+ if (config.timeout !== undefined) {
87
+ if (config.timeout < BATCH_CONSTRAINTS.minTimeout ||
88
+ config.timeout > BATCH_CONSTRAINTS.maxTimeout) {
89
+ errors.push(`timeout must be between ${BATCH_CONSTRAINTS.minTimeout} and ${BATCH_CONSTRAINTS.maxTimeout}ms`);
90
+ }
91
+ }
92
+ // Validate retry policy
93
+ if (config.retry_policy) {
94
+ if (config.retry_policy.max_retries !== undefined) {
95
+ if (config.retry_policy.max_retries < BATCH_CONSTRAINTS.minRetries ||
96
+ config.retry_policy.max_retries > BATCH_CONSTRAINTS.maxRetries) {
97
+ errors.push(`retry_policy.max_retries must be between ${BATCH_CONSTRAINTS.minRetries} and ${BATCH_CONSTRAINTS.maxRetries}`);
98
+ }
99
+ }
100
+ if (config.retry_policy.retry_delay_ms !== undefined) {
101
+ if (config.retry_policy.retry_delay_ms < BATCH_CONSTRAINTS.minRetryDelay ||
102
+ config.retry_policy.retry_delay_ms > BATCH_CONSTRAINTS.maxRetryDelay) {
103
+ errors.push(`retry_policy.retry_delay_ms must be between ${BATCH_CONSTRAINTS.minRetryDelay} and ${BATCH_CONSTRAINTS.maxRetryDelay}ms`);
104
+ }
105
+ }
106
+ }
107
+ return errors;
108
+ }
109
+ /**
110
+ * Validate a single job
111
+ */
112
+ function validateJob(job, index) {
113
+ const errors = [];
114
+ const prefix = `Job ${index + 1}`;
115
+ const jobType = job.type || 'generate';
116
+ switch (jobType) {
117
+ case 'generate': {
118
+ const genJob = job;
119
+ if (!genJob.prompt && !genJob.image) {
120
+ errors.push(`${prefix}: Either prompt or image is required for generate jobs`);
121
+ }
122
+ if (genJob.model && !isValidModel(genJob.model)) {
123
+ errors.push(`${prefix}: Invalid model: ${genJob.model}`);
124
+ }
125
+ if (genJob.resolution && !isValidResolution(genJob.resolution)) {
126
+ errors.push(`${prefix}: Invalid resolution: ${genJob.resolution}`);
127
+ }
128
+ if (genJob.aspect_ratio && !isValidAspectRatio(genJob.aspect_ratio)) {
129
+ errors.push(`${prefix}: Invalid aspect_ratio: ${genJob.aspect_ratio}`);
130
+ }
131
+ if (genJob.duration_seconds !== undefined) {
132
+ const duration = typeof genJob.duration_seconds === 'number'
133
+ ? genJob.duration_seconds
134
+ : parseInt(String(genJob.duration_seconds), 10);
135
+ if (!isValidDuration(duration)) {
136
+ errors.push(`${prefix}: Invalid duration_seconds: ${genJob.duration_seconds}. Must be 4, 6, or 8`);
137
+ }
138
+ }
139
+ if (genJob.reference_images) {
140
+ if (!Array.isArray(genJob.reference_images)) {
141
+ errors.push(`${prefix}: reference_images must be an array`);
142
+ }
143
+ else if (genJob.reference_images.length > 3) {
144
+ errors.push(`${prefix}: Maximum 3 reference images allowed`);
145
+ }
146
+ else {
147
+ genJob.reference_images.forEach((ref, refIndex) => {
148
+ if (!ref.image) {
149
+ errors.push(`${prefix}: Reference image ${refIndex + 1} missing image`);
150
+ }
151
+ if (!ref.reference_type || !isValidReferenceType(ref.reference_type)) {
152
+ errors.push(`${prefix}: Reference image ${refIndex + 1} has invalid reference_type. Must be "asset" or "style"`);
153
+ }
154
+ });
155
+ }
156
+ }
157
+ break;
158
+ }
159
+ case 'extend': {
160
+ const extJob = job;
161
+ if (!extJob.video) {
162
+ errors.push(`${prefix}: video is required for extend jobs`);
163
+ }
164
+ break;
165
+ }
166
+ case 'interpolate': {
167
+ const intJob = job;
168
+ if (!intJob.first_frame) {
169
+ errors.push(`${prefix}: first_frame is required for interpolate jobs`);
170
+ }
171
+ if (!intJob.last_frame) {
172
+ errors.push(`${prefix}: last_frame is required for interpolate jobs`);
173
+ }
174
+ break;
175
+ }
176
+ default:
177
+ errors.push(`${prefix}: Invalid job type: ${jobType}`);
178
+ }
179
+ return errors;
180
+ }
181
+ /**
182
+ * Merge configuration with CLI options and environment variables
183
+ * Priority: CLI options > Environment > Config file > Defaults
184
+ */
185
+ export function mergeBatchConfig(config, cliOptions) {
186
+ // Start with defaults
187
+ const merged = { ...DEFAULT_BATCH_OPTIONS };
188
+ // Apply config file settings
189
+ if (config.output_dir)
190
+ merged.outputDir = config.output_dir;
191
+ if (config.max_concurrent)
192
+ merged.maxConcurrent = config.max_concurrent;
193
+ if (config.poll_interval)
194
+ merged.pollInterval = config.poll_interval;
195
+ if (config.timeout)
196
+ merged.timeout = config.timeout;
197
+ if (config.retry_policy) {
198
+ merged.retryPolicy = {
199
+ ...DEFAULT_RETRY_POLICY,
200
+ ...config.retry_policy
201
+ };
202
+ }
203
+ // Apply environment variables
204
+ if (process.env.OUTPUT_DIR)
205
+ merged.outputDir = process.env.OUTPUT_DIR;
206
+ // Apply CLI options (highest priority)
207
+ if (cliOptions.outputDir)
208
+ merged.outputDir = cliOptions.outputDir;
209
+ if (cliOptions.maxConcurrent)
210
+ merged.maxConcurrent = cliOptions.maxConcurrent;
211
+ if (cliOptions.pollInterval)
212
+ merged.pollInterval = cliOptions.pollInterval;
213
+ if (cliOptions.timeout)
214
+ merged.timeout = cliOptions.timeout;
215
+ if (cliOptions.estimateOnly !== undefined)
216
+ merged.estimateOnly = cliOptions.estimateOnly;
217
+ if (cliOptions.format)
218
+ merged.format = cliOptions.format;
219
+ if (cliOptions.noAudio !== undefined)
220
+ merged.noAudio = cliOptions.noAudio;
221
+ if (cliOptions.allowAnyPath !== undefined)
222
+ merged.allowAnyPath = cliOptions.allowAnyPath;
223
+ debugLog('Merged batch options', merged);
224
+ return merged;
225
+ }
226
+ /**
227
+ * Resolve output path for a job
228
+ */
229
+ export function resolveOutputPath(job, index, outputDir, configDir) {
230
+ if (job.output_path) {
231
+ if (path.isAbsolute(job.output_path)) {
232
+ return job.output_path;
233
+ }
234
+ return path.resolve(configDir, job.output_path);
235
+ }
236
+ // Generate default output path
237
+ const prefix = getJobPrefix(job);
238
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
239
+ const filename = `${prefix}_${index + 1}_${timestamp}.mp4`;
240
+ return path.join(outputDir, filename);
241
+ }
242
+ /**
243
+ * Get prefix for job output filename
244
+ */
245
+ function getJobPrefix(job) {
246
+ const jobType = job.type || 'generate';
247
+ switch (jobType) {
248
+ case 'extend':
249
+ return 'veo3_extended';
250
+ case 'interpolate':
251
+ return 'veo3_interpolated';
252
+ default:
253
+ return 'veo3';
254
+ }
255
+ }
256
+ /**
257
+ * Apply defaults from config to a job
258
+ */
259
+ export function applyJobDefaults(job, config) {
260
+ const jobType = job.type || 'generate';
261
+ if (jobType === 'generate') {
262
+ const genJob = job;
263
+ return {
264
+ ...genJob,
265
+ model: genJob.model || config.default_model || DEFAULT_MODEL,
266
+ resolution: genJob.resolution || config.default_resolution || DEFAULT_RESOLUTION,
267
+ aspect_ratio: genJob.aspect_ratio || config.default_aspect_ratio || DEFAULT_ASPECT_RATIO,
268
+ duration_seconds: genJob.duration_seconds ?? config.default_duration_seconds ?? DEFAULT_DURATION,
269
+ generate_audio: genJob.generate_audio ?? config.default_generate_audio ?? true
270
+ };
271
+ }
272
+ if (jobType === 'interpolate') {
273
+ const intJob = job;
274
+ return {
275
+ ...intJob,
276
+ duration_seconds: intJob.duration_seconds ?? config.default_duration_seconds ?? DEFAULT_DURATION,
277
+ generate_audio: intJob.generate_audio ?? config.default_generate_audio ?? true
278
+ };
279
+ }
280
+ // extend jobs don't have configurable defaults
281
+ return job;
282
+ }
283
+ //# sourceMappingURL=batch-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-config.js","sourceRoot":"","sources":["../../src/utils/batch-config.ts"],"names":[],"mappings":"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"}