@pixeldojo/mcp 0.31.0 → 0.36.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 +9 -2
- package/dist/cli.cjs +115 -56
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +115 -56
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +115 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +115 -56
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -248,6 +248,14 @@ async function snapAspectRatio(apiId, requested, client, opts = {}) {
|
|
|
248
248
|
if (!field.enum || field.enum.length === 0) return requested;
|
|
249
249
|
return nearestAspectFromEnum(requested, field.enum);
|
|
250
250
|
}
|
|
251
|
+
async function snapImageSizePreset(apiId, requested, client) {
|
|
252
|
+
if (!requested) return void 0;
|
|
253
|
+
const props2 = await getFieldConstraints(apiId, client);
|
|
254
|
+
const values = props2?.image_size?.enum;
|
|
255
|
+
if (!values || props2?.aspect_ratio) return void 0;
|
|
256
|
+
const key = requested.trim().replace(":", "_");
|
|
257
|
+
return values.find((v) => String(v).endsWith(`_${key}`));
|
|
258
|
+
}
|
|
251
259
|
async function resolveMediaSlot(apiId, kind, client) {
|
|
252
260
|
const info = await getModelInfo(apiId, client);
|
|
253
261
|
if (info === null) return void 0;
|
|
@@ -506,20 +514,24 @@ async function run(input, ctx) {
|
|
|
506
514
|
}
|
|
507
515
|
}
|
|
508
516
|
let refField;
|
|
517
|
+
let imageSizePreset;
|
|
509
518
|
let audioSlot;
|
|
510
519
|
if (!VIDEO_INPUT_MODELS.has(apiId)) {
|
|
511
|
-
const [aspect_ratio, duration, resolution, ref, audio] = await Promise.all([
|
|
520
|
+
const [aspect_ratio, imageSize, duration, resolution, ref, audio] = await Promise.all([
|
|
512
521
|
snapAspectRatio(apiId, resolved.aspect_ratio, ctx.client),
|
|
522
|
+
snapImageSizePreset(apiId, resolved.aspect_ratio, ctx.client),
|
|
513
523
|
snapDuration(apiId, resolved.duration, ctx.client),
|
|
514
524
|
snapResolution(apiId, resolved.resolution, ctx.client),
|
|
515
525
|
src.url ? resolveMediaSlot(apiId, src.isClip ? "video" : "image", ctx.client) : Promise.resolve(void 0),
|
|
516
526
|
src.audioUrl ? resolveMediaSlot(apiId, "audio", ctx.client) : Promise.resolve(void 0)
|
|
517
527
|
]);
|
|
518
528
|
resolved = { ...resolved, aspect_ratio, duration, resolution };
|
|
529
|
+
imageSizePreset = imageSize;
|
|
519
530
|
refField = ref === void 0 && src.url ? fallbackSlot(apiId, src.isClip ? "video" : "image") : ref;
|
|
520
531
|
audioSlot = audio === void 0 && src.audioUrl ? fallbackSlot(apiId, "audio") : audio;
|
|
521
532
|
}
|
|
522
533
|
const body = buildPayload(apiId, resolved, src, refField, audioSlot);
|
|
534
|
+
if (imageSizePreset) body.image_size = imageSizePreset;
|
|
523
535
|
const paramsNote = applyParams(body, input.params, input.model, apiId);
|
|
524
536
|
const note = [routeNote, paramsNote].filter(Boolean).join(" ");
|
|
525
537
|
const submitted = await ctx.client.run(apiId, body);
|
|
@@ -551,7 +563,7 @@ var init_generate = __esm({
|
|
|
551
563
|
InputSchema = zod.z.object({
|
|
552
564
|
prompt: zod.z.string().min(1).max(8e3).describe('Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio ("@Mara on a beach"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.'),
|
|
553
565
|
model: zod.z.string().optional().describe(
|
|
554
|
-
`Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5" for images (the default), "seedance-2-5" for video (prompt only or a starting image), "kling-4-0" for a whole scene up to 30 s written as a shot list (dialogue in quotes, exact on-screen text), "minimax-h3-turbo" for the cheapest video from a photo or up to 9 reference images
|
|
566
|
+
`Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5-5" for images (the default), "seedance-2-5-flash" for video (prompt only or a starting image, 480p or 720p), "seedance-2-5" for 1080p video, "kling-4-0" for a whole scene up to 30 s written as a shot list (dialogue in quotes, exact on-screen text), "minimax-h3-turbo" for the cheapest video from a prompt alone, a photo or up to 9 reference images, "wan-3-0-video" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model's fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5-5, which makes still images only; name a video model to get a video.`
|
|
555
567
|
),
|
|
556
568
|
preset: zod.z.string().optional().describe(
|
|
557
569
|
"Preset slug that seeds the running model's settings; explicit fields and params override it. Each preset belongs to one model (browse them by model at https://pixeldojo.ai/presets), so set `model` to that preset's model: a slug the running model has no preset for is rejected with a 400 before any charge."
|
|
@@ -576,7 +588,7 @@ var init_generate = __esm({
|
|
|
576
588
|
"Multiple absolute local file paths. Each is uploaded to PixelDojo (24h temp storage) and used as a reference, same rules as image_urls."
|
|
577
589
|
)
|
|
578
590
|
});
|
|
579
|
-
DEFAULT_MODEL = "seedream-5";
|
|
591
|
+
DEFAULT_MODEL = "seedream-5-5";
|
|
580
592
|
VIDEO_REFERENCE_MODEL = "seedance-2-reference";
|
|
581
593
|
VIDEO_REFERENCE_SLOTS = {
|
|
582
594
|
image: { name: "reference_images", isArray: true },
|
|
@@ -590,7 +602,7 @@ var init_generate = __esm({
|
|
|
590
602
|
prompt: { type: "string", description: 'Prompt describing what to generate. Write @Name to use a character or element the user saved in Character Studio ("@Mara on a beach"): its photos are attached automatically on models that take reference images. pixeldojo_library source=characters lists them.' },
|
|
591
603
|
model: {
|
|
592
604
|
type: "string",
|
|
593
|
-
description: `Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5" for images (the default), "seedance-2-5" for video (prompt only or a starting image), "kling-4-0" for a whole scene up to 30 s written as a shot list (dialogue in quotes, exact on-screen text), "minimax-h3-turbo" for the cheapest video from a photo or up to 9 reference images
|
|
605
|
+
description: `Model apiId. Recommended (the models the PixelDojo studios use): "seedream-5-5" for images (the default), "seedance-2-5-flash" for video (prompt only or a starting image, 480p or 720p), "seedance-2-5" for 1080p video, "kling-4-0" for a whole scene up to 30 s written as a shot list (dialogue in quotes, exact on-screen text), "minimax-h3-turbo" for the cheapest video from a prompt alone, a photo or up to 9 reference images, "wan-3-0-video" for video the others refuse. Use another model only when the user names one. Full catalog: https://pixeldojo.ai/api/v1/models; one model's fields: https://pixeldojo.ai/llm/{apiId}.txt. Omit for seedream-5-5, which makes still images only; name a video model to get a video.`
|
|
594
606
|
},
|
|
595
607
|
preset: {
|
|
596
608
|
type: "string",
|
|
@@ -638,8 +650,8 @@ var init_generate = __esm({
|
|
|
638
650
|
};
|
|
639
651
|
generateSkill = {
|
|
640
652
|
name: "pixeldojo_generate",
|
|
641
|
-
description: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image; kling-4-0 for a multi-shot scene up to 30 s with dialogue; minimax-h3-turbo for the lowest price
|
|
642
|
-
hostedDescription: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5, which makes still images only. For a video, name seedance-2-5, which works from a prompt alone or a starting image; kling-4-0 for a multi-shot scene up to 30 s with dialogue; minimax-h3-turbo for the lowest price
|
|
653
|
+
description: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5-5, which makes still images only. For a video, name seedance-2-5-flash, which works from a prompt alone or a starting image at 480p or 720p; seedance-2-5 for 1080p; kling-4-0 for a multi-shot scene up to 30 s with dialogue; minimax-h3-turbo for the lowest price, from a prompt alone, a photo or reference images. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills, `video_url` for a source clip, `image_path`/`image_paths` for absolute local files (uploaded to 24h temp storage first). A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.",
|
|
654
|
+
hostedDescription: "Generate an image or video from a prompt with any model in the PixelDojo catalog. With no `model`, a prompt runs on seedream-5-5, which makes still images only. For a video, name seedance-2-5-flash, which works from a prompt alone or a starting image at 480p or 720p; seedance-2-5 for 1080p; kling-4-0 for a multi-shot scene up to 30 s with dialogue; minimax-h3-turbo for the lowest price, from a prompt alone, a photo or reference images. If a provider refuses the content, retry once on wan-3-0-video (video) or seedream-5 (images), the least-restricted models. For a multi-shot film or a music video synced to a song use pixeldojo_film; to change, move or extend an existing clip use pixeldojo_video. These are the models the PixelDojo studios use; name another only when the user asks for it. References: `image_url`/`image_urls` for stills and `video_url` for a source clip, all public http(s) URLs. A clip or an audio track URL with no `model` runs on seedance-2-reference; a named model that cannot read a clip is swapped for it and the result says so, while a named model with no audio input drops the track. Model-specific settings go in `params` alongside an explicit `model`. Returns asset URLs, or a jobId for pixeldojo_status when the job outlasts the 30s wait.",
|
|
643
655
|
inputZod: InputSchema,
|
|
644
656
|
inputJsonSchema: InputJsonSchema,
|
|
645
657
|
allowedModels: null,
|
|
@@ -919,25 +931,31 @@ var init_character = __esm({
|
|
|
919
931
|
init_schema_snap();
|
|
920
932
|
init_params();
|
|
921
933
|
ALLOWED = [
|
|
934
|
+
"seedream-5-5",
|
|
922
935
|
"seedream-5",
|
|
923
936
|
"seedream-4",
|
|
924
937
|
"seedream-5-flash",
|
|
925
938
|
"google-nano-banana",
|
|
926
939
|
"wan-2.7-image-edit",
|
|
927
940
|
"qwen-3-pro",
|
|
928
|
-
"qwen-image-2.0-pro"
|
|
941
|
+
"qwen-image-2.0-pro",
|
|
942
|
+
"p-h3-image",
|
|
943
|
+
"minimax-h3-image"
|
|
929
944
|
];
|
|
930
|
-
DEFAULT_MODEL3 = "seedream-5";
|
|
945
|
+
DEFAULT_MODEL3 = "seedream-5-5";
|
|
931
946
|
MAX_REFERENCES = 9;
|
|
932
947
|
REQUIRES_REFERENCE = /* @__PURE__ */ new Set(["wan-2.7-image-edit"]);
|
|
933
948
|
FALLBACK_REF_KEY = {
|
|
934
949
|
"seedream-5": "image_urls",
|
|
950
|
+
"seedream-5-5": "image_urls",
|
|
935
951
|
"seedream-4": "image_urls",
|
|
936
952
|
"seedream-5-flash": "image_urls",
|
|
937
953
|
"google-nano-banana": "image_input",
|
|
938
954
|
"wan-2.7-image-edit": "image_urls",
|
|
939
955
|
"qwen-3-pro": "image",
|
|
940
|
-
"qwen-image-2.0-pro": "reference_images"
|
|
956
|
+
"qwen-image-2.0-pro": "reference_images",
|
|
957
|
+
"p-h3-image": "reference_images",
|
|
958
|
+
"minimax-h3-image": "reference_images"
|
|
941
959
|
};
|
|
942
960
|
InputSchema3 = zod.z.object({
|
|
943
961
|
prompt: zod.z.string().min(1).max(8e3),
|
|
@@ -974,7 +992,7 @@ var init_character = __esm({
|
|
|
974
992
|
},
|
|
975
993
|
aspect_ratio: {
|
|
976
994
|
type: "string",
|
|
977
|
-
description: 'e.g. "1:1", "16:9", "9:16". Snapped to the nearest ratio the model supports, and dropped for models with no aspect_ratio field (including the default seedream-5, which sizes by image_size: set that in params with an explicit model).'
|
|
995
|
+
description: 'e.g. "1:1", "16:9", "9:16". Snapped to the nearest ratio the model supports, and dropped for models with no aspect_ratio field (including the default seedream-5-5, which sizes by image_size: set that in params with an explicit model).'
|
|
978
996
|
},
|
|
979
997
|
params: PARAMS_JSON_SCHEMA
|
|
980
998
|
},
|
|
@@ -982,7 +1000,7 @@ var init_character = __esm({
|
|
|
982
1000
|
};
|
|
983
1001
|
characterSkill = {
|
|
984
1002
|
name: "pixeldojo_character",
|
|
985
|
-
description: "Generate or edit consistent characters across shots. Pass reference_image_urls (up to 9) to lock identity \u2014 send every photo of the person you have, since more angles hold the face far better than one. Defaults to seedream-5.",
|
|
1003
|
+
description: "Generate or edit consistent characters across shots. Pass reference_image_urls (up to 9) to lock identity \u2014 send every photo of the person you have, since more angles hold the face far better than one. Defaults to seedream-5-5.",
|
|
986
1004
|
inputZod: InputSchema3,
|
|
987
1005
|
inputJsonSchema: InputJsonSchema3,
|
|
988
1006
|
allowedModels: [...ALLOWED],
|
|
@@ -1681,7 +1699,7 @@ async function filmApi(ctx, method, path, body) {
|
|
|
1681
1699
|
Authorization: `Bearer ${ctx.apiKey}`,
|
|
1682
1700
|
"Content-Type": "application/json",
|
|
1683
1701
|
"x-pixeldojo-source": `mcp/${ctx.mcpVersion}`,
|
|
1684
|
-
"x-pixeldojo-skill": "
|
|
1702
|
+
"x-pixeldojo-skill": "pixeldojo_film"
|
|
1685
1703
|
},
|
|
1686
1704
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
1687
1705
|
});
|
|
@@ -2010,7 +2028,7 @@ It is saved in the Library folder "Film: ${film.title}".`,
|
|
|
2010
2028
|
}
|
|
2011
2029
|
const startExport = async () => {
|
|
2012
2030
|
const r = await filmApi(ctx, "POST", `/api/films/${filmId}/export`, {});
|
|
2013
|
-
return r.status === 200 || r.status === 409 ? null : r.data.error ?? `HTTP ${r.status}`;
|
|
2031
|
+
return r.status === 200 || r.status === 409 && r.data.code === "export-running" ? null : r.data.error ?? `HTTP ${r.status}`;
|
|
2014
2032
|
};
|
|
2015
2033
|
if (film.exportError && all.length > 0 && all.every((sh) => sh.status === "clip-ready")) {
|
|
2016
2034
|
const again = await startExport();
|
|
@@ -2440,8 +2458,6 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2440
2458
|
...vd !== void 0 ? { source_duration_seconds: vd } : {}
|
|
2441
2459
|
}
|
|
2442
2460
|
};
|
|
2443
|
-
case "flux-video-edit":
|
|
2444
|
-
return { body: { prompt, video: i.videoUrl, video_duration: Math.ceil(vd) }, note: droppedImages };
|
|
2445
2461
|
case "xai-video-edit":
|
|
2446
2462
|
return { body: { prompt, video_url: i.videoUrl, video_duration: vd }, note: droppedImages };
|
|
2447
2463
|
case "happyhorse-1.0-video-edit":
|
|
@@ -2472,6 +2488,17 @@ function buildVideoPayload(verb, apiId, i) {
|
|
|
2472
2488
|
}
|
|
2473
2489
|
}
|
|
2474
2490
|
if (verb === "move") {
|
|
2491
|
+
if (apiId === "p-video-2-pro-replace") {
|
|
2492
|
+
return {
|
|
2493
|
+
body: {
|
|
2494
|
+
prompt: "",
|
|
2495
|
+
video: i.videoUrl,
|
|
2496
|
+
images: i.images.slice(0, 2),
|
|
2497
|
+
video_duration: vd,
|
|
2498
|
+
...prompt ? { instruction_prompt: prompt } : {}
|
|
2499
|
+
}
|
|
2500
|
+
};
|
|
2501
|
+
}
|
|
2475
2502
|
if (apiId === "wan-video-character-swap") {
|
|
2476
2503
|
return { body: { prompt: "", image_url: i.images[0], video_url: i.videoUrl, video_duration: vd } };
|
|
2477
2504
|
}
|
|
@@ -2593,8 +2620,6 @@ var init_video = __esm({
|
|
|
2593
2620
|
VIDEO_STUDIO_ENGINES = {
|
|
2594
2621
|
change: [
|
|
2595
2622
|
"seedance-2-5-video-edit",
|
|
2596
|
-
"flux-video-edit",
|
|
2597
|
-
"kling-video-edit",
|
|
2598
2623
|
"kling-4-0",
|
|
2599
2624
|
"minimax-h3-turbo",
|
|
2600
2625
|
"wan-video-edit",
|
|
@@ -2602,24 +2627,24 @@ var init_video = __esm({
|
|
|
2602
2627
|
"happyhorse-1.0-video-edit",
|
|
2603
2628
|
"xai-video-edit"
|
|
2604
2629
|
],
|
|
2605
|
-
move: ["kling-motion-control", "wan-video-character-swap"],
|
|
2630
|
+
move: ["p-video-2-pro-replace", "kling-motion-control", "wan-video-character-swap"],
|
|
2606
2631
|
extend: ["seedance-2-5-video-edit", "wan-2.7-i2v", "grok-video-extend"]
|
|
2607
2632
|
};
|
|
2608
2633
|
VERBS = ["change", "move", "extend"];
|
|
2609
2634
|
BACKWARD_ENGINES = /* @__PURE__ */ new Set(["seedance-2-5-video-edit"]);
|
|
2610
2635
|
clamp = (n, min, max) => Math.min(max, Math.max(min, Math.round(n)));
|
|
2611
2636
|
NEEDS_VIDEO_DURATION = /* @__PURE__ */ new Set([
|
|
2612
|
-
"flux-video-edit",
|
|
2613
|
-
"kling-video-edit",
|
|
2614
2637
|
"wan-video-edit",
|
|
2615
2638
|
"seedance-video-edit",
|
|
2616
2639
|
"happyhorse-1.0-video-edit",
|
|
2617
2640
|
"xai-video-edit",
|
|
2618
2641
|
"kling-motion-control",
|
|
2619
2642
|
"wan-video-character-swap",
|
|
2620
|
-
"kling-4-0"
|
|
2643
|
+
"kling-4-0",
|
|
2644
|
+
// Its schema defaults the length, but the price is per second: a missing length would under-charge.
|
|
2645
|
+
"p-video-2-pro-replace"
|
|
2621
2646
|
]);
|
|
2622
|
-
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["
|
|
2647
|
+
NO_IMAGE_ENGINES = /* @__PURE__ */ new Set(["xai-video-edit", "minimax-h3-turbo"]);
|
|
2623
2648
|
InputSchema11 = zod.z.object({
|
|
2624
2649
|
verb: zod.z.enum(VERBS),
|
|
2625
2650
|
prompt: zod.z.string().max(8e3).optional(),
|
|
@@ -2645,7 +2670,7 @@ var init_video = __esm({
|
|
|
2645
2670
|
},
|
|
2646
2671
|
prompt: {
|
|
2647
2672
|
type: "string",
|
|
2648
|
-
description: "What to change, how the character should move, or what happens next. Required for change and extend. Optional for move (wan-video-character-swap ignores it). @Name uses a character or element the user saved in Character Studio (photos attached automatically)."
|
|
2673
|
+
description: "What to change, how the character should move, or what happens next. Required for change and extend. Optional for move (p-video-2-pro-replace reads it as who becomes whom; wan-video-character-swap ignores it). @Name uses a character or element the user saved in Character Studio (photos attached automatically)."
|
|
2649
2674
|
},
|
|
2650
2675
|
video_url: {
|
|
2651
2676
|
type: "string",
|
|
@@ -2711,7 +2736,7 @@ async function episodeApi(ctx, method, path, body) {
|
|
|
2711
2736
|
Authorization: `Bearer ${ctx.apiKey}`,
|
|
2712
2737
|
"Content-Type": "application/json",
|
|
2713
2738
|
"x-pixeldojo-source": `mcp/${ctx.mcpVersion}`,
|
|
2714
|
-
"x-pixeldojo-skill": "
|
|
2739
|
+
"x-pixeldojo-skill": "pixeldojo_episode"
|
|
2715
2740
|
},
|
|
2716
2741
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
2717
2742
|
});
|
|
@@ -2952,7 +2977,7 @@ async function dramaApi(ctx, method, path, body) {
|
|
|
2952
2977
|
Authorization: `Bearer ${ctx.apiKey}`,
|
|
2953
2978
|
"Content-Type": "application/json",
|
|
2954
2979
|
"x-pixeldojo-source": `mcp/${ctx.mcpVersion}`,
|
|
2955
|
-
"x-pixeldojo-skill": "
|
|
2980
|
+
"x-pixeldojo-skill": "pixeldojo_drama"
|
|
2956
2981
|
},
|
|
2957
2982
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
2958
2983
|
});
|
|
@@ -2966,9 +2991,10 @@ function describeDrama(v, o = DRAMA_OPTS) {
|
|
|
2966
2991
|
const next2 = (action) => `${o.tool} with {"${o.idField}": "${id}", "action": "${action}"}`;
|
|
2967
2992
|
const music = o.unit === "section";
|
|
2968
2993
|
const what = music ? "music video" : "episode";
|
|
2994
|
+
if (v.status === "failed" && v.error?.startsWith("Prohibited content")) return { kind: "text", text: `${v.error} Tell the user this idea is prohibited content; do not rewrite it to get around the refusal.` };
|
|
2969
2995
|
if (v.status === "failed") return { kind: "text", text: `The ${what} stopped: ${v.error ?? "unknown error"}. Each render that failed was refunded.${v.beats.some((b) => b.url) ? ` Re-film ${o.unit}s with action "redo".` : ""}` };
|
|
2970
2996
|
if (v.status === "quote") {
|
|
2971
|
-
const cost = music ? `Filming costs about ${v.estimate_credits} credits (cast portraits and ${v.sections?.length ?? "several"} sections lip-synced to the song).` : `Filming costs about ${v.estimate_credits} credits (cast portraits,
|
|
2997
|
+
const cost = music ? `Filming costs about ${v.estimate_credits} credits (cast portraits and ${v.sections?.length ?? "several"} sections lip-synced to the song).` : `Filming costs about ${v.estimate_credits} credits (cast portraits, scenes of up to 30 seconds with ${v.dialogue === false ? "their own sound and no dialogue" : "their dialogue and sound"}${v.score === false ? ", no music" : ", and one score over the finished edit"}); every scene is checked, and a scene that drops a line or shows a clear fault waits for the user's OK before it is filmed again, at the scene's own price (a render that fails is tried again free).`;
|
|
2972
2998
|
return {
|
|
2973
2999
|
kind: "text",
|
|
2974
3000
|
text: [`Planned (${o.idField}: ${id}), ${v.format === "9:16" ? "vertical 9:16" : "widescreen 16:9"} (to switch, create it again in the other format before producing):`, v.plan ?? "", "", `Nothing has been charged yet. ${cost} Show this to the user and, once they agree, call ${next2("produce")}. (In Sensei: put it in pixeldojo_plan as ONE step with skill "${music ? "music_video" : "drama"}" and params {"${o.idField}": "${id}"}, which prices it from this quote.)`].join("\n")
|
|
@@ -3051,9 +3077,12 @@ var init_drama = __esm({
|
|
|
3051
3077
|
end_text: zod.z.string().max(60).optional(),
|
|
3052
3078
|
brand_color: zod.z.string().regex(/^#[0-9a-fA-F]{6}$/).optional(),
|
|
3053
3079
|
logo_url: zod.z.string().url().optional(),
|
|
3054
|
-
cast: zod.z.array(zod.z.object({ name: zod.z.string().min(1).max(40), image_url: zod.z.string().url() })).max(5).optional(),
|
|
3080
|
+
cast: zod.z.array(zod.z.object({ name: zod.z.string().min(1).max(40), image_url: zod.z.string().url(), outfit_image_url: zod.z.string().url().optional() })).max(5).optional(),
|
|
3081
|
+
length_sec: zod.z.number().int().min(24).max(180).multipleOf(6).optional(),
|
|
3055
3082
|
scenes: zod.z.number().int().min(1).max(15).optional(),
|
|
3056
3083
|
score: zod.z.boolean().optional(),
|
|
3084
|
+
dialogue: zod.z.boolean().optional(),
|
|
3085
|
+
engine: zod.z.enum(["seedance-2-5", "seedance-2-5-flash", "wan-3-0-video", "kling-4-0"]).optional(),
|
|
3057
3086
|
drama_id: zod.z.string().max(60).optional(),
|
|
3058
3087
|
beats: zod.z.array(zod.z.number().int().min(1).max(15)).min(1).max(15).optional(),
|
|
3059
3088
|
notes: zod.z.array(zod.z.string().max(300)).max(15).optional()
|
|
@@ -3064,7 +3093,7 @@ var init_drama = __esm({
|
|
|
3064
3093
|
action: {
|
|
3065
3094
|
type: "string",
|
|
3066
3095
|
enum: ["create", "produce", "status", "redo", "cut"],
|
|
3067
|
-
description: "create (default, free): writes the
|
|
3096
|
+
description: "create (default, free): writes the plan (30 seconds unless length_sec says, cast, lines) and returns drama_id and the price. Show the plan and price to the user and wait for their OK. produce (charged): films it. status (free): progress; call every ~60s until it returns the episode. redo (charged): re-film chosen beats of a finished episode or one waiting at the review, then it cuts again. cut (free): when the review flagged beats and the user wants it as it is, cut it now."
|
|
3068
3097
|
},
|
|
3069
3098
|
idea: { type: "string", description: "Create: the story in a line or two (who, the conflict, the twist)." },
|
|
3070
3099
|
format: { type: "string", enum: ["9:16", "16:9"], description: "Create: vertical 9:16 (default) or widescreen 16:9." },
|
|
@@ -3072,7 +3101,7 @@ var init_drama = __esm({
|
|
|
3072
3101
|
kind: {
|
|
3073
3102
|
type: "string",
|
|
3074
3103
|
enum: [...KINDS],
|
|
3075
|
-
description: "Create: micro-drama (default: episode one with a hook and a cliffhanger), short-film (a complete
|
|
3104
|
+
description: "Create: micro-drama (default: episode one with a hook and a cliffhanger), short-film (a complete story) or trailer (sells a film that does not exist, never shows the ending)."
|
|
3076
3105
|
},
|
|
3077
3106
|
look: { type: "string", enum: [...LOOKS2], description: "Create (optional): the visual style and genre. Default live-action (a micro-drama story type brings its own)." },
|
|
3078
3107
|
story_type: {
|
|
@@ -3092,14 +3121,18 @@ var init_drama = __esm({
|
|
|
3092
3121
|
type: "object",
|
|
3093
3122
|
properties: {
|
|
3094
3123
|
name: { type: "string", description: "The character's name as the story uses it." },
|
|
3095
|
-
image_url: { type: "string", description:
|
|
3124
|
+
image_url: { type: "string", description: `A clear front-facing portrait on the PixelDojo CDN (a saved character's first "for video" picture when it has one).` },
|
|
3125
|
+
outfit_image_url: { type: "string", description: `Optional: the saved character's outfit picture (the second "for video" picture from pixeldojo_library). The scenes then keep their clothes closer.` }
|
|
3096
3126
|
},
|
|
3097
3127
|
required: ["name", "image_url"]
|
|
3098
3128
|
},
|
|
3099
|
-
description:
|
|
3129
|
+
description: 'Create (optional): up to 5 characters to star (people, animals or creatures), each with a portrait on the PixelDojo CDN (a saved character from pixeldojo_library; pass its "for video" face and outfit pictures when it lists them). Others get a portrait made for them.'
|
|
3100
3130
|
},
|
|
3101
|
-
|
|
3131
|
+
length_sec: { type: "integer", minimum: 24, maximum: 180, multipleOf: 6, description: "Create (optional): the film's length in seconds, 24 to 180 in steps of 6. Default 30. If the user has not said how long, ask (30 seconds, 1, 2 or 3 minutes; the price grows with the length) or leave it out for 30 seconds. The writer splits the length into scenes of up to 30 s, one per place and cast." },
|
|
3132
|
+
scenes: { type: "integer", minimum: 1, maximum: 15, description: "Create (optional, older): the length in 12-second units (5 = 60 s). Prefer length_sec." },
|
|
3133
|
+
engine: { type: "string", enum: ["seedance-2-5", "seedance-2-5-flash", "wan-3-0-video", "kling-4-0"], description: "Create (optional): the video model every scene films on, from the cast pictures. seedance-2-5 (default), seedance-2-5-flash (the same model family, faster and about a third cheaper, 720p), wan-3-0-video (about a third of the price), kling-4-0. Pass it only when the user names one. Adult work always runs on wan-3-0-video." },
|
|
3102
3134
|
score: { type: "boolean", description: "Create (optional): one score laid over the finished edit, on by default and included in the price. Pass false only when the user wants no music (dialogue and ambience only)." },
|
|
3135
|
+
dialogue: { type: "boolean", description: "Create (optional): pass false for a film with no dialogue, where nobody speaks and the story is told in pictures, sound and the score. Use it when the user asks for no dialogue, a silent or wordless film, or visuals with music only; otherwise leave it out (characters speak)." },
|
|
3103
3136
|
drama_id: { type: "string", description: "From create. Required for produce, status and redo." },
|
|
3104
3137
|
beats: { type: "array", items: { type: "integer", minimum: 1, maximum: 15 }, description: "Redo: the beat numbers to film again." },
|
|
3105
3138
|
notes: { type: "array", items: { type: "string" }, description: "Redo (optional): what to fix in each of those beats, in the same order." }
|
|
@@ -3115,10 +3148,10 @@ var init_drama = __esm({
|
|
|
3115
3148
|
DRAMA_OPTS = { tool: "pixeldojo_drama", idField: "drama_id", unit: "beat" };
|
|
3116
3149
|
dramaSkill = {
|
|
3117
3150
|
name: "pixeldojo_drama",
|
|
3118
|
-
description: "Make a
|
|
3151
|
+
description: "Make a micro-drama episode (30 seconds by default, up to 3 minutes with length_sec; hook, twist, cliffhanger; optionally a classic genre such as billionaire, werewolf or mafia), short film (a complete story) or movie trailer from an idea, vertical 9:16 or 16:9, in any of Film Studio's looks (live-action, anime, 3D animation, noir, horror, sci-fi, western, romance, comedy and more). Scenes of up to 30 seconds (one per place and cast), each filmed in one pass with several cuts, on Seedance 2.5, WAN 3 or Kling 4, the cast's faces kept from portraits and every line spoken and lip-synced (or no dialogue at all with dialogue: false), cut together with their own sound and one score over the finished edit, with free motion graphics (title card, name tags, end screen; each can be turned off), and saved to the Library. Not for music videos (pixeldojo_music_video) create is free and returns the plan and the exact price (about 190 credits for a regular 30 second film, about 380 for a minute; less on the wan-3-0-video engine and for mature work); produce films it; then call status until it is finished (10-15 minutes).",
|
|
3119
3152
|
inputZod: InputSchema13,
|
|
3120
3153
|
inputJsonSchema: InputJsonSchema13,
|
|
3121
|
-
allowedModels: ["seedance-2-5", "seedream-4"],
|
|
3154
|
+
allowedModels: ["seedance-2-5", "seedance-2-5-flash", "seedream-4"],
|
|
3122
3155
|
defaultModel: "seedance-2-5",
|
|
3123
3156
|
async run(input, ctx) {
|
|
3124
3157
|
if (input.action === "create") {
|
|
@@ -3130,8 +3163,11 @@ var init_drama = __esm({
|
|
|
3130
3163
|
...input.mature ? { mature: true } : {},
|
|
3131
3164
|
...input.look ? { look: input.look } : {},
|
|
3132
3165
|
...input.story_type ? { story_type: input.story_type } : {},
|
|
3166
|
+
...input.length_sec ? { length_sec: input.length_sec } : {},
|
|
3133
3167
|
...input.scenes ? { scenes: input.scenes } : {},
|
|
3168
|
+
...input.engine ? { engine: input.engine } : {},
|
|
3134
3169
|
...input.score === false ? { score: false } : {},
|
|
3170
|
+
...input.dialogue === false ? { dialogue: false } : {},
|
|
3135
3171
|
...Object.fromEntries(
|
|
3136
3172
|
["title_card", "name_tags", "end_screen", "end_text", "brand_color", "logo_url"].filter((k) => input[k] !== void 0).map((k) => [k, input[k]])
|
|
3137
3173
|
),
|
|
@@ -3159,7 +3195,7 @@ async function api(ctx, method, path, body) {
|
|
|
3159
3195
|
Authorization: `Bearer ${ctx.apiKey}`,
|
|
3160
3196
|
"Content-Type": "application/json",
|
|
3161
3197
|
"x-pixeldojo-source": `mcp/${ctx.mcpVersion}`,
|
|
3162
|
-
"x-pixeldojo-skill": "
|
|
3198
|
+
"x-pixeldojo-skill": "pixeldojo_music_video"
|
|
3163
3199
|
},
|
|
3164
3200
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
3165
3201
|
});
|
|
@@ -3288,7 +3324,7 @@ async function kataApi(ctx, method, path, body) {
|
|
|
3288
3324
|
Authorization: `Bearer ${ctx.apiKey}`,
|
|
3289
3325
|
"Content-Type": "application/json",
|
|
3290
3326
|
"x-pixeldojo-source": `mcp/${ctx.mcpVersion}`,
|
|
3291
|
-
"x-pixeldojo-skill": "
|
|
3327
|
+
"x-pixeldojo-skill": "pixeldojo_kata"
|
|
3292
3328
|
},
|
|
3293
3329
|
...body !== void 0 ? { body: JSON.stringify(body) } : {}
|
|
3294
3330
|
});
|
|
@@ -3340,6 +3376,7 @@ var init_kata = __esm({
|
|
|
3340
3376
|
photos: zod.z.array(zod.z.object({ url: zod.z.string().url(), note: zod.z.string().max(80).optional() })).max(4).optional(),
|
|
3341
3377
|
instructions: zod.z.string().max(1500).optional(),
|
|
3342
3378
|
look: zod.z.string().max(80).optional(),
|
|
3379
|
+
engine: zod.z.enum(["seedance-2-5", "seedance-2-5-flash"]).optional(),
|
|
3343
3380
|
kata_id: zod.z.string().max(60).optional()
|
|
3344
3381
|
});
|
|
3345
3382
|
InputJsonSchema15 = {
|
|
@@ -3372,6 +3409,7 @@ var init_kata = __esm({
|
|
|
3372
3409
|
},
|
|
3373
3410
|
instructions: { type: "string", description: "Create (optional): what to change, e.g. the setting, the words on screen, where the product goes." },
|
|
3374
3411
|
look: { type: "string", description: 'Create (optional): style transfer, one look for every new shot, e.g. "hand-drawn anime".' },
|
|
3412
|
+
engine: { type: "string", enum: ["seedance-2-5", "seedance-2-5-flash"], description: "Create (optional): the video model the new clips film on. seedance-2-5 (default) or seedance-2-5-flash (faster, about a third cheaper). Pass it only when the user asks." },
|
|
3375
3413
|
kata_id: { type: "string", description: "From create. Required for produce and status." }
|
|
3376
3414
|
}
|
|
3377
3415
|
};
|
|
@@ -3393,7 +3431,7 @@ var init_kata = __esm({
|
|
|
3393
3431
|
description: `Kata: recreate a reference edit (a viral short, an ad, a montage, a trailer, 4 to 60 s) with the user's own characters, products and photos. It keeps the same pacing and cut points to the frame, the transitions, the camera moves, the caption style and the music feel (an original score on the same tempo, never the reference's audio); dance moves come across by motion transfer, and a look can restyle every shot. Start from a reference_url or a Kata library preset (action "presets"). create is free and returns the plan and the price; produce makes it; then call status until it is finished. Saved to the Library.`,
|
|
3394
3432
|
inputZod: InputSchema15,
|
|
3395
3433
|
inputJsonSchema: InputJsonSchema15,
|
|
3396
|
-
allowedModels: ["seedance-2-5", "google-nano-banana", "kling-motion-control"],
|
|
3434
|
+
allowedModels: ["seedance-2-5", "seedance-2-5-flash", "google-nano-banana", "kling-motion-control"],
|
|
3397
3435
|
defaultModel: "seedance-2-5",
|
|
3398
3436
|
async run(input, ctx) {
|
|
3399
3437
|
if (input.action === "presets") {
|
|
@@ -3412,7 +3450,8 @@ var init_kata = __esm({
|
|
|
3412
3450
|
...input.cast?.length ? { cast: input.cast } : {},
|
|
3413
3451
|
...input.photos?.length ? { photos: input.photos } : {},
|
|
3414
3452
|
...input.instructions ? { instructions: input.instructions } : {},
|
|
3415
|
-
...input.look ? { look: input.look } : {}
|
|
3453
|
+
...input.look ? { look: input.look } : {},
|
|
3454
|
+
...input.engine ? { engine: input.engine } : {}
|
|
3416
3455
|
});
|
|
3417
3456
|
if (!created.data.id) return { kind: "text", text: `Could not start the Kata: ${errorText3(created.data, created.status)}` };
|
|
3418
3457
|
const planned = await waitForPlan3(ctx, created.data.id);
|
|
@@ -3452,7 +3491,7 @@ async function run13(input, ctx) {
|
|
|
3452
3491
|
aspect_ratio: input.aspect_ratio,
|
|
3453
3492
|
duration: input.duration,
|
|
3454
3493
|
reference_video_url: input.reference_video_url,
|
|
3455
|
-
brand_kit: input.brand_kit
|
|
3494
|
+
brand_kit: input.brand_kit === false ? false : input.brand_kit_id ?? input.brand_kit
|
|
3456
3495
|
};
|
|
3457
3496
|
const client = ctx.client;
|
|
3458
3497
|
const submitted = await client.runAd(body);
|
|
@@ -3497,7 +3536,8 @@ var init_ad = __esm({
|
|
|
3497
3536
|
aspect_ratio: zod.z.enum(["16:9", "4:3", "1:1", "3:4", "9:16", "21:9"]).optional(),
|
|
3498
3537
|
duration: zod.z.number().int().min(4).max(15).optional(),
|
|
3499
3538
|
reference_video_url: zod.z.string().url().optional(),
|
|
3500
|
-
brand_kit: zod.z.boolean().optional()
|
|
3539
|
+
brand_kit: zod.z.boolean().optional(),
|
|
3540
|
+
brand_kit_id: zod.z.string().max(80).optional()
|
|
3501
3541
|
}).refine(
|
|
3502
3542
|
(v) => v.product_url || (v.product_image_urls?.length || v.product_image_paths?.length) && v.product_name,
|
|
3503
3543
|
{
|
|
@@ -3591,7 +3631,11 @@ var init_ad = __esm({
|
|
|
3591
3631
|
},
|
|
3592
3632
|
brand_kit: {
|
|
3593
3633
|
type: "boolean",
|
|
3594
|
-
description: "The account's brand kit (palette, voice, selling points; see pixeldojo_brand_kit) rides on every ad. false skips it."
|
|
3634
|
+
description: "The account's default brand kit (palette, voice, selling points; see pixeldojo_brand_kit) rides on every ad. false skips it."
|
|
3635
|
+
},
|
|
3636
|
+
brand_kit_id: {
|
|
3637
|
+
type: "string",
|
|
3638
|
+
description: "Use this saved brand kit instead of the default (ids listed by pixeldojo_brand_kit)."
|
|
3595
3639
|
}
|
|
3596
3640
|
}
|
|
3597
3641
|
// "product_url OR product_name+images" is enforced by the server and the
|
|
@@ -3932,7 +3976,8 @@ async function run18(input, ctx) {
|
|
|
3932
3976
|
}
|
|
3933
3977
|
const lines2 = characters.map(
|
|
3934
3978
|
(c) => `- ${c.mention} (${c.kind})${c.description ? `: ${c.description.slice(0, 100)}` : ""}
|
|
3935
|
-
images: ${c.image_urls.slice(0, 4).join(" ")}`
|
|
3979
|
+
images: ${c.image_urls.slice(0, 4).join(" ")}${c.video_pair && c.video_image_urls?.length === 2 ? `
|
|
3980
|
+
for video (face, outfit; pass both to pixeldojo_drama cast as image_url + outfit_image_url): ${c.video_image_urls.join(" ")}` : ""}`
|
|
3936
3981
|
);
|
|
3937
3982
|
return {
|
|
3938
3983
|
kind: "text",
|
|
@@ -4155,7 +4200,8 @@ async function effectRun(input, ctx) {
|
|
|
4155
4200
|
});
|
|
4156
4201
|
const data = await res.json().catch(() => ({}));
|
|
4157
4202
|
if (!res.ok || !data.jobId) {
|
|
4158
|
-
|
|
4203
|
+
const err = typeof data.error === "string" ? data.error : data.error?.message;
|
|
4204
|
+
return { kind: "text", text: `Effect not started (nothing charged): ${err ?? `HTTP ${res.status}`}` };
|
|
4159
4205
|
}
|
|
4160
4206
|
const result = await pollJobUntilDoneOrHandoff(data.jobId, (id) => ctx.client.getJob(id), ctx.buildStatusUrl, {
|
|
4161
4207
|
now: ctx.pollOverrides?.now,
|
|
@@ -4287,7 +4333,15 @@ ${describeKit(r2.data.brand_kit)}` };
|
|
|
4287
4333
|
}
|
|
4288
4334
|
const r = await call2(ctx, "pixeldojo_brand_kit", path);
|
|
4289
4335
|
if (!r.ok) return { kind: "text", text: `Could not read the brand kit: ${r.error}` };
|
|
4290
|
-
|
|
4336
|
+
const all = r.data.brand_kits ?? [];
|
|
4337
|
+
const others = all.filter((k) => !k.isDefault);
|
|
4338
|
+
return {
|
|
4339
|
+
kind: "text",
|
|
4340
|
+
text: [
|
|
4341
|
+
describeKit(r.data.brand_kit ?? null),
|
|
4342
|
+
...others.length ? [`Other brand kits (pass brand_kit_id on a run to use one): ${others.map((k) => `${k.name || "(no name)"} (id ${k.id})`).join("; ")}`] : []
|
|
4343
|
+
].join("\n")
|
|
4344
|
+
};
|
|
4291
4345
|
}
|
|
4292
4346
|
async function templatesRun(input, ctx) {
|
|
4293
4347
|
const q = new URLSearchParams();
|
|
@@ -4333,7 +4387,7 @@ async function imageRun(input, ctx) {
|
|
|
4333
4387
|
engine: input.engine,
|
|
4334
4388
|
count: input.count,
|
|
4335
4389
|
reference_ad_url: input.reference_ad_url,
|
|
4336
|
-
brand_kit: input.brand_kit
|
|
4390
|
+
brand_kit: input.brand_kit === false ? false : input.brand_kit_id ?? input.brand_kit
|
|
4337
4391
|
}
|
|
4338
4392
|
});
|
|
4339
4393
|
if (!r.ok) return { kind: "text", text: `Images not started: ${r.error}` };
|
|
@@ -4403,7 +4457,7 @@ async function motionRun(input, ctx) {
|
|
|
4403
4457
|
video_url: input.video_url,
|
|
4404
4458
|
brand_name: input.brand_name,
|
|
4405
4459
|
colors: input.colors?.map((c) => c.trim().toLowerCase()),
|
|
4406
|
-
brand_kit: input.brand_kit
|
|
4460
|
+
brand_kit: input.brand_kit === false ? false : input.brand_kit_id ?? input.brand_kit
|
|
4407
4461
|
}
|
|
4408
4462
|
});
|
|
4409
4463
|
if (!r.ok) return { kind: "text", text: `Not started: ${r.error}` };
|
|
@@ -4500,7 +4554,8 @@ var init_marketing = __esm({
|
|
|
4500
4554
|
motion_id: zod.z.string().max(80).optional(),
|
|
4501
4555
|
brand_name: zod.z.string().max(60).optional(),
|
|
4502
4556
|
colors: zod.z.array(zod.z.string()).max(5).optional(),
|
|
4503
|
-
brand_kit: zod.z.boolean().optional()
|
|
4557
|
+
brand_kit: zod.z.boolean().optional(),
|
|
4558
|
+
brand_kit_id: zod.z.string().max(80).optional()
|
|
4504
4559
|
});
|
|
4505
4560
|
props = {
|
|
4506
4561
|
action: {
|
|
@@ -4536,7 +4591,8 @@ var init_marketing = __esm({
|
|
|
4536
4591
|
motion_id: { type: "string", description: "status: the id a motion or end_card call returned." },
|
|
4537
4592
|
brand_name: { type: "string", description: "motion: the brand shown when there is no logo. Default: the brand kit." },
|
|
4538
4593
|
colors: { type: "array", items: { type: "string" }, maxItems: 5, description: "motion: #RRGGBB, lead color first. Default: the brand kit." },
|
|
4539
|
-
brand_kit: { type: "boolean", description: "false skips the brand kit for this call." }
|
|
4594
|
+
brand_kit: { type: "boolean", description: "false skips the brand kit for this call." },
|
|
4595
|
+
brand_kit_id: { type: "string", description: "Use this saved brand kit instead of the default (ids listed by pixeldojo_brand_kit)." }
|
|
4540
4596
|
};
|
|
4541
4597
|
marketingSkill = {
|
|
4542
4598
|
name: "pixeldojo_marketing",
|
|
@@ -5064,7 +5120,7 @@ var init_skills = __esm({
|
|
|
5064
5120
|
}
|
|
5065
5121
|
};
|
|
5066
5122
|
});
|
|
5067
|
-
render = (title) => ({ title, readOnlyHint: false, destructiveHint: false, openWorldHint:
|
|
5123
|
+
render = (title) => ({ title, readOnlyHint: false, destructiveHint: false, openWorldHint: true });
|
|
5068
5124
|
read = (title) => ({ title, readOnlyHint: true, destructiveHint: false, openWorldHint: false });
|
|
5069
5125
|
exports.TOOL_ANNOTATIONS = {
|
|
5070
5126
|
pixeldojo_generate: render("Generate image or video"),
|
|
@@ -5079,22 +5135,22 @@ var init_skills = __esm({
|
|
|
5079
5135
|
pixeldojo_effect: render("Run one-click effect"),
|
|
5080
5136
|
pixeldojo_video: render("Change, animate or extend video"),
|
|
5081
5137
|
pixeldojo_ad: render("Make video ad"),
|
|
5082
|
-
pixeldojo_brand_kit: render("Brand kit from website"),
|
|
5138
|
+
pixeldojo_brand_kit: { ...render("Brand kit from website"), destructiveHint: true },
|
|
5083
5139
|
pixeldojo_marketing: render("Image ads, motion graphics and templates"),
|
|
5084
5140
|
pixeldojo_campaign: render("Make product launch campaign"),
|
|
5085
|
-
pixeldojo_film: render("Make short film"),
|
|
5141
|
+
pixeldojo_film: { ...render("Make short film"), destructiveHint: true },
|
|
5086
5142
|
pixeldojo_episode: render("Make faceless video"),
|
|
5087
5143
|
pixeldojo_drama: render("Make micro-drama, short film or trailer"),
|
|
5088
5144
|
pixeldojo_music_video: render("Make music video for a song"),
|
|
5089
5145
|
pixeldojo_kata: render("Recreate an edit with your cast"),
|
|
5090
5146
|
pixeldojo_run_workflow: render("Run saved workflow"),
|
|
5091
5147
|
pixeldojo_upload: render("Upload local file"),
|
|
5092
|
-
pixeldojo_save_workflow: { ...render("Save workflow"), destructiveHint: true },
|
|
5148
|
+
pixeldojo_save_workflow: { ...render("Save workflow"), destructiveHint: true, openWorldHint: false },
|
|
5093
5149
|
pixeldojo_status: read("Check job status"),
|
|
5094
5150
|
pixeldojo_campaign_status: read("Check campaign status"),
|
|
5095
5151
|
pixeldojo_library: read("Search media library"),
|
|
5096
|
-
pixeldojo_save: render("Save to My Media"),
|
|
5097
|
-
pixeldojo_save_character: render("Save character or element"),
|
|
5152
|
+
pixeldojo_save: { ...render("Save to My Media"), openWorldHint: false },
|
|
5153
|
+
pixeldojo_save_character: { ...render("Save character or element"), openWorldHint: false },
|
|
5098
5154
|
pixeldojo_build_character: render("Build AI character from traits"),
|
|
5099
5155
|
pixeldojo_perform: render("Make character dance or do a trend"),
|
|
5100
5156
|
pixeldojo_list_workflows: read("List saved workflows"),
|
|
@@ -5153,7 +5209,7 @@ function makeRedactedLogger(target = console) {
|
|
|
5153
5209
|
}
|
|
5154
5210
|
|
|
5155
5211
|
// src/server.ts
|
|
5156
|
-
var PACKAGE_VERSION = "0.
|
|
5212
|
+
var PACKAGE_VERSION = "0.36.0" ;
|
|
5157
5213
|
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.";
|
|
5158
5214
|
function buildServer(options) {
|
|
5159
5215
|
if (!options.apiKey) {
|
|
@@ -5271,7 +5327,10 @@ function errorToActionableMessage(err) {
|
|
|
5271
5327
|
return "Authentication failed. Check PIXELDOJO_API_KEY. Get a key at https://pixeldojo.ai/api-platform/api-keys.";
|
|
5272
5328
|
}
|
|
5273
5329
|
if (e.status === 402 || e.code === "insufficient_credits") {
|
|
5274
|
-
return
|
|
5330
|
+
return (
|
|
5331
|
+
// ponytail: no checkout link, ChatGPT's plugin review bans linking to a purchase page.
|
|
5332
|
+
"Not enough credits for this. Add credits in your Pixel Dojo account, then try again."
|
|
5333
|
+
);
|
|
5275
5334
|
}
|
|
5276
5335
|
if (e.status === 429 || e.code === "rate_limit") {
|
|
5277
5336
|
return "Rate limit hit. Try again in a few seconds.";
|