@productmaker/mcp 8.5.1 → 8.6.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 +5 -0
- package/dist/http.js +310 -168
- package/dist/stdio.js +310 -168
- package/package.json +1 -1
package/dist/http.js
CHANGED
|
@@ -42,8 +42,20 @@ var NarrativeStyle = z.enum([
|
|
|
42
42
|
"ugc_skeptic_confession",
|
|
43
43
|
"ugc_demo_review",
|
|
44
44
|
"gap_replication",
|
|
45
|
-
"market"
|
|
45
|
+
"market",
|
|
46
|
+
"animated_storyteller",
|
|
47
|
+
"animated_inner_journey",
|
|
48
|
+
"animated_object_soul",
|
|
49
|
+
"animated_timeline"
|
|
50
|
+
]);
|
|
51
|
+
var AnimationStyleSchema = z.enum([
|
|
52
|
+
"pixar_3d",
|
|
53
|
+
"claymation",
|
|
54
|
+
"wes_anderson",
|
|
55
|
+
"sci_fi",
|
|
56
|
+
"realista"
|
|
46
57
|
]);
|
|
58
|
+
var ANIMATION_STYLE_VALUES = AnimationStyleSchema.options;
|
|
47
59
|
var VideoResolution = z.enum([
|
|
48
60
|
"480p",
|
|
49
61
|
"720p"
|
|
@@ -59,6 +71,10 @@ var VideoPreset = z.enum([
|
|
|
59
71
|
"wearable_showcase",
|
|
60
72
|
"pixar_problem",
|
|
61
73
|
"pixar_sassy",
|
|
74
|
+
"storyteller",
|
|
75
|
+
"inner_journey",
|
|
76
|
+
"object_soul",
|
|
77
|
+
"timeline",
|
|
62
78
|
"ugc_unboxing_chaos",
|
|
63
79
|
"ugc_curiosity_reveal",
|
|
64
80
|
"ugc_listicle_3",
|
|
@@ -3248,7 +3264,9 @@ var LandingProductSchema = z21.object({
|
|
|
3248
3264
|
whatsappNumber: z21.string().regex(/^\d{7,15}$/, 'digits only, 7\u201315 chars (e.g. "573001234567")').optional()
|
|
3249
3265
|
});
|
|
3250
3266
|
var CodeLandingProductSchema = LandingProductSchema.extend({
|
|
3251
|
-
price: z21.string().min(1).optional()
|
|
3267
|
+
price: z21.string().min(1).optional(),
|
|
3268
|
+
/** Keeps image-medium selection stable when a saved page is recomposed. */
|
|
3269
|
+
category: z21.string().min(1).optional()
|
|
3252
3270
|
});
|
|
3253
3271
|
var PAYMENT_METHOD_KEYS = [
|
|
3254
3272
|
"contraentrega",
|
|
@@ -4091,6 +4109,9 @@ var IngestOptions = z22.object({
|
|
|
4091
4109
|
videoTier: WritableVideoTier.default(DEFAULT_VIDEO_TIER),
|
|
4092
4110
|
narrativeStyle: NarrativeStyle.default("review"),
|
|
4093
4111
|
videoPreset: VideoPreset.optional(),
|
|
4112
|
+
/** Orthogonal visual style for animated narratives only. The API rejects it
|
|
4113
|
+
* on non-animated presets; absent → the pipeline resolves 'pixar_3d'. */
|
|
4114
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
4094
4115
|
multiAngleVideos: z22.boolean().default(false),
|
|
4095
4116
|
videoAngleCount: z22.number().int().min(1).max(3).optional(),
|
|
4096
4117
|
/** Per-angle narrative override (positional). angleNarratives[i] forces the
|
|
@@ -4287,6 +4308,10 @@ var VideoOptionsOverride = z22.object({
|
|
|
4287
4308
|
ugcFormat: VideoFormat.optional(),
|
|
4288
4309
|
videoStyle: VideoStyle.optional(),
|
|
4289
4310
|
narrativeStyle: NarrativeStyle.optional(),
|
|
4311
|
+
/** Animation-style pick for THIS angle. The approve/draft handlers persist
|
|
4312
|
+
* it on the angle's own row (Angle.animationStyle) while its effective
|
|
4313
|
+
* narrative is animated; switching to a non-animated narrative clears it. */
|
|
4314
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
4290
4315
|
videoResolution: VideoResolution.optional(),
|
|
4291
4316
|
voiceId: VoiceId.optional(),
|
|
4292
4317
|
/** Actor/character description (role + appearance + attitude). Drives voice and video character. */
|
|
@@ -5266,7 +5291,7 @@ var ApproveVideoScriptResponse = z27.object({
|
|
|
5266
5291
|
status: ScriptReviewStatus
|
|
5267
5292
|
});
|
|
5268
5293
|
var RegenerateVideoScriptNarrativeRequest = z27.object({
|
|
5269
|
-
angleKey: z27.string().min(1),
|
|
5294
|
+
angleKey: z27.string().trim().min(1).max(120),
|
|
5270
5295
|
narrativeStyle: NarrativeStyle,
|
|
5271
5296
|
narrativeSelection: z27.enum([
|
|
5272
5297
|
"market",
|
|
@@ -5280,7 +5305,11 @@ var RegenerateVideoScriptNarrativeRequest = z27.object({
|
|
|
5280
5305
|
});
|
|
5281
5306
|
var RegenerateVideoScriptNarrativeResponse = z27.object({
|
|
5282
5307
|
/** 'not_ready' while Phase 1 re-runs; the client polls until 'ready'. */
|
|
5283
|
-
status: ScriptReviewStatus
|
|
5308
|
+
status: ScriptReviewStatus,
|
|
5309
|
+
/** The angle text the new script is written from — re-voiced into the new
|
|
5310
|
+
* narrative's speaker when that changed it. The review card shows it right
|
|
5311
|
+
* away so its next draft save cannot write the old voice back. */
|
|
5312
|
+
angle: z27.string().optional()
|
|
5284
5313
|
});
|
|
5285
5314
|
var RegenerateVideoRequest = z27.object({
|
|
5286
5315
|
angleKey: z27.string().min(1)
|
|
@@ -6306,7 +6335,11 @@ var AutoResolvedPresetSchema = z35.enum([
|
|
|
6306
6335
|
"wearable_showcase",
|
|
6307
6336
|
"pixar_problem",
|
|
6308
6337
|
"pixar_sassy",
|
|
6309
|
-
"metaphor_product"
|
|
6338
|
+
"metaphor_product",
|
|
6339
|
+
"storyteller",
|
|
6340
|
+
"inner_journey",
|
|
6341
|
+
"object_soul",
|
|
6342
|
+
"timeline"
|
|
6310
6343
|
]);
|
|
6311
6344
|
var SelectedOutputsSchema = z35.array(z35.enum([
|
|
6312
6345
|
"landing",
|
|
@@ -6399,6 +6432,9 @@ var TaskCreativeVariantResult = TaskCreativeVariantBaseResult.extend({
|
|
|
6399
6432
|
images: z35.array(LandingImageReadable).min(1).max(MAX_LANDING_IMAGES)
|
|
6400
6433
|
}).optional()
|
|
6401
6434
|
});
|
|
6435
|
+
var ResultAngle = Angle.extend({
|
|
6436
|
+
animationStyle: AnimationStyleSchema.optional()
|
|
6437
|
+
});
|
|
6402
6438
|
var MVPResult = z35.object({
|
|
6403
6439
|
taskId: z35.string().uuid(),
|
|
6404
6440
|
product: Product,
|
|
@@ -6410,7 +6446,7 @@ var MVPResult = z35.object({
|
|
|
6410
6446
|
// into a 500 on GET /v1/results/:taskId and hides EVERY deliverable of a
|
|
6411
6447
|
// task that already finished. Same failure shape as the variant landing cap
|
|
6412
6448
|
// below (alert 88badc8). The write path is what must stay at 3.
|
|
6413
|
-
angles: z35.array(
|
|
6449
|
+
angles: z35.array(ResultAngle),
|
|
6414
6450
|
topVideos: z35.array(AdVideo).max(20),
|
|
6415
6451
|
landing: z35.object({
|
|
6416
6452
|
// Allow legacy data (10 sections × 2 variants) and new data (7 sections × 2)
|
|
@@ -6442,6 +6478,10 @@ var MVPResult = z35.object({
|
|
|
6442
6478
|
// and by angles review banner.
|
|
6443
6479
|
autoResolvedPreset: AutoResolvedPresetSchema.optional(),
|
|
6444
6480
|
autoResolveReasoning: z35.string().optional(),
|
|
6481
|
+
/** Persisted animated-narrative visual style (Task.animationStyle). Absent on
|
|
6482
|
+
* non-animated tasks and rows predating the axis — readers resolve
|
|
6483
|
+
* 'pixar_3d' as the default. */
|
|
6484
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
6445
6485
|
partialVideoResult: PartialVideoResult.optional(),
|
|
6446
6486
|
/** Mixed images derived from MixTask rows linked to this task via sourceTaskId. */
|
|
6447
6487
|
mixedImages: z35.array(MixedImage).optional(),
|
|
@@ -6762,6 +6802,10 @@ var StatusResponse = z35.object({
|
|
|
6762
6802
|
videoRouteId: VideoRouteId.optional(),
|
|
6763
6803
|
videoResolution: VideoResolution.optional(),
|
|
6764
6804
|
narrativeStyle: NarrativeStyle.optional(),
|
|
6805
|
+
/** Persisted animated-narrative visual style (Task.animationStyle). Absent on
|
|
6806
|
+
* non-animated tasks and rows predating the axis — readers resolve
|
|
6807
|
+
* 'pixar_3d' as the default. */
|
|
6808
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
6765
6809
|
videoAngleCount: z35.number().int().min(1).max(3).optional(),
|
|
6766
6810
|
/** Historical authorization flag kept for clients resolving legacy reviews. */
|
|
6767
6811
|
multiAngleVideos: z35.boolean().optional(),
|
|
@@ -10284,6 +10328,14 @@ var DEFAULT_PRICING = {
|
|
|
10284
10328
|
ourCostCents: 3,
|
|
10285
10329
|
userPriceCents: 6
|
|
10286
10330
|
},
|
|
10331
|
+
// Unit = one storyteller brief (insight, figure, metaphor, money shot): ONE text call per
|
|
10332
|
+
// storyteller-family angle before its plan is authored (`rapid-storyteller-brief`, judge-text
|
|
10333
|
+
// role). Billed since the family shipped but quoted nowhere until 2026-09-25. Priced by ANALOGY
|
|
10334
|
+
// with `rapid-grok-shot-action` (one batched text call of similar size), not measured yet.
|
|
10335
|
+
"openrouter:rapid-storyteller-brief": {
|
|
10336
|
+
ourCostCents: 3,
|
|
10337
|
+
userPriceCents: 6
|
|
10338
|
+
},
|
|
10287
10339
|
// Unit = one frame inventory: a single-image vision pass over ONE rendered panel, listing which
|
|
10288
10340
|
// hands are visible and what each holds, so the shot-action flatten can author against the frame
|
|
10289
10341
|
// the clip animates from instead of against the text the panel was asked to be. PER SHOT, not
|
|
@@ -13703,54 +13755,65 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13703
13755
|
], [
|
|
13704
13756
|
"product_costing"
|
|
13705
13757
|
]),
|
|
13706
|
-
defineCapability(
|
|
13758
|
+
defineCapability(
|
|
13759
|
+
"create_creative_variant",
|
|
13760
|
+
// MCP 8.6.0: + storyteller narrative family and animationStyle axis.
|
|
13761
|
+
"db6d98e9e07d57dd1a78d9b73cdbfdaa7ee7a6ae4dff30d1bd2b3edf3225cd0d",
|
|
13707
13762
|
"credit_consuming",
|
|
13708
|
-
"
|
|
13709
|
-
|
|
13710
|
-
|
|
13711
|
-
"
|
|
13712
|
-
]
|
|
13713
|
-
|
|
13714
|
-
"
|
|
13715
|
-
|
|
13716
|
-
|
|
13717
|
-
"
|
|
13718
|
-
|
|
13719
|
-
|
|
13720
|
-
"
|
|
13721
|
-
|
|
13722
|
-
|
|
13723
|
-
"
|
|
13724
|
-
|
|
13725
|
-
"
|
|
13726
|
-
"
|
|
13727
|
-
|
|
13728
|
-
|
|
13729
|
-
|
|
13730
|
-
|
|
13731
|
-
|
|
13732
|
-
"
|
|
13733
|
-
|
|
13734
|
-
|
|
13735
|
-
|
|
13736
|
-
|
|
13737
|
-
|
|
13738
|
-
|
|
13739
|
-
|
|
13740
|
-
|
|
13741
|
-
|
|
13742
|
-
|
|
13743
|
-
|
|
13744
|
-
|
|
13745
|
-
|
|
13746
|
-
|
|
13763
|
+
"creative",
|
|
13764
|
+
[
|
|
13765
|
+
"credit_consuming",
|
|
13766
|
+
"state_change"
|
|
13767
|
+
],
|
|
13768
|
+
[
|
|
13769
|
+
slot("source_task", true, [
|
|
13770
|
+
"sourceTaskId"
|
|
13771
|
+
]),
|
|
13772
|
+
slot("creative_kind", true, [
|
|
13773
|
+
"kind"
|
|
13774
|
+
]),
|
|
13775
|
+
slot("confirmation", true, [
|
|
13776
|
+
"confirm"
|
|
13777
|
+
], [], "confirmation"),
|
|
13778
|
+
slot("idempotency", true, [
|
|
13779
|
+
"clientRequestId"
|
|
13780
|
+
], void 0, "server"),
|
|
13781
|
+
slot("creative_brief", false, [
|
|
13782
|
+
"angle",
|
|
13783
|
+
"buyerPersona",
|
|
13784
|
+
"scriptNotes",
|
|
13785
|
+
"creativeDirection"
|
|
13786
|
+
]),
|
|
13787
|
+
slot("render_options", false, [
|
|
13788
|
+
"videoPreset",
|
|
13789
|
+
"videoResolution",
|
|
13790
|
+
"generateAiMusic",
|
|
13791
|
+
"nVariants",
|
|
13792
|
+
"imageStyle",
|
|
13793
|
+
"creativeArchetype",
|
|
13794
|
+
"visualTreatment",
|
|
13795
|
+
"aspectRatio",
|
|
13796
|
+
"styleMix",
|
|
13797
|
+
"sectionKey",
|
|
13798
|
+
"instructions"
|
|
13799
|
+
])
|
|
13800
|
+
],
|
|
13801
|
+
[
|
|
13802
|
+
"task",
|
|
13803
|
+
"creative"
|
|
13804
|
+
],
|
|
13805
|
+
[
|
|
13806
|
+
"creative_variant"
|
|
13807
|
+
]
|
|
13808
|
+
),
|
|
13747
13809
|
defineCapability(
|
|
13748
13810
|
"create_product_task",
|
|
13749
13811
|
// MCP 8.4.0 (Fase 4, Tarea 3, .agent/plans/2026-09-26-refactor-fase4-detallado.md):
|
|
13750
13812
|
// outputs accepts 1 value, actorId max 120, landingStrategy optional (no
|
|
13751
13813
|
// default). Recomputed from the real tools/list digest printer.
|
|
13752
13814
|
// + market study opt-in copy (#2005, competitorScanEnabled description).
|
|
13753
|
-
|
|
13815
|
+
// MCP 8.6.0: + storyteller narrative family and animationStyle axis.
|
|
13816
|
+
"46b308923121dac1023b55f68b61dfbf4e89f682bdd48b04d4d0f8a3667f8999",
|
|
13754
13817
|
"credit_consuming",
|
|
13755
13818
|
"creative",
|
|
13756
13819
|
[
|
|
@@ -13809,6 +13872,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13809
13872
|
"videoResolution",
|
|
13810
13873
|
"videoAngleCount",
|
|
13811
13874
|
"angleNarratives",
|
|
13875
|
+
"animationStyle",
|
|
13812
13876
|
"competitorScanEnabled",
|
|
13813
13877
|
"replicateWinnerWhenFound"
|
|
13814
13878
|
], [
|
|
@@ -13820,6 +13884,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13820
13884
|
"videoResolution",
|
|
13821
13885
|
"multiAngleVideos",
|
|
13822
13886
|
"angleNarratives",
|
|
13887
|
+
// MCP-only for now: the WhatsApp contract schema does not expose the
|
|
13888
|
+
// animation-style axis yet (Phase 1 ships it on web + MCP).
|
|
13823
13889
|
"competitorScanEnabled",
|
|
13824
13890
|
"competitorCommercialStudyRequested",
|
|
13825
13891
|
"replicateWinnerWhenFound"
|
|
@@ -13918,7 +13984,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13918
13984
|
], [
|
|
13919
13985
|
"task_draft"
|
|
13920
13986
|
]),
|
|
13921
|
-
defineCapability("estimate_creative_variant", "
|
|
13987
|
+
defineCapability("estimate_creative_variant", "055a92336bfb773c14e3f7018368b4490404ebcb3e607f78d5e0d5c0e78254b8", "none", "read_only", [
|
|
13922
13988
|
"read"
|
|
13923
13989
|
], [
|
|
13924
13990
|
slot("source_task", true, [
|
|
@@ -14247,112 +14313,127 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14247
14313
|
fieldCompletion: "all"
|
|
14248
14314
|
}
|
|
14249
14315
|
]),
|
|
14250
|
-
defineCapability(
|
|
14316
|
+
defineCapability(
|
|
14317
|
+
"generate_video_creative",
|
|
14318
|
+
// MCP 8.6.0: + storyteller narrative family and animationStyle axis.
|
|
14319
|
+
"5545b24de7b344c9184cfe087a39b766490526a432d8b288c02c2e9a20529c3d",
|
|
14251
14320
|
"credit_consuming",
|
|
14252
|
-
"state_change"
|
|
14253
|
-
], [
|
|
14254
|
-
slot("product_reference", true, [
|
|
14255
|
-
"images",
|
|
14256
|
-
"winnerReference"
|
|
14257
|
-
], [
|
|
14258
|
-
"imageMessageIds",
|
|
14259
|
-
"imageAssetIds",
|
|
14260
|
-
"projectId",
|
|
14261
|
-
"productUrl"
|
|
14262
|
-
]),
|
|
14263
|
-
slot("product_identity", true, [
|
|
14264
|
-
"title"
|
|
14265
|
-
]),
|
|
14266
|
-
// Optional in the canonical API because the shared generation pipeline
|
|
14267
|
-
// owns delegated angles. WhatsApp still asks through conversationInputs.
|
|
14268
|
-
slot("creative_angle", false, [
|
|
14269
|
-
"primaryAngle"
|
|
14270
|
-
]),
|
|
14271
|
-
slot("locale", true, [
|
|
14272
|
-
"language",
|
|
14273
|
-
"country"
|
|
14274
|
-
]),
|
|
14275
|
-
slot("render_options", true, [
|
|
14276
|
-
"angleNarratives",
|
|
14277
|
-
"aspectRatio",
|
|
14278
|
-
"durationSeconds",
|
|
14279
|
-
"videoAngleCount",
|
|
14280
|
-
"creativeSetup",
|
|
14281
|
-
"videoStructure",
|
|
14282
|
-
"videoQuality",
|
|
14283
|
-
"videoResolution",
|
|
14284
|
-
"features",
|
|
14285
|
-
"cta",
|
|
14286
|
-
"scriptNotes",
|
|
14287
|
-
"competitorScanEnabled",
|
|
14288
|
-
"replicateWinnerWhenFound"
|
|
14289
|
-
], [
|
|
14290
|
-
"aspectRatio",
|
|
14291
|
-
"durationSeconds",
|
|
14292
|
-
"videoPreset",
|
|
14293
|
-
"videoStructure",
|
|
14294
|
-
"videoQuality",
|
|
14295
|
-
"videoResolution",
|
|
14296
|
-
"features",
|
|
14297
|
-
"cta",
|
|
14298
|
-
"scriptNotes",
|
|
14299
|
-
"pauseForVideoScriptReview",
|
|
14300
|
-
"pauseForAngleReview",
|
|
14301
|
-
"competitorScanEnabled",
|
|
14302
|
-
"competitorCommercialStudyRequested",
|
|
14303
|
-
"replicateWinnerWhenFound"
|
|
14304
|
-
]),
|
|
14305
|
-
slot("commercial_offer", false, [
|
|
14306
|
-
"price",
|
|
14307
|
-
"offer"
|
|
14308
|
-
]),
|
|
14309
|
-
slot("product_context", false, [
|
|
14310
|
-
"productContext",
|
|
14311
|
-
"productLabel"
|
|
14312
|
-
], []),
|
|
14313
|
-
slot("brand_direction", false, [
|
|
14314
|
-
"brandId"
|
|
14315
|
-
]),
|
|
14316
|
-
// Casting pin. MCP-only for now: the WhatsApp generate_video_creative request
|
|
14317
|
-
// schema is .strict() and does not carry it yet (follow-up), hence the explicit [].
|
|
14318
|
-
slot("actor", false, [
|
|
14319
|
-
"creativeGender"
|
|
14320
|
-
], [])
|
|
14321
|
-
], [
|
|
14322
|
-
"product_reference"
|
|
14323
|
-
], [
|
|
14324
|
-
"task",
|
|
14325
14321
|
"creative",
|
|
14326
|
-
|
|
14327
|
-
|
|
14328
|
-
|
|
14329
|
-
|
|
14330
|
-
|
|
14331
|
-
|
|
14332
|
-
|
|
14333
|
-
|
|
14334
|
-
|
|
14335
|
-
|
|
14336
|
-
|
|
14337
|
-
|
|
14338
|
-
|
|
14339
|
-
|
|
14340
|
-
|
|
14341
|
-
|
|
14342
|
-
|
|
14343
|
-
|
|
14344
|
-
|
|
14345
|
-
|
|
14322
|
+
[
|
|
14323
|
+
"credit_consuming",
|
|
14324
|
+
"state_change"
|
|
14325
|
+
],
|
|
14326
|
+
[
|
|
14327
|
+
slot("product_reference", true, [
|
|
14328
|
+
"images",
|
|
14329
|
+
"winnerReference"
|
|
14330
|
+
], [
|
|
14331
|
+
"imageMessageIds",
|
|
14332
|
+
"imageAssetIds",
|
|
14333
|
+
"projectId",
|
|
14334
|
+
"productUrl"
|
|
14335
|
+
]),
|
|
14336
|
+
slot("product_identity", true, [
|
|
14337
|
+
"title"
|
|
14338
|
+
]),
|
|
14339
|
+
// Optional in the canonical API because the shared generation pipeline
|
|
14340
|
+
// owns delegated angles. WhatsApp still asks through conversationInputs.
|
|
14341
|
+
slot("creative_angle", false, [
|
|
14346
14342
|
"primaryAngle"
|
|
14347
|
-
]
|
|
14348
|
-
|
|
14349
|
-
|
|
14350
|
-
|
|
14351
|
-
|
|
14352
|
-
|
|
14353
|
-
|
|
14354
|
-
|
|
14355
|
-
|
|
14343
|
+
]),
|
|
14344
|
+
slot("locale", true, [
|
|
14345
|
+
"language",
|
|
14346
|
+
"country"
|
|
14347
|
+
]),
|
|
14348
|
+
slot("render_options", true, [
|
|
14349
|
+
"angleNarratives",
|
|
14350
|
+
"aspectRatio",
|
|
14351
|
+
"durationSeconds",
|
|
14352
|
+
"videoAngleCount",
|
|
14353
|
+
// animationStyle rides inside creativeSetup.guided on this tool, so
|
|
14354
|
+
// it is not a top-level schema field here (it is on
|
|
14355
|
+
// create_product_task).
|
|
14356
|
+
"creativeSetup",
|
|
14357
|
+
"videoStructure",
|
|
14358
|
+
"videoQuality",
|
|
14359
|
+
"videoResolution",
|
|
14360
|
+
"features",
|
|
14361
|
+
"cta",
|
|
14362
|
+
"scriptNotes",
|
|
14363
|
+
"competitorScanEnabled",
|
|
14364
|
+
"replicateWinnerWhenFound"
|
|
14365
|
+
], [
|
|
14366
|
+
"aspectRatio",
|
|
14367
|
+
"durationSeconds",
|
|
14368
|
+
"videoPreset",
|
|
14369
|
+
"videoStructure",
|
|
14370
|
+
"videoQuality",
|
|
14371
|
+
"videoResolution",
|
|
14372
|
+
"features",
|
|
14373
|
+
"cta",
|
|
14374
|
+
"scriptNotes",
|
|
14375
|
+
"pauseForVideoScriptReview",
|
|
14376
|
+
"pauseForAngleReview",
|
|
14377
|
+
"competitorScanEnabled",
|
|
14378
|
+
"competitorCommercialStudyRequested",
|
|
14379
|
+
"replicateWinnerWhenFound"
|
|
14380
|
+
]),
|
|
14381
|
+
slot("commercial_offer", false, [
|
|
14382
|
+
"price",
|
|
14383
|
+
"offer"
|
|
14384
|
+
]),
|
|
14385
|
+
slot("product_context", false, [
|
|
14386
|
+
"productContext",
|
|
14387
|
+
"productLabel"
|
|
14388
|
+
], []),
|
|
14389
|
+
slot("brand_direction", false, [
|
|
14390
|
+
"brandId"
|
|
14391
|
+
]),
|
|
14392
|
+
// Casting pin. MCP-only for now: the WhatsApp generate_video_creative request
|
|
14393
|
+
// schema is .strict() and does not carry it yet (follow-up), hence the explicit [].
|
|
14394
|
+
slot("actor", false, [
|
|
14395
|
+
"creativeGender"
|
|
14396
|
+
], [])
|
|
14397
|
+
],
|
|
14398
|
+
[
|
|
14399
|
+
"product_reference"
|
|
14400
|
+
],
|
|
14401
|
+
[
|
|
14402
|
+
"task",
|
|
14403
|
+
"creative",
|
|
14404
|
+
"video"
|
|
14405
|
+
],
|
|
14406
|
+
SHARED_CHANNEL_EXPOSURE,
|
|
14407
|
+
[
|
|
14408
|
+
{
|
|
14409
|
+
slot: "product_reference",
|
|
14410
|
+
askBeforePaidExecution: true,
|
|
14411
|
+
explicitOmissionAllowed: false,
|
|
14412
|
+
fieldCompletion: "any"
|
|
14413
|
+
},
|
|
14414
|
+
{
|
|
14415
|
+
slot: "locale",
|
|
14416
|
+
askBeforePaidExecution: true,
|
|
14417
|
+
explicitOmissionAllowed: false,
|
|
14418
|
+
fieldCompletion: "all"
|
|
14419
|
+
},
|
|
14420
|
+
{
|
|
14421
|
+
slot: "creative_angle",
|
|
14422
|
+
askBeforePaidExecution: true,
|
|
14423
|
+
explicitOmissionAllowed: true,
|
|
14424
|
+
fieldCompletion: "any",
|
|
14425
|
+
completionFields: [
|
|
14426
|
+
"primaryAngle"
|
|
14427
|
+
]
|
|
14428
|
+
},
|
|
14429
|
+
{
|
|
14430
|
+
slot: "commercial_offer",
|
|
14431
|
+
askBeforePaidExecution: true,
|
|
14432
|
+
explicitOmissionAllowed: true,
|
|
14433
|
+
fieldCompletion: "all"
|
|
14434
|
+
}
|
|
14435
|
+
]
|
|
14436
|
+
),
|
|
14356
14437
|
defineCapability("get_meta_campaign_status", "92077241cf4e9d14edefca410e85715cc383b1433081c3461c925f8fc3d6e8ab", "none", "read_only", [
|
|
14357
14438
|
"read"
|
|
14358
14439
|
], [
|
|
@@ -14660,7 +14741,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14660
14741
|
], [
|
|
14661
14742
|
"product_media"
|
|
14662
14743
|
], MCP_ONLY_CHANNEL_EXPOSURE),
|
|
14663
|
-
defineCapability("regenerate_video_script", "
|
|
14744
|
+
defineCapability("regenerate_video_script", "198903f5d89b245daedde4e08020a6d536f2ea354f5924176253b71c84241859", "credit_consuming", "creative", [
|
|
14664
14745
|
"credit_consuming",
|
|
14665
14746
|
"state_change"
|
|
14666
14747
|
], [
|
|
@@ -14723,7 +14804,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14723
14804
|
], [
|
|
14724
14805
|
"media_upload_session"
|
|
14725
14806
|
], MCP_ONLY_CHANNEL_EXPOSURE),
|
|
14726
|
-
defineCapability("resolve_pending_action", "
|
|
14807
|
+
defineCapability("resolve_pending_action", "7d76b53ebce3265a751836e61f6959debd98bd8159291ef73437e1b7a0824333", "credit_consuming", "creative", [
|
|
14727
14808
|
"credit_consuming",
|
|
14728
14809
|
"state_change"
|
|
14729
14810
|
], [
|
|
@@ -15137,6 +15218,10 @@ var MCP_ANGLE_NARRATIVE_STYLES = [
|
|
|
15137
15218
|
"wild_card",
|
|
15138
15219
|
"animated_problem_pixar",
|
|
15139
15220
|
"sassy_product_pixar",
|
|
15221
|
+
"animated_storyteller",
|
|
15222
|
+
"animated_inner_journey",
|
|
15223
|
+
"animated_object_soul",
|
|
15224
|
+
"animated_timeline",
|
|
15140
15225
|
"market"
|
|
15141
15226
|
];
|
|
15142
15227
|
var McpAngleNarrativeStyleSchema = NarrativeStyle.extract(MCP_ANGLE_NARRATIVE_STYLES);
|
|
@@ -18107,7 +18192,7 @@ var ApiClient = class {
|
|
|
18107
18192
|
};
|
|
18108
18193
|
|
|
18109
18194
|
// src/index.ts
|
|
18110
|
-
var MCP_VERSION = "8.
|
|
18195
|
+
var MCP_VERSION = "8.6.0";
|
|
18111
18196
|
|
|
18112
18197
|
// src/meta-upload-app.ts
|
|
18113
18198
|
import { readFileSync } from "fs";
|
|
@@ -18756,7 +18841,11 @@ var VideoPresetEnum = VideoPreset.extract([
|
|
|
18756
18841
|
"cinematic",
|
|
18757
18842
|
"wild_card",
|
|
18758
18843
|
"pixar_problem",
|
|
18759
|
-
"pixar_sassy"
|
|
18844
|
+
"pixar_sassy",
|
|
18845
|
+
"storyteller",
|
|
18846
|
+
"inner_journey",
|
|
18847
|
+
"object_soul",
|
|
18848
|
+
"timeline"
|
|
18760
18849
|
]);
|
|
18761
18850
|
var VideoStructureEnum = VideoStructure;
|
|
18762
18851
|
var VideoQualityEnum = VideoQuality;
|
|
@@ -18803,6 +18892,22 @@ var VIDEO_PRESET_RESOLUTION = {
|
|
|
18803
18892
|
wild_card: {
|
|
18804
18893
|
videoStyle: "product_only",
|
|
18805
18894
|
narrativeStyle: "wild_card"
|
|
18895
|
+
},
|
|
18896
|
+
storyteller: {
|
|
18897
|
+
videoStyle: "ai_dynamic",
|
|
18898
|
+
narrativeStyle: "animated_storyteller"
|
|
18899
|
+
},
|
|
18900
|
+
inner_journey: {
|
|
18901
|
+
videoStyle: "ai_dynamic",
|
|
18902
|
+
narrativeStyle: "animated_inner_journey"
|
|
18903
|
+
},
|
|
18904
|
+
object_soul: {
|
|
18905
|
+
videoStyle: "ai_dynamic",
|
|
18906
|
+
narrativeStyle: "animated_object_soul"
|
|
18907
|
+
},
|
|
18908
|
+
timeline: {
|
|
18909
|
+
videoStyle: "ai_dynamic",
|
|
18910
|
+
narrativeStyle: "animated_timeline"
|
|
18806
18911
|
}
|
|
18807
18912
|
};
|
|
18808
18913
|
function resolveVideoPreset(preset) {
|
|
@@ -18810,6 +18915,26 @@ function resolveVideoPreset(preset) {
|
|
|
18810
18915
|
return VIDEO_PRESET_RESOLUTION[preset] ?? null;
|
|
18811
18916
|
}
|
|
18812
18917
|
__name(resolveVideoPreset, "resolveVideoPreset");
|
|
18918
|
+
var ANIMATED_VIDEO_PRESETS = /* @__PURE__ */ new Set([
|
|
18919
|
+
"pixar_problem",
|
|
18920
|
+
"pixar_sassy",
|
|
18921
|
+
"storyteller",
|
|
18922
|
+
"inner_journey",
|
|
18923
|
+
"object_soul",
|
|
18924
|
+
"timeline"
|
|
18925
|
+
]);
|
|
18926
|
+
var ANIMATED_NARRATIVE_STYLES = /* @__PURE__ */ new Set([
|
|
18927
|
+
"animated_problem_pixar",
|
|
18928
|
+
"sassy_product_pixar",
|
|
18929
|
+
"animated_storyteller",
|
|
18930
|
+
"animated_inner_journey",
|
|
18931
|
+
"animated_object_soul",
|
|
18932
|
+
"animated_timeline"
|
|
18933
|
+
]);
|
|
18934
|
+
function animationStyleApplies(videoPreset, angleNarratives) {
|
|
18935
|
+
return ANIMATED_VIDEO_PRESETS.has(videoPreset ?? "") || (angleNarratives ?? []).some((n) => ANIMATED_NARRATIVE_STYLES.has(n));
|
|
18936
|
+
}
|
|
18937
|
+
__name(animationStyleApplies, "animationStyleApplies");
|
|
18813
18938
|
var VideoTierEnum = z78.enum([
|
|
18814
18939
|
"basic"
|
|
18815
18940
|
]);
|
|
@@ -18821,19 +18946,23 @@ function resolveWireVideoTier(tier, durationSeconds) {
|
|
|
18821
18946
|
return durationSeconds === 30 ? "standard" : resolveVideoTier(tier);
|
|
18822
18947
|
}
|
|
18823
18948
|
__name(resolveWireVideoTier, "resolveWireVideoTier");
|
|
18824
|
-
function assertVideoPresetDurationCompatibility(
|
|
18825
|
-
|
|
18826
|
-
|
|
18827
|
-
|
|
18828
|
-
|
|
18949
|
+
function assertVideoPresetDurationCompatibility(_videoPreset, _durationSeconds, _videoStructure, _videoQuality) {
|
|
18950
|
+
}
|
|
18951
|
+
__name(assertVideoPresetDurationCompatibility, "assertVideoPresetDurationCompatibility");
|
|
18952
|
+
var MULTI_SCENE_ONLY_NARRATIVES = /* @__PURE__ */ new Set([]);
|
|
18953
|
+
function assertAngleNarrativeDurationCompatibility(angleNarratives, durationSeconds, videoStructure) {
|
|
18954
|
+
if (!angleNarratives?.some((n) => MULTI_SCENE_ONLY_NARRATIVES.has(n))) return;
|
|
18955
|
+
if (videoStructure !== void 0) {
|
|
18956
|
+
if (videoStructure === "single_take") {
|
|
18957
|
+
throw new Error("Alguna de las narrativas por \xE1ngulo solo est\xE1 disponible en Multiescena.");
|
|
18829
18958
|
}
|
|
18830
18959
|
return;
|
|
18831
18960
|
}
|
|
18832
18961
|
if (durationSeconds !== 30) {
|
|
18833
|
-
throw new Error("
|
|
18962
|
+
throw new Error("Alguna de las narrativas por \xE1ngulo solo est\xE1 disponible en videos Multiescena de 30 segundos.");
|
|
18834
18963
|
}
|
|
18835
18964
|
}
|
|
18836
|
-
__name(
|
|
18965
|
+
__name(assertAngleNarrativeDurationCompatibility, "assertAngleNarrativeDurationCompatibility");
|
|
18837
18966
|
function resolveVideoFormatForDuration(durationSeconds) {
|
|
18838
18967
|
return durationSeconds === 30 ? "double_30s" : "single_15s";
|
|
18839
18968
|
}
|
|
@@ -18854,6 +18983,7 @@ var VideoResolutionEnum = VideoResolution;
|
|
|
18854
18983
|
var CreativeGenderEnum = CreativeGenderPin;
|
|
18855
18984
|
var NarrativeStyleEnum = McpNarrativeStyleSchema;
|
|
18856
18985
|
var PublicNarrativeStyleEnum = McpAngleNarrativeStyleSchema;
|
|
18986
|
+
var AnimationStyleEnum = AnimationStyleSchema;
|
|
18857
18987
|
var TaskVideoModelEnum = VideoModel;
|
|
18858
18988
|
var ProductReferenceUserChoiceEnum = ProductReferenceUserChoiceSchema;
|
|
18859
18989
|
var ProductReferenceScopeEnum = ProductReferenceScopeSchema;
|
|
@@ -20506,7 +20636,8 @@ var CreateProductTaskInput = z81.object({
|
|
|
20506
20636
|
paymentMethods: z81.string().min(1).max(240).optional().describe('Opcional. M\xE9todos de pago que puede mostrar la landing. Ej. "Tarjeta, PSE, Nequi, Contraentrega". Si se omite, la landing no muestra m\xE9todos de pago.'),
|
|
20507
20637
|
productContext: z81.string().max(PRODUCT_CONTEXT_MAX_CHARS).optional().describe("Opcional. Informacion adicional del producto que la IA debe usar como contexto prioritario: uso real, comprador, restricciones, diferenciadores o direccion creativa. No reemplaza la investigacion de competencia; si hay competencia, guia el primer angulo y los outputs no deben contradecirlo."),
|
|
20508
20638
|
productLabel: z81.string().trim().max(80).optional().describe('Opcional. Qu\xE9 es el producto, en pocas palabras (ej. "quita pelusas para ropa"). Es AUTORITATIVO: si lo env\xEDas, la IA usa esta identidad y no la reemplaza por otra categor\xEDa. Si lo omites, la IA detecta el producto desde la imagen.'),
|
|
20509
|
-
videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena)
|
|
20639
|
+
videoPreset: VideoPresetEnum.default("auto").describe('Opcional. Tipo/narrativa del video \u2014 \xFAnico campo de "estilo" que el usuario controla. Default "auto" (la IA escoge tras analizar el producto). Todos los presets funcionan a 15s (single_call) y 30s (Multiescena); "problem_solution" en single_call abre sin el producto y el producto entra por referencia en su beat de soluci\xF3n. Opciones: "auto", "ugc_dynamic" (review con experiencia y prueba), "ugc_how_to" (tutorial con pasos y resultado visible), "ugc_unboxing_chaos" (apertura y primera prueba), "problem_solution" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase" (producto ejecutando una funci\xF3n real), "wearable_showcase" (prenda o accesorio modelado), "cinematic" (TV spot con receta cinematogr\xE1fica), "wild_card" (idea imposible: un truco visual que en la vida real no podr\xEDa pasar, y al cierre la invitaci\xF3n a comprar), "pixar_problem" (problema animado 3D), "pixar_sassy" (producto que habla), "storyteller" (narrador animado + met\xE1fora visual), "inner_journey" (la c\xE1mara entra al interior del problema), "object_soul" (un objeto cotidiano con alma silenciosa), "timeline" (el mismo encuadre a trav\xE9s de \xE9pocas). Si el usuario pide algo fuera de esta lista, p\xEDdele una opci\xF3n v\xE1lida.'),
|
|
20640
|
+
animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem", "pixar_sassy", "storyteller", "inner_journey", "object_soul" o "timeline") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
|
|
20510
20641
|
durationSeconds: z81.union([
|
|
20511
20642
|
z81.literal(15),
|
|
20512
20643
|
z81.literal(30)
|
|
@@ -20518,7 +20649,7 @@ var CreateProductTaskInput = z81.object({
|
|
|
20518
20649
|
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
|
|
20519
20650
|
videoResolution: VideoResolutionEnum.optional().describe('Opcional. Resoluci\xF3n del render. En la web se pregunta "\xBFResoluci\xF3n del video?". "480p" = excelente calidad y m\xE1s econ\xF3mico (RECOMENDADO, default si se omite); "720p" = m\xE1xima nitidez, entre 3% y 15% m\xE1s caro seg\xFAn formato y tier. Si el usuario no menciona resoluci\xF3n, OMITE este campo (el backend usa 480p).'),
|
|
20520
20651
|
videoAngleCount: z81.number().int().min(1).max(3).optional().describe("Cantidad de videos a renderizar: 1, 2 o 3. REQUERIDO cuando outputs incluye video (o se omite outputs, cuyo default incluye video); om\xEDtelo s\xF3lo cuando no se generar\xE1 video. Preg\xFAntalo incluso con aiDecidesAll=true porque cambia el costo."),
|
|
20521
|
-
angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
|
|
20652
|
+
angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "animated_storyteller" (narrador + met\xE1fora), "animated_inner_journey" (viaje al interior), "animated_object_soul" (objeto con alma), "animated_timeline" (misma c\xE1mara por \xE9pocas), "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
|
|
20522
20653
|
outputs: z81.array(z81.enum([
|
|
20523
20654
|
"landing",
|
|
20524
20655
|
"video",
|
|
@@ -20626,7 +20757,7 @@ var PendingActionPayload = z81.discriminatedUnion("kind", [
|
|
|
20626
20757
|
// an opaque HTTP 400 after the model already believed it had been saved.
|
|
20627
20758
|
features: z81.array(z81.string().min(1).max(MCP_REVIEW_FEATURE_ITEM_MAX)).max(10).optional(),
|
|
20628
20759
|
buyerPersona: z81.string().min(1).max(360).optional(),
|
|
20629
|
-
narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n)
|
|
20760
|
+
narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") funciona en ambos formatos: 15s Un solo clip y 30s Multiescena.'),
|
|
20630
20761
|
actor: z81.string().min(1).max(360).optional().describe("Nueva descripci\xF3n del presentador. Al enviarla sin actorId, se elimina autom\xE1ticamente cualquier actor guardado previo de esos \xE1ngulos."),
|
|
20631
20762
|
actorId: z81.string().max(120).nullable().optional(),
|
|
20632
20763
|
creativeDirection: z81.string().max(2e3).optional(),
|
|
@@ -20639,7 +20770,7 @@ var PendingActionPayload = z81.discriminatedUnion("kind", [
|
|
|
20639
20770
|
]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
|
|
20640
20771
|
angle: z81.string().min(1).max(480).optional(),
|
|
20641
20772
|
buyerPersona: z81.string().min(1).max(360).optional(),
|
|
20642
|
-
narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n)
|
|
20773
|
+
narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n) funciona en ambos formatos \u2014 en Un solo clip abre sin producto y el producto entra por referencia en su beat. La familia storyteller ("animated_storyteller", "animated_inner_journey", "animated_object_soul", "animated_timeline") funciona en ambos formatos: 15s Un solo clip y 30s Multiescena.'),
|
|
20643
20774
|
actor: z81.string().min(1).max(360).optional(),
|
|
20644
20775
|
actorId: z81.string().max(120).nullable().optional(),
|
|
20645
20776
|
creativeDirection: z81.string().max(2e3).optional()
|
|
@@ -20919,6 +21050,10 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
20919
21050
|
const selectedOutputs = input.outputs ?? DEFAULT_PRODUCT_TASK_OUTPUTS;
|
|
20920
21051
|
const videoPreset = selectedOutputs.includes("video") && input.competitorScanEnabled === true ? "auto" : input.videoPreset;
|
|
20921
21052
|
assertVideoPresetDurationCompatibility(videoPreset, input.durationSeconds, input.videoStructure, input.videoQuality);
|
|
21053
|
+
assertAngleNarrativeDurationCompatibility(input.angleNarratives, input.durationSeconds, input.videoStructure);
|
|
21054
|
+
if (input.animationStyle !== void 0 && !animationStyleApplies(videoPreset, input.angleNarratives)) {
|
|
21055
|
+
throw new Error("animationStyle solo aplica a narrativas animadas.");
|
|
21056
|
+
}
|
|
20922
21057
|
if (selectedOutputs.includes("video")) {
|
|
20923
21058
|
assertSemanticVideoDurationCompatibility(input.videoStructure, input.videoQuality, input.durationSeconds);
|
|
20924
21059
|
}
|
|
@@ -20962,6 +21097,7 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
20962
21097
|
"options.productContext": input.productContext,
|
|
20963
21098
|
"options.productLabel": input.productLabel,
|
|
20964
21099
|
"options.videoPreset": videoPreset,
|
|
21100
|
+
"options.animationStyle": input.animationStyle,
|
|
20965
21101
|
"options.videoStyle": resolved?.videoStyle,
|
|
20966
21102
|
"options.narrativeStyle": resolved?.narrativeStyle,
|
|
20967
21103
|
"options.videoTier": wireTier,
|
|
@@ -21723,8 +21859,9 @@ var VideoCreativeSetup = z82.discriminatedUnion("mode", [
|
|
|
21723
21859
|
}).strict(),
|
|
21724
21860
|
z82.object({
|
|
21725
21861
|
mode: z82.literal("guided"),
|
|
21726
|
-
videoPreset: VideoPresetEnum.default("auto").describe('Narrativa opcional. Con estudio de mercado no la preguntes: se usa "auto" y el estudio define la estructura. Sin estudio conserva la elecci\xF3n del usuario.
|
|
21862
|
+
videoPreset: VideoPresetEnum.default("auto").describe('Narrativa opcional. Con estudio de mercado no la preguntes: se usa "auto" y el estudio define la estructura. Sin estudio conserva la elecci\xF3n del usuario. Todas las narrativas funcionan en Un solo clip y Multiescena.'),
|
|
21727
21863
|
buyerPersona: z82.string().trim().min(1).max(360),
|
|
21864
|
+
animationStyle: AnimationStyleEnum.optional().describe('Opcional. Estilo visual SOLO para presets animados ("pixar_problem", "pixar_sassy", "storyteller", "inner_journey", "object_soul" o "timeline") \u2014 la API lo rechaza con cualquier otro preset. Opciones: "pixar_3d" (default, look 3D de pel\xEDcula animada), "claymation" (plastilina stop-motion artesanal), "wes_anderson" (tableau sim\xE9trico pastel), "sci_fi" (futurista con HUDs y ne\xF3n), "realista" (fotorrealista, fiel al producto). Si el usuario pide un look animado sin nombrar el estilo, omite el campo.'),
|
|
21728
21865
|
presenter: VideoPresenter,
|
|
21729
21866
|
creativeDirection: z82.string().trim().min(1).max(500).nullable().describe("Direcci\xF3n visual elegida. null significa que el usuario deleg\xF3 expl\xEDcitamente esta decisi\xF3n.")
|
|
21730
21867
|
}).strict()
|
|
@@ -21743,7 +21880,7 @@ var VideoInput = z82.object({
|
|
|
21743
21880
|
]).describe('Relaci\xF3n de aspecto. "9:16" = vertical (TikTok/Reels \u2014 default recomendado para ads). "16:9" = horizontal (YouTube). "Auto" = decide la IA.'),
|
|
21744
21881
|
durationSeconds: z82.number().int().min(4).max(30).default(15).describe("Opcional. Duraci\xF3n objetivo: Un solo clip Econ\xF3mico o Medio usa 15s; Un solo clip Pro usa 15s o 30s; Multiescena usa 15s o 30s totales. La combinaci\xF3n de formato y calidad determina la ruta y el costo."),
|
|
21745
21882
|
videoAngleCount: z82.number().int().min(1).max(3).describe("Cantidad de videos a renderizar: 1, 2 o 3. Es una decisi\xF3n de costo obligatoria: preg\xFAntala incluso cuando creativeSetup.mode=automatic."),
|
|
21746
|
-
angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
|
|
21883
|
+
angleNarratives: PublicNarrativeStyleEnum.array().max(3).optional().describe('Opcional. Narrativa POR \xC1NGULO (posicional). Valores actuales: "review", "ugc_how_to", "ugc_unboxing_chaos", "problem_product_cta" (problema concreto, producto como soluci\xF3n y CTA), "product_showcase", "wearable_showcase", "cinematic", "wild_card", "animated_problem_pixar", "sassy_product_pixar", "animated_storyteller" (narrador + met\xE1fora), "animated_inner_journey" (viaje al interior), "animated_object_soul" (objeto con alma), "animated_timeline" (misma c\xE1mara por \xE9pocas), "market" (narrativa an\xE1lisis de mercado: adapta el video a los patrones ganadores estudiados de la competencia; requiere competitorScanEnabled: true). angleNarratives[i] fuerza la narrativa del \xE1ngulo i; las posiciones restantes las elige la IA. La lista no puede superar videoAngleCount.'),
|
|
21747
21884
|
creativeSetup: VideoCreativeSetup.describe("Configuraci\xF3n creativa obligatoria. En guided pregunta narrativa, p\xFAblico, presentador y direcci\xF3n antes de confirmar. Usa automatic s\xF3lo si el usuario deleg\xF3 todo expl\xEDcitamente."),
|
|
21748
21885
|
videoStructure: VideoStructureEnum.default("single_take").describe('Opcional. Formato: "single_take" = Un solo clip (generado completo; puede incluir cambios de plano) o "multi_scene" = Multiescena (varias tomas concatenadas). Default: single_take.'),
|
|
21749
21886
|
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El sistema elige el proveedor internamente. Default: economy.'),
|
|
@@ -22064,6 +22201,10 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
22064
22201
|
const guidedSetup = input.creativeSetup.mode === "guided" ? input.creativeSetup : null;
|
|
22065
22202
|
const videoPreset = input.competitorScanEnabled === true ? "auto" : guidedSetup?.videoPreset ?? "auto";
|
|
22066
22203
|
assertVideoPresetDurationCompatibility(videoPreset, input.durationSeconds, input.videoStructure, input.videoQuality);
|
|
22204
|
+
assertAngleNarrativeDurationCompatibility(input.angleNarratives, input.durationSeconds, input.videoStructure);
|
|
22205
|
+
if (guidedSetup?.animationStyle !== void 0 && !animationStyleApplies(videoPreset, input.angleNarratives)) {
|
|
22206
|
+
throw new Error("animationStyle solo aplica a narrativas animadas.");
|
|
22207
|
+
}
|
|
22067
22208
|
const resolved = resolveVideoPreset(videoPreset);
|
|
22068
22209
|
const reviewPolicy = resolveConversationalReviewPolicy(input.creativeSetup.mode === "automatic");
|
|
22069
22210
|
const { videoResolution: _vr, creativeSetup: _creativeSetup, winnerReference: _winnerReference, ...rest } = input;
|
|
@@ -22081,6 +22222,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
22081
22222
|
if (guidedSetup.presenter.mode === "described") wirePayload.actorDescription = guidedSetup.presenter.description;
|
|
22082
22223
|
const direction = guidedSetup.creativeDirection;
|
|
22083
22224
|
wirePayload.creativeDirectionMode = direction ? "provided" : "ai_decides";
|
|
22225
|
+
if (guidedSetup.animationStyle !== void 0) wirePayload.animationStyle = guidedSetup.animationStyle;
|
|
22084
22226
|
if (direction) {
|
|
22085
22227
|
wirePayload.scriptNotes = [
|
|
22086
22228
|
input.scriptNotes?.trim(),
|