digital-workers 2.1.3 → 2.3.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/CHANGELOG.md +9 -0
- package/README.md +2 -0
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +33 -21
- package/dist/actions.js.map +1 -1
- package/dist/agent-comms.d.ts.map +1 -1
- package/dist/agent-comms.js +36 -25
- package/dist/agent-comms.js.map +1 -1
- package/dist/approve.d.ts +40 -8
- package/dist/approve.d.ts.map +1 -1
- package/dist/approve.js +86 -20
- package/dist/approve.js.map +1 -1
- package/dist/ask.d.ts +38 -7
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +85 -25
- package/dist/ask.js.map +1 -1
- package/dist/browse.d.ts +223 -0
- package/dist/browse.d.ts.map +1 -0
- package/dist/browse.js +392 -0
- package/dist/browse.js.map +1 -0
- package/dist/capability-tiers.js +3 -3
- package/dist/capability-tiers.js.map +1 -1
- package/dist/cascade-context.d.ts +28 -28
- package/dist/client.d.ts +162 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +64 -0
- package/dist/client.js.map +1 -0
- package/dist/decide.d.ts +42 -6
- package/dist/decide.d.ts.map +1 -1
- package/dist/decide.js +54 -11
- package/dist/decide.js.map +1 -1
- package/dist/do.d.ts +36 -7
- package/dist/do.d.ts.map +1 -1
- package/dist/do.js +82 -39
- package/dist/do.js.map +1 -1
- package/dist/error-escalation.d.ts.map +1 -1
- package/dist/error-escalation.js +38 -38
- package/dist/error-escalation.js.map +1 -1
- package/dist/generate.d.ts +48 -7
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +49 -8
- package/dist/generate.js.map +1 -1
- package/dist/goals.d.ts +10 -9
- package/dist/goals.d.ts.map +1 -1
- package/dist/goals.js +30 -24
- package/dist/goals.js.map +1 -1
- package/dist/image.d.ts +189 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +528 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +49 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +58 -2
- package/dist/index.js.map +1 -1
- package/dist/is.d.ts +45 -10
- package/dist/is.d.ts.map +1 -1
- package/dist/is.js +56 -21
- package/dist/is.js.map +1 -1
- package/dist/kpis.d.ts +24 -15
- package/dist/kpis.d.ts.map +1 -1
- package/dist/kpis.js +16 -14
- package/dist/kpis.js.map +1 -1
- package/dist/load-balancing.d.ts.map +1 -1
- package/dist/load-balancing.js +124 -38
- package/dist/load-balancing.js.map +1 -1
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +39 -0
- package/dist/logger.js.map +1 -0
- package/dist/notify.d.ts +38 -9
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +72 -17
- package/dist/notify.js.map +1 -1
- package/dist/role.d.ts +5 -4
- package/dist/role.d.ts.map +1 -1
- package/dist/role.js +13 -10
- package/dist/role.js.map +1 -1
- package/dist/runtime.d.ts +310 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +510 -0
- package/dist/runtime.js.map +1 -0
- package/dist/team.d.ts +11 -6
- package/dist/team.d.ts.map +1 -1
- package/dist/team.js +22 -15
- package/dist/team.js.map +1 -1
- package/dist/transports/email.d.ts +318 -0
- package/dist/transports/email.d.ts.map +1 -0
- package/dist/transports/email.js +779 -0
- package/dist/transports/email.js.map +1 -0
- package/dist/transports/slack.d.ts +515 -0
- package/dist/transports/slack.d.ts.map +1 -0
- package/dist/transports/slack.js +844 -0
- package/dist/transports/slack.js.map +1 -0
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +44 -25
- package/dist/transports.js.map +1 -1
- package/dist/types.d.ts +141 -19
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/id.d.ts +19 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +21 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/video.d.ts +203 -0
- package/dist/video.d.ts.map +1 -0
- package/dist/video.js +528 -0
- package/dist/video.js.map +1 -0
- package/dist/worker.d.ts +343 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +698 -0
- package/dist/worker.js.map +1 -0
- package/package.json +32 -14
- package/src/actions.ts +39 -30
- package/src/agent-comms.ts +54 -92
- package/src/approve.ts +91 -20
- package/src/ask.ts +99 -25
- package/src/browse.ts +627 -0
- package/src/capability-tiers.ts +5 -5
- package/src/client.ts +221 -0
- package/src/decide.ts +81 -35
- package/src/do.ts +98 -52
- package/src/error-escalation.ts +55 -67
- package/src/generate.ts +52 -18
- package/src/goals.ts +36 -27
- package/src/image.ts +816 -0
- package/src/index.ts +187 -2
- package/src/is.ts +59 -25
- package/src/kpis.ts +41 -36
- package/src/load-balancing.ts +132 -46
- package/src/logger.ts +93 -0
- package/src/notify.ts +78 -17
- package/src/role.ts +30 -20
- package/src/runtime.ts +796 -0
- package/src/team.ts +24 -19
- package/src/transports/email.ts +1160 -0
- package/src/transports/slack.ts +1320 -0
- package/src/transports.ts +58 -43
- package/src/types.ts +174 -46
- package/src/utils/id.ts +21 -0
- package/src/video.ts +906 -0
- package/src/worker.ts +1007 -0
- package/test/approve.test.ts +305 -0
- package/test/ask.test.ts +274 -0
- package/test/browse.test.ts +361 -0
- package/test/decide.test.ts +252 -0
- package/test/do.test.ts +144 -0
- package/test/error-logging.test.ts +357 -0
- package/test/generate.test.ts +319 -0
- package/test/image.test.ts +398 -0
- package/test/is.test.ts +287 -0
- package/test/load-balancing-safety.test.ts +404 -0
- package/test/notify.test.ts +434 -0
- package/test/primitives.test.ts +320 -0
- package/test/runtime-integration.test.ts +892 -0
- package/test/transports/crypto.test.ts +230 -0
- package/test/transports/email.test.ts +866 -0
- package/test/transports/id-generation.test.ts +91 -0
- package/test/transports/slack.test.ts +760 -0
- package/test/type-safety.test.ts +834 -0
- package/test/types.test.ts +60 -2
- package/test/video.test.ts +530 -0
- package/test/worker.test.ts +1433 -0
- package/tsconfig.json +4 -1
- package/vitest.config.ts +42 -0
- package/wrangler.jsonc +36 -0
- package/.turbo/turbo-build.log +0 -4
- package/LICENSE +0 -21
- package/src/actions.js +0 -436
- package/src/approve.js +0 -234
- package/src/ask.js +0 -226
- package/src/decide.js +0 -244
- package/src/do.js +0 -227
- package/src/generate.js +0 -298
- package/src/goals.js +0 -205
- package/src/index.js +0 -68
- package/src/is.js +0 -317
- package/src/kpis.js +0 -270
- package/src/notify.js +0 -219
- package/src/role.js +0 -110
- package/src/team.js +0 -130
- package/src/transports.js +0 -357
- package/src/types.js +0 -71
package/dist/video.js
ADDED
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Video generation functionality for digital workers
|
|
3
|
+
*
|
|
4
|
+
* This module provides video generation within a worker context,
|
|
5
|
+
* supporting various AI video generation models (Runway, Pika, etc.)
|
|
6
|
+
* with rich metadata about the generation process.
|
|
7
|
+
*
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Helper Functions
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Build metadata object, only including defined optional fields
|
|
15
|
+
*/
|
|
16
|
+
function buildMetadata(model, duration, resolution, fps, aspectRatio, generationTime, optionals = {}) {
|
|
17
|
+
const metadata = {
|
|
18
|
+
model,
|
|
19
|
+
duration,
|
|
20
|
+
resolution,
|
|
21
|
+
fps,
|
|
22
|
+
aspectRatio,
|
|
23
|
+
generationTime,
|
|
24
|
+
};
|
|
25
|
+
if (optionals.fileSize !== undefined)
|
|
26
|
+
metadata.fileSize = optionals.fileSize;
|
|
27
|
+
if (optionals.format !== undefined)
|
|
28
|
+
metadata.format = optionals.format;
|
|
29
|
+
if (optionals.style !== undefined)
|
|
30
|
+
metadata.style = optionals.style;
|
|
31
|
+
if (optionals.seed !== undefined)
|
|
32
|
+
metadata.seed = optionals.seed;
|
|
33
|
+
if (optionals.cost !== undefined)
|
|
34
|
+
metadata.cost = optionals.cost;
|
|
35
|
+
return metadata;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the worker URL for video generation based on model
|
|
39
|
+
*/
|
|
40
|
+
function resolveVideoWorkerUrl(model) {
|
|
41
|
+
// Map models to their respective worker endpoints
|
|
42
|
+
const workerMap = {
|
|
43
|
+
'runway-gen3': 'https://video.workers.do/runway/gen3',
|
|
44
|
+
'runway-gen2': 'https://video.workers.do/runway/gen2',
|
|
45
|
+
'pika-1.0': 'https://video.workers.do/pika/1.0',
|
|
46
|
+
'pika-1.5': 'https://video.workers.do/pika/1.5',
|
|
47
|
+
'stable-video': 'https://video.workers.do/stability/svd',
|
|
48
|
+
minimax: 'https://video.workers.do/minimax',
|
|
49
|
+
kling: 'https://video.workers.do/kling',
|
|
50
|
+
luma: 'https://video.workers.do/luma',
|
|
51
|
+
};
|
|
52
|
+
// Check for custom endpoint in environment
|
|
53
|
+
const customEndpoint = typeof globalThis !== 'undefined' && 'process' in globalThis
|
|
54
|
+
? globalThis.process?.env?.['VIDEO_WORKER_URL']
|
|
55
|
+
: undefined;
|
|
56
|
+
if (customEndpoint) {
|
|
57
|
+
return customEndpoint;
|
|
58
|
+
}
|
|
59
|
+
return workerMap[model] || `https://video.workers.do/${model}`;
|
|
60
|
+
}
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Video Generation Function
|
|
63
|
+
// ============================================================================
|
|
64
|
+
/**
|
|
65
|
+
* Generate a video from a text prompt.
|
|
66
|
+
*
|
|
67
|
+
* Creates AI-generated video content using models like Runway, Pika,
|
|
68
|
+
* Stable Video, and others. Returns the video URL with rich metadata
|
|
69
|
+
* about the generation process.
|
|
70
|
+
*
|
|
71
|
+
* @param prompt - Text description of the video to generate
|
|
72
|
+
* @param options - Generation options (duration, fps, resolution, model, etc.)
|
|
73
|
+
* @returns Promise resolving to VideoResult with URL and metadata
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```ts
|
|
77
|
+
* // Basic video generation
|
|
78
|
+
* const result = await video('A serene mountain lake at sunset with gentle ripples')
|
|
79
|
+
* console.log(result.url) // URL of generated video
|
|
80
|
+
* console.log(result.metadata.duration) // Video duration in seconds
|
|
81
|
+
* ```
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```ts
|
|
85
|
+
* // With options
|
|
86
|
+
* const result = await video('A futuristic city with flying cars', {
|
|
87
|
+
* duration: 8,
|
|
88
|
+
* resolution: '4k',
|
|
89
|
+
* style: 'cinematic',
|
|
90
|
+
* model: 'runway-gen3',
|
|
91
|
+
* motion: 'dolly',
|
|
92
|
+
* })
|
|
93
|
+
* ```
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* // With negative prompt
|
|
98
|
+
* const result = await video('A happy golden retriever playing in a park', {
|
|
99
|
+
* negativePrompt: 'blurry, distorted, extra limbs',
|
|
100
|
+
* guidance: 12,
|
|
101
|
+
* })
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export async function video(prompt, options = {}) {
|
|
105
|
+
const { duration = 4, fps = 24, resolution = '1080p', aspectRatio = '16:9', style, model = 'runway-gen3', negativePrompt, guidance, seed, motion, motionIntensity, loop, modelParams, } = options;
|
|
106
|
+
const startTime = Date.now();
|
|
107
|
+
// Build the worker URL for video generation
|
|
108
|
+
const workerUrl = resolveVideoWorkerUrl(model);
|
|
109
|
+
try {
|
|
110
|
+
const response = await fetch(workerUrl, {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
headers: {
|
|
113
|
+
'Content-Type': 'application/json',
|
|
114
|
+
},
|
|
115
|
+
body: JSON.stringify({
|
|
116
|
+
prompt,
|
|
117
|
+
duration,
|
|
118
|
+
fps,
|
|
119
|
+
resolution,
|
|
120
|
+
aspectRatio,
|
|
121
|
+
style,
|
|
122
|
+
model,
|
|
123
|
+
negativePrompt,
|
|
124
|
+
guidance,
|
|
125
|
+
seed,
|
|
126
|
+
motion,
|
|
127
|
+
motionIntensity,
|
|
128
|
+
loop,
|
|
129
|
+
...modelParams,
|
|
130
|
+
}),
|
|
131
|
+
});
|
|
132
|
+
if (!response.ok) {
|
|
133
|
+
const errorText = await response.text();
|
|
134
|
+
throw new Error(`Video generation failed: ${response.status} - ${errorText}`);
|
|
135
|
+
}
|
|
136
|
+
const data = (await response.json());
|
|
137
|
+
const optionals = {
|
|
138
|
+
format: data.format || 'mp4',
|
|
139
|
+
};
|
|
140
|
+
if (data.fileSize !== undefined)
|
|
141
|
+
optionals.fileSize = data.fileSize;
|
|
142
|
+
if (style !== undefined)
|
|
143
|
+
optionals.style = style;
|
|
144
|
+
if (data.seed !== undefined)
|
|
145
|
+
optionals.seed = data.seed;
|
|
146
|
+
else if (seed !== undefined)
|
|
147
|
+
optionals.seed = seed;
|
|
148
|
+
if (data.cost !== undefined)
|
|
149
|
+
optionals.cost = data.cost;
|
|
150
|
+
const result = {
|
|
151
|
+
url: data.url,
|
|
152
|
+
prompt,
|
|
153
|
+
metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime, optionals),
|
|
154
|
+
status: 'completed',
|
|
155
|
+
};
|
|
156
|
+
if (data.thumbnail)
|
|
157
|
+
result.thumbnail = data.thumbnail;
|
|
158
|
+
if (data.preview)
|
|
159
|
+
result.preview = data.preview;
|
|
160
|
+
return result;
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
const result = {
|
|
164
|
+
url: '',
|
|
165
|
+
prompt,
|
|
166
|
+
metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime),
|
|
167
|
+
status: 'failed',
|
|
168
|
+
error: error instanceof Error ? error.message : String(error),
|
|
169
|
+
};
|
|
170
|
+
return result;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
// ============================================================================
|
|
174
|
+
// Helper Methods
|
|
175
|
+
// ============================================================================
|
|
176
|
+
/**
|
|
177
|
+
* Generate a video from a static image.
|
|
178
|
+
*
|
|
179
|
+
* Animates a source image based on a motion prompt, bringing still
|
|
180
|
+
* images to life with AI-generated animation.
|
|
181
|
+
*
|
|
182
|
+
* @param imageUrl - URL of the source image
|
|
183
|
+
* @param prompt - Text description of the desired motion/animation
|
|
184
|
+
* @param options - Additional generation options
|
|
185
|
+
* @returns Promise resolving to VideoResult
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```ts
|
|
189
|
+
* const result = await video.fromImage(
|
|
190
|
+
* 'https://example.com/landscape.jpg',
|
|
191
|
+
* 'Camera slowly pans across the scene, clouds drift by',
|
|
192
|
+
* { duration: 6, imageFidelity: 0.8 }
|
|
193
|
+
* )
|
|
194
|
+
* ```
|
|
195
|
+
*/
|
|
196
|
+
video.fromImage = async function fromImage(imageUrl, prompt, options = {}) {
|
|
197
|
+
const { duration = 4, fps = 24, resolution = '1080p', aspectRatio = '16:9', style, model = 'runway-gen3', imageFidelity = 0.7, motion, motionIntensity, } = options;
|
|
198
|
+
const startTime = Date.now();
|
|
199
|
+
const workerUrl = resolveVideoWorkerUrl(model);
|
|
200
|
+
try {
|
|
201
|
+
const response = await fetch(workerUrl, {
|
|
202
|
+
method: 'POST',
|
|
203
|
+
headers: {
|
|
204
|
+
'Content-Type': 'application/json',
|
|
205
|
+
},
|
|
206
|
+
body: JSON.stringify({
|
|
207
|
+
mode: 'image-to-video',
|
|
208
|
+
imageUrl,
|
|
209
|
+
prompt,
|
|
210
|
+
duration,
|
|
211
|
+
fps,
|
|
212
|
+
resolution,
|
|
213
|
+
aspectRatio,
|
|
214
|
+
style,
|
|
215
|
+
model,
|
|
216
|
+
imageFidelity,
|
|
217
|
+
motion,
|
|
218
|
+
motionIntensity,
|
|
219
|
+
}),
|
|
220
|
+
});
|
|
221
|
+
if (!response.ok) {
|
|
222
|
+
const errorText = await response.text();
|
|
223
|
+
throw new Error(`Image-to-video generation failed: ${response.status} - ${errorText}`);
|
|
224
|
+
}
|
|
225
|
+
const data = (await response.json());
|
|
226
|
+
const optionals = {
|
|
227
|
+
format: data.format || 'mp4',
|
|
228
|
+
};
|
|
229
|
+
if (data.fileSize !== undefined)
|
|
230
|
+
optionals.fileSize = data.fileSize;
|
|
231
|
+
if (style !== undefined)
|
|
232
|
+
optionals.style = style;
|
|
233
|
+
if (data.seed !== undefined)
|
|
234
|
+
optionals.seed = data.seed;
|
|
235
|
+
if (data.cost !== undefined)
|
|
236
|
+
optionals.cost = data.cost;
|
|
237
|
+
const result = {
|
|
238
|
+
url: data.url,
|
|
239
|
+
prompt,
|
|
240
|
+
metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime, optionals),
|
|
241
|
+
status: 'completed',
|
|
242
|
+
};
|
|
243
|
+
if (data.thumbnail)
|
|
244
|
+
result.thumbnail = data.thumbnail;
|
|
245
|
+
if (data.preview)
|
|
246
|
+
result.preview = data.preview;
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
return {
|
|
251
|
+
url: '',
|
|
252
|
+
prompt,
|
|
253
|
+
metadata: buildMetadata(model, duration, resolution, fps, aspectRatio, Date.now() - startTime),
|
|
254
|
+
status: 'failed',
|
|
255
|
+
error: error instanceof Error ? error.message : String(error),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
/**
|
|
260
|
+
* Extend an existing video by generating additional frames.
|
|
261
|
+
*
|
|
262
|
+
* Continues a video seamlessly by generating new content that
|
|
263
|
+
* matches the style and content of the original.
|
|
264
|
+
*
|
|
265
|
+
* @param videoUrl - URL of the source video
|
|
266
|
+
* @param duration - Additional duration in seconds to add
|
|
267
|
+
* @param options - Extension options
|
|
268
|
+
* @returns Promise resolving to VideoResult with extended video
|
|
269
|
+
*
|
|
270
|
+
* @example
|
|
271
|
+
* ```ts
|
|
272
|
+
* // Extend video by 4 more seconds
|
|
273
|
+
* const result = await video.extend(
|
|
274
|
+
* 'https://example.com/short-clip.mp4',
|
|
275
|
+
* 4
|
|
276
|
+
* )
|
|
277
|
+
* ```
|
|
278
|
+
*
|
|
279
|
+
* @example
|
|
280
|
+
* ```ts
|
|
281
|
+
* // Extend with a prompt hint
|
|
282
|
+
* const result = await video.extend(
|
|
283
|
+
* 'https://example.com/scene.mp4',
|
|
284
|
+
* 6,
|
|
285
|
+
* { prompt: 'The character turns and walks away', direction: 'forward' }
|
|
286
|
+
* )
|
|
287
|
+
* ```
|
|
288
|
+
*/
|
|
289
|
+
video.extend = async function extend(videoUrl, duration, options = {}) {
|
|
290
|
+
const { prompt, direction = 'forward', overlap = 4 } = options;
|
|
291
|
+
const startTime = Date.now();
|
|
292
|
+
const workerUrl = resolveVideoWorkerUrl('runway-gen3');
|
|
293
|
+
try {
|
|
294
|
+
const response = await fetch(workerUrl, {
|
|
295
|
+
method: 'POST',
|
|
296
|
+
headers: {
|
|
297
|
+
'Content-Type': 'application/json',
|
|
298
|
+
},
|
|
299
|
+
body: JSON.stringify({
|
|
300
|
+
mode: 'extend',
|
|
301
|
+
videoUrl,
|
|
302
|
+
duration,
|
|
303
|
+
prompt,
|
|
304
|
+
direction,
|
|
305
|
+
overlap,
|
|
306
|
+
}),
|
|
307
|
+
});
|
|
308
|
+
if (!response.ok) {
|
|
309
|
+
const errorText = await response.text();
|
|
310
|
+
throw new Error(`Video extension failed: ${response.status} - ${errorText}`);
|
|
311
|
+
}
|
|
312
|
+
const data = (await response.json());
|
|
313
|
+
const resultPrompt = prompt || 'Extended video';
|
|
314
|
+
const optionals = {
|
|
315
|
+
format: data.format || 'mp4',
|
|
316
|
+
};
|
|
317
|
+
if (data.fileSize !== undefined)
|
|
318
|
+
optionals.fileSize = data.fileSize;
|
|
319
|
+
if (data.cost !== undefined)
|
|
320
|
+
optionals.cost = data.cost;
|
|
321
|
+
const result = {
|
|
322
|
+
url: data.url,
|
|
323
|
+
prompt: resultPrompt,
|
|
324
|
+
metadata: buildMetadata('runway-gen3', data.totalDuration || duration, '1080p', 24, '16:9', Date.now() - startTime, optionals),
|
|
325
|
+
status: 'completed',
|
|
326
|
+
};
|
|
327
|
+
if (data.thumbnail)
|
|
328
|
+
result.thumbnail = data.thumbnail;
|
|
329
|
+
if (data.preview)
|
|
330
|
+
result.preview = data.preview;
|
|
331
|
+
return result;
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
return {
|
|
335
|
+
url: '',
|
|
336
|
+
prompt: prompt || 'Extended video',
|
|
337
|
+
metadata: buildMetadata('runway-gen3', duration, '1080p', 24, '16:9', Date.now() - startTime),
|
|
338
|
+
status: 'failed',
|
|
339
|
+
error: error instanceof Error ? error.message : String(error),
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
/**
|
|
344
|
+
* Edit an existing video using AI.
|
|
345
|
+
*
|
|
346
|
+
* Modifies a video based on a text prompt, allowing for
|
|
347
|
+
* style changes, object removal/addition, and other edits.
|
|
348
|
+
*
|
|
349
|
+
* @param videoUrl - URL of the video to edit
|
|
350
|
+
* @param prompt - Text description of the desired edits
|
|
351
|
+
* @param options - Edit options
|
|
352
|
+
* @returns Promise resolving to VideoResult with edited video
|
|
353
|
+
*
|
|
354
|
+
* @example
|
|
355
|
+
* ```ts
|
|
356
|
+
* // Change the style of a video
|
|
357
|
+
* const result = await video.edit(
|
|
358
|
+
* 'https://example.com/original.mp4',
|
|
359
|
+
* 'Make it look like a vintage 1970s film'
|
|
360
|
+
* )
|
|
361
|
+
* ```
|
|
362
|
+
*
|
|
363
|
+
* @example
|
|
364
|
+
* ```ts
|
|
365
|
+
* // Edit with mask
|
|
366
|
+
* const result = await video.edit(
|
|
367
|
+
* 'https://example.com/scene.mp4',
|
|
368
|
+
* 'Replace the car with a spaceship',
|
|
369
|
+
* { maskUrl: 'https://example.com/car-mask.png', strength: 0.9 }
|
|
370
|
+
* )
|
|
371
|
+
* ```
|
|
372
|
+
*/
|
|
373
|
+
video.edit = async function edit(videoUrl, prompt, options = {}) {
|
|
374
|
+
const { region, maskUrl, strength = 0.7, preserveAudio = true } = options;
|
|
375
|
+
const startTime = Date.now();
|
|
376
|
+
const workerUrl = resolveVideoWorkerUrl('runway-gen3');
|
|
377
|
+
try {
|
|
378
|
+
const response = await fetch(workerUrl, {
|
|
379
|
+
method: 'POST',
|
|
380
|
+
headers: {
|
|
381
|
+
'Content-Type': 'application/json',
|
|
382
|
+
},
|
|
383
|
+
body: JSON.stringify({
|
|
384
|
+
mode: 'edit',
|
|
385
|
+
videoUrl,
|
|
386
|
+
prompt,
|
|
387
|
+
region,
|
|
388
|
+
maskUrl,
|
|
389
|
+
strength,
|
|
390
|
+
preserveAudio,
|
|
391
|
+
}),
|
|
392
|
+
});
|
|
393
|
+
if (!response.ok) {
|
|
394
|
+
const errorText = await response.text();
|
|
395
|
+
throw new Error(`Video editing failed: ${response.status} - ${errorText}`);
|
|
396
|
+
}
|
|
397
|
+
const data = (await response.json());
|
|
398
|
+
const optionals = {
|
|
399
|
+
format: data.format || 'mp4',
|
|
400
|
+
};
|
|
401
|
+
if (data.fileSize !== undefined)
|
|
402
|
+
optionals.fileSize = data.fileSize;
|
|
403
|
+
if (data.cost !== undefined)
|
|
404
|
+
optionals.cost = data.cost;
|
|
405
|
+
const result = {
|
|
406
|
+
url: data.url,
|
|
407
|
+
prompt,
|
|
408
|
+
metadata: buildMetadata('runway-gen3', data.duration || 4, '1080p', 24, '16:9', Date.now() - startTime, optionals),
|
|
409
|
+
status: 'completed',
|
|
410
|
+
};
|
|
411
|
+
if (data.thumbnail)
|
|
412
|
+
result.thumbnail = data.thumbnail;
|
|
413
|
+
if (data.preview)
|
|
414
|
+
result.preview = data.preview;
|
|
415
|
+
return result;
|
|
416
|
+
}
|
|
417
|
+
catch (error) {
|
|
418
|
+
return {
|
|
419
|
+
url: '',
|
|
420
|
+
prompt,
|
|
421
|
+
metadata: buildMetadata('runway-gen3', 4, '1080p', 24, '16:9', Date.now() - startTime),
|
|
422
|
+
status: 'failed',
|
|
423
|
+
error: error instanceof Error ? error.message : String(error),
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
/**
|
|
428
|
+
* Create a video generator with a preset style.
|
|
429
|
+
*
|
|
430
|
+
* Returns a function that generates videos with the specified
|
|
431
|
+
* style pre-applied. Useful for maintaining consistent aesthetics.
|
|
432
|
+
*
|
|
433
|
+
* @param style - Style preset to apply to all generated videos
|
|
434
|
+
* @returns Function that generates styled videos
|
|
435
|
+
*
|
|
436
|
+
* @example
|
|
437
|
+
* ```ts
|
|
438
|
+
* // Create a cinematic video generator
|
|
439
|
+
* const cinematicVideo = video.style('cinematic')
|
|
440
|
+
*
|
|
441
|
+
* const result1 = await cinematicVideo('A dramatic sunset over the ocean')
|
|
442
|
+
* const result2 = await cinematicVideo('A hero walking into the distance')
|
|
443
|
+
* // Both will have cinematic style applied
|
|
444
|
+
* ```
|
|
445
|
+
*
|
|
446
|
+
* @example
|
|
447
|
+
* ```ts
|
|
448
|
+
* // Chain with other options
|
|
449
|
+
* const animeVideo = video.style('anime')
|
|
450
|
+
* const result = await animeVideo('A magical girl transformation sequence', {
|
|
451
|
+
* duration: 8,
|
|
452
|
+
* resolution: '4k',
|
|
453
|
+
* })
|
|
454
|
+
* ```
|
|
455
|
+
*/
|
|
456
|
+
video.style = function style(stylePreset) {
|
|
457
|
+
return function styledVideo(prompt, options = {}) {
|
|
458
|
+
return video(prompt, { ...options, style: stylePreset });
|
|
459
|
+
};
|
|
460
|
+
};
|
|
461
|
+
/**
|
|
462
|
+
* Generate multiple video variations from the same prompt.
|
|
463
|
+
*
|
|
464
|
+
* @param prompt - Text description of the video
|
|
465
|
+
* @param count - Number of variations to generate
|
|
466
|
+
* @param options - Generation options
|
|
467
|
+
* @returns Promise resolving to array of VideoResults
|
|
468
|
+
*
|
|
469
|
+
* @example
|
|
470
|
+
* ```ts
|
|
471
|
+
* const variations = await video.variations(
|
|
472
|
+
* 'A cat playing with a ball of yarn',
|
|
473
|
+
* 3,
|
|
474
|
+
* { duration: 4 }
|
|
475
|
+
* )
|
|
476
|
+
*
|
|
477
|
+
* variations.forEach((v, i) => {
|
|
478
|
+
* console.log(`Variation ${i + 1}: ${v.url}`)
|
|
479
|
+
* })
|
|
480
|
+
* ```
|
|
481
|
+
*/
|
|
482
|
+
video.variations = async function variations(prompt, count, options = {}) {
|
|
483
|
+
const results = await Promise.all(Array.from({ length: count }, (_, i) => video(prompt, {
|
|
484
|
+
...options,
|
|
485
|
+
// Use different seeds for variations
|
|
486
|
+
seed: options.seed !== undefined ? options.seed + i : Math.floor(Math.random() * 1000000) + i,
|
|
487
|
+
})));
|
|
488
|
+
return results;
|
|
489
|
+
};
|
|
490
|
+
/**
|
|
491
|
+
* Generate video with specific camera motion.
|
|
492
|
+
*
|
|
493
|
+
* @param prompt - Text description of the scene
|
|
494
|
+
* @param motion - Camera motion type
|
|
495
|
+
* @param options - Additional generation options
|
|
496
|
+
* @returns Promise resolving to VideoResult
|
|
497
|
+
*
|
|
498
|
+
* @example
|
|
499
|
+
* ```ts
|
|
500
|
+
* const result = await video.withMotion(
|
|
501
|
+
* 'A beautiful landscape',
|
|
502
|
+
* 'dolly',
|
|
503
|
+
* { motionIntensity: 0.5 }
|
|
504
|
+
* )
|
|
505
|
+
* ```
|
|
506
|
+
*/
|
|
507
|
+
video.withMotion = async function withMotion(prompt, motion, options = {}) {
|
|
508
|
+
return video(prompt, { ...options, motion });
|
|
509
|
+
};
|
|
510
|
+
/**
|
|
511
|
+
* Generate a looping video (perfect for backgrounds, GIFs).
|
|
512
|
+
*
|
|
513
|
+
* @param prompt - Text description of the video
|
|
514
|
+
* @param options - Generation options
|
|
515
|
+
* @returns Promise resolving to VideoResult with looping video
|
|
516
|
+
*
|
|
517
|
+
* @example
|
|
518
|
+
* ```ts
|
|
519
|
+
* const result = await video.loop(
|
|
520
|
+
* 'Gently swaying grass in the wind',
|
|
521
|
+
* { duration: 3 }
|
|
522
|
+
* )
|
|
523
|
+
* ```
|
|
524
|
+
*/
|
|
525
|
+
video.loop = async function loop(prompt, options = {}) {
|
|
526
|
+
return video(prompt, { ...options, loop: true });
|
|
527
|
+
};
|
|
528
|
+
//# sourceMappingURL=video.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../src/video.ts"],"names":[],"mappings":"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"}
|