@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/stdio.js
CHANGED
|
@@ -64,8 +64,20 @@ var NarrativeStyle = z.enum([
|
|
|
64
64
|
"ugc_skeptic_confession",
|
|
65
65
|
"ugc_demo_review",
|
|
66
66
|
"gap_replication",
|
|
67
|
-
"market"
|
|
67
|
+
"market",
|
|
68
|
+
"animated_storyteller",
|
|
69
|
+
"animated_inner_journey",
|
|
70
|
+
"animated_object_soul",
|
|
71
|
+
"animated_timeline"
|
|
72
|
+
]);
|
|
73
|
+
var AnimationStyleSchema = z.enum([
|
|
74
|
+
"pixar_3d",
|
|
75
|
+
"claymation",
|
|
76
|
+
"wes_anderson",
|
|
77
|
+
"sci_fi",
|
|
78
|
+
"realista"
|
|
68
79
|
]);
|
|
80
|
+
var ANIMATION_STYLE_VALUES = AnimationStyleSchema.options;
|
|
69
81
|
var VideoResolution = z.enum([
|
|
70
82
|
"480p",
|
|
71
83
|
"720p"
|
|
@@ -81,6 +93,10 @@ var VideoPreset = z.enum([
|
|
|
81
93
|
"wearable_showcase",
|
|
82
94
|
"pixar_problem",
|
|
83
95
|
"pixar_sassy",
|
|
96
|
+
"storyteller",
|
|
97
|
+
"inner_journey",
|
|
98
|
+
"object_soul",
|
|
99
|
+
"timeline",
|
|
84
100
|
"ugc_unboxing_chaos",
|
|
85
101
|
"ugc_curiosity_reveal",
|
|
86
102
|
"ugc_listicle_3",
|
|
@@ -3270,7 +3286,9 @@ var LandingProductSchema = z21.object({
|
|
|
3270
3286
|
whatsappNumber: z21.string().regex(/^\d{7,15}$/, 'digits only, 7\u201315 chars (e.g. "573001234567")').optional()
|
|
3271
3287
|
});
|
|
3272
3288
|
var CodeLandingProductSchema = LandingProductSchema.extend({
|
|
3273
|
-
price: z21.string().min(1).optional()
|
|
3289
|
+
price: z21.string().min(1).optional(),
|
|
3290
|
+
/** Keeps image-medium selection stable when a saved page is recomposed. */
|
|
3291
|
+
category: z21.string().min(1).optional()
|
|
3274
3292
|
});
|
|
3275
3293
|
var PAYMENT_METHOD_KEYS = [
|
|
3276
3294
|
"contraentrega",
|
|
@@ -4113,6 +4131,9 @@ var IngestOptions = z22.object({
|
|
|
4113
4131
|
videoTier: WritableVideoTier.default(DEFAULT_VIDEO_TIER),
|
|
4114
4132
|
narrativeStyle: NarrativeStyle.default("review"),
|
|
4115
4133
|
videoPreset: VideoPreset.optional(),
|
|
4134
|
+
/** Orthogonal visual style for animated narratives only. The API rejects it
|
|
4135
|
+
* on non-animated presets; absent → the pipeline resolves 'pixar_3d'. */
|
|
4136
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
4116
4137
|
multiAngleVideos: z22.boolean().default(false),
|
|
4117
4138
|
videoAngleCount: z22.number().int().min(1).max(3).optional(),
|
|
4118
4139
|
/** Per-angle narrative override (positional). angleNarratives[i] forces the
|
|
@@ -4309,6 +4330,10 @@ var VideoOptionsOverride = z22.object({
|
|
|
4309
4330
|
ugcFormat: VideoFormat.optional(),
|
|
4310
4331
|
videoStyle: VideoStyle.optional(),
|
|
4311
4332
|
narrativeStyle: NarrativeStyle.optional(),
|
|
4333
|
+
/** Animation-style pick for THIS angle. The approve/draft handlers persist
|
|
4334
|
+
* it on the angle's own row (Angle.animationStyle) while its effective
|
|
4335
|
+
* narrative is animated; switching to a non-animated narrative clears it. */
|
|
4336
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
4312
4337
|
videoResolution: VideoResolution.optional(),
|
|
4313
4338
|
voiceId: VoiceId.optional(),
|
|
4314
4339
|
/** Actor/character description (role + appearance + attitude). Drives voice and video character. */
|
|
@@ -5288,7 +5313,7 @@ var ApproveVideoScriptResponse = z27.object({
|
|
|
5288
5313
|
status: ScriptReviewStatus
|
|
5289
5314
|
});
|
|
5290
5315
|
var RegenerateVideoScriptNarrativeRequest = z27.object({
|
|
5291
|
-
angleKey: z27.string().min(1),
|
|
5316
|
+
angleKey: z27.string().trim().min(1).max(120),
|
|
5292
5317
|
narrativeStyle: NarrativeStyle,
|
|
5293
5318
|
narrativeSelection: z27.enum([
|
|
5294
5319
|
"market",
|
|
@@ -5302,7 +5327,11 @@ var RegenerateVideoScriptNarrativeRequest = z27.object({
|
|
|
5302
5327
|
});
|
|
5303
5328
|
var RegenerateVideoScriptNarrativeResponse = z27.object({
|
|
5304
5329
|
/** 'not_ready' while Phase 1 re-runs; the client polls until 'ready'. */
|
|
5305
|
-
status: ScriptReviewStatus
|
|
5330
|
+
status: ScriptReviewStatus,
|
|
5331
|
+
/** The angle text the new script is written from — re-voiced into the new
|
|
5332
|
+
* narrative's speaker when that changed it. The review card shows it right
|
|
5333
|
+
* away so its next draft save cannot write the old voice back. */
|
|
5334
|
+
angle: z27.string().optional()
|
|
5306
5335
|
});
|
|
5307
5336
|
var RegenerateVideoRequest = z27.object({
|
|
5308
5337
|
angleKey: z27.string().min(1)
|
|
@@ -6328,7 +6357,11 @@ var AutoResolvedPresetSchema = z35.enum([
|
|
|
6328
6357
|
"wearable_showcase",
|
|
6329
6358
|
"pixar_problem",
|
|
6330
6359
|
"pixar_sassy",
|
|
6331
|
-
"metaphor_product"
|
|
6360
|
+
"metaphor_product",
|
|
6361
|
+
"storyteller",
|
|
6362
|
+
"inner_journey",
|
|
6363
|
+
"object_soul",
|
|
6364
|
+
"timeline"
|
|
6332
6365
|
]);
|
|
6333
6366
|
var SelectedOutputsSchema = z35.array(z35.enum([
|
|
6334
6367
|
"landing",
|
|
@@ -6421,6 +6454,9 @@ var TaskCreativeVariantResult = TaskCreativeVariantBaseResult.extend({
|
|
|
6421
6454
|
images: z35.array(LandingImageReadable).min(1).max(MAX_LANDING_IMAGES)
|
|
6422
6455
|
}).optional()
|
|
6423
6456
|
});
|
|
6457
|
+
var ResultAngle = Angle.extend({
|
|
6458
|
+
animationStyle: AnimationStyleSchema.optional()
|
|
6459
|
+
});
|
|
6424
6460
|
var MVPResult = z35.object({
|
|
6425
6461
|
taskId: z35.string().uuid(),
|
|
6426
6462
|
product: Product,
|
|
@@ -6432,7 +6468,7 @@ var MVPResult = z35.object({
|
|
|
6432
6468
|
// into a 500 on GET /v1/results/:taskId and hides EVERY deliverable of a
|
|
6433
6469
|
// task that already finished. Same failure shape as the variant landing cap
|
|
6434
6470
|
// below (alert 88badc8). The write path is what must stay at 3.
|
|
6435
|
-
angles: z35.array(
|
|
6471
|
+
angles: z35.array(ResultAngle),
|
|
6436
6472
|
topVideos: z35.array(AdVideo).max(20),
|
|
6437
6473
|
landing: z35.object({
|
|
6438
6474
|
// Allow legacy data (10 sections × 2 variants) and new data (7 sections × 2)
|
|
@@ -6464,6 +6500,10 @@ var MVPResult = z35.object({
|
|
|
6464
6500
|
// and by angles review banner.
|
|
6465
6501
|
autoResolvedPreset: AutoResolvedPresetSchema.optional(),
|
|
6466
6502
|
autoResolveReasoning: z35.string().optional(),
|
|
6503
|
+
/** Persisted animated-narrative visual style (Task.animationStyle). Absent on
|
|
6504
|
+
* non-animated tasks and rows predating the axis — readers resolve
|
|
6505
|
+
* 'pixar_3d' as the default. */
|
|
6506
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
6467
6507
|
partialVideoResult: PartialVideoResult.optional(),
|
|
6468
6508
|
/** Mixed images derived from MixTask rows linked to this task via sourceTaskId. */
|
|
6469
6509
|
mixedImages: z35.array(MixedImage).optional(),
|
|
@@ -6784,6 +6824,10 @@ var StatusResponse = z35.object({
|
|
|
6784
6824
|
videoRouteId: VideoRouteId.optional(),
|
|
6785
6825
|
videoResolution: VideoResolution.optional(),
|
|
6786
6826
|
narrativeStyle: NarrativeStyle.optional(),
|
|
6827
|
+
/** Persisted animated-narrative visual style (Task.animationStyle). Absent on
|
|
6828
|
+
* non-animated tasks and rows predating the axis — readers resolve
|
|
6829
|
+
* 'pixar_3d' as the default. */
|
|
6830
|
+
animationStyle: AnimationStyleSchema.optional(),
|
|
6787
6831
|
videoAngleCount: z35.number().int().min(1).max(3).optional(),
|
|
6788
6832
|
/** Historical authorization flag kept for clients resolving legacy reviews. */
|
|
6789
6833
|
multiAngleVideos: z35.boolean().optional(),
|
|
@@ -10306,6 +10350,14 @@ var DEFAULT_PRICING = {
|
|
|
10306
10350
|
ourCostCents: 3,
|
|
10307
10351
|
userPriceCents: 6
|
|
10308
10352
|
},
|
|
10353
|
+
// Unit = one storyteller brief (insight, figure, metaphor, money shot): ONE text call per
|
|
10354
|
+
// storyteller-family angle before its plan is authored (`rapid-storyteller-brief`, judge-text
|
|
10355
|
+
// role). Billed since the family shipped but quoted nowhere until 2026-09-25. Priced by ANALOGY
|
|
10356
|
+
// with `rapid-grok-shot-action` (one batched text call of similar size), not measured yet.
|
|
10357
|
+
"openrouter:rapid-storyteller-brief": {
|
|
10358
|
+
ourCostCents: 3,
|
|
10359
|
+
userPriceCents: 6
|
|
10360
|
+
},
|
|
10309
10361
|
// Unit = one frame inventory: a single-image vision pass over ONE rendered panel, listing which
|
|
10310
10362
|
// hands are visible and what each holds, so the shot-action flatten can author against the frame
|
|
10311
10363
|
// the clip animates from instead of against the text the panel was asked to be. PER SHOT, not
|
|
@@ -13725,54 +13777,65 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13725
13777
|
], [
|
|
13726
13778
|
"product_costing"
|
|
13727
13779
|
]),
|
|
13728
|
-
defineCapability(
|
|
13780
|
+
defineCapability(
|
|
13781
|
+
"create_creative_variant",
|
|
13782
|
+
// MCP 8.6.0: + storyteller narrative family and animationStyle axis.
|
|
13783
|
+
"db6d98e9e07d57dd1a78d9b73cdbfdaa7ee7a6ae4dff30d1bd2b3edf3225cd0d",
|
|
13729
13784
|
"credit_consuming",
|
|
13730
|
-
"
|
|
13731
|
-
|
|
13732
|
-
|
|
13733
|
-
"
|
|
13734
|
-
]
|
|
13735
|
-
|
|
13736
|
-
"
|
|
13737
|
-
|
|
13738
|
-
|
|
13739
|
-
"
|
|
13740
|
-
|
|
13741
|
-
|
|
13742
|
-
"
|
|
13743
|
-
|
|
13744
|
-
|
|
13745
|
-
"
|
|
13746
|
-
|
|
13747
|
-
"
|
|
13748
|
-
"
|
|
13749
|
-
|
|
13750
|
-
|
|
13751
|
-
|
|
13752
|
-
|
|
13753
|
-
|
|
13754
|
-
"
|
|
13755
|
-
|
|
13756
|
-
|
|
13757
|
-
|
|
13758
|
-
|
|
13759
|
-
|
|
13760
|
-
|
|
13761
|
-
|
|
13762
|
-
|
|
13763
|
-
|
|
13764
|
-
|
|
13765
|
-
|
|
13766
|
-
|
|
13767
|
-
|
|
13768
|
-
|
|
13785
|
+
"creative",
|
|
13786
|
+
[
|
|
13787
|
+
"credit_consuming",
|
|
13788
|
+
"state_change"
|
|
13789
|
+
],
|
|
13790
|
+
[
|
|
13791
|
+
slot("source_task", true, [
|
|
13792
|
+
"sourceTaskId"
|
|
13793
|
+
]),
|
|
13794
|
+
slot("creative_kind", true, [
|
|
13795
|
+
"kind"
|
|
13796
|
+
]),
|
|
13797
|
+
slot("confirmation", true, [
|
|
13798
|
+
"confirm"
|
|
13799
|
+
], [], "confirmation"),
|
|
13800
|
+
slot("idempotency", true, [
|
|
13801
|
+
"clientRequestId"
|
|
13802
|
+
], void 0, "server"),
|
|
13803
|
+
slot("creative_brief", false, [
|
|
13804
|
+
"angle",
|
|
13805
|
+
"buyerPersona",
|
|
13806
|
+
"scriptNotes",
|
|
13807
|
+
"creativeDirection"
|
|
13808
|
+
]),
|
|
13809
|
+
slot("render_options", false, [
|
|
13810
|
+
"videoPreset",
|
|
13811
|
+
"videoResolution",
|
|
13812
|
+
"generateAiMusic",
|
|
13813
|
+
"nVariants",
|
|
13814
|
+
"imageStyle",
|
|
13815
|
+
"creativeArchetype",
|
|
13816
|
+
"visualTreatment",
|
|
13817
|
+
"aspectRatio",
|
|
13818
|
+
"styleMix",
|
|
13819
|
+
"sectionKey",
|
|
13820
|
+
"instructions"
|
|
13821
|
+
])
|
|
13822
|
+
],
|
|
13823
|
+
[
|
|
13824
|
+
"task",
|
|
13825
|
+
"creative"
|
|
13826
|
+
],
|
|
13827
|
+
[
|
|
13828
|
+
"creative_variant"
|
|
13829
|
+
]
|
|
13830
|
+
),
|
|
13769
13831
|
defineCapability(
|
|
13770
13832
|
"create_product_task",
|
|
13771
13833
|
// MCP 8.4.0 (Fase 4, Tarea 3, .agent/plans/2026-09-26-refactor-fase4-detallado.md):
|
|
13772
13834
|
// outputs accepts 1 value, actorId max 120, landingStrategy optional (no
|
|
13773
13835
|
// default). Recomputed from the real tools/list digest printer.
|
|
13774
13836
|
// + market study opt-in copy (#2005, competitorScanEnabled description).
|
|
13775
|
-
|
|
13837
|
+
// MCP 8.6.0: + storyteller narrative family and animationStyle axis.
|
|
13838
|
+
"46b308923121dac1023b55f68b61dfbf4e89f682bdd48b04d4d0f8a3667f8999",
|
|
13776
13839
|
"credit_consuming",
|
|
13777
13840
|
"creative",
|
|
13778
13841
|
[
|
|
@@ -13831,6 +13894,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13831
13894
|
"videoResolution",
|
|
13832
13895
|
"videoAngleCount",
|
|
13833
13896
|
"angleNarratives",
|
|
13897
|
+
"animationStyle",
|
|
13834
13898
|
"competitorScanEnabled",
|
|
13835
13899
|
"replicateWinnerWhenFound"
|
|
13836
13900
|
], [
|
|
@@ -13842,6 +13906,8 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13842
13906
|
"videoResolution",
|
|
13843
13907
|
"multiAngleVideos",
|
|
13844
13908
|
"angleNarratives",
|
|
13909
|
+
// MCP-only for now: the WhatsApp contract schema does not expose the
|
|
13910
|
+
// animation-style axis yet (Phase 1 ships it on web + MCP).
|
|
13845
13911
|
"competitorScanEnabled",
|
|
13846
13912
|
"competitorCommercialStudyRequested",
|
|
13847
13913
|
"replicateWinnerWhenFound"
|
|
@@ -13940,7 +14006,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
13940
14006
|
], [
|
|
13941
14007
|
"task_draft"
|
|
13942
14008
|
]),
|
|
13943
|
-
defineCapability("estimate_creative_variant", "
|
|
14009
|
+
defineCapability("estimate_creative_variant", "055a92336bfb773c14e3f7018368b4490404ebcb3e607f78d5e0d5c0e78254b8", "none", "read_only", [
|
|
13944
14010
|
"read"
|
|
13945
14011
|
], [
|
|
13946
14012
|
slot("source_task", true, [
|
|
@@ -14269,112 +14335,127 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14269
14335
|
fieldCompletion: "all"
|
|
14270
14336
|
}
|
|
14271
14337
|
]),
|
|
14272
|
-
defineCapability(
|
|
14338
|
+
defineCapability(
|
|
14339
|
+
"generate_video_creative",
|
|
14340
|
+
// MCP 8.6.0: + storyteller narrative family and animationStyle axis.
|
|
14341
|
+
"5545b24de7b344c9184cfe087a39b766490526a432d8b288c02c2e9a20529c3d",
|
|
14273
14342
|
"credit_consuming",
|
|
14274
|
-
"state_change"
|
|
14275
|
-
], [
|
|
14276
|
-
slot("product_reference", true, [
|
|
14277
|
-
"images",
|
|
14278
|
-
"winnerReference"
|
|
14279
|
-
], [
|
|
14280
|
-
"imageMessageIds",
|
|
14281
|
-
"imageAssetIds",
|
|
14282
|
-
"projectId",
|
|
14283
|
-
"productUrl"
|
|
14284
|
-
]),
|
|
14285
|
-
slot("product_identity", true, [
|
|
14286
|
-
"title"
|
|
14287
|
-
]),
|
|
14288
|
-
// Optional in the canonical API because the shared generation pipeline
|
|
14289
|
-
// owns delegated angles. WhatsApp still asks through conversationInputs.
|
|
14290
|
-
slot("creative_angle", false, [
|
|
14291
|
-
"primaryAngle"
|
|
14292
|
-
]),
|
|
14293
|
-
slot("locale", true, [
|
|
14294
|
-
"language",
|
|
14295
|
-
"country"
|
|
14296
|
-
]),
|
|
14297
|
-
slot("render_options", true, [
|
|
14298
|
-
"angleNarratives",
|
|
14299
|
-
"aspectRatio",
|
|
14300
|
-
"durationSeconds",
|
|
14301
|
-
"videoAngleCount",
|
|
14302
|
-
"creativeSetup",
|
|
14303
|
-
"videoStructure",
|
|
14304
|
-
"videoQuality",
|
|
14305
|
-
"videoResolution",
|
|
14306
|
-
"features",
|
|
14307
|
-
"cta",
|
|
14308
|
-
"scriptNotes",
|
|
14309
|
-
"competitorScanEnabled",
|
|
14310
|
-
"replicateWinnerWhenFound"
|
|
14311
|
-
], [
|
|
14312
|
-
"aspectRatio",
|
|
14313
|
-
"durationSeconds",
|
|
14314
|
-
"videoPreset",
|
|
14315
|
-
"videoStructure",
|
|
14316
|
-
"videoQuality",
|
|
14317
|
-
"videoResolution",
|
|
14318
|
-
"features",
|
|
14319
|
-
"cta",
|
|
14320
|
-
"scriptNotes",
|
|
14321
|
-
"pauseForVideoScriptReview",
|
|
14322
|
-
"pauseForAngleReview",
|
|
14323
|
-
"competitorScanEnabled",
|
|
14324
|
-
"competitorCommercialStudyRequested",
|
|
14325
|
-
"replicateWinnerWhenFound"
|
|
14326
|
-
]),
|
|
14327
|
-
slot("commercial_offer", false, [
|
|
14328
|
-
"price",
|
|
14329
|
-
"offer"
|
|
14330
|
-
]),
|
|
14331
|
-
slot("product_context", false, [
|
|
14332
|
-
"productContext",
|
|
14333
|
-
"productLabel"
|
|
14334
|
-
], []),
|
|
14335
|
-
slot("brand_direction", false, [
|
|
14336
|
-
"brandId"
|
|
14337
|
-
]),
|
|
14338
|
-
// Casting pin. MCP-only for now: the WhatsApp generate_video_creative request
|
|
14339
|
-
// schema is .strict() and does not carry it yet (follow-up), hence the explicit [].
|
|
14340
|
-
slot("actor", false, [
|
|
14341
|
-
"creativeGender"
|
|
14342
|
-
], [])
|
|
14343
|
-
], [
|
|
14344
|
-
"product_reference"
|
|
14345
|
-
], [
|
|
14346
|
-
"task",
|
|
14347
14343
|
"creative",
|
|
14348
|
-
|
|
14349
|
-
|
|
14350
|
-
|
|
14351
|
-
|
|
14352
|
-
|
|
14353
|
-
|
|
14354
|
-
|
|
14355
|
-
|
|
14356
|
-
|
|
14357
|
-
|
|
14358
|
-
|
|
14359
|
-
|
|
14360
|
-
|
|
14361
|
-
|
|
14362
|
-
|
|
14363
|
-
|
|
14364
|
-
|
|
14365
|
-
|
|
14366
|
-
|
|
14367
|
-
|
|
14344
|
+
[
|
|
14345
|
+
"credit_consuming",
|
|
14346
|
+
"state_change"
|
|
14347
|
+
],
|
|
14348
|
+
[
|
|
14349
|
+
slot("product_reference", true, [
|
|
14350
|
+
"images",
|
|
14351
|
+
"winnerReference"
|
|
14352
|
+
], [
|
|
14353
|
+
"imageMessageIds",
|
|
14354
|
+
"imageAssetIds",
|
|
14355
|
+
"projectId",
|
|
14356
|
+
"productUrl"
|
|
14357
|
+
]),
|
|
14358
|
+
slot("product_identity", true, [
|
|
14359
|
+
"title"
|
|
14360
|
+
]),
|
|
14361
|
+
// Optional in the canonical API because the shared generation pipeline
|
|
14362
|
+
// owns delegated angles. WhatsApp still asks through conversationInputs.
|
|
14363
|
+
slot("creative_angle", false, [
|
|
14368
14364
|
"primaryAngle"
|
|
14369
|
-
]
|
|
14370
|
-
|
|
14371
|
-
|
|
14372
|
-
|
|
14373
|
-
|
|
14374
|
-
|
|
14375
|
-
|
|
14376
|
-
|
|
14377
|
-
|
|
14365
|
+
]),
|
|
14366
|
+
slot("locale", true, [
|
|
14367
|
+
"language",
|
|
14368
|
+
"country"
|
|
14369
|
+
]),
|
|
14370
|
+
slot("render_options", true, [
|
|
14371
|
+
"angleNarratives",
|
|
14372
|
+
"aspectRatio",
|
|
14373
|
+
"durationSeconds",
|
|
14374
|
+
"videoAngleCount",
|
|
14375
|
+
// animationStyle rides inside creativeSetup.guided on this tool, so
|
|
14376
|
+
// it is not a top-level schema field here (it is on
|
|
14377
|
+
// create_product_task).
|
|
14378
|
+
"creativeSetup",
|
|
14379
|
+
"videoStructure",
|
|
14380
|
+
"videoQuality",
|
|
14381
|
+
"videoResolution",
|
|
14382
|
+
"features",
|
|
14383
|
+
"cta",
|
|
14384
|
+
"scriptNotes",
|
|
14385
|
+
"competitorScanEnabled",
|
|
14386
|
+
"replicateWinnerWhenFound"
|
|
14387
|
+
], [
|
|
14388
|
+
"aspectRatio",
|
|
14389
|
+
"durationSeconds",
|
|
14390
|
+
"videoPreset",
|
|
14391
|
+
"videoStructure",
|
|
14392
|
+
"videoQuality",
|
|
14393
|
+
"videoResolution",
|
|
14394
|
+
"features",
|
|
14395
|
+
"cta",
|
|
14396
|
+
"scriptNotes",
|
|
14397
|
+
"pauseForVideoScriptReview",
|
|
14398
|
+
"pauseForAngleReview",
|
|
14399
|
+
"competitorScanEnabled",
|
|
14400
|
+
"competitorCommercialStudyRequested",
|
|
14401
|
+
"replicateWinnerWhenFound"
|
|
14402
|
+
]),
|
|
14403
|
+
slot("commercial_offer", false, [
|
|
14404
|
+
"price",
|
|
14405
|
+
"offer"
|
|
14406
|
+
]),
|
|
14407
|
+
slot("product_context", false, [
|
|
14408
|
+
"productContext",
|
|
14409
|
+
"productLabel"
|
|
14410
|
+
], []),
|
|
14411
|
+
slot("brand_direction", false, [
|
|
14412
|
+
"brandId"
|
|
14413
|
+
]),
|
|
14414
|
+
// Casting pin. MCP-only for now: the WhatsApp generate_video_creative request
|
|
14415
|
+
// schema is .strict() and does not carry it yet (follow-up), hence the explicit [].
|
|
14416
|
+
slot("actor", false, [
|
|
14417
|
+
"creativeGender"
|
|
14418
|
+
], [])
|
|
14419
|
+
],
|
|
14420
|
+
[
|
|
14421
|
+
"product_reference"
|
|
14422
|
+
],
|
|
14423
|
+
[
|
|
14424
|
+
"task",
|
|
14425
|
+
"creative",
|
|
14426
|
+
"video"
|
|
14427
|
+
],
|
|
14428
|
+
SHARED_CHANNEL_EXPOSURE,
|
|
14429
|
+
[
|
|
14430
|
+
{
|
|
14431
|
+
slot: "product_reference",
|
|
14432
|
+
askBeforePaidExecution: true,
|
|
14433
|
+
explicitOmissionAllowed: false,
|
|
14434
|
+
fieldCompletion: "any"
|
|
14435
|
+
},
|
|
14436
|
+
{
|
|
14437
|
+
slot: "locale",
|
|
14438
|
+
askBeforePaidExecution: true,
|
|
14439
|
+
explicitOmissionAllowed: false,
|
|
14440
|
+
fieldCompletion: "all"
|
|
14441
|
+
},
|
|
14442
|
+
{
|
|
14443
|
+
slot: "creative_angle",
|
|
14444
|
+
askBeforePaidExecution: true,
|
|
14445
|
+
explicitOmissionAllowed: true,
|
|
14446
|
+
fieldCompletion: "any",
|
|
14447
|
+
completionFields: [
|
|
14448
|
+
"primaryAngle"
|
|
14449
|
+
]
|
|
14450
|
+
},
|
|
14451
|
+
{
|
|
14452
|
+
slot: "commercial_offer",
|
|
14453
|
+
askBeforePaidExecution: true,
|
|
14454
|
+
explicitOmissionAllowed: true,
|
|
14455
|
+
fieldCompletion: "all"
|
|
14456
|
+
}
|
|
14457
|
+
]
|
|
14458
|
+
),
|
|
14378
14459
|
defineCapability("get_meta_campaign_status", "92077241cf4e9d14edefca410e85715cc383b1433081c3461c925f8fc3d6e8ab", "none", "read_only", [
|
|
14379
14460
|
"read"
|
|
14380
14461
|
], [
|
|
@@ -14682,7 +14763,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14682
14763
|
], [
|
|
14683
14764
|
"product_media"
|
|
14684
14765
|
], MCP_ONLY_CHANNEL_EXPOSURE),
|
|
14685
|
-
defineCapability("regenerate_video_script", "
|
|
14766
|
+
defineCapability("regenerate_video_script", "198903f5d89b245daedde4e08020a6d536f2ea354f5924176253b71c84241859", "credit_consuming", "creative", [
|
|
14686
14767
|
"credit_consuming",
|
|
14687
14768
|
"state_change"
|
|
14688
14769
|
], [
|
|
@@ -14745,7 +14826,7 @@ var PRODUCTMAKER_CAPABILITY_REGISTRY = deepFreeze([
|
|
|
14745
14826
|
], [
|
|
14746
14827
|
"media_upload_session"
|
|
14747
14828
|
], MCP_ONLY_CHANNEL_EXPOSURE),
|
|
14748
|
-
defineCapability("resolve_pending_action", "
|
|
14829
|
+
defineCapability("resolve_pending_action", "7d76b53ebce3265a751836e61f6959debd98bd8159291ef73437e1b7a0824333", "credit_consuming", "creative", [
|
|
14749
14830
|
"credit_consuming",
|
|
14750
14831
|
"state_change"
|
|
14751
14832
|
], [
|
|
@@ -15152,6 +15233,10 @@ var MCP_ANGLE_NARRATIVE_STYLES = [
|
|
|
15152
15233
|
"wild_card",
|
|
15153
15234
|
"animated_problem_pixar",
|
|
15154
15235
|
"sassy_product_pixar",
|
|
15236
|
+
"animated_storyteller",
|
|
15237
|
+
"animated_inner_journey",
|
|
15238
|
+
"animated_object_soul",
|
|
15239
|
+
"animated_timeline",
|
|
15155
15240
|
"market"
|
|
15156
15241
|
];
|
|
15157
15242
|
var McpAngleNarrativeStyleSchema = NarrativeStyle.extract(MCP_ANGLE_NARRATIVE_STYLES);
|
|
@@ -16439,7 +16524,7 @@ var ApiClient = class {
|
|
|
16439
16524
|
};
|
|
16440
16525
|
|
|
16441
16526
|
// src/index.ts
|
|
16442
|
-
var MCP_VERSION = "8.
|
|
16527
|
+
var MCP_VERSION = "8.6.0";
|
|
16443
16528
|
|
|
16444
16529
|
// src/meta-upload-app.ts
|
|
16445
16530
|
import { readFileSync } from "fs";
|
|
@@ -17088,7 +17173,11 @@ var VideoPresetEnum = VideoPreset.extract([
|
|
|
17088
17173
|
"cinematic",
|
|
17089
17174
|
"wild_card",
|
|
17090
17175
|
"pixar_problem",
|
|
17091
|
-
"pixar_sassy"
|
|
17176
|
+
"pixar_sassy",
|
|
17177
|
+
"storyteller",
|
|
17178
|
+
"inner_journey",
|
|
17179
|
+
"object_soul",
|
|
17180
|
+
"timeline"
|
|
17092
17181
|
]);
|
|
17093
17182
|
var VideoStructureEnum = VideoStructure;
|
|
17094
17183
|
var VideoQualityEnum = VideoQuality;
|
|
@@ -17135,6 +17224,22 @@ var VIDEO_PRESET_RESOLUTION = {
|
|
|
17135
17224
|
wild_card: {
|
|
17136
17225
|
videoStyle: "product_only",
|
|
17137
17226
|
narrativeStyle: "wild_card"
|
|
17227
|
+
},
|
|
17228
|
+
storyteller: {
|
|
17229
|
+
videoStyle: "ai_dynamic",
|
|
17230
|
+
narrativeStyle: "animated_storyteller"
|
|
17231
|
+
},
|
|
17232
|
+
inner_journey: {
|
|
17233
|
+
videoStyle: "ai_dynamic",
|
|
17234
|
+
narrativeStyle: "animated_inner_journey"
|
|
17235
|
+
},
|
|
17236
|
+
object_soul: {
|
|
17237
|
+
videoStyle: "ai_dynamic",
|
|
17238
|
+
narrativeStyle: "animated_object_soul"
|
|
17239
|
+
},
|
|
17240
|
+
timeline: {
|
|
17241
|
+
videoStyle: "ai_dynamic",
|
|
17242
|
+
narrativeStyle: "animated_timeline"
|
|
17138
17243
|
}
|
|
17139
17244
|
};
|
|
17140
17245
|
function resolveVideoPreset(preset) {
|
|
@@ -17142,6 +17247,26 @@ function resolveVideoPreset(preset) {
|
|
|
17142
17247
|
return VIDEO_PRESET_RESOLUTION[preset] ?? null;
|
|
17143
17248
|
}
|
|
17144
17249
|
__name(resolveVideoPreset, "resolveVideoPreset");
|
|
17250
|
+
var ANIMATED_VIDEO_PRESETS = /* @__PURE__ */ new Set([
|
|
17251
|
+
"pixar_problem",
|
|
17252
|
+
"pixar_sassy",
|
|
17253
|
+
"storyteller",
|
|
17254
|
+
"inner_journey",
|
|
17255
|
+
"object_soul",
|
|
17256
|
+
"timeline"
|
|
17257
|
+
]);
|
|
17258
|
+
var ANIMATED_NARRATIVE_STYLES = /* @__PURE__ */ new Set([
|
|
17259
|
+
"animated_problem_pixar",
|
|
17260
|
+
"sassy_product_pixar",
|
|
17261
|
+
"animated_storyteller",
|
|
17262
|
+
"animated_inner_journey",
|
|
17263
|
+
"animated_object_soul",
|
|
17264
|
+
"animated_timeline"
|
|
17265
|
+
]);
|
|
17266
|
+
function animationStyleApplies(videoPreset, angleNarratives) {
|
|
17267
|
+
return ANIMATED_VIDEO_PRESETS.has(videoPreset ?? "") || (angleNarratives ?? []).some((n) => ANIMATED_NARRATIVE_STYLES.has(n));
|
|
17268
|
+
}
|
|
17269
|
+
__name(animationStyleApplies, "animationStyleApplies");
|
|
17145
17270
|
var VideoTierEnum = z77.enum([
|
|
17146
17271
|
"basic"
|
|
17147
17272
|
]);
|
|
@@ -17153,19 +17278,23 @@ function resolveWireVideoTier(tier, durationSeconds) {
|
|
|
17153
17278
|
return durationSeconds === 30 ? "standard" : resolveVideoTier(tier);
|
|
17154
17279
|
}
|
|
17155
17280
|
__name(resolveWireVideoTier, "resolveWireVideoTier");
|
|
17156
|
-
function assertVideoPresetDurationCompatibility(
|
|
17157
|
-
|
|
17158
|
-
|
|
17159
|
-
|
|
17160
|
-
|
|
17281
|
+
function assertVideoPresetDurationCompatibility(_videoPreset, _durationSeconds, _videoStructure, _videoQuality) {
|
|
17282
|
+
}
|
|
17283
|
+
__name(assertVideoPresetDurationCompatibility, "assertVideoPresetDurationCompatibility");
|
|
17284
|
+
var MULTI_SCENE_ONLY_NARRATIVES = /* @__PURE__ */ new Set([]);
|
|
17285
|
+
function assertAngleNarrativeDurationCompatibility(angleNarratives, durationSeconds, videoStructure) {
|
|
17286
|
+
if (!angleNarratives?.some((n) => MULTI_SCENE_ONLY_NARRATIVES.has(n))) return;
|
|
17287
|
+
if (videoStructure !== void 0) {
|
|
17288
|
+
if (videoStructure === "single_take") {
|
|
17289
|
+
throw new Error("Alguna de las narrativas por \xE1ngulo solo est\xE1 disponible en Multiescena.");
|
|
17161
17290
|
}
|
|
17162
17291
|
return;
|
|
17163
17292
|
}
|
|
17164
17293
|
if (durationSeconds !== 30) {
|
|
17165
|
-
throw new Error("
|
|
17294
|
+
throw new Error("Alguna de las narrativas por \xE1ngulo solo est\xE1 disponible en videos Multiescena de 30 segundos.");
|
|
17166
17295
|
}
|
|
17167
17296
|
}
|
|
17168
|
-
__name(
|
|
17297
|
+
__name(assertAngleNarrativeDurationCompatibility, "assertAngleNarrativeDurationCompatibility");
|
|
17169
17298
|
function resolveVideoFormatForDuration(durationSeconds) {
|
|
17170
17299
|
return durationSeconds === 30 ? "double_30s" : "single_15s";
|
|
17171
17300
|
}
|
|
@@ -17186,6 +17315,7 @@ var VideoResolutionEnum = VideoResolution;
|
|
|
17186
17315
|
var CreativeGenderEnum = CreativeGenderPin;
|
|
17187
17316
|
var NarrativeStyleEnum = McpNarrativeStyleSchema;
|
|
17188
17317
|
var PublicNarrativeStyleEnum = McpAngleNarrativeStyleSchema;
|
|
17318
|
+
var AnimationStyleEnum = AnimationStyleSchema;
|
|
17189
17319
|
var TaskVideoModelEnum = VideoModel;
|
|
17190
17320
|
var ProductReferenceUserChoiceEnum = ProductReferenceUserChoiceSchema;
|
|
17191
17321
|
var ProductReferenceScopeEnum = ProductReferenceScopeSchema;
|
|
@@ -18891,7 +19021,8 @@ var CreateProductTaskInput = z80.object({
|
|
|
18891
19021
|
paymentMethods: z80.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.'),
|
|
18892
19022
|
productContext: z80.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."),
|
|
18893
19023
|
productLabel: z80.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.'),
|
|
18894
|
-
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)
|
|
19024
|
+
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.'),
|
|
19025
|
+
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.'),
|
|
18895
19026
|
durationSeconds: z80.union([
|
|
18896
19027
|
z80.literal(15),
|
|
18897
19028
|
z80.literal(30)
|
|
@@ -18903,7 +19034,7 @@ var CreateProductTaskInput = z80.object({
|
|
|
18903
19034
|
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El proveedor se elige internamente. Default: economy.'),
|
|
18904
19035
|
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).'),
|
|
18905
19036
|
videoAngleCount: z80.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."),
|
|
18906
|
-
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.'),
|
|
19037
|
+
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.'),
|
|
18907
19038
|
outputs: z80.array(z80.enum([
|
|
18908
19039
|
"landing",
|
|
18909
19040
|
"video",
|
|
@@ -19011,7 +19142,7 @@ var PendingActionPayload = z80.discriminatedUnion("kind", [
|
|
|
19011
19142
|
// an opaque HTTP 400 after the model already believed it had been saved.
|
|
19012
19143
|
features: z80.array(z80.string().min(1).max(MCP_REVIEW_FEATURE_ITEM_MAX)).max(10).optional(),
|
|
19013
19144
|
buyerPersona: z80.string().min(1).max(360).optional(),
|
|
19014
|
-
narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n)
|
|
19145
|
+
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.'),
|
|
19015
19146
|
actor: z80.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."),
|
|
19016
19147
|
actorId: z80.string().max(120).nullable().optional(),
|
|
19017
19148
|
creativeDirection: z80.string().max(2e3).optional(),
|
|
@@ -19024,7 +19155,7 @@ var PendingActionPayload = z80.discriminatedUnion("kind", [
|
|
|
19024
19155
|
]).optional().describe("Elecci\xF3n expl\xEDcita: market usa el estudio disponible; guided usa la narrativa elegida para este \xE1ngulo."),
|
|
19025
19156
|
angle: z80.string().min(1).max(480).optional(),
|
|
19026
19157
|
buyerPersona: z80.string().min(1).max(360).optional(),
|
|
19027
|
-
narrativeStyle: PublicNarrativeStyleEnum.optional().describe('Narrativa del video. "problem_product_cta" (Problema y Soluci\xF3n)
|
|
19158
|
+
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.'),
|
|
19028
19159
|
actor: z80.string().min(1).max(360).optional(),
|
|
19029
19160
|
actorId: z80.string().max(120).nullable().optional(),
|
|
19030
19161
|
creativeDirection: z80.string().max(2e3).optional()
|
|
@@ -19304,6 +19435,10 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
19304
19435
|
const selectedOutputs = input.outputs ?? DEFAULT_PRODUCT_TASK_OUTPUTS;
|
|
19305
19436
|
const videoPreset = selectedOutputs.includes("video") && input.competitorScanEnabled === true ? "auto" : input.videoPreset;
|
|
19306
19437
|
assertVideoPresetDurationCompatibility(videoPreset, input.durationSeconds, input.videoStructure, input.videoQuality);
|
|
19438
|
+
assertAngleNarrativeDurationCompatibility(input.angleNarratives, input.durationSeconds, input.videoStructure);
|
|
19439
|
+
if (input.animationStyle !== void 0 && !animationStyleApplies(videoPreset, input.angleNarratives)) {
|
|
19440
|
+
throw new Error("animationStyle solo aplica a narrativas animadas.");
|
|
19441
|
+
}
|
|
19307
19442
|
if (selectedOutputs.includes("video")) {
|
|
19308
19443
|
assertSemanticVideoDurationCompatibility(input.videoStructure, input.videoQuality, input.durationSeconds);
|
|
19309
19444
|
}
|
|
@@ -19347,6 +19482,7 @@ ANTES de invocar, resume outputs, cantidad de videos y datos comerciales, explic
|
|
|
19347
19482
|
"options.productContext": input.productContext,
|
|
19348
19483
|
"options.productLabel": input.productLabel,
|
|
19349
19484
|
"options.videoPreset": videoPreset,
|
|
19485
|
+
"options.animationStyle": input.animationStyle,
|
|
19350
19486
|
"options.videoStyle": resolved?.videoStyle,
|
|
19351
19487
|
"options.narrativeStyle": resolved?.narrativeStyle,
|
|
19352
19488
|
"options.videoTier": wireTier,
|
|
@@ -20108,8 +20244,9 @@ var VideoCreativeSetup = z81.discriminatedUnion("mode", [
|
|
|
20108
20244
|
}).strict(),
|
|
20109
20245
|
z81.object({
|
|
20110
20246
|
mode: z81.literal("guided"),
|
|
20111
|
-
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.
|
|
20247
|
+
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.'),
|
|
20112
20248
|
buyerPersona: z81.string().trim().min(1).max(360),
|
|
20249
|
+
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.'),
|
|
20113
20250
|
presenter: VideoPresenter,
|
|
20114
20251
|
creativeDirection: z81.string().trim().min(1).max(500).nullable().describe("Direcci\xF3n visual elegida. null significa que el usuario deleg\xF3 expl\xEDcitamente esta decisi\xF3n.")
|
|
20115
20252
|
}).strict()
|
|
@@ -20128,7 +20265,7 @@ var VideoInput = z81.object({
|
|
|
20128
20265
|
]).describe('Relaci\xF3n de aspecto. "9:16" = vertical (TikTok/Reels \u2014 default recomendado para ads). "16:9" = horizontal (YouTube). "Auto" = decide la IA.'),
|
|
20129
20266
|
durationSeconds: z81.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."),
|
|
20130
20267
|
videoAngleCount: z81.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."),
|
|
20131
|
-
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.'),
|
|
20268
|
+
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.'),
|
|
20132
20269
|
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."),
|
|
20133
20270
|
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.'),
|
|
20134
20271
|
videoQuality: VideoQualityEnum.default("economy").describe('Opcional. Calidad: "economy" = Econ\xF3mico, "medium" = Medio o "pro" = Pro. El sistema elige el proveedor internamente. Default: economy.'),
|
|
@@ -20449,6 +20586,10 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
20449
20586
|
const guidedSetup = input.creativeSetup.mode === "guided" ? input.creativeSetup : null;
|
|
20450
20587
|
const videoPreset = input.competitorScanEnabled === true ? "auto" : guidedSetup?.videoPreset ?? "auto";
|
|
20451
20588
|
assertVideoPresetDurationCompatibility(videoPreset, input.durationSeconds, input.videoStructure, input.videoQuality);
|
|
20589
|
+
assertAngleNarrativeDurationCompatibility(input.angleNarratives, input.durationSeconds, input.videoStructure);
|
|
20590
|
+
if (guidedSetup?.animationStyle !== void 0 && !animationStyleApplies(videoPreset, input.angleNarratives)) {
|
|
20591
|
+
throw new Error("animationStyle solo aplica a narrativas animadas.");
|
|
20592
|
+
}
|
|
20452
20593
|
const resolved = resolveVideoPreset(videoPreset);
|
|
20453
20594
|
const reviewPolicy = resolveConversationalReviewPolicy(input.creativeSetup.mode === "automatic");
|
|
20454
20595
|
const { videoResolution: _vr, creativeSetup: _creativeSetup, winnerReference: _winnerReference, ...rest } = input;
|
|
@@ -20466,6 +20607,7 @@ function registerCreativeTools(server, api, { transport = "http" } = {}) {
|
|
|
20466
20607
|
if (guidedSetup.presenter.mode === "described") wirePayload.actorDescription = guidedSetup.presenter.description;
|
|
20467
20608
|
const direction = guidedSetup.creativeDirection;
|
|
20468
20609
|
wirePayload.creativeDirectionMode = direction ? "provided" : "ai_decides";
|
|
20610
|
+
if (guidedSetup.animationStyle !== void 0) wirePayload.animationStyle = guidedSetup.animationStyle;
|
|
20469
20611
|
if (direction) {
|
|
20470
20612
|
wirePayload.scriptNotes = [
|
|
20471
20613
|
input.scriptNotes?.trim(),
|