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.
- package/README.md +257 -0
- package/dist/cli/batch.d.ts +8 -0
- package/dist/cli/batch.d.ts.map +1 -0
- package/dist/cli/batch.js +289 -0
- package/dist/cli/batch.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +372 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/extend.d.ts +14 -0
- package/dist/tools/extend.d.ts.map +1 -0
- package/dist/tools/extend.js +153 -0
- package/dist/tools/extend.js.map +1 -0
- package/dist/tools/generate.d.ts +10 -0
- package/dist/tools/generate.d.ts.map +1 -0
- package/dist/tools/generate.js +210 -0
- package/dist/tools/generate.js.map +1 -0
- package/dist/tools/interpolate.d.ts +12 -0
- package/dist/tools/interpolate.d.ts.map +1 -0
- package/dist/tools/interpolate.js +170 -0
- package/dist/tools/interpolate.js.map +1 -0
- package/dist/types/batch.d.ts +121 -0
- package/dist/types/batch.d.ts.map +1 -0
- package/dist/types/batch.js +37 -0
- package/dist/types/batch.js.map +1 -0
- package/dist/types/tools.d.ts +154 -0
- package/dist/types/tools.d.ts.map +1 -0
- package/dist/types/tools.js +134 -0
- package/dist/types/tools.js.map +1 -0
- package/dist/utils/batch-config.d.ts +26 -0
- package/dist/utils/batch-config.d.ts.map +1 -0
- package/dist/utils/batch-config.js +283 -0
- package/dist/utils/batch-config.js.map +1 -0
- package/dist/utils/batch-manager.d.ts +43 -0
- package/dist/utils/batch-manager.d.ts.map +1 -0
- package/dist/utils/batch-manager.js +310 -0
- package/dist/utils/batch-manager.js.map +1 -0
- package/dist/utils/debug.d.ts +16 -0
- package/dist/utils/debug.d.ts.map +1 -0
- package/dist/utils/debug.js +44 -0
- package/dist/utils/debug.js.map +1 -0
- package/dist/utils/path.d.ts +36 -0
- package/dist/utils/path.d.ts.map +1 -0
- package/dist/utils/path.js +97 -0
- package/dist/utils/path.js.map +1 -0
- package/dist/utils/video.d.ts +44 -0
- package/dist/utils/video.d.ts.map +1 -0
- package/dist/utils/video.js +261 -0
- package/dist/utils/video.js.map +1 -0
- package/docs/GOOGLE_VEO_3.1_API_SPECIFICATION.md +392 -0
- package/examples/batch-config.json +44 -0
- package/package.json +48 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Video Generation Tool for Veo 3.1
|
|
3
|
+
* Supports Text-to-Video, Image-to-Video, and Reference Images
|
|
4
|
+
*/
|
|
5
|
+
import { GEMINI_API_BASE_URL, DEFAULT_POLL_INTERVAL, DEFAULT_MAX_POLL_ATTEMPTS, normalizeModel, normalizeResolution, normalizeAspectRatio, normalizeDuration, calculateCost, isValidResolutionForModel } from '../types/tools.js';
|
|
6
|
+
import { getApiKey, pollVideoResult, downloadAndSaveVideo, extractVideoFromResponse, readImageAsBase64 } from '../utils/video.js';
|
|
7
|
+
import { generateDefaultOutputPath, getDisplayPath } from '../utils/path.js';
|
|
8
|
+
import { debugLog, errorLog } from '../utils/debug.js';
|
|
9
|
+
/**
|
|
10
|
+
* Generate a video using Veo 3.1 API
|
|
11
|
+
*/
|
|
12
|
+
export async function generateVideo(params) {
|
|
13
|
+
const apiKey = getApiKey();
|
|
14
|
+
// Normalize parameters
|
|
15
|
+
const model = normalizeModel(params.model);
|
|
16
|
+
const resolution = normalizeResolution(params.resolution);
|
|
17
|
+
const aspectRatio = normalizeAspectRatio(params.aspect_ratio);
|
|
18
|
+
const durationSeconds = normalizeDuration(params.duration_seconds);
|
|
19
|
+
const generateAudio = params.generate_audio ?? true;
|
|
20
|
+
const sampleCount = typeof params.sample_count === 'string'
|
|
21
|
+
? parseInt(params.sample_count, 10)
|
|
22
|
+
: (params.sample_count ?? 1);
|
|
23
|
+
// Validate resolution for model
|
|
24
|
+
if (!isValidResolutionForModel(resolution, model)) {
|
|
25
|
+
return {
|
|
26
|
+
success: false,
|
|
27
|
+
error: `Resolution ${resolution} is not available for model ${model}. Fast model only supports 720p and 1080p.`
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// Validate prompt
|
|
31
|
+
if (!params.prompt && !params.image) {
|
|
32
|
+
return {
|
|
33
|
+
success: false,
|
|
34
|
+
error: 'Either prompt or image is required for video generation'
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
debugLog('Generating video with parameters', {
|
|
38
|
+
model,
|
|
39
|
+
resolution,
|
|
40
|
+
aspectRatio,
|
|
41
|
+
durationSeconds,
|
|
42
|
+
generateAudio,
|
|
43
|
+
hasImage: !!params.image,
|
|
44
|
+
hasReferenceImages: !!params.reference_images?.length
|
|
45
|
+
});
|
|
46
|
+
try {
|
|
47
|
+
// Build request instance
|
|
48
|
+
const instance = {};
|
|
49
|
+
if (params.prompt) {
|
|
50
|
+
instance.prompt = params.prompt;
|
|
51
|
+
}
|
|
52
|
+
// Handle input image (Image-to-Video)
|
|
53
|
+
if (params.image) {
|
|
54
|
+
if (params.image.startsWith('gs://')) {
|
|
55
|
+
instance.image = { gcsUri: params.image };
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const base64Data = await readImageAsBase64(params.image);
|
|
59
|
+
instance.image = { bytesBase64Encoded: base64Data };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Handle reference images
|
|
63
|
+
if (params.reference_images && params.reference_images.length > 0) {
|
|
64
|
+
instance.referenceImages = [];
|
|
65
|
+
for (const refImage of params.reference_images) {
|
|
66
|
+
let imageInput;
|
|
67
|
+
if (refImage.image.startsWith('gs://')) {
|
|
68
|
+
imageInput = { gcsUri: refImage.image };
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const base64Data = await readImageAsBase64(refImage.image);
|
|
72
|
+
imageInput = { bytesBase64Encoded: base64Data };
|
|
73
|
+
}
|
|
74
|
+
instance.referenceImages.push({
|
|
75
|
+
image: imageInput,
|
|
76
|
+
referenceType: refImage.reference_type
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Build request parameters
|
|
81
|
+
// Note: generateAudio is NOT supported in Gemini API preview models
|
|
82
|
+
// Audio is always generated by default in Veo 3.1 preview
|
|
83
|
+
const requestParams = {
|
|
84
|
+
aspectRatio,
|
|
85
|
+
resolution,
|
|
86
|
+
durationSeconds,
|
|
87
|
+
sampleCount
|
|
88
|
+
};
|
|
89
|
+
if (params.negative_prompt) {
|
|
90
|
+
requestParams.negativePrompt = params.negative_prompt;
|
|
91
|
+
}
|
|
92
|
+
if (params.person_generation) {
|
|
93
|
+
requestParams.personGeneration = params.person_generation;
|
|
94
|
+
}
|
|
95
|
+
if (params.seed !== undefined) {
|
|
96
|
+
requestParams.seed = typeof params.seed === 'string'
|
|
97
|
+
? parseInt(params.seed, 10)
|
|
98
|
+
: params.seed;
|
|
99
|
+
}
|
|
100
|
+
if (params.compression_quality) {
|
|
101
|
+
requestParams.compressionQuality = params.compression_quality;
|
|
102
|
+
}
|
|
103
|
+
if (params.resize_mode) {
|
|
104
|
+
requestParams.resizeMode = params.resize_mode;
|
|
105
|
+
}
|
|
106
|
+
if (params.storage_uri) {
|
|
107
|
+
requestParams.storageUri = params.storage_uri;
|
|
108
|
+
}
|
|
109
|
+
// Build full request
|
|
110
|
+
const request = {
|
|
111
|
+
instances: [instance],
|
|
112
|
+
parameters: requestParams
|
|
113
|
+
};
|
|
114
|
+
debugLog('API Request', request);
|
|
115
|
+
// Make API call
|
|
116
|
+
const url = `${GEMINI_API_BASE_URL}/models/${model}:predictLongRunning?key=${apiKey}`;
|
|
117
|
+
const response = await fetch(url, {
|
|
118
|
+
method: 'POST',
|
|
119
|
+
headers: {
|
|
120
|
+
'Content-Type': 'application/json'
|
|
121
|
+
},
|
|
122
|
+
body: JSON.stringify(request)
|
|
123
|
+
});
|
|
124
|
+
if (!response.ok) {
|
|
125
|
+
const errorText = await response.text();
|
|
126
|
+
errorLog('API request failed', { status: response.status, error: errorText });
|
|
127
|
+
// Handle specific error codes
|
|
128
|
+
if (response.status === 401) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: 'Authentication failed. Please check your GOOGLE_API_KEY.'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (response.status === 403) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
error: 'Access denied. Your API key may not have access to Veo 3.1.'
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (response.status === 429) {
|
|
141
|
+
return {
|
|
142
|
+
success: false,
|
|
143
|
+
error: 'Rate limit exceeded. Please try again later.'
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
success: false,
|
|
148
|
+
error: `API request failed: ${response.status} ${response.statusText} - ${errorText}`
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const operationResponse = await response.json();
|
|
152
|
+
debugLog('Initial operation response', operationResponse);
|
|
153
|
+
const operationName = operationResponse.name;
|
|
154
|
+
// Calculate estimated cost
|
|
155
|
+
const estimatedCost = calculateCost(model, resolution, durationSeconds, generateAudio);
|
|
156
|
+
// Poll for completion
|
|
157
|
+
const pollInterval = parseInt(process.env.VIDEO_POLL_INTERVAL || '') || DEFAULT_POLL_INTERVAL;
|
|
158
|
+
const maxAttempts = parseInt(process.env.VIDEO_MAX_POLL_ATTEMPTS || '') || DEFAULT_MAX_POLL_ATTEMPTS;
|
|
159
|
+
const finalResponse = await pollVideoResult(operationName, apiKey, pollInterval, maxAttempts);
|
|
160
|
+
// Check for errors
|
|
161
|
+
if (finalResponse.error) {
|
|
162
|
+
return {
|
|
163
|
+
success: false,
|
|
164
|
+
operation_name: operationName,
|
|
165
|
+
error: finalResponse.error.message,
|
|
166
|
+
failure_reason: `Error code: ${finalResponse.error.code}`
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// Extract video data
|
|
170
|
+
const videoData = extractVideoFromResponse(finalResponse);
|
|
171
|
+
if (!videoData) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
operation_name: operationName,
|
|
175
|
+
error: 'No video was generated. The content may have been filtered by safety policies.',
|
|
176
|
+
estimated_cost: estimatedCost
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
// Download and save if output path specified
|
|
180
|
+
let videoPath;
|
|
181
|
+
let videoUrl = videoData.url;
|
|
182
|
+
if (params.output_path || process.env.OUTPUT_DIR) {
|
|
183
|
+
const outputPath = params.output_path || generateDefaultOutputPath(process.env.OUTPUT_DIR || './output', 'veo3');
|
|
184
|
+
try {
|
|
185
|
+
videoPath = await downloadAndSaveVideo(videoData.url, videoData.base64, outputPath);
|
|
186
|
+
debugLog('Video saved', { path: videoPath });
|
|
187
|
+
}
|
|
188
|
+
catch (downloadError) {
|
|
189
|
+
errorLog('Failed to save video', downloadError);
|
|
190
|
+
// Don't fail the whole operation if download fails
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return {
|
|
194
|
+
success: true,
|
|
195
|
+
operation_name: operationName,
|
|
196
|
+
video_url: videoUrl,
|
|
197
|
+
video_path: videoPath ? getDisplayPath(videoPath) : undefined,
|
|
198
|
+
duration_seconds: durationSeconds,
|
|
199
|
+
estimated_cost: estimatedCost
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
errorLog('Video generation failed', error);
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
error: error instanceof Error ? error.message : String(error)
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/tools/generate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame Interpolation Tool for Veo 3.1
|
|
3
|
+
* Generates video between first and last frames
|
|
4
|
+
*/
|
|
5
|
+
import { type InterpolateFramesParams, type VideoGenerationResult } from '../types/tools.js';
|
|
6
|
+
/**
|
|
7
|
+
* Interpolate between first and last frames to generate video
|
|
8
|
+
*
|
|
9
|
+
* Creates a smooth video transition between two keyframes
|
|
10
|
+
*/
|
|
11
|
+
export declare function interpolateFrames(params: InterpolateFramesParams): Promise<VideoGenerationResult>;
|
|
12
|
+
//# sourceMappingURL=interpolate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolate.d.ts","sourceRoot":"","sources":["../../src/tools/interpolate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EASL,KAAK,uBAAuB,EAG5B,KAAK,qBAAqB,EAG3B,MAAM,mBAAmB,CAAC;AAW3B;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,uBAAuB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA0LvG"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Frame Interpolation Tool for Veo 3.1
|
|
3
|
+
* Generates video between first and last frames
|
|
4
|
+
*/
|
|
5
|
+
import { GEMINI_API_BASE_URL, DEFAULT_MODEL, DEFAULT_RESOLUTION, DEFAULT_POLL_INTERVAL, DEFAULT_MAX_POLL_ATTEMPTS, normalizeDuration, calculateCost } from '../types/tools.js';
|
|
6
|
+
import { getApiKey, pollVideoResult, downloadAndSaveVideo, extractVideoFromResponse, readImageAsBase64 } from '../utils/video.js';
|
|
7
|
+
import { generateDefaultOutputPath, getDisplayPath } from '../utils/path.js';
|
|
8
|
+
import { debugLog, errorLog } from '../utils/debug.js';
|
|
9
|
+
/**
|
|
10
|
+
* Interpolate between first and last frames to generate video
|
|
11
|
+
*
|
|
12
|
+
* Creates a smooth video transition between two keyframes
|
|
13
|
+
*/
|
|
14
|
+
export async function interpolateFrames(params) {
|
|
15
|
+
const apiKey = getApiKey();
|
|
16
|
+
// Validate required parameters
|
|
17
|
+
if (!params.first_frame) {
|
|
18
|
+
return {
|
|
19
|
+
success: false,
|
|
20
|
+
error: 'first_frame parameter is required for frame interpolation'
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
if (!params.last_frame) {
|
|
24
|
+
return {
|
|
25
|
+
success: false,
|
|
26
|
+
error: 'last_frame parameter is required for frame interpolation'
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
const model = DEFAULT_MODEL;
|
|
30
|
+
const durationSeconds = normalizeDuration(params.duration_seconds);
|
|
31
|
+
const generateAudio = params.generate_audio ?? true;
|
|
32
|
+
const resolution = DEFAULT_RESOLUTION;
|
|
33
|
+
debugLog('Interpolating frames with parameters', {
|
|
34
|
+
model,
|
|
35
|
+
durationSeconds,
|
|
36
|
+
generateAudio,
|
|
37
|
+
hasPrompt: !!params.prompt
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
// Build request instance
|
|
41
|
+
const instance = {};
|
|
42
|
+
if (params.prompt) {
|
|
43
|
+
instance.prompt = params.prompt;
|
|
44
|
+
}
|
|
45
|
+
// Handle first frame (image)
|
|
46
|
+
if (params.first_frame.startsWith('gs://')) {
|
|
47
|
+
instance.image = { gcsUri: params.first_frame };
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const base64Data = await readImageAsBase64(params.first_frame);
|
|
51
|
+
instance.image = { bytesBase64Encoded: base64Data };
|
|
52
|
+
}
|
|
53
|
+
// Handle last frame
|
|
54
|
+
if (params.last_frame.startsWith('gs://')) {
|
|
55
|
+
instance.lastFrame = { gcsUri: params.last_frame };
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const base64Data = await readImageAsBase64(params.last_frame);
|
|
59
|
+
instance.lastFrame = { bytesBase64Encoded: base64Data };
|
|
60
|
+
}
|
|
61
|
+
// Build request parameters
|
|
62
|
+
// Note: generateAudio is NOT supported in Gemini API preview models
|
|
63
|
+
const parameters = {
|
|
64
|
+
durationSeconds
|
|
65
|
+
};
|
|
66
|
+
const request = {
|
|
67
|
+
instances: [instance],
|
|
68
|
+
parameters
|
|
69
|
+
};
|
|
70
|
+
debugLog('API Request', request);
|
|
71
|
+
// Make API call
|
|
72
|
+
const url = `${GEMINI_API_BASE_URL}/models/${model}:predictLongRunning?key=${apiKey}`;
|
|
73
|
+
const response = await fetch(url, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json'
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify(request)
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
const errorText = await response.text();
|
|
82
|
+
errorLog('API request failed', { status: response.status, error: errorText });
|
|
83
|
+
if (response.status === 401) {
|
|
84
|
+
return {
|
|
85
|
+
success: false,
|
|
86
|
+
error: 'Authentication failed. Please check your GOOGLE_API_KEY.'
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (response.status === 403) {
|
|
90
|
+
return {
|
|
91
|
+
success: false,
|
|
92
|
+
error: 'Access denied. Your API key may not have access to Veo 3.1.'
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
if (response.status === 429) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
error: 'Rate limit exceeded. Please try again later.'
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (response.status === 400) {
|
|
102
|
+
return {
|
|
103
|
+
success: false,
|
|
104
|
+
error: `Invalid frame images for interpolation. Details: ${errorText}`
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
error: `API request failed: ${response.status} ${response.statusText} - ${errorText}`
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const operationResponse = await response.json();
|
|
113
|
+
debugLog('Initial operation response', operationResponse);
|
|
114
|
+
const operationName = operationResponse.name;
|
|
115
|
+
// Calculate estimated cost
|
|
116
|
+
const estimatedCost = calculateCost(model, resolution, durationSeconds, generateAudio);
|
|
117
|
+
// Poll for completion
|
|
118
|
+
const pollInterval = parseInt(process.env.VIDEO_POLL_INTERVAL || '') || DEFAULT_POLL_INTERVAL;
|
|
119
|
+
const maxAttempts = parseInt(process.env.VIDEO_MAX_POLL_ATTEMPTS || '') || DEFAULT_MAX_POLL_ATTEMPTS;
|
|
120
|
+
const finalResponse = await pollVideoResult(operationName, apiKey, pollInterval, maxAttempts);
|
|
121
|
+
// Check for errors
|
|
122
|
+
if (finalResponse.error) {
|
|
123
|
+
return {
|
|
124
|
+
success: false,
|
|
125
|
+
operation_name: operationName,
|
|
126
|
+
error: finalResponse.error.message,
|
|
127
|
+
failure_reason: `Error code: ${finalResponse.error.code}`
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Extract video data
|
|
131
|
+
const videoData = extractVideoFromResponse(finalResponse);
|
|
132
|
+
if (!videoData) {
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
operation_name: operationName,
|
|
136
|
+
error: 'No video was generated. The content may have been filtered by safety policies.',
|
|
137
|
+
estimated_cost: estimatedCost
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Download and save if output path specified
|
|
141
|
+
let videoPath;
|
|
142
|
+
let videoUrl = videoData.url;
|
|
143
|
+
if (params.output_path || process.env.OUTPUT_DIR) {
|
|
144
|
+
const outputPath = params.output_path || generateDefaultOutputPath(process.env.OUTPUT_DIR || './output', 'veo3_interpolated');
|
|
145
|
+
try {
|
|
146
|
+
videoPath = await downloadAndSaveVideo(videoData.url, videoData.base64, outputPath);
|
|
147
|
+
debugLog('Interpolated video saved', { path: videoPath });
|
|
148
|
+
}
|
|
149
|
+
catch (downloadError) {
|
|
150
|
+
errorLog('Failed to save interpolated video', downloadError);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
success: true,
|
|
155
|
+
operation_name: operationName,
|
|
156
|
+
video_url: videoUrl,
|
|
157
|
+
video_path: videoPath ? getDisplayPath(videoPath) : undefined,
|
|
158
|
+
duration_seconds: durationSeconds,
|
|
159
|
+
estimated_cost: estimatedCost
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
errorLog('Frame interpolation failed', error);
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
error: error instanceof Error ? error.message : String(error)
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=interpolate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interpolate.js","sourceRoot":"","sources":["../../src/tools/interpolate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Processing Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
import type { Model, Resolution, AspectRatio, Duration, ReferenceImage } from './tools.js';
|
|
5
|
+
export type JobType = 'generate' | 'extend' | 'interpolate';
|
|
6
|
+
export interface BaseJob {
|
|
7
|
+
type?: JobType;
|
|
8
|
+
output_path?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface GenerateJob extends BaseJob {
|
|
11
|
+
type?: 'generate';
|
|
12
|
+
prompt: string;
|
|
13
|
+
model?: Model;
|
|
14
|
+
aspect_ratio?: AspectRatio;
|
|
15
|
+
resolution?: Resolution;
|
|
16
|
+
duration_seconds?: Duration | number;
|
|
17
|
+
generate_audio?: boolean;
|
|
18
|
+
negative_prompt?: string;
|
|
19
|
+
image?: string;
|
|
20
|
+
reference_images?: ReferenceImage[];
|
|
21
|
+
}
|
|
22
|
+
export interface ExtendJob extends BaseJob {
|
|
23
|
+
type: 'extend';
|
|
24
|
+
video: string;
|
|
25
|
+
prompt?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface InterpolateJob extends BaseJob {
|
|
28
|
+
type: 'interpolate';
|
|
29
|
+
first_frame: string;
|
|
30
|
+
last_frame: string;
|
|
31
|
+
prompt?: string;
|
|
32
|
+
duration_seconds?: Duration | number;
|
|
33
|
+
generate_audio?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type BatchJob = GenerateJob | ExtendJob | InterpolateJob;
|
|
36
|
+
export interface RetryPolicy {
|
|
37
|
+
max_retries: number;
|
|
38
|
+
retry_delay_ms: number;
|
|
39
|
+
retry_on_errors: string[];
|
|
40
|
+
}
|
|
41
|
+
export declare const DEFAULT_RETRY_POLICY: RetryPolicy;
|
|
42
|
+
export interface BatchConfig {
|
|
43
|
+
jobs: BatchJob[];
|
|
44
|
+
output_dir?: string;
|
|
45
|
+
default_model?: Model;
|
|
46
|
+
default_resolution?: Resolution;
|
|
47
|
+
default_aspect_ratio?: AspectRatio;
|
|
48
|
+
default_duration_seconds?: Duration | number;
|
|
49
|
+
default_generate_audio?: boolean;
|
|
50
|
+
max_concurrent?: number;
|
|
51
|
+
poll_interval?: number;
|
|
52
|
+
timeout?: number;
|
|
53
|
+
retry_policy?: RetryPolicy;
|
|
54
|
+
}
|
|
55
|
+
export interface BatchExecutionOptions {
|
|
56
|
+
outputDir: string;
|
|
57
|
+
maxConcurrent: number;
|
|
58
|
+
pollInterval: number;
|
|
59
|
+
timeout: number;
|
|
60
|
+
retryPolicy: RetryPolicy;
|
|
61
|
+
estimateOnly: boolean;
|
|
62
|
+
format: 'text' | 'json';
|
|
63
|
+
noAudio: boolean;
|
|
64
|
+
allowAnyPath: boolean;
|
|
65
|
+
}
|
|
66
|
+
export declare const DEFAULT_BATCH_OPTIONS: BatchExecutionOptions;
|
|
67
|
+
export interface JobResult {
|
|
68
|
+
index: number;
|
|
69
|
+
job: BatchJob;
|
|
70
|
+
success: boolean;
|
|
71
|
+
operation_name?: string;
|
|
72
|
+
video_url?: string;
|
|
73
|
+
video_path?: string;
|
|
74
|
+
estimated_cost?: number;
|
|
75
|
+
error?: string;
|
|
76
|
+
failure_reason?: string;
|
|
77
|
+
started_at?: Date;
|
|
78
|
+
completed_at?: Date;
|
|
79
|
+
duration_ms?: number;
|
|
80
|
+
retries?: number;
|
|
81
|
+
}
|
|
82
|
+
export interface BatchResult {
|
|
83
|
+
total_jobs: number;
|
|
84
|
+
successful: number;
|
|
85
|
+
failed: number;
|
|
86
|
+
cancelled: number;
|
|
87
|
+
total_estimated_cost: number;
|
|
88
|
+
jobs: JobResult[];
|
|
89
|
+
started_at: Date;
|
|
90
|
+
completed_at: Date;
|
|
91
|
+
duration_ms: number;
|
|
92
|
+
}
|
|
93
|
+
export interface JobCostEstimate {
|
|
94
|
+
index: number;
|
|
95
|
+
job_type: JobType;
|
|
96
|
+
model: Model;
|
|
97
|
+
resolution: Resolution;
|
|
98
|
+
duration_seconds: number;
|
|
99
|
+
generate_audio: boolean;
|
|
100
|
+
estimated_cost: number;
|
|
101
|
+
}
|
|
102
|
+
export interface BatchCostEstimate {
|
|
103
|
+
jobs: JobCostEstimate[];
|
|
104
|
+
total_estimated_cost: number;
|
|
105
|
+
total_duration_seconds: number;
|
|
106
|
+
}
|
|
107
|
+
export declare const BATCH_CONSTRAINTS: {
|
|
108
|
+
minJobs: number;
|
|
109
|
+
maxJobs: number;
|
|
110
|
+
minConcurrent: number;
|
|
111
|
+
maxConcurrent: number;
|
|
112
|
+
minTimeout: number;
|
|
113
|
+
maxTimeout: number;
|
|
114
|
+
minPollInterval: number;
|
|
115
|
+
maxPollInterval: number;
|
|
116
|
+
minRetries: number;
|
|
117
|
+
maxRetries: number;
|
|
118
|
+
minRetryDelay: number;
|
|
119
|
+
maxRetryDelay: number;
|
|
120
|
+
};
|
|
121
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/types/batch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batch Processing Type Definitions
|
|
3
|
+
*/
|
|
4
|
+
export const DEFAULT_RETRY_POLICY = {
|
|
5
|
+
max_retries: 2,
|
|
6
|
+
retry_delay_ms: 5000,
|
|
7
|
+
retry_on_errors: ['rate_limit', 'timeout', '429', '503', 'RESOURCE_EXHAUSTED']
|
|
8
|
+
};
|
|
9
|
+
export const DEFAULT_BATCH_OPTIONS = {
|
|
10
|
+
outputDir: './output',
|
|
11
|
+
maxConcurrent: 2,
|
|
12
|
+
pollInterval: 15000,
|
|
13
|
+
timeout: 1800000, // 30 minutes
|
|
14
|
+
retryPolicy: DEFAULT_RETRY_POLICY,
|
|
15
|
+
estimateOnly: false,
|
|
16
|
+
format: 'text',
|
|
17
|
+
noAudio: false,
|
|
18
|
+
allowAnyPath: false
|
|
19
|
+
};
|
|
20
|
+
// =============================================================================
|
|
21
|
+
// Validation Constraints
|
|
22
|
+
// =============================================================================
|
|
23
|
+
export const BATCH_CONSTRAINTS = {
|
|
24
|
+
minJobs: 1,
|
|
25
|
+
maxJobs: 100,
|
|
26
|
+
minConcurrent: 1,
|
|
27
|
+
maxConcurrent: 5,
|
|
28
|
+
minTimeout: 60000, // 1 minute
|
|
29
|
+
maxTimeout: 3600000, // 1 hour
|
|
30
|
+
minPollInterval: 5000, // 5 seconds
|
|
31
|
+
maxPollInterval: 60000, // 60 seconds
|
|
32
|
+
minRetries: 0,
|
|
33
|
+
maxRetries: 5,
|
|
34
|
+
minRetryDelay: 100,
|
|
35
|
+
maxRetryDelay: 60000
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=batch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.js","sourceRoot":"","sources":["../../src/types/batch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuDH,MAAM,CAAC,MAAM,oBAAoB,GAAgB;IAC/C,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,CAAC;CAC/E,CAAC;AAoCF,MAAM,CAAC,MAAM,qBAAqB,GAA0B;IAC1D,SAAS,EAAE,UAAU;IACrB,aAAa,EAAE,CAAC;IAChB,YAAY,EAAE,KAAK;IACnB,OAAO,EAAE,OAAO,EAAE,aAAa;IAC/B,WAAW,EAAE,oBAAoB;IACjC,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,YAAY,EAAE,KAAK;CACpB,CAAC;AA0DF,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,GAAG;IACZ,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,CAAC;IAChB,UAAU,EAAE,KAAK,EAAO,WAAW;IACnC,UAAU,EAAE,OAAO,EAAK,SAAS;IACjC,eAAe,EAAE,IAAI,EAAG,YAAY;IACpC,eAAe,EAAE,KAAK,EAAE,aAAa;IACrC,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,KAAK;CACrB,CAAC"}
|