@pixeldojo/mcp 0.20.0 → 0.21.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 +3 -2
- package/dist/cli.cjs +160 -94
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +160 -94
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +159 -94
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +159 -94
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.cjs
CHANGED
|
@@ -1250,6 +1250,67 @@ 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) {
|
|
1253
1314
|
const job = await ctx.client.getJob(input.jobId);
|
|
1254
1315
|
if (job.status === "completed") {
|
|
1255
1316
|
const urls = extractAssetUrls2(job);
|
|
@@ -1313,13 +1374,13 @@ function extractAssetUrls2(job) {
|
|
|
1313
1374
|
if (output?.video) return [output.video];
|
|
1314
1375
|
return [];
|
|
1315
1376
|
}
|
|
1316
|
-
var
|
|
1377
|
+
var InputSchema7, InputJsonSchema7, STUCK_HINT_MS, ABANDON_HINT_MS, statusSkill;
|
|
1317
1378
|
var init_status = __esm({
|
|
1318
1379
|
"src/skills/status.ts"() {
|
|
1319
|
-
|
|
1380
|
+
InputSchema7 = zod.z.object({
|
|
1320
1381
|
jobId: zod.z.string().min(1).max(200).describe("Job id returned from a prior pixeldojo_* skill handoff.")
|
|
1321
1382
|
});
|
|
1322
|
-
|
|
1383
|
+
InputJsonSchema7 = {
|
|
1323
1384
|
type: "object",
|
|
1324
1385
|
properties: {
|
|
1325
1386
|
jobId: {
|
|
@@ -1334,16 +1395,16 @@ var init_status = __esm({
|
|
|
1334
1395
|
statusSkill = {
|
|
1335
1396
|
name: "pixeldojo_status",
|
|
1336
1397
|
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:
|
|
1398
|
+
inputZod: InputSchema7,
|
|
1399
|
+
inputJsonSchema: InputJsonSchema7,
|
|
1339
1400
|
// status is special — it doesn't dispatch to a model
|
|
1340
1401
|
allowedModels: [],
|
|
1341
1402
|
defaultModel: "",
|
|
1342
|
-
run:
|
|
1403
|
+
run: run7
|
|
1343
1404
|
};
|
|
1344
1405
|
}
|
|
1345
1406
|
});
|
|
1346
|
-
async function
|
|
1407
|
+
async function run8(input, ctx) {
|
|
1347
1408
|
const product = await ctx.client.extractProduct(input.url);
|
|
1348
1409
|
const summary = [
|
|
1349
1410
|
`Product: ${product.name}`,
|
|
@@ -1360,13 +1421,13 @@ function truncate(input, max) {
|
|
|
1360
1421
|
if (input.length <= max) return input;
|
|
1361
1422
|
return input.slice(0, max - 3) + "...";
|
|
1362
1423
|
}
|
|
1363
|
-
var
|
|
1424
|
+
var InputSchema8, InputJsonSchema8, fromUrlSkill;
|
|
1364
1425
|
var init_from_url = __esm({
|
|
1365
1426
|
"src/skills/from-url.ts"() {
|
|
1366
|
-
|
|
1427
|
+
InputSchema8 = zod.z.object({
|
|
1367
1428
|
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
1429
|
});
|
|
1369
|
-
|
|
1430
|
+
InputJsonSchema8 = {
|
|
1370
1431
|
type: "object",
|
|
1371
1432
|
properties: {
|
|
1372
1433
|
url: {
|
|
@@ -1379,12 +1440,12 @@ var init_from_url = __esm({
|
|
|
1379
1440
|
fromUrlSkill = {
|
|
1380
1441
|
name: "pixeldojo_from_url",
|
|
1381
1442
|
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:
|
|
1443
|
+
inputZod: InputSchema8,
|
|
1444
|
+
inputJsonSchema: InputJsonSchema8,
|
|
1384
1445
|
// No model dispatch — this skill calls a server-side scrape, not a generation.
|
|
1385
1446
|
allowedModels: [],
|
|
1386
1447
|
defaultModel: "",
|
|
1387
|
-
run:
|
|
1448
|
+
run: run8
|
|
1388
1449
|
};
|
|
1389
1450
|
}
|
|
1390
1451
|
});
|
|
@@ -1947,7 +2008,7 @@ async function redoShots(input, ctx) {
|
|
|
1947
2008
|
followUp: keepGoing(filmId, 30, { soundtrack: input.soundtrack })
|
|
1948
2009
|
};
|
|
1949
2010
|
}
|
|
1950
|
-
async function
|
|
2011
|
+
async function run9(input, ctx) {
|
|
1951
2012
|
const action = input.action === "plan" && input.film_id ? input.cast?.length ? "cast" : "status" : input.action;
|
|
1952
2013
|
if (action === "plan") return plan(input, ctx);
|
|
1953
2014
|
if (!input.film_id) return { kind: "text", text: "produce/status/cast/redo need the film_id returned by the plan step." };
|
|
@@ -1967,7 +2028,7 @@ async function run8(input, ctx) {
|
|
|
1967
2028
|
if (action === "redo") return redoShots(input, ctx);
|
|
1968
2029
|
return advance(input.film_id, input.soundtrack, input.music_job_id, ctx);
|
|
1969
2030
|
}
|
|
1970
|
-
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID,
|
|
2031
|
+
var STORY_LOOKS, MUSIC_VIDEO_LOOKS, LOOKS, MUSIC_CLIP_ENGINE_ID, InputSchema9, InputJsonSchema9, shots, benignDispatchRefusal, count, frameDone, RETRY_CLEARS, REFUSED, isRefused, PLANNER_POLL_MS, PLANNER_MAX_POLLS, isMusicVideo, needsSlice, stillPlanningText, LOOK_MUSIC, ARC, filmSkill;
|
|
1971
2032
|
var init_film = __esm({
|
|
1972
2033
|
"src/skills/film.ts"() {
|
|
1973
2034
|
init_upload_helpers();
|
|
@@ -1975,7 +2036,7 @@ var init_film = __esm({
|
|
|
1975
2036
|
MUSIC_VIDEO_LOOKS = ["rap-video", "neon-club", "stage-performance", "retro-camcorder", "y2k-pop", "moody-rnb", "rock-grit", "dream-pop", "k-pop"];
|
|
1976
2037
|
LOOKS = [...STORY_LOOKS, ...MUSIC_VIDEO_LOOKS];
|
|
1977
2038
|
MUSIC_CLIP_ENGINE_ID = "minimax-h3-reference";
|
|
1978
|
-
|
|
2039
|
+
InputSchema9 = zod.z.object({
|
|
1979
2040
|
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
2041
|
script: zod.z.string().max(2e4).optional().describe("A full screenplay to plan instead of an idea (sluglines, action lines, dialogue)."),
|
|
1981
2042
|
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 +2064,7 @@ var init_film = __esm({
|
|
|
2003
2064
|
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
2065
|
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
2066
|
});
|
|
2006
|
-
|
|
2067
|
+
InputJsonSchema9 = {
|
|
2007
2068
|
type: "object",
|
|
2008
2069
|
properties: {
|
|
2009
2070
|
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 +2178,11 @@ var init_film = __esm({
|
|
|
2117
2178
|
name: "pixeldojo_film",
|
|
2118
2179
|
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
2180
|
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:
|
|
2181
|
+
inputZod: InputSchema9,
|
|
2182
|
+
inputJsonSchema: InputJsonSchema9,
|
|
2122
2183
|
allowedModels: [],
|
|
2123
2184
|
defaultModel: "",
|
|
2124
|
-
run:
|
|
2185
|
+
run: run9
|
|
2125
2186
|
};
|
|
2126
2187
|
}
|
|
2127
2188
|
});
|
|
@@ -2208,7 +2269,7 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2208
2269
|
};
|
|
2209
2270
|
}
|
|
2210
2271
|
}
|
|
2211
|
-
async function
|
|
2272
|
+
async function run10(input, ctx) {
|
|
2212
2273
|
const paramsGate = paramsWithoutModel(input.params, input.model);
|
|
2213
2274
|
if (paramsGate) return { kind: "text", text: paramsGate };
|
|
2214
2275
|
const verb = input.verb;
|
|
@@ -2271,7 +2332,7 @@ async function run9(input, ctx) {
|
|
|
2271
2332
|
notes.join(" ")
|
|
2272
2333
|
);
|
|
2273
2334
|
}
|
|
2274
|
-
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES,
|
|
2335
|
+
var VIDEO_STUDIO_ENGINES, VERBS, BACKWARD_ENGINES, clamp, NEEDS_VIDEO_DURATION, NO_IMAGE_ENGINES, InputSchema10, engineList, InputJsonSchema10, BASE_DESCRIPTION, videoSkill;
|
|
2275
2336
|
var init_video = __esm({
|
|
2276
2337
|
"src/skills/video.ts"() {
|
|
2277
2338
|
init_poll();
|
|
@@ -2305,7 +2366,7 @@ var init_video = __esm({
|
|
|
2305
2366
|
"wan-video-character-swap"
|
|
2306
2367
|
]);
|
|
2307
2368
|
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["flux-video-edit", "xai-video-edit"]);
|
|
2308
|
-
|
|
2369
|
+
InputSchema10 = zod.z.object({
|
|
2309
2370
|
verb: zod.z.enum(VERBS),
|
|
2310
2371
|
prompt: zod.z.string().max(8e3).optional(),
|
|
2311
2372
|
video_url: zod.z.string().url().optional(),
|
|
@@ -2320,7 +2381,7 @@ var init_video = __esm({
|
|
|
2320
2381
|
params: ParamsInput
|
|
2321
2382
|
});
|
|
2322
2383
|
engineList = (verb) => `${verb}: ${VIDEO_STUDIO_ENGINES[verb].join(", ")} (default ${VIDEO_STUDIO_ENGINES[verb][0]})`;
|
|
2323
|
-
|
|
2384
|
+
InputJsonSchema10 = {
|
|
2324
2385
|
type: "object",
|
|
2325
2386
|
properties: {
|
|
2326
2387
|
verb: {
|
|
@@ -2381,11 +2442,11 @@ var init_video = __esm({
|
|
|
2381
2442
|
name: "pixeldojo_video",
|
|
2382
2443
|
description: `${BASE_DESCRIPTION} Local files: video_path / image_path (uploaded to 24h temp storage first).`,
|
|
2383
2444
|
hostedDescription: `${BASE_DESCRIPTION} Media must be public http(s) URLs.`,
|
|
2384
|
-
inputZod:
|
|
2385
|
-
inputJsonSchema:
|
|
2445
|
+
inputZod: InputSchema10,
|
|
2446
|
+
inputJsonSchema: InputJsonSchema10,
|
|
2386
2447
|
allowedModels: Array.from(new Set(VERBS.flatMap((v) => VIDEO_STUDIO_ENGINES[v]))),
|
|
2387
2448
|
defaultModel: VIDEO_STUDIO_ENGINES.change[0],
|
|
2388
|
-
run:
|
|
2449
|
+
run: run10
|
|
2389
2450
|
};
|
|
2390
2451
|
}
|
|
2391
2452
|
});
|
|
@@ -2560,28 +2621,28 @@ async function produce2(id, ctx) {
|
|
|
2560
2621
|
const musicNote = ep.musicEnabled && ep.music?.status === "failed" ? " The music bed failed, so this cut has no music." : "";
|
|
2561
2622
|
return { kind: "text", text: `Export started, free${prior}.${musicNote} ${next(id, "produce", "~60s")}` };
|
|
2562
2623
|
}
|
|
2563
|
-
async function
|
|
2624
|
+
async function run11(input, ctx) {
|
|
2564
2625
|
const action = input.action === "create" && input.episode_id ? "status" : input.action;
|
|
2565
2626
|
if (action === "create") return create(input, ctx);
|
|
2566
2627
|
if (!input.episode_id) return { kind: "text", text: "produce and status need the episode_id returned by the create step." };
|
|
2567
2628
|
if (action === "produce") return produce2(input.episode_id, ctx);
|
|
2568
2629
|
return status(input.episode_id, ctx);
|
|
2569
2630
|
}
|
|
2570
|
-
var
|
|
2631
|
+
var STYLES2, CATEGORIES, ENGINES, MIN_SECONDS, MAX_SECONDS, MAX_IN_FLIGHT, InputSchema11, InputJsonSchema11, call, next, needsRender, PLAN_POLL_MS, PLAN_MAX_POLLS, stillPlanning, episodeSkill;
|
|
2571
2632
|
var init_episode = __esm({
|
|
2572
2633
|
"src/skills/episode.ts"() {
|
|
2573
|
-
|
|
2634
|
+
STYLES2 = ["editorial-motion", "paper-diorama", "hand-drawn", "storybook", "poster-vector", "soft-3d"];
|
|
2574
2635
|
CATEGORIES = ["education", "history", "kids", "storytelling", "custom"];
|
|
2575
2636
|
ENGINES = ["omni-draft", "omni-final", "still-motion"];
|
|
2576
2637
|
MIN_SECONDS = 60;
|
|
2577
2638
|
MAX_SECONDS = 300;
|
|
2578
2639
|
MAX_IN_FLIGHT = 4;
|
|
2579
|
-
|
|
2640
|
+
InputSchema11 = zod.z.object({
|
|
2580
2641
|
action: zod.z.enum(["create", "produce", "status"]).default("create"),
|
|
2581
2642
|
topic: zod.z.string().min(8).max(400).optional(),
|
|
2582
2643
|
episode_id: zod.z.string().max(40).optional(),
|
|
2583
2644
|
category: zod.z.enum(CATEGORIES).default("education"),
|
|
2584
|
-
style: zod.z.enum(
|
|
2645
|
+
style: zod.z.enum(STYLES2).default("editorial-motion"),
|
|
2585
2646
|
aspect: zod.z.enum(["16:9", "9:16"]).default("16:9"),
|
|
2586
2647
|
length_seconds: zod.z.number().int().min(MIN_SECONDS).max(MAX_SECONDS).default(120),
|
|
2587
2648
|
voice: zod.z.string().min(1).max(80).default("Wise_Woman"),
|
|
@@ -2589,7 +2650,7 @@ var init_episode = __esm({
|
|
|
2589
2650
|
music: zod.z.boolean().default(true),
|
|
2590
2651
|
title: zod.z.string().max(120).optional()
|
|
2591
2652
|
});
|
|
2592
|
-
|
|
2653
|
+
InputJsonSchema11 = {
|
|
2593
2654
|
type: "object",
|
|
2594
2655
|
properties: {
|
|
2595
2656
|
action: {
|
|
@@ -2600,7 +2661,7 @@ var init_episode = __esm({
|
|
|
2600
2661
|
topic: { type: "string", description: "Create step: what the episode is about, 8 to 400 characters." },
|
|
2601
2662
|
episode_id: { type: "string", description: "The episode_id from the create step. Required for produce and status." },
|
|
2602
2663
|
category: { type: "string", enum: [...CATEGORIES], description: "Create step: tone of the script. Default education." },
|
|
2603
|
-
style: { type: "string", enum: [...
|
|
2664
|
+
style: { type: "string", enum: [...STYLES2], description: "Create step: visual style of every scene. Default editorial-motion." },
|
|
2604
2665
|
aspect: { type: "string", enum: ["16:9", "9:16"], description: "Create step: 16:9 landscape (default) or 9:16 vertical." },
|
|
2605
2666
|
length_seconds: { type: "integer", minimum: MIN_SECONDS, maximum: MAX_SECONDS, description: "Create step: target length in seconds. Default 120." },
|
|
2606
2667
|
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 +2683,15 @@ var init_episode = __esm({
|
|
|
2622
2683
|
episodeSkill = {
|
|
2623
2684
|
name: "pixeldojo_episode",
|
|
2624
2685
|
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:
|
|
2686
|
+
inputZod: InputSchema11,
|
|
2687
|
+
inputJsonSchema: InputJsonSchema11,
|
|
2627
2688
|
allowedModels: [],
|
|
2628
2689
|
defaultModel: "",
|
|
2629
|
-
run:
|
|
2690
|
+
run: run11
|
|
2630
2691
|
};
|
|
2631
2692
|
}
|
|
2632
2693
|
});
|
|
2633
|
-
async function
|
|
2694
|
+
async function run12(input, ctx) {
|
|
2634
2695
|
const productImages = [
|
|
2635
2696
|
...input.product_image_urls ?? [],
|
|
2636
2697
|
...await Promise.all((input.product_image_paths ?? []).map((p) => uploadLocalFile(p, ctx)))
|
|
@@ -2673,13 +2734,13 @@ async function run11(input, ctx) {
|
|
|
2673
2734
|
(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
2735
|
);
|
|
2675
2736
|
}
|
|
2676
|
-
var
|
|
2737
|
+
var InputSchema12, InputJsonSchema12, adSkill;
|
|
2677
2738
|
var init_ad = __esm({
|
|
2678
2739
|
"src/skills/ad.ts"() {
|
|
2679
2740
|
init_types();
|
|
2680
2741
|
init_poll();
|
|
2681
2742
|
init_upload_helpers();
|
|
2682
|
-
|
|
2743
|
+
InputSchema12 = zod.z.object({
|
|
2683
2744
|
style: zod.z.string().max(80).optional().describe(
|
|
2684
2745
|
"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
2746
|
),
|
|
@@ -2705,7 +2766,7 @@ var init_ad = __esm({
|
|
|
2705
2766
|
path: ["product_url"]
|
|
2706
2767
|
}
|
|
2707
2768
|
);
|
|
2708
|
-
|
|
2769
|
+
InputJsonSchema12 = {
|
|
2709
2770
|
type: "object",
|
|
2710
2771
|
properties: {
|
|
2711
2772
|
style: {
|
|
@@ -2792,16 +2853,16 @@ var init_ad = __esm({
|
|
|
2792
2853
|
name: "pixeldojo_ad",
|
|
2793
2854
|
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
2855
|
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:
|
|
2856
|
+
inputZod: InputSchema12,
|
|
2857
|
+
inputJsonSchema: InputJsonSchema12,
|
|
2797
2858
|
// Composition skill — the server routes to the ad engine internally.
|
|
2798
2859
|
allowedModels: [],
|
|
2799
2860
|
defaultModel: "",
|
|
2800
|
-
run:
|
|
2861
|
+
run: run12
|
|
2801
2862
|
};
|
|
2802
2863
|
}
|
|
2803
2864
|
});
|
|
2804
|
-
async function
|
|
2865
|
+
async function run13(input, ctx) {
|
|
2805
2866
|
const client = ctx.client;
|
|
2806
2867
|
const result = await client.runCampaign(input);
|
|
2807
2868
|
if (result.kind === "campaign") {
|
|
@@ -2828,10 +2889,10 @@ async function run12(input, ctx) {
|
|
|
2828
2889
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2829
2890
|
};
|
|
2830
2891
|
}
|
|
2831
|
-
var
|
|
2892
|
+
var InputSchema13, InputJsonSchema13, campaignSkill;
|
|
2832
2893
|
var init_campaign = __esm({
|
|
2833
2894
|
"src/skills/campaign.ts"() {
|
|
2834
|
-
|
|
2895
|
+
InputSchema13 = zod.z.object({
|
|
2835
2896
|
productUrl: zod.z.string().url().optional().describe("Product page URL. We extract name + description + images automatically."),
|
|
2836
2897
|
product: zod.z.object({
|
|
2837
2898
|
name: zod.z.string().min(1).max(200),
|
|
@@ -2847,7 +2908,7 @@ var init_campaign = __esm({
|
|
|
2847
2908
|
message: "productUrl or product is required",
|
|
2848
2909
|
path: ["productUrl"]
|
|
2849
2910
|
});
|
|
2850
|
-
|
|
2911
|
+
InputJsonSchema13 = {
|
|
2851
2912
|
type: "object",
|
|
2852
2913
|
properties: {
|
|
2853
2914
|
productUrl: {
|
|
@@ -2898,17 +2959,17 @@ var init_campaign = __esm({
|
|
|
2898
2959
|
campaignSkill = {
|
|
2899
2960
|
name: "pixeldojo_campaign",
|
|
2900
2961
|
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:
|
|
2962
|
+
inputZod: InputSchema13,
|
|
2963
|
+
inputJsonSchema: InputJsonSchema13,
|
|
2903
2964
|
// Composition skill — internal sub-jobs route to per-tool models, no
|
|
2904
2965
|
// single allowed-models list applies here.
|
|
2905
2966
|
allowedModels: [],
|
|
2906
2967
|
defaultModel: "",
|
|
2907
|
-
run:
|
|
2968
|
+
run: run13
|
|
2908
2969
|
};
|
|
2909
2970
|
}
|
|
2910
2971
|
});
|
|
2911
|
-
async function
|
|
2972
|
+
async function run14(input, ctx) {
|
|
2912
2973
|
const client = ctx.client;
|
|
2913
2974
|
const result = await client.getCampaign(input.campaignId);
|
|
2914
2975
|
if (result.kind === "campaign") {
|
|
@@ -2938,13 +2999,13 @@ async function run13(input, ctx) {
|
|
|
2938
2999
|
statusUrl: result.statusUrl ?? ctx.buildStatusUrl(result.campaignId)
|
|
2939
3000
|
};
|
|
2940
3001
|
}
|
|
2941
|
-
var
|
|
3002
|
+
var InputSchema14, InputJsonSchema14, campaignStatusSkill;
|
|
2942
3003
|
var init_campaign_status = __esm({
|
|
2943
3004
|
"src/skills/campaign-status.ts"() {
|
|
2944
|
-
|
|
3005
|
+
InputSchema14 = zod.z.object({
|
|
2945
3006
|
campaignId: zod.z.string().min(1).max(200).describe("Campaign id returned from a prior pixeldojo_campaign handoff.")
|
|
2946
3007
|
});
|
|
2947
|
-
|
|
3008
|
+
InputJsonSchema14 = {
|
|
2948
3009
|
type: "object",
|
|
2949
3010
|
properties: {
|
|
2950
3011
|
campaignId: {
|
|
@@ -2957,15 +3018,15 @@ var init_campaign_status = __esm({
|
|
|
2957
3018
|
campaignStatusSkill = {
|
|
2958
3019
|
name: "pixeldojo_campaign_status",
|
|
2959
3020
|
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:
|
|
3021
|
+
inputZod: InputSchema14,
|
|
3022
|
+
inputJsonSchema: InputJsonSchema14,
|
|
2962
3023
|
allowedModels: [],
|
|
2963
3024
|
defaultModel: "",
|
|
2964
|
-
run:
|
|
3025
|
+
run: run14
|
|
2965
3026
|
};
|
|
2966
3027
|
}
|
|
2967
3028
|
});
|
|
2968
|
-
async function
|
|
3029
|
+
async function run15(input, ctx) {
|
|
2969
3030
|
let url;
|
|
2970
3031
|
try {
|
|
2971
3032
|
url = await uploadLocalFile(input.path, ctx);
|
|
@@ -2981,16 +3042,16 @@ async function run14(input, ctx) {
|
|
|
2981
3042
|
(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
3043
|
};
|
|
2983
3044
|
}
|
|
2984
|
-
var
|
|
3045
|
+
var InputSchema15, InputJsonSchema15, uploadSkill;
|
|
2985
3046
|
var init_upload = __esm({
|
|
2986
3047
|
"src/skills/upload.ts"() {
|
|
2987
3048
|
init_upload_helpers();
|
|
2988
|
-
|
|
3049
|
+
InputSchema15 = zod.z.object({
|
|
2989
3050
|
path: zod.z.string().min(1).max(4096).describe(
|
|
2990
3051
|
"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
3052
|
)
|
|
2992
3053
|
});
|
|
2993
|
-
|
|
3054
|
+
InputJsonSchema15 = {
|
|
2994
3055
|
type: "object",
|
|
2995
3056
|
properties: {
|
|
2996
3057
|
path: {
|
|
@@ -3003,15 +3064,15 @@ var init_upload = __esm({
|
|
|
3003
3064
|
uploadSkill = {
|
|
3004
3065
|
name: "pixeldojo_upload",
|
|
3005
3066
|
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:
|
|
3067
|
+
inputZod: InputSchema15,
|
|
3068
|
+
inputJsonSchema: InputJsonSchema15,
|
|
3008
3069
|
allowedModels: [],
|
|
3009
3070
|
defaultModel: "",
|
|
3010
|
-
run:
|
|
3071
|
+
run: run15
|
|
3011
3072
|
};
|
|
3012
3073
|
}
|
|
3013
3074
|
});
|
|
3014
|
-
async function
|
|
3075
|
+
async function run16(input, ctx) {
|
|
3015
3076
|
const requested = input.model ?? DEFAULT_MODEL6;
|
|
3016
3077
|
if (!ALLOWED4.includes(requested)) {
|
|
3017
3078
|
return {
|
|
@@ -3049,14 +3110,14 @@ async function run15(input, ctx) {
|
|
|
3049
3110
|
(urls) => urls.length === 0 ? `Job ${submitted.jobId} completed but returned no assets.` : `Audio ready. Asset: ${urls[0]}`
|
|
3050
3111
|
);
|
|
3051
3112
|
}
|
|
3052
|
-
var ALLOWED4, DEFAULT_MODEL6,
|
|
3113
|
+
var ALLOWED4, DEFAULT_MODEL6, InputSchema16, InputJsonSchema16, audioSkill;
|
|
3053
3114
|
var init_audio = __esm({
|
|
3054
3115
|
"src/skills/audio.ts"() {
|
|
3055
3116
|
init_poll();
|
|
3056
3117
|
init_types();
|
|
3057
3118
|
ALLOWED4 = ["seed-audio", "text-to-speech"];
|
|
3058
3119
|
DEFAULT_MODEL6 = "seed-audio";
|
|
3059
|
-
|
|
3120
|
+
InputSchema16 = zod.z.object({
|
|
3060
3121
|
prompt: zod.z.string().min(1).describe(
|
|
3061
3122
|
"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
3123
|
),
|
|
@@ -3066,7 +3127,7 @@ var init_audio = __esm({
|
|
|
3066
3127
|
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
3128
|
speed: zod.z.number().min(0.5).max(2).optional().describe("Speech speed multiplier, 0.5-2 (default 1). Both models.")
|
|
3068
3129
|
});
|
|
3069
|
-
|
|
3130
|
+
InputJsonSchema16 = {
|
|
3070
3131
|
type: "object",
|
|
3071
3132
|
properties: {
|
|
3072
3133
|
prompt: {
|
|
@@ -3104,15 +3165,15 @@ var init_audio = __esm({
|
|
|
3104
3165
|
audioSkill = {
|
|
3105
3166
|
name: "pixeldojo_audio",
|
|
3106
3167
|
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:
|
|
3168
|
+
inputZod: InputSchema16,
|
|
3169
|
+
inputJsonSchema: InputJsonSchema16,
|
|
3109
3170
|
allowedModels: [...ALLOWED4],
|
|
3110
3171
|
defaultModel: DEFAULT_MODEL6,
|
|
3111
|
-
run:
|
|
3172
|
+
run: run16
|
|
3112
3173
|
};
|
|
3113
3174
|
}
|
|
3114
3175
|
});
|
|
3115
|
-
async function
|
|
3176
|
+
async function run17(input, ctx) {
|
|
3116
3177
|
if (input.source === "characters") {
|
|
3117
3178
|
const { characters } = await ctx.client.listCharacters({ q: input.q, limit: input.limit ?? 25 });
|
|
3118
3179
|
if (characters.length === 0) {
|
|
@@ -3163,17 +3224,17 @@ ${lines.join("\n")}
|
|
|
3163
3224
|
Pass any URL back into pixeldojo_generate, pixeldojo_edit, pixeldojo_character, or pixeldojo_upscale as a reference input.`
|
|
3164
3225
|
};
|
|
3165
3226
|
}
|
|
3166
|
-
var
|
|
3227
|
+
var InputSchema17, InputJsonSchema17, librarySkill;
|
|
3167
3228
|
var init_library = __esm({
|
|
3168
3229
|
"src/skills/library.ts"() {
|
|
3169
|
-
|
|
3230
|
+
InputSchema17 = zod.z.object({
|
|
3170
3231
|
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
3232
|
q: zod.z.string().optional().describe("Substring match against the prompt that produced the asset."),
|
|
3172
3233
|
model: zod.z.string().optional().describe("Restrict to a single model (apiId)."),
|
|
3173
3234
|
modality: zod.z.enum(["image", "video", "audio"]).optional().describe("Restrict to one output type."),
|
|
3174
3235
|
limit: zod.z.number().int().min(1).max(50).optional().describe("Max results (default 10).")
|
|
3175
3236
|
});
|
|
3176
|
-
|
|
3237
|
+
InputJsonSchema17 = {
|
|
3177
3238
|
type: "object",
|
|
3178
3239
|
properties: {
|
|
3179
3240
|
source: {
|
|
@@ -3198,15 +3259,15 @@ var init_library = __esm({
|
|
|
3198
3259
|
librarySkill = {
|
|
3199
3260
|
name: "pixeldojo_library",
|
|
3200
3261
|
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:
|
|
3262
|
+
inputZod: InputSchema17,
|
|
3263
|
+
inputJsonSchema: InputJsonSchema17,
|
|
3203
3264
|
allowedModels: [],
|
|
3204
3265
|
defaultModel: "",
|
|
3205
|
-
run:
|
|
3266
|
+
run: run17
|
|
3206
3267
|
};
|
|
3207
3268
|
}
|
|
3208
3269
|
});
|
|
3209
|
-
async function
|
|
3270
|
+
async function run18(input, ctx) {
|
|
3210
3271
|
const res = await ctx.client.saveMedia({
|
|
3211
3272
|
url: input.url,
|
|
3212
3273
|
prompt: input.prompt,
|
|
@@ -3220,17 +3281,17 @@ async function run17(input, ctx) {
|
|
|
3220
3281
|
It will appear at https://pixeldojo.ai/my-images and in pixeldojo_library searches.`
|
|
3221
3282
|
};
|
|
3222
3283
|
}
|
|
3223
|
-
var
|
|
3284
|
+
var InputSchema18, InputJsonSchema18, saveSkill;
|
|
3224
3285
|
var init_save = __esm({
|
|
3225
3286
|
"src/skills/save.ts"() {
|
|
3226
|
-
|
|
3287
|
+
InputSchema18 = zod.z.object({
|
|
3227
3288
|
url: zod.z.string().url().describe("The asset URL to save (image or video)."),
|
|
3228
3289
|
prompt: zod.z.string().optional().describe("The prompt that produced it \u2014 makes it findable in the library later."),
|
|
3229
3290
|
tool_name: zod.z.string().optional().describe("Tool/model slug that produced it."),
|
|
3230
3291
|
modality: zod.z.enum(["image", "video", "audio"]).optional(),
|
|
3231
3292
|
job_id: zod.z.string().optional().describe("The jobId that produced this asset, when known.")
|
|
3232
3293
|
});
|
|
3233
|
-
|
|
3294
|
+
InputJsonSchema18 = {
|
|
3234
3295
|
type: "object",
|
|
3235
3296
|
properties: {
|
|
3236
3297
|
url: { type: "string", format: "uri", description: "The result URL to keep (image or video from a PixelDojo job)." },
|
|
@@ -3244,15 +3305,15 @@ var init_save = __esm({
|
|
|
3244
3305
|
saveSkill = {
|
|
3245
3306
|
name: "pixeldojo_save",
|
|
3246
3307
|
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:
|
|
3308
|
+
inputZod: InputSchema18,
|
|
3309
|
+
inputJsonSchema: InputJsonSchema18,
|
|
3249
3310
|
allowedModels: [],
|
|
3250
3311
|
defaultModel: "",
|
|
3251
|
-
run:
|
|
3312
|
+
run: run18
|
|
3252
3313
|
};
|
|
3253
3314
|
}
|
|
3254
3315
|
});
|
|
3255
|
-
async function
|
|
3316
|
+
async function run19(input, ctx) {
|
|
3256
3317
|
const res = await ctx.client.saveCharacter({
|
|
3257
3318
|
name: input.name,
|
|
3258
3319
|
kind: input.kind ?? "character",
|
|
@@ -3264,17 +3325,17 @@ async function run18(input, ctx) {
|
|
|
3264
3325
|
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
3326
|
};
|
|
3266
3327
|
}
|
|
3267
|
-
var KINDS,
|
|
3328
|
+
var KINDS, InputSchema19, InputJsonSchema19, saveCharacterSkill;
|
|
3268
3329
|
var init_save_character = __esm({
|
|
3269
3330
|
"src/skills/save-character.ts"() {
|
|
3270
3331
|
KINDS = ["character", "product", "outfit", "location", "object", "style"];
|
|
3271
|
-
|
|
3332
|
+
InputSchema19 = zod.z.object({
|
|
3272
3333
|
name: zod.z.string().min(1).max(60).describe("What to call it. Used as @Name in prompts."),
|
|
3273
3334
|
kind: zod.z.enum(KINDS).optional().describe("Default character."),
|
|
3274
3335
|
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
3336
|
description: zod.z.string().max(1500).optional().describe("Appearance notes, or the scene text for an element.")
|
|
3276
3337
|
});
|
|
3277
|
-
|
|
3338
|
+
InputJsonSchema19 = {
|
|
3278
3339
|
type: "object",
|
|
3279
3340
|
properties: {
|
|
3280
3341
|
name: { type: "string", description: "What to call it. Used as @Name in prompts afterwards." },
|
|
@@ -3292,11 +3353,11 @@ var init_save_character = __esm({
|
|
|
3292
3353
|
saveCharacterSkill = {
|
|
3293
3354
|
name: "pixeldojo_save_character",
|
|
3294
3355
|
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:
|
|
3356
|
+
inputZod: InputSchema19,
|
|
3357
|
+
inputJsonSchema: InputJsonSchema19,
|
|
3297
3358
|
allowedModels: [],
|
|
3298
3359
|
defaultModel: "",
|
|
3299
|
-
run:
|
|
3360
|
+
run: run19
|
|
3300
3361
|
};
|
|
3301
3362
|
}
|
|
3302
3363
|
});
|
|
@@ -3545,6 +3606,7 @@ __export(skills_exports, {
|
|
|
3545
3606
|
audioSkill: () => audioSkill,
|
|
3546
3607
|
campaignSkill: () => campaignSkill,
|
|
3547
3608
|
campaignStatusSkill: () => campaignStatusSkill,
|
|
3609
|
+
captionSkill: () => captionSkill,
|
|
3548
3610
|
characterSkill: () => characterSkill,
|
|
3549
3611
|
editSkill: () => editSkill,
|
|
3550
3612
|
episodeSkill: () => episodeSkill,
|
|
@@ -3592,6 +3654,7 @@ var init_skills = __esm({
|
|
|
3592
3654
|
init_character();
|
|
3593
3655
|
init_storyboard();
|
|
3594
3656
|
init_upscale();
|
|
3657
|
+
init_caption();
|
|
3595
3658
|
init_status();
|
|
3596
3659
|
init_from_url();
|
|
3597
3660
|
init_film();
|
|
@@ -3612,6 +3675,7 @@ var init_skills = __esm({
|
|
|
3612
3675
|
characterSkill,
|
|
3613
3676
|
storyboardSkill,
|
|
3614
3677
|
upscaleSkill,
|
|
3678
|
+
captionSkill,
|
|
3615
3679
|
audioSkill,
|
|
3616
3680
|
librarySkill,
|
|
3617
3681
|
saveSkill,
|
|
@@ -3651,6 +3715,7 @@ var init_skills = __esm({
|
|
|
3651
3715
|
pixeldojo_character: render("Consistent character image"),
|
|
3652
3716
|
pixeldojo_storyboard: render("Storyboard preview video"),
|
|
3653
3717
|
pixeldojo_upscale: render("Upscale image or video"),
|
|
3718
|
+
pixeldojo_caption: render("Caption video"),
|
|
3654
3719
|
pixeldojo_audio: render("Generate music, speech or sound"),
|
|
3655
3720
|
pixeldojo_video: render("Change, animate or extend video"),
|
|
3656
3721
|
pixeldojo_ad: render("Make video ad"),
|
|
@@ -3721,7 +3786,7 @@ function makeRedactedLogger(target = console) {
|
|
|
3721
3786
|
}
|
|
3722
3787
|
|
|
3723
3788
|
// src/server.ts
|
|
3724
|
-
var PACKAGE_VERSION = "0.
|
|
3789
|
+
var PACKAGE_VERSION = "0.21.0" ;
|
|
3725
3790
|
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
3791
|
function buildServer(options) {
|
|
3727
3792
|
if (!options.apiKey) {
|
|
@@ -3893,6 +3958,7 @@ function printInit() {
|
|
|
3893
3958
|
`# pixeldojo_character Consistent characters across shots.`,
|
|
3894
3959
|
`# pixeldojo_storyboard Multi-shot scenes from one brief.`,
|
|
3895
3960
|
`# pixeldojo_upscale Enhance any image or video.`,
|
|
3961
|
+
`# pixeldojo_caption Animated word-by-word captions on a video.`,
|
|
3896
3962
|
`# pixeldojo_audio Voices + effects + music in one clip.`,
|
|
3897
3963
|
`# pixeldojo_library Search your saved media + generations.`,
|
|
3898
3964
|
`# pixeldojo_*_workflow Save / run / list multi-step chains.`,
|