@pixeldojo/mcp 0.20.0 → 0.22.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 +4 -2
- package/dist/cli.cjs +267 -94
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +267 -94
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +265 -94
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +265 -94
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1250,6 +1250,169 @@ var init_upscale = __esm({
|
|
|
1250
1250
|
}
|
|
1251
1251
|
});
|
|
1252
1252
|
async function run6(input, ctx) {
|
|
1253
|
+
const submitted = await ctx.client.run(MODEL, {
|
|
1254
|
+
prompt: "",
|
|
1255
|
+
video: input.video_url,
|
|
1256
|
+
...input.style ? { caption_style: input.style } : {},
|
|
1257
|
+
...input.highlight_color ? { highlight_color: input.highlight_color } : {}
|
|
1258
|
+
});
|
|
1259
|
+
const result = await pollJobUntilDoneOrHandoff(
|
|
1260
|
+
submitted.jobId,
|
|
1261
|
+
(id) => ctx.client.getJob(id),
|
|
1262
|
+
ctx.buildStatusUrl,
|
|
1263
|
+
{ now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep }
|
|
1264
|
+
);
|
|
1265
|
+
return pollResultToSkillResult(
|
|
1266
|
+
result,
|
|
1267
|
+
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Captioned. Asset: ${urls[0]}`
|
|
1268
|
+
);
|
|
1269
|
+
}
|
|
1270
|
+
var MODEL, STYLES, InputSchema6, InputJsonSchema6, captionSkill;
|
|
1271
|
+
var init_caption = __esm({
|
|
1272
|
+
"src/skills/caption.ts"() {
|
|
1273
|
+
init_poll();
|
|
1274
|
+
init_types();
|
|
1275
|
+
MODEL = "video-autocaption";
|
|
1276
|
+
STYLES = ["pop", "highlighter", "clean"];
|
|
1277
|
+
InputSchema6 = zod.z.object({
|
|
1278
|
+
video_url: zod.z.string().url().describe("URL of the video to caption. It must have speech."),
|
|
1279
|
+
style: zod.z.enum(STYLES).optional(),
|
|
1280
|
+
highlight_color: zod.z.string().optional()
|
|
1281
|
+
});
|
|
1282
|
+
InputJsonSchema6 = {
|
|
1283
|
+
type: "object",
|
|
1284
|
+
required: ["video_url"],
|
|
1285
|
+
properties: {
|
|
1286
|
+
video_url: {
|
|
1287
|
+
type: "string",
|
|
1288
|
+
format: "uri",
|
|
1289
|
+
description: "The video to caption (MP4 or MOV). It must have speech; a silent clip is refused uncharged."
|
|
1290
|
+
},
|
|
1291
|
+
style: {
|
|
1292
|
+
type: "string",
|
|
1293
|
+
enum: STYLES,
|
|
1294
|
+
description: "pop (default): bold caps, the spoken word lit and growing. highlighter: the spoken word on a block of the color. clean: sentence case on a dark box."
|
|
1295
|
+
},
|
|
1296
|
+
highlight_color: {
|
|
1297
|
+
type: "string",
|
|
1298
|
+
description: "The highlight as #RRGGBB (a brand color) or a name like yellow, green, pink. Defaults to yellow."
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
};
|
|
1302
|
+
captionSkill = {
|
|
1303
|
+
name: "pixeldojo_caption",
|
|
1304
|
+
description: "Burn animated word-by-word captions onto a video with speech, the short-form look for TikTok, Reels and Shorts: the spoken word lights up, placed above the platform buttons. Pass video_url; optional style (pop, highlighter, clean) and highlight_color (#RRGGBB for a brand color). 5 credits.",
|
|
1305
|
+
inputZod: InputSchema6,
|
|
1306
|
+
inputJsonSchema: InputJsonSchema6,
|
|
1307
|
+
allowedModels: [MODEL],
|
|
1308
|
+
defaultModel: MODEL,
|
|
1309
|
+
run: run6
|
|
1310
|
+
};
|
|
1311
|
+
}
|
|
1312
|
+
});
|
|
1313
|
+
async function run7(input, ctx) {
|
|
1314
|
+
if (!input.offer && !input.end_card) {
|
|
1315
|
+
return { kind: "text", text: "pixeldojo_overlay needs an offer, an end_card, or both." };
|
|
1316
|
+
}
|
|
1317
|
+
const { offer, end_card: card } = input;
|
|
1318
|
+
const submitted = await ctx.client.run(MODEL2, {
|
|
1319
|
+
prompt: "",
|
|
1320
|
+
video: input.video_url,
|
|
1321
|
+
...input.color ? { color: input.color } : {},
|
|
1322
|
+
...offer ? {
|
|
1323
|
+
offer_text: offer.text,
|
|
1324
|
+
offer_subtext: offer.subtext,
|
|
1325
|
+
offer_start: offer.start_sec,
|
|
1326
|
+
offer_duration: offer.duration_sec,
|
|
1327
|
+
offer_position: offer.position
|
|
1328
|
+
} : {},
|
|
1329
|
+
...card ? {
|
|
1330
|
+
end_headline: card.headline,
|
|
1331
|
+
end_cta: card.cta,
|
|
1332
|
+
end_url: card.url,
|
|
1333
|
+
logo_url: card.logo_url,
|
|
1334
|
+
end_duration: card.duration_sec
|
|
1335
|
+
} : {}
|
|
1336
|
+
});
|
|
1337
|
+
const result = await pollJobUntilDoneOrHandoff(
|
|
1338
|
+
submitted.jobId,
|
|
1339
|
+
(id) => ctx.client.getJob(id),
|
|
1340
|
+
ctx.buildStatusUrl,
|
|
1341
|
+
{ now: ctx.pollOverrides?.now, sleep: ctx.pollOverrides?.sleep }
|
|
1342
|
+
);
|
|
1343
|
+
return pollResultToSkillResult(
|
|
1344
|
+
result,
|
|
1345
|
+
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Branded. Asset: ${urls[0]}`
|
|
1346
|
+
);
|
|
1347
|
+
}
|
|
1348
|
+
var MODEL2, InputSchema7, InputJsonSchema7, overlaySkill;
|
|
1349
|
+
var init_overlay = __esm({
|
|
1350
|
+
"src/skills/overlay.ts"() {
|
|
1351
|
+
init_poll();
|
|
1352
|
+
init_types();
|
|
1353
|
+
MODEL2 = "brand-overlay";
|
|
1354
|
+
InputSchema7 = zod.z.object({
|
|
1355
|
+
video_url: zod.z.string().url(),
|
|
1356
|
+
color: zod.z.string().optional(),
|
|
1357
|
+
offer: zod.z.object({
|
|
1358
|
+
text: zod.z.string().max(24),
|
|
1359
|
+
subtext: zod.z.string().max(40).optional(),
|
|
1360
|
+
start_sec: zod.z.number().min(0).optional(),
|
|
1361
|
+
duration_sec: zod.z.number().min(1).max(10).optional(),
|
|
1362
|
+
position: zod.z.enum(["top", "bottom"]).optional()
|
|
1363
|
+
}).optional(),
|
|
1364
|
+
end_card: zod.z.object({
|
|
1365
|
+
headline: zod.z.string().max(40),
|
|
1366
|
+
cta: zod.z.string().max(24).optional(),
|
|
1367
|
+
url: zod.z.string().max(40).optional(),
|
|
1368
|
+
logo_url: zod.z.string().url().optional(),
|
|
1369
|
+
duration_sec: zod.z.number().min(2).max(5).optional()
|
|
1370
|
+
}).optional()
|
|
1371
|
+
});
|
|
1372
|
+
InputJsonSchema7 = {
|
|
1373
|
+
type: "object",
|
|
1374
|
+
required: ["video_url"],
|
|
1375
|
+
properties: {
|
|
1376
|
+
video_url: { type: "string", format: "uri", description: "The video to brand (MP4 or MOV)." },
|
|
1377
|
+
color: { type: "string", description: "Brand color as #RRGGBB: the badge and the button. Defaults to #FFE500." },
|
|
1378
|
+
offer: {
|
|
1379
|
+
type: "object",
|
|
1380
|
+
description: "Offer callout: a badge that pops in on cue.",
|
|
1381
|
+
required: ["text"],
|
|
1382
|
+
properties: {
|
|
1383
|
+
text: { type: "string", maxLength: 24, description: 'e.g. "50% OFF".' },
|
|
1384
|
+
subtext: { type: "string", maxLength: 40, description: 'Small line under it, e.g. "This week only".' },
|
|
1385
|
+
start_sec: { type: "number", description: "Second it appears. Default 0.5." },
|
|
1386
|
+
duration_sec: { type: "number", minimum: 1, maximum: 10, description: "Seconds it stays. Default 3." },
|
|
1387
|
+
position: { type: "string", enum: ["top", "bottom"], description: "Default top." }
|
|
1388
|
+
}
|
|
1389
|
+
},
|
|
1390
|
+
end_card: {
|
|
1391
|
+
type: "object",
|
|
1392
|
+
description: "End card held after the last frame.",
|
|
1393
|
+
required: ["headline"],
|
|
1394
|
+
properties: {
|
|
1395
|
+
headline: { type: "string", maxLength: 40, description: 'e.g. "Your new favorite mug".' },
|
|
1396
|
+
cta: { type: "string", maxLength: 24, description: 'Button text, e.g. "Shop now".' },
|
|
1397
|
+
url: { type: "string", maxLength: 40, description: "Web address shown under the button." },
|
|
1398
|
+
logo_url: { type: "string", format: "uri", description: "PNG (transparent works best) or JPG." },
|
|
1399
|
+
duration_sec: { type: "number", minimum: 2, maximum: 5, description: "Default 3." }
|
|
1400
|
+
}
|
|
1401
|
+
}
|
|
1402
|
+
}
|
|
1403
|
+
};
|
|
1404
|
+
overlaySkill = {
|
|
1405
|
+
name: "pixeldojo_overlay",
|
|
1406
|
+
description: 'Add an offer callout (a badge like "50% OFF" that pops in on cue) and/or a branded end card (the last frame held under a logo, headline, button and web address) to a video. The text renders exactly as written, in the brand color. Pass video_url plus offer and/or end_card. 2 credits.',
|
|
1407
|
+
inputZod: InputSchema7,
|
|
1408
|
+
inputJsonSchema: InputJsonSchema7,
|
|
1409
|
+
allowedModels: [MODEL2],
|
|
1410
|
+
defaultModel: MODEL2,
|
|
1411
|
+
run: run7
|
|
1412
|
+
};
|
|
1413
|
+
}
|
|
1414
|
+
});
|
|
1415
|
+
async function run8(input, ctx) {
|
|
1253
1416
|
const job = await ctx.client.getJob(input.jobId);
|
|
1254
1417
|
if (job.status === "completed") {
|
|
1255
1418
|
const urls = extractAssetUrls2(job);
|
|
@@ -1313,13 +1476,13 @@ function extractAssetUrls2(job) {
|
|
|
1313
1476
|
if (output?.video) return [output.video];
|
|
1314
1477
|
return [];
|
|
1315
1478
|
}
|
|
1316
|
-
var
|
|
1479
|
+
var InputSchema8, InputJsonSchema8, STUCK_HINT_MS, ABANDON_HINT_MS, statusSkill;
|
|
1317
1480
|
var init_status = __esm({
|
|
1318
1481
|
"src/skills/status.ts"() {
|
|
1319
|
-
|
|
1482
|
+
InputSchema8 = zod.z.object({
|
|
1320
1483
|
jobId: zod.z.string().min(1).max(200).describe("Job id returned from a prior pixeldojo_* skill handoff.")
|
|
1321
1484
|
});
|
|
1322
|
-
|
|
1485
|
+
InputJsonSchema8 = {
|
|
1323
1486
|
type: "object",
|
|
1324
1487
|
properties: {
|
|
1325
1488
|
jobId: {
|
|
@@ -1334,16 +1497,16 @@ var init_status = __esm({
|
|
|
1334
1497
|
statusSkill = {
|
|
1335
1498
|
name: "pixeldojo_status",
|
|
1336
1499
|
description: 'Check once, without waiting, on a jobId that a generation tool returned instead of an asset after its 30s wait. Free. Returns asset URLs when complete, the failure reason if it failed, or the current state and job age if still running. Campaign ids go to pixeldojo_campaign_status; films report progress through pixeldojo_film with action "status".',
|
|
1337
|
-
inputZod:
|
|
1338
|
-
inputJsonSchema:
|
|
1500
|
+
inputZod: InputSchema8,
|
|
1501
|
+
inputJsonSchema: InputJsonSchema8,
|
|
1339
1502
|
// status is special — it doesn't dispatch to a model
|
|
1340
1503
|
allowedModels: [],
|
|
1341
1504
|
defaultModel: "",
|
|
1342
|
-
run:
|
|
1505
|
+
run: run8
|
|
1343
1506
|
};
|
|
1344
1507
|
}
|
|
1345
1508
|
});
|
|
1346
|
-
async function
|
|
1509
|
+
async function run9(input, ctx) {
|
|
1347
1510
|
const product = await ctx.client.extractProduct(input.url);
|
|
1348
1511
|
const summary = [
|
|
1349
1512
|
`Product: ${product.name}`,
|
|
@@ -1360,13 +1523,13 @@ function truncate(input, max) {
|
|
|
1360
1523
|
if (input.length <= max) return input;
|
|
1361
1524
|
return input.slice(0, max - 3) + "...";
|
|
1362
1525
|
}
|
|
1363
|
-
var
|
|
1526
|
+
var InputSchema9, InputJsonSchema9, fromUrlSkill;
|
|
1364
1527
|
var init_from_url = __esm({
|
|
1365
1528
|
"src/skills/from-url.ts"() {
|
|
1366
|
-
|
|
1529
|
+
InputSchema9 = zod.z.object({
|
|
1367
1530
|
url: zod.z.string().min(1).max(2048).describe("Product page URL. Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata.")
|
|
1368
1531
|
});
|
|
1369
|
-
|
|
1532
|
+
InputJsonSchema9 = {
|
|
1370
1533
|
type: "object",
|
|
1371
1534
|
properties: {
|
|
1372
1535
|
url: {
|
|
@@ -1379,12 +1542,12 @@ var init_from_url = __esm({
|
|
|
1379
1542
|
fromUrlSkill = {
|
|
1380
1543
|
name: "pixeldojo_from_url",
|
|
1381
1544
|
description: "Extract a product profile from a product page URL: name, description, image URLs (the first three are listed), and the extraction method used. Works on Shopify, BigCommerce, WooCommerce, or any page with JSON-LD / OpenGraph product metadata. Free. pixeldojo_campaign and pixeldojo_ad accept a product URL and run this extraction themselves; call this directly to check the product data first, or to reuse its images in other tools.",
|
|
1382
|
-
inputZod:
|
|
1383
|
-
inputJsonSchema:
|
|
1545
|
+
inputZod: InputSchema9,
|
|
1546
|
+
inputJsonSchema: InputJsonSchema9,
|
|
1384
1547
|
// No model dispatch — this skill calls a server-side scrape, not a generation.
|
|
1385
1548
|
allowedModels: [],
|
|
1386
1549
|
defaultModel: "",
|
|
1387
|
-
run:
|
|
1550
|
+
run: run9
|
|
1388
1551
|
};
|
|
1389
1552
|
}
|
|
1390
1553
|
});
|
|
@@ -1947,7 +2110,7 @@ async function redoShots(input, ctx) {
|
|
|
1947
2110
|
followUp: keepGoing(filmId, 30, { soundtrack: input.soundtrack })
|
|
1948
2111
|
};
|
|
1949
2112
|
}
|
|
1950
|
-
async function
|
|
2113
|
+
async function run10(input, ctx) {
|
|
1951
2114
|
const action = input.action === "plan" && input.film_id ? input.cast?.length ? "cast" : "status" : input.action;
|
|
1952
2115
|
if (action === "plan") return plan(input, ctx);
|
|
1953
2116
|
if (!input.film_id) return { kind: "text", text: "produce/status/cast/redo need the film_id returned by the plan step." };
|
|
@@ -1967,7 +2130,7 @@ async function run8(input, ctx) {
|
|
|
1967
2130
|
if (action === "redo") return redoShots(input, ctx);
|
|
1968
2131
|
return advance(input.film_id, input.soundtrack, input.music_job_id, ctx);
|
|
1969
2132
|
}
|
|
1970
|
-
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID,
|
|
2133
|
+
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID, InputSchema10, InputJsonSchema10, shots, benignDispatchRefusal, count, frameDone, RETRY_CLEARS, REFUSED, isRefused, PLANNER_POLL_MS, PLANNER_MAX_POLLS, isMusicVideo, needsSlice, stillPlanningText, LOOK_MUSIC, ARC, filmSkill;
|
|
1971
2134
|
var init_film = __esm({
|
|
1972
2135
|
"src/skills/film.ts"() {
|
|
1973
2136
|
init_upload_helpers();
|
|
@@ -1975,7 +2138,7 @@ var init_film = __esm({
|
|
|
1975
2138
|
MUSIC_VIDEO_LOOKS = ["rap-video", "neon-club", "stage-performance", "retro-camcorder", "y2k-pop", "moody-rnb", "rock-grit", "dream-pop", "k-pop"];
|
|
1976
2139
|
LOOKS = [...STORY_LOOKS, ...MUSIC_VIDEO_LOOKS];
|
|
1977
2140
|
MUSIC_CLIP_ENGINE_ID = "minimax-h3-reference";
|
|
1978
|
-
|
|
2141
|
+
InputSchema10 = zod.z.object({
|
|
1979
2142
|
idea: zod.z.string().max(2e3).optional().describe("One-to-three sentence film idea. The studio writes the screenplay (free). Provide idea OR script for planning."),
|
|
1980
2143
|
script: zod.z.string().max(2e4).optional().describe("A full screenplay to plan instead of an idea (sluglines, action lines, dialogue)."),
|
|
1981
2144
|
look: zod.z.enum(LOOKS).optional().describe("Visual style carried through frames, clips, and soundtrack. Default live-action, or rap-video for a music video."),
|
|
@@ -2003,7 +2166,7 @@ var init_film = __esm({
|
|
|
2003
2166
|
soundtrack: zod.z.enum(["scene-synced", "flat", "none"]).default("scene-synced").describe("scene-synced composes one musical section per scene, pinned to the scene lengths (default). flat is a single cohesive bed. none skips music."),
|
|
2004
2167
|
music_job_id: zod.z.string().max(80).optional().describe("The music_job_id from the previous status reply while the score is composing, so that score is attached. A status call without it, once all clips are ready and no score is attached, starts and charges for a new score.")
|
|
2005
2168
|
});
|
|
2006
|
-
|
|
2169
|
+
InputJsonSchema10 = {
|
|
2007
2170
|
type: "object",
|
|
2008
2171
|
properties: {
|
|
2009
2172
|
idea: { type: "string", description: `Plan step: one-to-three sentence film idea. The studio writes the screenplay (free). Provide idea or script. Keep the user's own words for who each character is, including their gender and pronouns ("she", "he") and species; the writer has nothing else to go on.` },
|
|
@@ -2117,11 +2280,11 @@ var init_film = __esm({
|
|
|
2117
2280
|
name: "pixeldojo_film",
|
|
2118
2281
|
description: "Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_path (a local file) or song_url (your own PixelDojo upload from pixeldojo_upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.",
|
|
2119
2282
|
hostedDescription: "Make a finished short film from one idea: screenplay, storyboard frames (AI-reviewed), video clips with spoken dialogue, scene-synced soundtrack, stitched export. Or a music video: pass song_url (your own PixelDojo upload made with POST /api/v1/upload, never a third-party link) with optional lyrics; the film is cut to that song, each clip lip-synced to its slice on the studio music video engine, and no score is composed: the export plays the song. Every named character must be cast (cast: your own images, a portrait prompt, or a Character Studio character) before frames render; cast entries can also replace or remove someone. Phased: plan is free; cast; produce starts charged generation; status advances production (poll every ~30s); redo renders a new take of chosen shots and status re-exports.",
|
|
2120
|
-
inputZod:
|
|
2121
|
-
inputJsonSchema:
|
|
2283
|
+
inputZod: InputSchema10,
|
|
2284
|
+
inputJsonSchema: InputJsonSchema10,
|
|
2122
2285
|
allowedModels: [],
|
|
2123
2286
|
defaultModel: "",
|
|
2124
|
-
run:
|
|
2287
|
+
run: run10
|
|
2125
2288
|
};
|
|
2126
2289
|
}
|
|
2127
2290
|
});
|
|
@@ -2208,7 +2371,7 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2208
2371
|
};
|
|
2209
2372
|
}
|
|
2210
2373
|
}
|
|
2211
|
-
async function
|
|
2374
|
+
async function run11(input, ctx) {
|
|
2212
2375
|
const paramsGate = paramsWithoutModel(input.params, input.model);
|
|
2213
2376
|
if (paramsGate) return { kind: "text", text: paramsGate };
|
|
2214
2377
|
const verb = input.verb;
|
|
@@ -2271,7 +2434,7 @@ async function run9(input, ctx) {
|
|
|
2271
2434
|
notes.join(" ")
|
|
2272
2435
|
);
|
|
2273
2436
|
}
|
|
2274
|
-
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES,
|
|
2437
|
+
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES, InputSchema11, engineList, InputJsonSchema11, BASE_DESCRIPTION, videoSkill;
|
|
2275
2438
|
var init_video = __esm({
|
|
2276
2439
|
"src/skills/video.ts"() {
|
|
2277
2440
|
init_poll();
|
|
@@ -2305,7 +2468,7 @@ var init_video = __esm({
|
|
|
2305
2468
|
"wan-video-character-swap"
|
|
2306
2469
|
]);
|
|
2307
2470
|
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["flux-video-edit", "xai-video-edit"]);
|
|
2308
|
-
|
|
2471
|
+
InputSchema11 = zod.z.object({
|
|
2309
2472
|
verb: zod.z.enum(VERBS),
|
|
2310
2473
|
prompt: zod.z.string().max(8e3).optional(),
|
|
2311
2474
|
video_url: zod.z.string().url().optional(),
|
|
@@ -2320,7 +2483,7 @@ var init_video = __esm({
|
|
|
2320
2483
|
params: ParamsInput
|
|
2321
2484
|
});
|
|
2322
2485
|
engineList = (verb) => `${verb}: ${VIDEO_STUDIO_ENGINES[verb].join(", ")} (default ${VIDEO_STUDIO_ENGINES[verb][0]})`;
|
|
2323
|
-
|
|
2486
|
+
InputJsonSchema11 = {
|
|
2324
2487
|
type: "object",
|
|
2325
2488
|
properties: {
|
|
2326
2489
|
verb: {
|
|
@@ -2381,11 +2544,11 @@ var init_video = __esm({
|
|
|
2381
2544
|
name: "pixeldojo_video",
|
|
2382
2545
|
description: `${BASE_DESCRIPTION} Local files: video_path / image_path (uploaded to 24h temp storage first).`,
|
|
2383
2546
|
hostedDescription: `${BASE_DESCRIPTION} Media must be public http(s) URLs.`,
|
|
2384
|
-
inputZod:
|
|
2385
|
-
inputJsonSchema:
|
|
2547
|
+
inputZod: InputSchema11,
|
|
2548
|
+
inputJsonSchema: InputJsonSchema11,
|
|
2386
2549
|
allowedModels: Array.from(new Set(VERBS.flatMap((v) => VIDEO_STUDIO_ENGINES[v]))),
|
|
2387
2550
|
defaultModel: VIDEO_STUDIO_ENGINES.change[0],
|
|
2388
|
-
run:
|
|
2551
|
+
run: run11
|
|
2389
2552
|
};
|
|
2390
2553
|
}
|
|
2391
2554
|
});
|
|
@@ -2560,28 +2723,28 @@ async function produce2(id, ctx) {
|
|
|
2560
2723
|
const musicNote = ep.musicEnabled && ep.music?.status === "failed" ? " The music bed failed, so this cut has no music." : "";
|
|
2561
2724
|
return { kind: "text", text: `Export started, free${prior}.${musicNote} ${next(id, "produce", "~60s")}` };
|
|
2562
2725
|
}
|
|
2563
|
-
async function
|
|
2726
|
+
async function run12(input, ctx) {
|
|
2564
2727
|
const action = input.action === "create" && input.episode_id ? "status" : input.action;
|
|
2565
2728
|
if (action === "create") return create(input, ctx);
|
|
2566
2729
|
if (!input.episode_id) return { kind: "text", text: "produce and status need the episode_id returned by the create step." };
|
|
2567
2730
|
if (action === "produce") return produce2(input.episode_id, ctx);
|
|
2568
2731
|
return status(input.episode_id, ctx);
|
|
2569
2732
|
}
|
|
2570
|
-
var
|
|
2733
|
+
var STYLES2, CATEGORIES, ENGINES, MIN_SECONDS, MAX_SECONDS, MAX_IN_FLIGHT, InputSchema12, InputJsonSchema12, call, next, needsRender, PLAN_POLL_MS, PLAN_MAX_POLLS, stillPlanning, episodeSkill;
|
|
2571
2734
|
var init_episode = __esm({
|
|
2572
2735
|
"src/skills/episode.ts"() {
|
|
2573
|
-
|
|
2736
|
+
STYLES2 = ["editorial-motion", "paper-diorama", "hand-drawn", "storybook", "poster-vector", "soft-3d"];
|
|
2574
2737
|
CATEGORIES = ["education", "history", "kids", "storytelling", "custom"];
|
|
2575
2738
|
ENGINES = ["omni-draft", "omni-final", "still-motion"];
|
|
2576
2739
|
MIN_SECONDS = 60;
|
|
2577
2740
|
MAX_SECONDS = 300;
|
|
2578
2741
|
MAX_IN_FLIGHT = 4;
|
|
2579
|
-
|
|
2742
|
+
InputSchema12 = zod.z.object({
|
|
2580
2743
|
action: zod.z.enum(["create", "produce", "status"]).default("create"),
|
|
2581
2744
|
topic: zod.z.string().min(8).max(400).optional(),
|
|
2582
2745
|
episode_id: zod.z.string().max(40).optional(),
|
|
2583
2746
|
category: zod.z.enum(CATEGORIES).default("education"),
|
|
2584
|
-
style: zod.z.enum(
|
|
2747
|
+
style: zod.z.enum(STYLES2).default("editorial-motion"),
|
|
2585
2748
|
aspect: zod.z.enum(["16:9", "9:16"]).default("16:9"),
|
|
2586
2749
|
length_seconds: zod.z.number().int().min(MIN_SECONDS).max(MAX_SECONDS).default(120),
|
|
2587
2750
|
voice: zod.z.string().min(1).max(80).default("Wise_Woman"),
|
|
@@ -2589,7 +2752,7 @@ var init_episode = __esm({
|
|
|
2589
2752
|
music: zod.z.boolean().default(true),
|
|
2590
2753
|
title: zod.z.string().max(120).optional()
|
|
2591
2754
|
});
|
|
2592
|
-
|
|
2755
|
+
InputJsonSchema12 = {
|
|
2593
2756
|
type: "object",
|
|
2594
2757
|
properties: {
|
|
2595
2758
|
action: {
|
|
@@ -2600,7 +2763,7 @@ var init_episode = __esm({
|
|
|
2600
2763
|
topic: { type: "string", description: "Create step: what the episode is about, 8 to 400 characters." },
|
|
2601
2764
|
episode_id: { type: "string", description: "The episode_id from the create step. Required for produce and status." },
|
|
2602
2765
|
category: { type: "string", enum: [...CATEGORIES], description: "Create step: tone of the script. Default education." },
|
|
2603
|
-
style: { type: "string", enum: [...
|
|
2766
|
+
style: { type: "string", enum: [...STYLES2], description: "Create step: visual style of every scene. Default editorial-motion." },
|
|
2604
2767
|
aspect: { type: "string", enum: ["16:9", "9:16"], description: "Create step: 16:9 landscape (default) or 9:16 vertical." },
|
|
2605
2768
|
length_seconds: { type: "integer", minimum: MIN_SECONDS, maximum: MAX_SECONDS, description: "Create step: target length in seconds. Default 120." },
|
|
2606
2769
|
voice: { type: "string", description: "Create step: narrator voice id from the text-to-speech tool (e.g. Wise_Woman, Deep_Voice_Man, Friendly_Person). Default Wise_Woman." },
|
|
@@ -2622,15 +2785,15 @@ var init_episode = __esm({
|
|
|
2622
2785
|
episodeSkill = {
|
|
2623
2786
|
name: "pixeldojo_episode",
|
|
2624
2787
|
description: "Make a finished narrated faceless video (explainer, history, kids story) from one topic: script, scene visuals, AI narration, music bed, stitched export saved to the Library. Phased: create is free and returns a credit quote; produce is charged and advances one step per call (poll every ~30s until it returns the video URL); status is free.",
|
|
2625
|
-
inputZod:
|
|
2626
|
-
inputJsonSchema:
|
|
2788
|
+
inputZod: InputSchema12,
|
|
2789
|
+
inputJsonSchema: InputJsonSchema12,
|
|
2627
2790
|
allowedModels: [],
|
|
2628
2791
|
defaultModel: "",
|
|
2629
|
-
run:
|
|
2792
|
+
run: run12
|
|
2630
2793
|
};
|
|
2631
2794
|
}
|
|
2632
2795
|
});
|
|
2633
|
-
async function
|
|
2796
|
+
async function run13(input, ctx) {
|
|
2634
2797
|
const productImages = [
|
|
2635
2798
|
...input.product_image_urls ?? [],
|
|
2636
2799
|
...await Promise.all((input.product_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))
|
|
@@ -2673,13 +2836,13 @@ async function run11(input, ctx) {
|
|
|
2673
2836
|
(urls) => urls.length === 0 ? `Ad job ${submitted.jobId} completed but returned no assets.` : `Ad rendered (style: ${styleLabel}${submitted.ad?.product?.name ? `, product: ${submitted.ad.product.name}` : ""}). Video: ${urls[0]}`
|
|
2674
2837
|
);
|
|
2675
2838
|
}
|
|
2676
|
-
var
|
|
2839
|
+
var InputSchema13, InputJsonSchema13, adSkill;
|
|
2677
2840
|
var init_ad = __esm({
|
|
2678
2841
|
"src/skills/ad.ts"() {
|
|
2679
2842
|
init_types();
|
|
2680
2843
|
init_poll();
|
|
2681
2844
|
init_upload_helpers();
|
|
2682
|
-
|
|
2845
|
+
InputSchema13 = zod.z.object({
|
|
2683
2846
|
style: zod.z.string().max(80).optional().describe(
|
|
2684
2847
|
"Ad style slug (default ugc-testimonial). Catalog: GET /api/v1/marketing/presets \u2014 e.g. ugc-testimonial, unboxing-reveal, unboxing-asmr, virtual-try-on, street-style, product-showcase, macro-details, crush-test, hyper-motion, before-after, day-in-the-life, the-gift, tv-spot."
|
|
2685
2848
|
),
|
|
@@ -2705,7 +2868,7 @@ var init_ad = __esm({
|
|
|
2705
2868
|
path: ["product_url"]
|
|
2706
2869
|
}
|
|
2707
2870
|
);
|
|
2708
|
-
|
|
2871
|
+
InputJsonSchema13 = {
|
|
2709
2872
|
type: "object",
|
|
2710
2873
|
properties: {
|
|
2711
2874
|
style: {
|
|
@@ -2792,16 +2955,16 @@ var init_ad = __esm({
|
|
|
2792
2955
|
name: "pixeldojo_ad",
|
|
2793
2956
|
description: "Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls / product_image_paths. Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.",
|
|
2794
2957
|
hostedDescription: "Marketing Studio: turn a product into a rendered video ad with voiceover. Requires `product_url` (name, description and images are extracted), or `product_name` plus product_image_urls (public http(s) URLs). Pick a `style` slug (default ugc-testimonial; full catalog at GET https://pixeldojo.ai/api/v1/marketing/presets), and optionally add presenter reference images, a location, a hook, and the exact spoken script. Returns the video URL, or a jobId to check with pixeldojo_status.",
|
|
2795
|
-
inputZod:
|
|
2796
|
-
inputJsonSchema:
|
|
2958
|
+
inputZod: InputSchema13,
|
|
2959
|
+
inputJsonSchema: InputJsonSchema13,
|
|
2797
2960
|
// Composition skill — the server routes to the ad engine internally.
|
|
2798
2961
|
allowedModels: [],
|
|
2799
2962
|
defaultModel: "",
|
|
2800
|
-
run:
|
|
2963
|
+
run: run13
|
|
2801
2964
|
};
|
|
2802
2965
|
}
|
|
2803
2966
|
});
|
|
2804
|
-
async function
|
|
2967
|
+
async function run14(input, ctx) {
|
|
2805
2968
|
const client = ctx.client;
|
|
2806
2969
|
const result = await client.runCampaign(input);
|
|
2807
2970
|
if (result.kind === "campaign") {
|
|
@@ -2828,10 +2991,10 @@ async function run12(input, ctx) {
|
|
|
2828
2991
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2829
2992
|
};
|
|
2830
2993
|
}
|
|
2831
|
-
var
|
|
2994
|
+
var InputSchema14, InputJsonSchema14, campaignSkill;
|
|
2832
2995
|
var init_campaign = __esm({
|
|
2833
2996
|
"src/skills/campaign.ts"() {
|
|
2834
|
-
|
|
2997
|
+
InputSchema14 = zod.z.object({
|
|
2835
2998
|
productUrl: zod.z.string().url().optional().describe("Product page URL. We extract name + description + images automatically."),
|
|
2836
2999
|
product: zod.z.object({
|
|
2837
3000
|
name: zod.z.string().min(1).max(200),
|
|
@@ -2847,7 +3010,7 @@ var init_campaign = __esm({
|
|
|
2847
3010
|
message: "productUrl or product is required",
|
|
2848
3011
|
path: ["productUrl"]
|
|
2849
3012
|
});
|
|
2850
|
-
|
|
3013
|
+
InputJsonSchema14 = {
|
|
2851
3014
|
type: "object",
|
|
2852
3015
|
properties: {
|
|
2853
3016
|
productUrl: {
|
|
@@ -2898,17 +3061,17 @@ var init_campaign = __esm({
|
|
|
2898
3061
|
campaignSkill = {
|
|
2899
3062
|
name: "pixeldojo_campaign",
|
|
2900
3063
|
description: "Generate a coherent product launch package (hero image + N lifestyle variants + optional vertical video) from one URL or product profile. Composes hero / lifestyle / video models server-side; returns assets in one call or a handoff with campaignId to poll via pixeldojo_campaign_status.",
|
|
2901
|
-
inputZod:
|
|
2902
|
-
inputJsonSchema:
|
|
3064
|
+
inputZod: InputSchema14,
|
|
3065
|
+
inputJsonSchema: InputJsonSchema14,
|
|
2903
3066
|
// Composition skill — internal sub-jobs route to per-tool models, no
|
|
2904
3067
|
// single allowed-models list applies here.
|
|
2905
3068
|
allowedModels: [],
|
|
2906
3069
|
defaultModel: "",
|
|
2907
|
-
run:
|
|
3070
|
+
run: run14
|
|
2908
3071
|
};
|
|
2909
3072
|
}
|
|
2910
3073
|
});
|
|
2911
|
-
async function
|
|
3074
|
+
async function run15(input, ctx) {
|
|
2912
3075
|
const client = ctx.client;
|
|
2913
3076
|
const result = await client.getCampaign(input.campaignId);
|
|
2914
3077
|
if (result.kind === "campaign") {
|
|
@@ -2938,13 +3101,13 @@ async function run13(input, ctx) {
|
|
|
2938
3101
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2939
3102
|
};
|
|
2940
3103
|
}
|
|
2941
|
-
var
|
|
3104
|
+
var InputSchema15, InputJsonSchema15, campaignStatusSkill;
|
|
2942
3105
|
var init_campaign_status = __esm({
|
|
2943
3106
|
"src/skills/campaign-status.ts"() {
|
|
2944
|
-
|
|
3107
|
+
InputSchema15 = zod.z.object({
|
|
2945
3108
|
campaignId: zod.z.string().min(1).max(200).describe("Campaign id returned from a prior pixeldojo_campaign handoff.")
|
|
2946
3109
|
});
|
|
2947
|
-
|
|
3110
|
+
InputJsonSchema15 = {
|
|
2948
3111
|
type: "object",
|
|
2949
3112
|
properties: {
|
|
2950
3113
|
campaignId: {
|
|
@@ -2957,15 +3120,15 @@ var init_campaign_status = __esm({
|
|
|
2957
3120
|
campaignStatusSkill = {
|
|
2958
3121
|
name: "pixeldojo_campaign_status",
|
|
2959
3122
|
description: "Poll a campaign by campaignId returned from pixeldojo_campaign. Returns assets when every sub-job is done, or a handoff describing what is still in flight.",
|
|
2960
|
-
inputZod:
|
|
2961
|
-
inputJsonSchema:
|
|
3123
|
+
inputZod: InputSchema15,
|
|
3124
|
+
inputJsonSchema: InputJsonSchema15,
|
|
2962
3125
|
allowedModels: [],
|
|
2963
3126
|
defaultModel: "",
|
|
2964
|
-
run:
|
|
3127
|
+
run: run15
|
|
2965
3128
|
};
|
|
2966
3129
|
}
|
|
2967
3130
|
});
|
|
2968
|
-
async function
|
|
3131
|
+
async function run16(input, ctx) {
|
|
2969
3132
|
let url;
|
|
2970
3133
|
try {
|
|
2971
3134
|
url = await uploadLocalFile(input.path, ctx);
|
|
@@ -2981,16 +3144,16 @@ async function run14(input, ctx) {
|
|
|
2981
3144
|
(temp storage; auto-deletes in ~24h. Pass this URL as image_url, video_url for a clip, or song_url on pixeldojo_film for a song, to any pixeldojo tool that takes one.)`
|
|
2982
3145
|
};
|
|
2983
3146
|
}
|
|
2984
|
-
var
|
|
3147
|
+
var InputSchema16, InputJsonSchema16, uploadSkill;
|
|
2985
3148
|
var init_upload = __esm({
|
|
2986
3149
|
"src/skills/upload.ts"() {
|
|
2987
3150
|
init_upload_helpers();
|
|
2988
|
-
|
|
3151
|
+
InputSchema16 = zod.z.object({
|
|
2989
3152
|
path: zod.z.string().min(1).max(4096).describe(
|
|
2990
3153
|
"Absolute local file path to upload. JPEG, PNG, WebP, GIF (\u226450MB), MP4, WebM, MOV (\u2264200MB) or MP3, WAV, M4A, AAC, OGG, FLAC audio (\u226450MB). Returns a public URL on the temp CDN; storage auto-expires after 24 hours."
|
|
2991
3154
|
)
|
|
2992
3155
|
});
|
|
2993
|
-
|
|
3156
|
+
InputJsonSchema16 = {
|
|
2994
3157
|
type: "object",
|
|
2995
3158
|
properties: {
|
|
2996
3159
|
path: {
|
|
@@ -3003,15 +3166,15 @@ var init_upload = __esm({
|
|
|
3003
3166
|
uploadSkill = {
|
|
3004
3167
|
name: "pixeldojo_upload",
|
|
3005
3168
|
description: "Upload a local image, video or audio file (JPEG, PNG, WebP, GIF up to 50MB; MP4, WebM, MOV up to 200MB; MP3, WAV, M4A, AAC, OGG, FLAC up to 50MB) and get back a public URL that expires after 24 hours. Free. Pass an audio URL as song_url to pixeldojo_film for a music video. Pass the URL as image_url (stills) or video_url (clips) to tools that take hosted URLs only, such as pixeldojo_character, pixeldojo_storyboard and pixeldojo_upscale. pixeldojo_generate, pixeldojo_edit and pixeldojo_ad take local paths directly and need no separate upload.",
|
|
3006
|
-
inputZod:
|
|
3007
|
-
inputJsonSchema:
|
|
3169
|
+
inputZod: InputSchema16,
|
|
3170
|
+
inputJsonSchema: InputJsonSchema16,
|
|
3008
3171
|
allowedModels: [],
|
|
3009
3172
|
defaultModel: "",
|
|
3010
|
-
run:
|
|
3173
|
+
run: run16
|
|
3011
3174
|
};
|
|
3012
3175
|
}
|
|
3013
3176
|
});
|
|
3014
|
-
async function
|
|
3177
|
+
async function run17(input, ctx) {
|
|
3015
3178
|
const requested = input.model ?? DEFAULT_MODEL6;
|
|
3016
3179
|
if (!ALLOWED4.includes(requested)) {
|
|
3017
3180
|
return {
|
|
@@ -3049,14 +3212,14 @@ async function run15(input, ctx) {
|
|
|
3049
3212
|
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Audio ready. Asset: ${urls[0]}`
|
|
3050
3213
|
);
|
|
3051
3214
|
}
|
|
3052
|
-
var ALLOWED4, DEFAULT_MODEL6,
|
|
3215
|
+
var ALLOWED4, DEFAULT_MODEL6, InputSchema17, InputJsonSchema17, audioSkill;
|
|
3053
3216
|
var init_audio = __esm({
|
|
3054
3217
|
"src/skills/audio.ts"() {
|
|
3055
3218
|
init_poll();
|
|
3056
3219
|
init_types();
|
|
3057
3220
|
ALLOWED4 = ["seed-audio", "text-to-speech"];
|
|
3058
3221
|
DEFAULT_MODEL6 = "seed-audio";
|
|
3059
|
-
|
|
3222
|
+
InputSchema17 = zod.z.object({
|
|
3060
3223
|
prompt: zod.z.string().min(1).describe(
|
|
3061
3224
|
"seed-audio: a script to speak, or a scene description (dialogue, sound effects, music), up to 2048 characters; refer to audio_urls clips in order as @Audio1..@Audio3. text-to-speech: the exact text to speak, up to 10,000 characters."
|
|
3062
3225
|
),
|
|
@@ -3066,7 +3229,7 @@ var init_audio = __esm({
|
|
|
3066
3229
|
output_format: zod.z.string().optional().describe("Output format. seed-audio: mp3 (default), wav, pcm, ogg_opus. text-to-speech: mp3 (default), wav, flac, pcm."),
|
|
3067
3230
|
speed: zod.z.number().min(0.5).max(2).optional().describe("Speech speed multiplier, 0.5-2 (default 1). Both models.")
|
|
3068
3231
|
});
|
|
3069
|
-
|
|
3232
|
+
InputJsonSchema17 = {
|
|
3070
3233
|
type: "object",
|
|
3071
3234
|
properties: {
|
|
3072
3235
|
prompt: {
|
|
@@ -3104,15 +3267,15 @@ var init_audio = __esm({
|
|
|
3104
3267
|
audioSkill = {
|
|
3105
3268
|
name: "pixeldojo_audio",
|
|
3106
3269
|
description: "Generate audio: speech, multi-character dialogue, sound effects, and background music from one prompt (Seed Audio 1.0 by default; plain text-to-speech available). Voice cloning takes hosted reference clip URLs in audio_urls; local audio files are not accepted. Returns an audio URL, or a jobId for pixeldojo_status.",
|
|
3107
|
-
inputZod:
|
|
3108
|
-
inputJsonSchema:
|
|
3270
|
+
inputZod: InputSchema17,
|
|
3271
|
+
inputJsonSchema: InputJsonSchema17,
|
|
3109
3272
|
allowedModels: [...ALLOWED4],
|
|
3110
3273
|
defaultModel: DEFAULT_MODEL6,
|
|
3111
|
-
run:
|
|
3274
|
+
run: run17
|
|
3112
3275
|
};
|
|
3113
3276
|
}
|
|
3114
3277
|
});
|
|
3115
|
-
async function
|
|
3278
|
+
async function run18(input, ctx) {
|
|
3116
3279
|
if (input.source === "characters") {
|
|
3117
3280
|
const { characters } = await ctx.client.listCharacters({ q: input.q, limit: input.limit ?? 25 });
|
|
3118
3281
|
if (characters.length === 0) {
|
|
@@ -3163,17 +3326,17 @@ ${lines.join("\n")}
|
|
|
3163
3326
|
Pass any URL back into pixeldojo_generate, pixeldojo_edit, pixeldojo_character, or pixeldojo_upscale as a reference input.`
|
|
3164
3327
|
};
|
|
3165
3328
|
}
|
|
3166
|
-
var
|
|
3329
|
+
var InputSchema18, InputJsonSchema18, librarySkill;
|
|
3167
3330
|
var init_library = __esm({
|
|
3168
3331
|
"src/skills/library.ts"() {
|
|
3169
|
-
|
|
3332
|
+
InputSchema18 = zod.z.object({
|
|
3170
3333
|
source: zod.z.enum(["media", "characters"]).optional().describe("media (default): saved and recent results. characters: saved Character Studio characters and elements, usable as @Name in prompts."),
|
|
3171
3334
|
q: zod.z.string().optional().describe("Substring match against the prompt that produced the asset."),
|
|
3172
3335
|
model: zod.z.string().optional().describe("Restrict to a single model (apiId)."),
|
|
3173
3336
|
modality: zod.z.enum(["image", "video", "audio"]).optional().describe("Restrict to one output type."),
|
|
3174
3337
|
limit: zod.z.number().int().min(1).max(50).optional().describe("Max results (default 10).")
|
|
3175
3338
|
});
|
|
3176
|
-
|
|
3339
|
+
InputJsonSchema18 = {
|
|
3177
3340
|
type: "object",
|
|
3178
3341
|
properties: {
|
|
3179
3342
|
source: {
|
|
@@ -3198,15 +3361,15 @@ var init_library = __esm({
|
|
|
3198
3361
|
librarySkill = {
|
|
3199
3362
|
name: "pixeldojo_library",
|
|
3200
3363
|
description: "Search your Library, newest first. source=media (default): saved media (permanent) and recent API/MCP generations (deleted 1 hour after they finish), as URLs to reuse as references. source=characters: saved Character Studio characters and elements, each usable as @Name in any prompt.",
|
|
3201
|
-
inputZod:
|
|
3202
|
-
inputJsonSchema:
|
|
3364
|
+
inputZod: InputSchema18,
|
|
3365
|
+
inputJsonSchema: InputJsonSchema18,
|
|
3203
3366
|
allowedModels: [],
|
|
3204
3367
|
defaultModel: "",
|
|
3205
|
-
run:
|
|
3368
|
+
run: run18
|
|
3206
3369
|
};
|
|
3207
3370
|
}
|
|
3208
3371
|
});
|
|
3209
|
-
async function
|
|
3372
|
+
async function run19(input, ctx) {
|
|
3210
3373
|
const res = await ctx.client.saveMedia({
|
|
3211
3374
|
url: input.url,
|
|
3212
3375
|
prompt: input.prompt,
|
|
@@ -3220,17 +3383,17 @@ async function run17(input, ctx) {
|
|
|
3220
3383
|
It will appear at https://pixeldojo.ai/my-images and in pixeldojo_library searches.`
|
|
3221
3384
|
};
|
|
3222
3385
|
}
|
|
3223
|
-
var
|
|
3386
|
+
var InputSchema19, InputJsonSchema19, saveSkill;
|
|
3224
3387
|
var init_save = __esm({
|
|
3225
3388
|
"src/skills/save.ts"() {
|
|
3226
|
-
|
|
3389
|
+
InputSchema19 = zod.z.object({
|
|
3227
3390
|
url: zod.z.string().url().describe("The asset URL to save (image or video)."),
|
|
3228
3391
|
prompt: zod.z.string().optional().describe("The prompt that produced it \u2014 makes it findable in the library later."),
|
|
3229
3392
|
tool_name: zod.z.string().optional().describe("Tool/model slug that produced it."),
|
|
3230
3393
|
modality: zod.z.enum(["image", "video", "audio"]).optional(),
|
|
3231
3394
|
job_id: zod.z.string().optional().describe("The jobId that produced this asset, when known.")
|
|
3232
3395
|
});
|
|
3233
|
-
|
|
3396
|
+
InputJsonSchema19 = {
|
|
3234
3397
|
type: "object",
|
|
3235
3398
|
properties: {
|
|
3236
3399
|
url: { type: "string", format: "uri", description: "The result URL to keep (image or video from a PixelDojo job)." },
|
|
@@ -3244,15 +3407,15 @@ var init_save = __esm({
|
|
|
3244
3407
|
saveSkill = {
|
|
3245
3408
|
name: "pixeldojo_save",
|
|
3246
3409
|
description: `Save a generated image or video into the user's My Media library permanently ("save this", "keep it"). Results otherwise expire 1 hour after they finish. Pass the result URL; it is safety-checked before it is kept.`,
|
|
3247
|
-
inputZod:
|
|
3248
|
-
inputJsonSchema:
|
|
3410
|
+
inputZod: InputSchema19,
|
|
3411
|
+
inputJsonSchema: InputJsonSchema19,
|
|
3249
3412
|
allowedModels: [],
|
|
3250
3413
|
defaultModel: "",
|
|
3251
|
-
run:
|
|
3414
|
+
run: run19
|
|
3252
3415
|
};
|
|
3253
3416
|
}
|
|
3254
3417
|
});
|
|
3255
|
-
async function
|
|
3418
|
+
async function run20(input, ctx) {
|
|
3256
3419
|
const res = await ctx.client.saveCharacter({
|
|
3257
3420
|
name: input.name,
|
|
3258
3421
|
kind: input.kind ?? "character",
|
|
@@ -3264,17 +3427,17 @@ async function run18(input, ctx) {
|
|
|
3264
3427
|
text: `Saved ${res.kind} "${res.name}" to Character Studio (${res.image_urls.length} image${res.image_urls.length === 1 ? "" : "s"}). Use it in any prompt as ${res.mention}, for example "${res.mention} walking on a beach at sunset". It also appears at https://pixeldojo.ai/characters.`
|
|
3265
3428
|
};
|
|
3266
3429
|
}
|
|
3267
|
-
var KINDS,
|
|
3430
|
+
var KINDS, InputSchema20, InputJsonSchema20, saveCharacterSkill;
|
|
3268
3431
|
var init_save_character = __esm({
|
|
3269
3432
|
"src/skills/save-character.ts"() {
|
|
3270
3433
|
KINDS = ["character", "product", "outfit", "location", "object", "style"];
|
|
3271
|
-
|
|
3434
|
+
InputSchema20 = zod.z.object({
|
|
3272
3435
|
name: zod.z.string().min(1).max(60).describe("What to call it. Used as @Name in prompts."),
|
|
3273
3436
|
kind: zod.z.enum(KINDS).optional().describe("Default character."),
|
|
3274
3437
|
image_urls: zod.z.array(zod.z.string().url()).max(8).optional().describe("3 to 5 photos from different angles works best for a character."),
|
|
3275
3438
|
description: zod.z.string().max(1500).optional().describe("Appearance notes, or the scene text for an element.")
|
|
3276
3439
|
});
|
|
3277
|
-
|
|
3440
|
+
InputJsonSchema20 = {
|
|
3278
3441
|
type: "object",
|
|
3279
3442
|
properties: {
|
|
3280
3443
|
name: { type: "string", description: "What to call it. Used as @Name in prompts afterwards." },
|
|
@@ -3292,11 +3455,11 @@ var init_save_character = __esm({
|
|
|
3292
3455
|
saveCharacterSkill = {
|
|
3293
3456
|
name: "pixeldojo_save_character",
|
|
3294
3457
|
description: "Save a character (a person, from 3-5 photos) or an element (product, outfit, location, prop, style) to the user's Character Studio library. Afterwards write @Name in any prompt to use it. List saved ones with pixeldojo_library source=characters.",
|
|
3295
|
-
inputZod:
|
|
3296
|
-
inputJsonSchema:
|
|
3458
|
+
inputZod: InputSchema20,
|
|
3459
|
+
inputJsonSchema: InputJsonSchema20,
|
|
3297
3460
|
allowedModels: [],
|
|
3298
3461
|
defaultModel: "",
|
|
3299
|
-
run:
|
|
3462
|
+
run: run20
|
|
3300
3463
|
};
|
|
3301
3464
|
}
|
|
3302
3465
|
});
|
|
@@ -3545,6 +3708,7 @@ __export(skills_exports, {
|
|
|
3545
3708
|
audioSkill: () => audioSkill,
|
|
3546
3709
|
campaignSkill: () => campaignSkill,
|
|
3547
3710
|
campaignStatusSkill: () => campaignStatusSkill,
|
|
3711
|
+
captionSkill: () => captionSkill,
|
|
3548
3712
|
characterSkill: () => characterSkill,
|
|
3549
3713
|
editSkill: () => editSkill,
|
|
3550
3714
|
episodeSkill: () => episodeSkill,
|
|
@@ -3555,6 +3719,7 @@ __export(skills_exports, {
|
|
|
3555
3719
|
generateSkill: () => generateSkill,
|
|
3556
3720
|
librarySkill: () => librarySkill,
|
|
3557
3721
|
listWorkflowsSkill: () => listWorkflowsSkill,
|
|
3722
|
+
overlaySkill: () => overlaySkill,
|
|
3558
3723
|
runWorkflowSkill: () => runWorkflowSkill,
|
|
3559
3724
|
saveCharacterSkill: () => saveCharacterSkill,
|
|
3560
3725
|
saveSkill: () => saveSkill,
|
|
@@ -3592,6 +3757,8 @@ var init_skills = __esm({
|
|
|
3592
3757
|
init_character();
|
|
3593
3758
|
init_storyboard();
|
|
3594
3759
|
init_upscale();
|
|
3760
|
+
init_caption();
|
|
3761
|
+
init_overlay();
|
|
3595
3762
|
init_status();
|
|
3596
3763
|
init_from_url();
|
|
3597
3764
|
init_film();
|
|
@@ -3612,6 +3779,8 @@ var init_skills = __esm({
|
|
|
3612
3779
|
characterSkill,
|
|
3613
3780
|
storyboardSkill,
|
|
3614
3781
|
upscaleSkill,
|
|
3782
|
+
captionSkill,
|
|
3783
|
+
overlaySkill,
|
|
3615
3784
|
audioSkill,
|
|
3616
3785
|
librarySkill,
|
|
3617
3786
|
saveSkill,
|
|
@@ -3651,6 +3820,8 @@ var init_skills = __esm({
|
|
|
3651
3820
|
pixeldojo_character: render("Consistent character image"),
|
|
3652
3821
|
pixeldojo_storyboard: render("Storyboard preview video"),
|
|
3653
3822
|
pixeldojo_upscale: render("Upscale image or video"),
|
|
3823
|
+
pixeldojo_caption: render("Caption video"),
|
|
3824
|
+
pixeldojo_overlay: render("Add offer or end card"),
|
|
3654
3825
|
pixeldojo_audio: render("Generate music, speech or sound"),
|
|
3655
3826
|
pixeldojo_video: render("Change, animate or extend video"),
|
|
3656
3827
|
pixeldojo_ad: render("Make video ad"),
|
|
@@ -3721,7 +3892,7 @@ function makeRedactedLogger(target = console) {
|
|
|
3721
3892
|
}
|
|
3722
3893
|
|
|
3723
3894
|
// src/server.ts
|
|
3724
|
-
var PACKAGE_VERSION = "0.
|
|
3895
|
+
var PACKAGE_VERSION = "0.22.0" ;
|
|
3725
3896
|
var SERVER_INSTRUCTIONS = "Pixel Dojo generates images, video, audio and short films from one catalog of AI models, billed in credits from the connected Pixel Dojo account. A job that runs past the 30-second wait returns a jobId to check later; check it rather than submitting again, since every new submission is charged. Generated asset URLs are deleted one hour after they are created: pixeldojo_save keeps one in the user's My Media permanently (after a safety check), and finished films stay in the account library. In any prompt, @Name uses a character, product, outfit, location, prop or style the user saved in Character Studio: its photos are attached automatically. pixeldojo_library source=characters lists them, and pixeldojo_save_character saves a new one from 3 to 5 photos.";
|
|
3726
3897
|
function buildServer(options) {
|
|
3727
3898
|
if (!options.apiKey) {
|