@nodaro/shared 3.6.0 → 3.8.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/dist/index.cjs +265 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +167 -9
- package/dist/index.d.ts +167 -9
- package/dist/index.js +254 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/normalize-model-input.test.ts +32 -0
- package/src/__tests__/scene3d-render-pricing.test.ts +157 -0
- package/src/__tests__/scene3d-v2.test.ts +4 -1
- package/src/image-overlay-layers.ts +10 -0
- package/src/index.ts +3 -0
- package/src/model-catalog.ts +106 -0
- package/src/model-constants.ts +30 -0
- package/src/node-default-mappings.ts +4 -0
- package/src/pipeline-types.ts +2 -0
- package/src/pro-3d-render.ts +55 -0
- package/src/reference-board-templates.ts +6 -1
- package/src/scene3d-render-pricing.ts +145 -0
- package/src/scene3d-v2.ts +3 -1
- package/src/scene3d.ts +19 -1
package/dist/index.cjs
CHANGED
|
@@ -74,6 +74,21 @@ var KONTEXT_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "21:9"];
|
|
|
74
74
|
var GROK_RATIOS = ["1:1", "16:9", "9:16", "3:2", "2:3"];
|
|
75
75
|
var GPT_IMAGE_RATIOS = ["1:1", "3:2", "2:3"];
|
|
76
76
|
var GPT_IMAGE_2_RATIOS = ["auto", "1:1", "16:9", "9:16", "4:3", "3:4"];
|
|
77
|
+
var GPT_IMAGE_2_5_RATIOS = [
|
|
78
|
+
"auto",
|
|
79
|
+
"1:1",
|
|
80
|
+
"3:2",
|
|
81
|
+
"2:3",
|
|
82
|
+
"4:3",
|
|
83
|
+
"3:4",
|
|
84
|
+
"16:9",
|
|
85
|
+
"9:16",
|
|
86
|
+
"21:9",
|
|
87
|
+
"27:16",
|
|
88
|
+
"16:27",
|
|
89
|
+
"9:8",
|
|
90
|
+
"8:9"
|
|
91
|
+
];
|
|
77
92
|
var IMAGEN4_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"];
|
|
78
93
|
var IDEOGRAM_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4"];
|
|
79
94
|
var SEEDREAM_RATIOS = ["1:1", "16:9", "9:16", "4:3", "3:4", "3:2", "2:3", "21:9"];
|
|
@@ -420,6 +435,114 @@ var IMAGE_MODELS = {
|
|
|
420
435
|
{ identifier: "gpt-image-2-i2i:4K", credits: 60, note: "4K" }
|
|
421
436
|
]
|
|
422
437
|
},
|
|
438
|
+
"gpt-image-2-5-flare": {
|
|
439
|
+
id: "gpt-image-2-5-flare",
|
|
440
|
+
kind: "image",
|
|
441
|
+
modes: ["t2i"],
|
|
442
|
+
family: "OpenAI",
|
|
443
|
+
label: "GPT Image 2.5 Flare",
|
|
444
|
+
series: "GPT Image",
|
|
445
|
+
description: "Fast everyday GPT Image 2.5 - higher quality than GPT Image 2 at about half the latency. The default of the pair: social and creator content, campaign variants, thumbnails, rapid iteration, high-volume work.",
|
|
446
|
+
useCases: ["typography", "high-res", "general", "draft"],
|
|
447
|
+
features: ["reference-image"],
|
|
448
|
+
aspectRatios: GPT_IMAGE_2_5_RATIOS,
|
|
449
|
+
resolutions: ["1K", "2K", "4K"],
|
|
450
|
+
pricing: [
|
|
451
|
+
{ identifier: "gpt-image-2-5-flare", credits: 15, note: "1K default" },
|
|
452
|
+
{ identifier: "gpt-image-2-5-flare:2K", credits: 25, note: "2K" },
|
|
453
|
+
{ identifier: "gpt-image-2-5-flare:4K", credits: 40, note: "4K" }
|
|
454
|
+
],
|
|
455
|
+
valueLabels: {
|
|
456
|
+
"3:2": "3:2 (Landscape)",
|
|
457
|
+
"2:3": "2:3 (Portrait)",
|
|
458
|
+
"27:16": "27:16 (Ultra-wide)",
|
|
459
|
+
"16:27": "16:27 (Ultra-tall)",
|
|
460
|
+
"9:8": "9:8 (Near-square)",
|
|
461
|
+
"8:9": "8:9 (Near-square)"
|
|
462
|
+
},
|
|
463
|
+
safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
|
|
464
|
+
},
|
|
465
|
+
"gpt-image-2-5-flare-i2i": {
|
|
466
|
+
id: "gpt-image-2-5-flare-i2i",
|
|
467
|
+
kind: "image",
|
|
468
|
+
modes: ["i2i"],
|
|
469
|
+
family: "OpenAI",
|
|
470
|
+
label: "GPT Image 2.5 Flare (I2I)",
|
|
471
|
+
series: "GPT Image",
|
|
472
|
+
description: "Fast GPT Image 2.5 edits (up to 16 source images) - the default when you are iterating rather than finishing.",
|
|
473
|
+
useCases: ["edit", "high-res"],
|
|
474
|
+
features: ["reference-image"],
|
|
475
|
+
aspectRatios: GPT_IMAGE_2_5_RATIOS,
|
|
476
|
+
resolutions: ["1K", "2K", "4K"],
|
|
477
|
+
pricing: [
|
|
478
|
+
{ identifier: "gpt-image-2-5-flare-i2i", credits: 15, note: "1K default" },
|
|
479
|
+
{ identifier: "gpt-image-2-5-flare-i2i:2K", credits: 25, note: "2K" },
|
|
480
|
+
{ identifier: "gpt-image-2-5-flare-i2i:4K", credits: 40, note: "4K" }
|
|
481
|
+
],
|
|
482
|
+
valueLabels: {
|
|
483
|
+
"3:2": "3:2 (Landscape)",
|
|
484
|
+
"2:3": "2:3 (Portrait)",
|
|
485
|
+
"27:16": "27:16 (Ultra-wide)",
|
|
486
|
+
"16:27": "16:27 (Ultra-tall)",
|
|
487
|
+
"9:8": "9:8 (Near-square)",
|
|
488
|
+
"8:9": "8:9 (Near-square)"
|
|
489
|
+
},
|
|
490
|
+
safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
|
|
491
|
+
},
|
|
492
|
+
"gpt-image-2-5-sunburst": {
|
|
493
|
+
id: "gpt-image-2-5-sunburst",
|
|
494
|
+
kind: "image",
|
|
495
|
+
modes: ["t2i"],
|
|
496
|
+
family: "OpenAI",
|
|
497
|
+
label: "GPT Image 2.5 Sunburst",
|
|
498
|
+
series: "GPT Image",
|
|
499
|
+
description: "Precision GPT Image 2.5 - trades generation time for tighter control and detail fidelity. Pick it for brand-sensitive and production work: packaging, diagrams, ecommerce retouching, polished campaign creative.",
|
|
500
|
+
useCases: ["typography", "high-res", "general"],
|
|
501
|
+
features: ["reference-image"],
|
|
502
|
+
aspectRatios: GPT_IMAGE_2_5_RATIOS,
|
|
503
|
+
resolutions: ["1K", "2K", "4K"],
|
|
504
|
+
pricing: [
|
|
505
|
+
{ identifier: "gpt-image-2-5-sunburst", credits: 15, note: "1K default" },
|
|
506
|
+
{ identifier: "gpt-image-2-5-sunburst:2K", credits: 25, note: "2K" },
|
|
507
|
+
{ identifier: "gpt-image-2-5-sunburst:4K", credits: 40, note: "4K" }
|
|
508
|
+
],
|
|
509
|
+
valueLabels: {
|
|
510
|
+
"3:2": "3:2 (Landscape)",
|
|
511
|
+
"2:3": "2:3 (Portrait)",
|
|
512
|
+
"27:16": "27:16 (Ultra-wide)",
|
|
513
|
+
"16:27": "16:27 (Ultra-tall)",
|
|
514
|
+
"9:8": "9:8 (Near-square)",
|
|
515
|
+
"8:9": "8:9 (Near-square)"
|
|
516
|
+
},
|
|
517
|
+
safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
|
|
518
|
+
},
|
|
519
|
+
"gpt-image-2-5-sunburst-i2i": {
|
|
520
|
+
id: "gpt-image-2-5-sunburst-i2i",
|
|
521
|
+
kind: "image",
|
|
522
|
+
modes: ["i2i"],
|
|
523
|
+
family: "OpenAI",
|
|
524
|
+
label: "GPT Image 2.5 Sunburst (I2I)",
|
|
525
|
+
series: "GPT Image",
|
|
526
|
+
description: "Precision GPT Image 2.5 edits (up to 16 source images) - the most controlled edit in the GPT family, at the cost of a longer run.",
|
|
527
|
+
useCases: ["edit", "high-res"],
|
|
528
|
+
features: ["reference-image"],
|
|
529
|
+
aspectRatios: GPT_IMAGE_2_5_RATIOS,
|
|
530
|
+
resolutions: ["1K", "2K", "4K"],
|
|
531
|
+
pricing: [
|
|
532
|
+
{ identifier: "gpt-image-2-5-sunburst-i2i", credits: 15, note: "1K default" },
|
|
533
|
+
{ identifier: "gpt-image-2-5-sunburst-i2i:2K", credits: 25, note: "2K" },
|
|
534
|
+
{ identifier: "gpt-image-2-5-sunburst-i2i:4K", credits: 40, note: "4K" }
|
|
535
|
+
],
|
|
536
|
+
valueLabels: {
|
|
537
|
+
"3:2": "3:2 (Landscape)",
|
|
538
|
+
"2:3": "2:3 (Portrait)",
|
|
539
|
+
"27:16": "27:16 (Ultra-wide)",
|
|
540
|
+
"16:27": "16:27 (Ultra-tall)",
|
|
541
|
+
"9:8": "9:8 (Near-square)",
|
|
542
|
+
"8:9": "8:9 (Near-square)"
|
|
543
|
+
},
|
|
544
|
+
safetyFilter: { stochastic: true, fallback: "nano-banana-pro" }
|
|
545
|
+
},
|
|
423
546
|
// ── Ideogram ──
|
|
424
547
|
// Ideogram models use a `rendering_speed` (TURBO / BALANCED / QUALITY)
|
|
425
548
|
// dimension that's distinct from the `quality` lever — frontend exposes
|
|
@@ -2718,7 +2841,13 @@ var IMAGE_ASPECT_RATIO_VALUES = [
|
|
|
2718
2841
|
"4:1",
|
|
2719
2842
|
"1:4",
|
|
2720
2843
|
"8:1",
|
|
2721
|
-
"1:8"
|
|
2844
|
+
"1:8",
|
|
2845
|
+
// GPT Image 2.5 (Flare + Sunburst) additions: near-square and ultra-wide/tall
|
|
2846
|
+
// cinema ratios (docs.kie.ai/market/gpt/gpt-image-2-5-*).
|
|
2847
|
+
"27:16",
|
|
2848
|
+
"16:27",
|
|
2849
|
+
"9:8",
|
|
2850
|
+
"8:9"
|
|
2722
2851
|
];
|
|
2723
2852
|
var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
|
|
2724
2853
|
// ── higher than the 5000 default ──
|
|
@@ -2730,6 +2859,15 @@ var MAX_IMAGE_PROMPT_CHARS_BY_PROVIDER = {
|
|
|
2730
2859
|
// docs.kie.ai/market/google/pro-image-to-image
|
|
2731
2860
|
"gpt-image-2-i2i": 2e4,
|
|
2732
2861
|
// docs.kie.ai/market/gpt/gpt-image-2-image-to-image
|
|
2862
|
+
// GPT Image 2.5 — all four lanes document a 20000-char prompt ceiling.
|
|
2863
|
+
"gpt-image-2-5-flare": 2e4,
|
|
2864
|
+
// docs.kie.ai/market/gpt/gpt-image-2-5-flare-text-to-image
|
|
2865
|
+
"gpt-image-2-5-flare-i2i": 2e4,
|
|
2866
|
+
// docs.kie.ai/market/gpt/gpt-image-2-5-flare-image-to-image
|
|
2867
|
+
"gpt-image-2-5-sunburst": 2e4,
|
|
2868
|
+
// docs.kie.ai/market/gpt/gpt-image-2-5-sunburst-text-to-image
|
|
2869
|
+
"gpt-image-2-5-sunburst-i2i": 2e4,
|
|
2870
|
+
// docs.kie.ai/market/gpt/gpt-image-2-5-sunburst-image-to-image
|
|
2733
2871
|
// ── lower than the 5000 default (over-send risk if left at default) ──
|
|
2734
2872
|
"seedream": 3e3,
|
|
2735
2873
|
// docs.kie.ai/market/seedream/4-5-text-to-image
|
|
@@ -2921,6 +3059,8 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
|
|
|
2921
3059
|
// T2I providers that auto-route to their i2i sibling when refs are attached
|
|
2922
3060
|
"gpt-image",
|
|
2923
3061
|
"gpt-image-2",
|
|
3062
|
+
"gpt-image-2-5-flare",
|
|
3063
|
+
"gpt-image-2-5-sunburst",
|
|
2924
3064
|
"grok",
|
|
2925
3065
|
"grok-2",
|
|
2926
3066
|
"qwen",
|
|
@@ -2933,6 +3073,8 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
|
|
|
2933
3073
|
"nano-banana-edit",
|
|
2934
3074
|
"gpt-image-i2i",
|
|
2935
3075
|
"gpt-image-2-i2i",
|
|
3076
|
+
"gpt-image-2-5-flare-i2i",
|
|
3077
|
+
"gpt-image-2-5-sunburst-i2i",
|
|
2936
3078
|
"grok-2-i2i",
|
|
2937
3079
|
"flux-i2i",
|
|
2938
3080
|
"flux-pro-i2i",
|
|
@@ -2962,6 +3104,8 @@ var MODELS_WITH_REFERENCE_IMAGE_SUPPORT = /* @__PURE__ */ new Set([
|
|
|
2962
3104
|
var T2I_TO_I2I_VARIANT = {
|
|
2963
3105
|
"gpt-image": "gpt-image-i2i",
|
|
2964
3106
|
"gpt-image-2": "gpt-image-2-i2i",
|
|
3107
|
+
"gpt-image-2-5-flare": "gpt-image-2-5-flare-i2i",
|
|
3108
|
+
"gpt-image-2-5-sunburst": "gpt-image-2-5-sunburst-i2i",
|
|
2965
3109
|
"grok": "grok-i2i",
|
|
2966
3110
|
// grok-2's t2i takes NO image input; its "i2i" is the segment-map(image_url)
|
|
2967
3111
|
// → image-edit(task_id) chain in the KIE provider (single reference).
|
|
@@ -2987,6 +3131,8 @@ var REF_IMAGE_MAX_LIMITS = {
|
|
|
2987
3131
|
"nano-banana-edit": 8,
|
|
2988
3132
|
"gpt-image-i2i": 16,
|
|
2989
3133
|
"gpt-image-2-i2i": 16,
|
|
3134
|
+
"gpt-image-2-5-flare-i2i": 16,
|
|
3135
|
+
"gpt-image-2-5-sunburst-i2i": 16,
|
|
2990
3136
|
"flux-i2i": 4,
|
|
2991
3137
|
"flux-pro-i2i": 4,
|
|
2992
3138
|
"seedream-edit": 16,
|
|
@@ -3023,6 +3169,10 @@ var VARIABLE_PRICING_MODELS = {
|
|
|
3023
3169
|
"gpt-image-i2i": "quality",
|
|
3024
3170
|
"gpt-image-2": "resolution",
|
|
3025
3171
|
"gpt-image-2-i2i": "resolution",
|
|
3172
|
+
"gpt-image-2-5-flare": "resolution",
|
|
3173
|
+
"gpt-image-2-5-flare-i2i": "resolution",
|
|
3174
|
+
"gpt-image-2-5-sunburst": "resolution",
|
|
3175
|
+
"gpt-image-2-5-sunburst-i2i": "resolution",
|
|
3026
3176
|
"nano-banana-pro": "resolution",
|
|
3027
3177
|
"nano-banana-2": "resolution",
|
|
3028
3178
|
"flux": "resolution",
|
|
@@ -3049,6 +3199,10 @@ var RESOLUTION_2K_4K_TIERED_PROVIDERS = /* @__PURE__ */ new Set([
|
|
|
3049
3199
|
"nano-banana-2",
|
|
3050
3200
|
"gpt-image-2",
|
|
3051
3201
|
"gpt-image-2-i2i",
|
|
3202
|
+
"gpt-image-2-5-flare",
|
|
3203
|
+
"gpt-image-2-5-flare-i2i",
|
|
3204
|
+
"gpt-image-2-5-sunburst",
|
|
3205
|
+
"gpt-image-2-5-sunburst-i2i",
|
|
3052
3206
|
"wan-2.7",
|
|
3053
3207
|
"wan-2.7-pro"
|
|
3054
3208
|
]);
|
|
@@ -3063,6 +3217,8 @@ var IMAGE_GEN_PROVIDERS = [
|
|
|
3063
3217
|
"grok-2",
|
|
3064
3218
|
"gpt-image",
|
|
3065
3219
|
"gpt-image-2",
|
|
3220
|
+
"gpt-image-2-5-flare",
|
|
3221
|
+
"gpt-image-2-5-sunburst",
|
|
3066
3222
|
"imagen4",
|
|
3067
3223
|
"imagen4-fast",
|
|
3068
3224
|
"imagen4-ultra",
|
|
@@ -3092,6 +3248,8 @@ var IMAGE_I2I_PROVIDERS = [
|
|
|
3092
3248
|
"flux-pro-i2i",
|
|
3093
3249
|
"gpt-image-i2i",
|
|
3094
3250
|
"gpt-image-2-i2i",
|
|
3251
|
+
"gpt-image-2-5-flare-i2i",
|
|
3252
|
+
"gpt-image-2-5-sunburst-i2i",
|
|
3095
3253
|
"grok-2-i2i",
|
|
3096
3254
|
"ideogram-edit",
|
|
3097
3255
|
"ideogram-remix",
|
|
@@ -3450,6 +3608,8 @@ var IMAGE_MASK_MODE = {
|
|
|
3450
3608
|
"nano-banana-2-lite": "prompt",
|
|
3451
3609
|
"gpt-image": "prompt",
|
|
3452
3610
|
"gpt-image-2": "prompt",
|
|
3611
|
+
"gpt-image-2-5-flare": "prompt",
|
|
3612
|
+
"gpt-image-2-5-sunburst": "prompt",
|
|
3453
3613
|
"seedream": "prompt",
|
|
3454
3614
|
"seedream-5-lite": "prompt",
|
|
3455
3615
|
"seedream-5-pro": "prompt",
|
|
@@ -8881,6 +9041,10 @@ var QUALITY_MAP = {
|
|
|
8881
9041
|
"flux-pro-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "2K" } },
|
|
8882
9042
|
"gpt-image-2": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
|
|
8883
9043
|
"gpt-image-2-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
|
|
9044
|
+
"gpt-image-2-5-flare": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
|
|
9045
|
+
"gpt-image-2-5-flare-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
|
|
9046
|
+
"gpt-image-2-5-sunburst": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
|
|
9047
|
+
"gpt-image-2-5-sunburst-i2i": { field: "resolution", values: { low: "1K", mid: "2K", high: "4K" } },
|
|
8884
9048
|
// Image gen — quality-style (medium/high or basic/high)
|
|
8885
9049
|
"gpt-image": { field: "quality", values: { low: "medium", mid: "medium", high: "high" } },
|
|
8886
9050
|
"gpt-image-i2i": { field: "quality", values: { low: "medium", mid: "medium", high: "high" } },
|
|
@@ -11531,7 +11695,9 @@ var PIPELINE_PINNABLE_IMAGE_MODELS = [
|
|
|
11531
11695
|
"nano-banana-2",
|
|
11532
11696
|
"flux",
|
|
11533
11697
|
"gpt-image",
|
|
11534
|
-
"gpt-image-2"
|
|
11698
|
+
"gpt-image-2",
|
|
11699
|
+
"gpt-image-2-5-flare",
|
|
11700
|
+
"gpt-image-2-5-sunburst"
|
|
11535
11701
|
];
|
|
11536
11702
|
var PIPELINE_PINNABLE_VIDEO_MODELS = [
|
|
11537
11703
|
"kling-turbo",
|
|
@@ -13789,7 +13955,12 @@ function estimateSheetCost(entityKind, sections, flavour, buckets, name, perPane
|
|
|
13789
13955
|
}
|
|
13790
13956
|
|
|
13791
13957
|
// src/reference-board-templates.ts
|
|
13792
|
-
var REFERENCE_BOARD_PROVIDERS = [
|
|
13958
|
+
var REFERENCE_BOARD_PROVIDERS = [
|
|
13959
|
+
"nano-banana-pro",
|
|
13960
|
+
"gpt-image-2",
|
|
13961
|
+
"gpt-image-2-5-flare",
|
|
13962
|
+
"gpt-image-2-5-sunburst"
|
|
13963
|
+
];
|
|
13793
13964
|
var ANTI_RIGID = "Editorial reference-board layout, dark near-black background, thin yellow neon accent light, faint film-grain overlay, production-grade design UI. Organized but not rigidly locked: panels may shift position from generation to generation while staying readable, balanced and premium. Works cleanly in different aspect ratios without depending on a fixed left-column structure. All on-image labels in ENGLISH.";
|
|
13794
13965
|
var PALETTE = "A COLOR PALETTE panel: 6 swatches with HEX codes derived from the dominant tones.";
|
|
13795
13966
|
var CAPTION = (kind) => `Bottom caption: "Use this ${kind} board as a visual reference for consistent depiction across all generations." Bottom-right tags: STYLE \xB7 Modern \xB7 Realistic \xB7 Cinematic. Style: photorealistic, no illustration. 8K, fine grain, cinematic color grading.`;
|
|
@@ -14046,6 +14217,17 @@ function overlayShapeElement(shape, w, h, inset = 0) {
|
|
|
14046
14217
|
}
|
|
14047
14218
|
|
|
14048
14219
|
// src/image-overlay-layers.ts
|
|
14220
|
+
var OVERLAY_ANCHORS = [
|
|
14221
|
+
"top-left",
|
|
14222
|
+
"top",
|
|
14223
|
+
"top-right",
|
|
14224
|
+
"left",
|
|
14225
|
+
"center",
|
|
14226
|
+
"right",
|
|
14227
|
+
"bottom-left",
|
|
14228
|
+
"bottom",
|
|
14229
|
+
"bottom-right"
|
|
14230
|
+
];
|
|
14049
14231
|
var OVERLAY_LAYER_KINDS = ["image", "text", "qr", "shape"];
|
|
14050
14232
|
var OVERLAY_TEXT_ALIGNS = ["left", "center", "right"];
|
|
14051
14233
|
var OVERLAY_IMAGE_MASKS = ["none", "circle"];
|
|
@@ -14950,7 +15132,16 @@ var SCENE3D_DEFAULT_FPS = 24;
|
|
|
14950
15132
|
var SCENE3D_DEFAULT_DURATION_SECONDS = 4;
|
|
14951
15133
|
var SCENE3D_LIMITS = {
|
|
14952
15134
|
minDimensionPx: 100,
|
|
14953
|
-
|
|
15135
|
+
/** Applies to BOTH axes, so the worst admissible frame is SQUARE, not merely
|
|
15136
|
+
* wider — 2560x2560 is 3.2x the pixels of 1920x1080, and that is the frame
|
|
15137
|
+
* this bound was measured at. Raised from 1920 once that cost was measured
|
|
15138
|
+
* rather than assumed: on the software GL path a container actually uses,
|
|
15139
|
+
* an animated 2560x2560 frame costs ~154 ms/frame against ~65 ms at
|
|
15140
|
+
* 1920x1080, so even `maxDurationInFrames` (3600) lands near 9 min against
|
|
15141
|
+
* the render worker's 25-minute budget. Peak memory is the real price —
|
|
15142
|
+
* ~3.1 GB across the browser process tree versus ~1.6 GB — and is the number
|
|
15143
|
+
* to re-measure before widening this again. */
|
|
15144
|
+
maxDimensionPx: 2560,
|
|
14954
15145
|
minFps: 15,
|
|
14955
15146
|
maxFps: 60,
|
|
14956
15147
|
minDurationInFrames: 1,
|
|
@@ -15443,7 +15634,9 @@ var SCENE3D_V2_LIMITS = {
|
|
|
15443
15634
|
defaultFps: 24,
|
|
15444
15635
|
/** Even integers only — an odd axis breaks H.264 chroma subsampling. */
|
|
15445
15636
|
minDimensionPx: 100,
|
|
15446
|
-
maxDimensionPx
|
|
15637
|
+
/** Deliberately kept equal to v1's `SCENE3D_LIMITS.maxDimensionPx`: one
|
|
15638
|
+
* renderer draws both versions, so one measured ceiling bounds both. */
|
|
15639
|
+
maxDimensionPx: SCENE3D_LIMITS.maxDimensionPx,
|
|
15447
15640
|
minEntities: 1,
|
|
15448
15641
|
/** SEMANTIC entities, not exported mesh nodes. */
|
|
15449
15642
|
maxEntities: 100,
|
|
@@ -16663,11 +16856,18 @@ var pro3DRenderQuoteSchema = zod.z.object({
|
|
|
16663
16856
|
function isPro3DRenderQuote(value) {
|
|
16664
16857
|
return pro3DRenderQuoteSchema.safeParse(value).success;
|
|
16665
16858
|
}
|
|
16859
|
+
var pro3DRenderShotStillSchema = zod.z.object({
|
|
16860
|
+
shotIndex: zod.z.number().int().min(0),
|
|
16861
|
+
frame: zod.z.number().int().min(0),
|
|
16862
|
+
assetId: zod.z.string().min(1),
|
|
16863
|
+
url: zod.z.string().min(1)
|
|
16864
|
+
}).passthrough();
|
|
16666
16865
|
var pro3DRenderJobOutputSchema = zod.z.object({
|
|
16667
16866
|
videoUrl: zod.z.string().min(1),
|
|
16668
16867
|
scenePlan: scene3DAnyPlanSchema,
|
|
16669
16868
|
sceneRevisionId: zod.z.string().min(1),
|
|
16670
16869
|
posterAssetId: zod.z.string().min(1),
|
|
16870
|
+
shotStills: zod.z.array(pro3DRenderShotStillSchema).optional(),
|
|
16671
16871
|
sourceArtifactId: zod.z.string().min(1).optional(),
|
|
16672
16872
|
validation: zod.z.object({
|
|
16673
16873
|
status: zod.z.literal("passed"),
|
|
@@ -16693,6 +16893,20 @@ var pro3DRenderJobOutputSchema = zod.z.object({
|
|
|
16693
16893
|
function isPro3DRenderJobOutput(value) {
|
|
16694
16894
|
return pro3DRenderJobOutputSchema.safeParse(value).success;
|
|
16695
16895
|
}
|
|
16896
|
+
function pro3DRenderShotStills(output) {
|
|
16897
|
+
const list = output?.shotStills;
|
|
16898
|
+
if (!Array.isArray(list)) return [];
|
|
16899
|
+
const parsed = list.flatMap((entry) => {
|
|
16900
|
+
const result = pro3DRenderShotStillSchema.safeParse(entry);
|
|
16901
|
+
return result.success ? [{
|
|
16902
|
+
shotIndex: result.data.shotIndex,
|
|
16903
|
+
frame: result.data.frame,
|
|
16904
|
+
assetId: result.data.assetId,
|
|
16905
|
+
url: result.data.url
|
|
16906
|
+
}] : [];
|
|
16907
|
+
});
|
|
16908
|
+
return parsed.sort((a, b) => a.shotIndex - b.shotIndex);
|
|
16909
|
+
}
|
|
16696
16910
|
var pro3DRenderCoreOutputSchema = zod.z.object({
|
|
16697
16911
|
videoUrl: zod.z.string().min(1),
|
|
16698
16912
|
scenePlan: scene3DAnyPlanSchema
|
|
@@ -16736,6 +16950,40 @@ function pro3DRenderTimingOverrides(input) {
|
|
|
16736
16950
|
return out;
|
|
16737
16951
|
}
|
|
16738
16952
|
|
|
16953
|
+
// src/scene3d-render-pricing.ts
|
|
16954
|
+
var SCENE3D_RENDER_TIERS = ["base", "large", "xlarge"];
|
|
16955
|
+
var SCENE3D_RENDER_BASE_MAX_PX = 1920;
|
|
16956
|
+
var SCENE3D_RENDER_XLARGE_MIN_AREA_PX = 512e4;
|
|
16957
|
+
var SCENE3D_RENDER_TIER_MULTIPLIERS = {
|
|
16958
|
+
base: 1,
|
|
16959
|
+
large: 1.5,
|
|
16960
|
+
xlarge: 2.5
|
|
16961
|
+
};
|
|
16962
|
+
function scene3DRenderTier(width, height) {
|
|
16963
|
+
const w = typeof width === "number" && Number.isFinite(width) && width > 0 ? width : 0;
|
|
16964
|
+
const h = typeof height === "number" && Number.isFinite(height) && height > 0 ? height : 0;
|
|
16965
|
+
if (w === 0 || h === 0) return "base";
|
|
16966
|
+
if (Math.max(w, h) <= SCENE3D_RENDER_BASE_MAX_PX) return "base";
|
|
16967
|
+
return w * h > SCENE3D_RENDER_XLARGE_MIN_AREA_PX ? "xlarge" : "large";
|
|
16968
|
+
}
|
|
16969
|
+
function scene3DRenderTierCredits(baseCredits, tier) {
|
|
16970
|
+
return Math.ceil(baseCredits * SCENE3D_RENDER_TIER_MULTIPLIERS[tier]);
|
|
16971
|
+
}
|
|
16972
|
+
var RENDER_VIDEO_CREDIT_ID = "render-video";
|
|
16973
|
+
function renderVideoCreditId(input) {
|
|
16974
|
+
if (!input || typeof input !== "object") return RENDER_VIDEO_CREDIT_ID;
|
|
16975
|
+
const body = input;
|
|
16976
|
+
if (body.planType !== SCENE3D_PLAN_TYPE) return RENDER_VIDEO_CREDIT_ID;
|
|
16977
|
+
if (!body.plan || typeof body.plan !== "object") return RENDER_VIDEO_CREDIT_ID;
|
|
16978
|
+
const plan = body.plan;
|
|
16979
|
+
const tier = scene3DRenderTier(plan.width, plan.height);
|
|
16980
|
+
return tier === "base" ? RENDER_VIDEO_CREDIT_ID : `${RENDER_VIDEO_CREDIT_ID}:3d-${tier}`;
|
|
16981
|
+
}
|
|
16982
|
+
function pro3DRenderFrameUnit(quality, tier = "base") {
|
|
16983
|
+
const unit = `${PRO3D_RENDER_CREDIT_ID}:render-frame:${quality}`;
|
|
16984
|
+
return tier === "base" ? unit : `${unit}:${tier}`;
|
|
16985
|
+
}
|
|
16986
|
+
|
|
16739
16987
|
// src/studio-transient.ts
|
|
16740
16988
|
var STUDIO_TRANSIENT_KEYS = [
|
|
16741
16989
|
"trash",
|
|
@@ -17286,6 +17534,7 @@ exports.ORG_ROLES = ORG_ROLES;
|
|
|
17286
17534
|
exports.ORG_STATUSES = ORG_STATUSES;
|
|
17287
17535
|
exports.OUTPUT_FIELD_MAP = OUTPUT_FIELD_MAP;
|
|
17288
17536
|
exports.OUTPUT_FORMATS = OUTPUT_FORMATS;
|
|
17537
|
+
exports.OVERLAY_ANCHORS = OVERLAY_ANCHORS;
|
|
17289
17538
|
exports.OVERLAY_FONTS = OVERLAY_FONTS;
|
|
17290
17539
|
exports.OVERLAY_FONT_IDS = OVERLAY_FONT_IDS;
|
|
17291
17540
|
exports.OVERLAY_IMAGE_MASKS = OVERLAY_IMAGE_MASKS;
|
|
@@ -17370,6 +17619,7 @@ exports.REF_HANDLE_CATEGORY = REF_HANDLE_CATEGORY;
|
|
|
17370
17619
|
exports.REF_IMAGE_MAX_LIMITS = REF_IMAGE_MAX_LIMITS;
|
|
17371
17620
|
exports.REF_TOKEN_NAMESPACE_PREFIXES = REF_TOKEN_NAMESPACE_PREFIXES;
|
|
17372
17621
|
exports.RENDERING_SPEED_SUPPORT = RENDERING_SPEED_SUPPORT;
|
|
17622
|
+
exports.RENDER_VIDEO_CREDIT_ID = RENDER_VIDEO_CREDIT_ID;
|
|
17373
17623
|
exports.REPEATABLE_NODE_TYPES = REPEATABLE_NODE_TYPES;
|
|
17374
17624
|
exports.REPEAT_PLACEHOLDER = REPEAT_PLACEHOLDER;
|
|
17375
17625
|
exports.REPLICATE_LIP_SYNC_PROVIDERS = REPLICATE_LIP_SYNC_PROVIDERS;
|
|
@@ -17402,6 +17652,10 @@ exports.SCENE3D_PLAN_TYPE = SCENE3D_PLAN_TYPE;
|
|
|
17402
17652
|
exports.SCENE3D_PRIMITIVES = SCENE3D_PRIMITIVES;
|
|
17403
17653
|
exports.SCENE3D_PRIMITIVE_MATERIAL_ROLE = SCENE3D_PRIMITIVE_MATERIAL_ROLE;
|
|
17404
17654
|
exports.SCENE3D_RENDERER_ASSET_KINDS = SCENE3D_RENDERER_ASSET_KINDS;
|
|
17655
|
+
exports.SCENE3D_RENDER_BASE_MAX_PX = SCENE3D_RENDER_BASE_MAX_PX;
|
|
17656
|
+
exports.SCENE3D_RENDER_TIERS = SCENE3D_RENDER_TIERS;
|
|
17657
|
+
exports.SCENE3D_RENDER_TIER_MULTIPLIERS = SCENE3D_RENDER_TIER_MULTIPLIERS;
|
|
17658
|
+
exports.SCENE3D_RENDER_XLARGE_MIN_AREA_PX = SCENE3D_RENDER_XLARGE_MIN_AREA_PX;
|
|
17405
17659
|
exports.SCENE3D_SCHEMA_VERSION = SCENE3D_SCHEMA_VERSION;
|
|
17406
17660
|
exports.SCENE3D_SCHEMA_VERSION_V2 = SCENE3D_SCHEMA_VERSION_V2;
|
|
17407
17661
|
exports.SCENE3D_SUPPORTED_SCHEMA_VERSIONS = SCENE3D_SUPPORTED_SCHEMA_VERSIONS;
|
|
@@ -17853,9 +18107,12 @@ exports.presetDataMatches = presetDataMatches;
|
|
|
17853
18107
|
exports.presetEntries = presetEntries;
|
|
17854
18108
|
exports.pricedVideoSelection = pricedVideoSelection;
|
|
17855
18109
|
exports.pro3DRenderCoreOutputSchema = pro3DRenderCoreOutputSchema;
|
|
18110
|
+
exports.pro3DRenderFrameUnit = pro3DRenderFrameUnit;
|
|
17856
18111
|
exports.pro3DRenderJobOutputSchema = pro3DRenderJobOutputSchema;
|
|
17857
18112
|
exports.pro3DRenderProducedSchemaVersion = pro3DRenderProducedSchemaVersion;
|
|
17858
18113
|
exports.pro3DRenderQuoteSchema = pro3DRenderQuoteSchema;
|
|
18114
|
+
exports.pro3DRenderShotStillSchema = pro3DRenderShotStillSchema;
|
|
18115
|
+
exports.pro3DRenderShotStills = pro3DRenderShotStills;
|
|
17859
18116
|
exports.pro3DRenderTimingOverrides = pro3DRenderTimingOverrides;
|
|
17860
18117
|
exports.qualityOptionsByKind = qualityOptionsByKind;
|
|
17861
18118
|
exports.readPromptAffixes = readPromptAffixes;
|
|
@@ -17865,6 +18122,7 @@ exports.referenceSheetCreditId = referenceSheetCreditId;
|
|
|
17865
18122
|
exports.registerCatalogSidecars = registerCatalogSidecars;
|
|
17866
18123
|
exports.registerSidecarLoaders = registerSidecarLoaders;
|
|
17867
18124
|
exports.renderAnalyzedScene = renderAnalyzedScene;
|
|
18125
|
+
exports.renderVideoCreditId = renderVideoCreditId;
|
|
17868
18126
|
exports.requiresSequenceExecution = requiresSequenceExecution;
|
|
17869
18127
|
exports.resetCatalogSidecars = resetCatalogSidecars;
|
|
17870
18128
|
exports.resolutionOptionsByKind = resolutionOptionsByKind;
|
|
@@ -17973,6 +18231,8 @@ exports.scene3DPrimitiveSchema = scene3DPrimitiveSchema;
|
|
|
17973
18231
|
exports.scene3DProjectionIssues = scene3DProjectionIssues;
|
|
17974
18232
|
exports.scene3DProvenanceSchema = scene3DProvenanceSchema;
|
|
17975
18233
|
exports.scene3DReferenceSchema = scene3DReferenceSchema;
|
|
18234
|
+
exports.scene3DRenderTier = scene3DRenderTier;
|
|
18235
|
+
exports.scene3DRenderTierCredits = scene3DRenderTierCredits;
|
|
17976
18236
|
exports.scene3DSampleForFrame = scene3DSampleForFrame;
|
|
17977
18237
|
exports.scene3DSha256Schema = scene3DSha256Schema;
|
|
17978
18238
|
exports.scene3DShotForFrame = scene3DShotForFrame;
|