@nodaro/shared 1.23.0 → 1.24.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.d.cts CHANGED
@@ -2017,7 +2017,7 @@ declare const VIDEO_ANALYSIS_LLM_MODELS: string[];
2017
2017
  * so adding a video model forces a tier decision instead of silently leaking.
2018
2018
  */
2019
2019
  declare const VIDEO_ANALYSIS_TIERS: {
2020
- readonly fast: "gemini-3.6-flash";
2020
+ readonly fast: "gemini-3-flash";
2021
2021
  readonly pro: "gemini-3.1-pro";
2022
2022
  };
2023
2023
  type VideoAnalysisModelTier = keyof typeof VIDEO_ANALYSIS_TIERS;
@@ -2042,10 +2042,24 @@ declare const VIDEO_ANALYSIS_LEGACY_MODELS: Record<string, VideoAnalysisModelTie
2042
2042
  * NOT published here (Apache irrevocability; only the wire vocabulary below is
2043
2043
  * contract — the engine lives in the private analysis plugin).
2044
2044
  */
2045
- declare const VIDEO_ANALYSIS_MIXED_TIERS: readonly ["mixed", "mixed-fast"];
2045
+ declare const VIDEO_ANALYSIS_MIXED_TIERS: readonly ["mixed", "mixed-fast", "smart"];
2046
2046
  type VideoAnalysisMixedTier = (typeof VIDEO_ANALYSIS_MIXED_TIERS)[number];
2047
- /** UI/listing order — recommended (pro) first. */
2048
- declare const VIDEO_ANALYSIS_TIER_ORDER: readonly ["pro", "fast", "mixed", "mixed-fast"];
2047
+ /**
2048
+ * `smart` is an ENGINE-PLAN sentinel like the mixed tiers — it names a plan, not a
2049
+ * model — but it is the opposite kind of plan, and the distinction is the whole
2050
+ * reason it exists as a separate tier rather than a repricing of the others.
2051
+ *
2052
+ * The economy tiers (`fast`, `pro`, `mixed`, `mixed-fast`) run several passes on
2053
+ * the cheaper proxied transport and vote. That transport is 3-4x cheaper per token
2054
+ * and additionally does no deep reasoning, which is why they cost single-digit
2055
+ * credits — and also why they are less accurate. `smart` runs ONE pass on the
2056
+ * native transport with everything turned up, which is where the accuracy is.
2057
+ *
2058
+ * As with the mixed sentinels, what the plan does internally is deliberately not
2059
+ * published here; only the wire vocabulary is contract.
2060
+ */
2061
+ /** UI/listing order — recommended (smart) first. */
2062
+ declare const VIDEO_ANALYSIS_TIER_ORDER: readonly ["smart", "pro", "fast", "mixed", "mixed-fast"];
2049
2063
  type VideoAnalysisTier = (typeof VIDEO_ANALYSIS_TIER_ORDER)[number];
2050
2064
  declare const DEFAULT_VIDEO_ANALYSIS_TIER: VideoAnalysisTier;
2051
2065
  declare const DEFAULT_VIDEO_ANALYSIS_MODEL: string;
@@ -8749,6 +8763,7 @@ declare const entitySlotSchema: z.ZodObject<{
8749
8763
  role: z.ZodString;
8750
8764
  description: z.ZodString;
8751
8765
  refImageUrl: z.ZodOptional<z.ZodString>;
8766
+ refRejectedReason: z.ZodOptional<z.ZodString>;
8752
8767
  variations: z.ZodOptional<z.ZodArray<z.ZodObject<{
8753
8768
  variationId: z.ZodString;
8754
8769
  label: z.ZodString;
@@ -8856,6 +8871,7 @@ declare const windowAnalysisSchema: z.ZodObject<{
8856
8871
  role: z.ZodString;
8857
8872
  description: z.ZodString;
8858
8873
  refImageUrl: z.ZodOptional<z.ZodString>;
8874
+ refRejectedReason: z.ZodOptional<z.ZodString>;
8859
8875
  variations: z.ZodOptional<z.ZodArray<z.ZodObject<{
8860
8876
  variationId: z.ZodString;
8861
8877
  label: z.ZodString;
@@ -9014,6 +9030,7 @@ declare const videoAnalysisResultSchema: z.ZodObject<{
9014
9030
  role: z.ZodString;
9015
9031
  description: z.ZodString;
9016
9032
  refImageUrl: z.ZodOptional<z.ZodString>;
9033
+ refRejectedReason: z.ZodOptional<z.ZodString>;
9017
9034
  variations: z.ZodOptional<z.ZodArray<z.ZodObject<{
9018
9035
  variationId: z.ZodString;
9019
9036
  label: z.ZodString;
@@ -9087,6 +9104,7 @@ declare const videoAnalysisResultSchema: z.ZodObject<{
9087
9104
  variationId: z.ZodString;
9088
9105
  label: z.ZodString;
9089
9106
  }, z.core.$strip>>>;
9107
+ warnings: z.ZodOptional<z.ZodArray<z.ZodString>>;
9090
9108
  }, z.core.$strip>;
9091
9109
  type VideoAnalysisResult = z.infer<typeof videoAnalysisResultSchema>;
9092
9110
  declare function deriveSlotRefs(visual: string): string[];
package/dist/index.d.ts CHANGED
@@ -2017,7 +2017,7 @@ declare const VIDEO_ANALYSIS_LLM_MODELS: string[];
2017
2017
  * so adding a video model forces a tier decision instead of silently leaking.
2018
2018
  */
2019
2019
  declare const VIDEO_ANALYSIS_TIERS: {
2020
- readonly fast: "gemini-3.6-flash";
2020
+ readonly fast: "gemini-3-flash";
2021
2021
  readonly pro: "gemini-3.1-pro";
2022
2022
  };
2023
2023
  type VideoAnalysisModelTier = keyof typeof VIDEO_ANALYSIS_TIERS;
@@ -2042,10 +2042,24 @@ declare const VIDEO_ANALYSIS_LEGACY_MODELS: Record<string, VideoAnalysisModelTie
2042
2042
  * NOT published here (Apache irrevocability; only the wire vocabulary below is
2043
2043
  * contract — the engine lives in the private analysis plugin).
2044
2044
  */
2045
- declare const VIDEO_ANALYSIS_MIXED_TIERS: readonly ["mixed", "mixed-fast"];
2045
+ declare const VIDEO_ANALYSIS_MIXED_TIERS: readonly ["mixed", "mixed-fast", "smart"];
2046
2046
  type VideoAnalysisMixedTier = (typeof VIDEO_ANALYSIS_MIXED_TIERS)[number];
2047
- /** UI/listing order — recommended (pro) first. */
2048
- declare const VIDEO_ANALYSIS_TIER_ORDER: readonly ["pro", "fast", "mixed", "mixed-fast"];
2047
+ /**
2048
+ * `smart` is an ENGINE-PLAN sentinel like the mixed tiers — it names a plan, not a
2049
+ * model — but it is the opposite kind of plan, and the distinction is the whole
2050
+ * reason it exists as a separate tier rather than a repricing of the others.
2051
+ *
2052
+ * The economy tiers (`fast`, `pro`, `mixed`, `mixed-fast`) run several passes on
2053
+ * the cheaper proxied transport and vote. That transport is 3-4x cheaper per token
2054
+ * and additionally does no deep reasoning, which is why they cost single-digit
2055
+ * credits — and also why they are less accurate. `smart` runs ONE pass on the
2056
+ * native transport with everything turned up, which is where the accuracy is.
2057
+ *
2058
+ * As with the mixed sentinels, what the plan does internally is deliberately not
2059
+ * published here; only the wire vocabulary is contract.
2060
+ */
2061
+ /** UI/listing order — recommended (smart) first. */
2062
+ declare const VIDEO_ANALYSIS_TIER_ORDER: readonly ["smart", "pro", "fast", "mixed", "mixed-fast"];
2049
2063
  type VideoAnalysisTier = (typeof VIDEO_ANALYSIS_TIER_ORDER)[number];
2050
2064
  declare const DEFAULT_VIDEO_ANALYSIS_TIER: VideoAnalysisTier;
2051
2065
  declare const DEFAULT_VIDEO_ANALYSIS_MODEL: string;
@@ -8749,6 +8763,7 @@ declare const entitySlotSchema: z.ZodObject<{
8749
8763
  role: z.ZodString;
8750
8764
  description: z.ZodString;
8751
8765
  refImageUrl: z.ZodOptional<z.ZodString>;
8766
+ refRejectedReason: z.ZodOptional<z.ZodString>;
8752
8767
  variations: z.ZodOptional<z.ZodArray<z.ZodObject<{
8753
8768
  variationId: z.ZodString;
8754
8769
  label: z.ZodString;
@@ -8856,6 +8871,7 @@ declare const windowAnalysisSchema: z.ZodObject<{
8856
8871
  role: z.ZodString;
8857
8872
  description: z.ZodString;
8858
8873
  refImageUrl: z.ZodOptional<z.ZodString>;
8874
+ refRejectedReason: z.ZodOptional<z.ZodString>;
8859
8875
  variations: z.ZodOptional<z.ZodArray<z.ZodObject<{
8860
8876
  variationId: z.ZodString;
8861
8877
  label: z.ZodString;
@@ -9014,6 +9030,7 @@ declare const videoAnalysisResultSchema: z.ZodObject<{
9014
9030
  role: z.ZodString;
9015
9031
  description: z.ZodString;
9016
9032
  refImageUrl: z.ZodOptional<z.ZodString>;
9033
+ refRejectedReason: z.ZodOptional<z.ZodString>;
9017
9034
  variations: z.ZodOptional<z.ZodArray<z.ZodObject<{
9018
9035
  variationId: z.ZodString;
9019
9036
  label: z.ZodString;
@@ -9087,6 +9104,7 @@ declare const videoAnalysisResultSchema: z.ZodObject<{
9087
9104
  variationId: z.ZodString;
9088
9105
  label: z.ZodString;
9089
9106
  }, z.core.$strip>>>;
9107
+ warnings: z.ZodOptional<z.ZodArray<z.ZodString>>;
9090
9108
  }, z.core.$strip>;
9091
9109
  type VideoAnalysisResult = z.infer<typeof videoAnalysisResultSchema>;
9092
9110
  declare function deriveSlotRefs(visual: string): string[];
package/dist/index.js CHANGED
@@ -1665,11 +1665,11 @@ var VIDEO_MODELS = {
1665
1665
  description: "Legacy fast-tier analysis model (pre-2026-07). Kept so stored raw-model configs keep running and keep pricing under their own identifier; new fast-tier runs use the current fast model.",
1666
1666
  useCases: ["video-analysis", "shot-list", "fast"],
1667
1667
  pricing: [
1668
- { identifier: "video-analysis:gemini-3-flash", credits: 112, note: "10-min ceiling (no duration given)" },
1669
- { identifier: "video-analysis:gemini-3-flash:60s", credits: 21 },
1670
- { identifier: "video-analysis:gemini-3-flash:180s", credits: 24 },
1671
- { identifier: "video-analysis:gemini-3-flash:360s", credits: 68 },
1672
- { identifier: "video-analysis:gemini-3-flash:600s", credits: 112, note: "10-min ceiling" }
1668
+ { identifier: "video-analysis:gemini-3-flash", credits: 14, note: "10-min ceiling (no duration given)" },
1669
+ { identifier: "video-analysis:gemini-3-flash:60s", credits: 3 },
1670
+ { identifier: "video-analysis:gemini-3-flash:180s", credits: 4 },
1671
+ { identifier: "video-analysis:gemini-3-flash:360s", credits: 9 },
1672
+ { identifier: "video-analysis:gemini-3-flash:600s", credits: 14, note: "10-min ceiling" }
1673
1673
  ]
1674
1674
  },
1675
1675
  "gemini-3.6-flash-video-analysis": {
@@ -1682,11 +1682,11 @@ var VIDEO_MODELS = {
1682
1682
  description: "Analyze a video into a structured shot list (scenes, camera, audio) \u2014 fast, economy tier. Billed per duration bucket.",
1683
1683
  useCases: ["video-analysis", "shot-list", "fast"],
1684
1684
  pricing: [
1685
- { identifier: "video-analysis:gemini-3.6-flash", credits: 291, note: "10-min ceiling (no duration given)" },
1686
- { identifier: "video-analysis:gemini-3.6-flash:60s", credits: 54 },
1687
- { identifier: "video-analysis:gemini-3.6-flash:180s", credits: 63 },
1688
- { identifier: "video-analysis:gemini-3.6-flash:360s", credits: 175 },
1689
- { identifier: "video-analysis:gemini-3.6-flash:600s", credits: 291, note: "10-min ceiling" }
1685
+ { identifier: "video-analysis:gemini-3.6-flash", credits: 38, note: "10-min ceiling (no duration given)" },
1686
+ { identifier: "video-analysis:gemini-3.6-flash:60s", credits: 7 },
1687
+ { identifier: "video-analysis:gemini-3.6-flash:180s", credits: 9 },
1688
+ { identifier: "video-analysis:gemini-3.6-flash:360s", credits: 23 },
1689
+ { identifier: "video-analysis:gemini-3.6-flash:600s", credits: 38, note: "10-min ceiling" }
1690
1690
  ]
1691
1691
  },
1692
1692
  "gemini-3.1-pro-video-analysis": {
@@ -1699,11 +1699,11 @@ var VIDEO_MODELS = {
1699
1699
  description: "Analyze a video into a structured shot list (scenes, camera, audio) \u2014 higher-fidelity, default tier. Billed per duration bucket.",
1700
1700
  useCases: ["video-analysis", "shot-list", "cinematic"],
1701
1701
  pricing: [
1702
- { identifier: "video-analysis:gemini-3.1-pro", credits: 448, note: "10-min ceiling (no duration given)" },
1703
- { identifier: "video-analysis:gemini-3.1-pro:60s", credits: 84 },
1704
- { identifier: "video-analysis:gemini-3.1-pro:180s", credits: 96 },
1705
- { identifier: "video-analysis:gemini-3.1-pro:360s", credits: 269 },
1706
- { identifier: "video-analysis:gemini-3.1-pro:600s", credits: 448, note: "10-min ceiling" }
1702
+ { identifier: "video-analysis:gemini-3.1-pro", credits: 49, note: "10-min ceiling (no duration given)" },
1703
+ { identifier: "video-analysis:gemini-3.1-pro:60s", credits: 9 },
1704
+ { identifier: "video-analysis:gemini-3.1-pro:180s", credits: 12 },
1705
+ { identifier: "video-analysis:gemini-3.1-pro:360s", credits: 30 },
1706
+ { identifier: "video-analysis:gemini-3.1-pro:600s", credits: 49, note: "10-min ceiling" }
1707
1707
  ]
1708
1708
  },
1709
1709
  // Both mixed tiers are variants of the same advanced multi-engine analysis
@@ -1719,11 +1719,32 @@ var VIDEO_MODELS = {
1719
1719
  description: "Our most advanced analysis tier \u2014 multiple analysis engines combined into one result for maximum completeness and accuracy. Billed per duration bucket.",
1720
1720
  useCases: ["video-analysis", "shot-list", "premium", "most-complete"],
1721
1721
  pricing: [
1722
- { identifier: "video-analysis:mixed", credits: 739, note: "10-min ceiling (no duration given)" },
1723
- { identifier: "video-analysis:mixed:60s", credits: 137 },
1724
- { identifier: "video-analysis:mixed:180s", credits: 158 },
1725
- { identifier: "video-analysis:mixed:360s", credits: 443 },
1726
- { identifier: "video-analysis:mixed:600s", credits: 739, note: "10-min ceiling" }
1722
+ { identifier: "video-analysis:mixed", credits: 63, note: "10-min ceiling (no duration given)" },
1723
+ { identifier: "video-analysis:mixed:60s", credits: 11 },
1724
+ { identifier: "video-analysis:mixed:180s", credits: 15 },
1725
+ { identifier: "video-analysis:mixed:360s", credits: 38 },
1726
+ { identifier: "video-analysis:mixed:600s", credits: 63, note: "10-min ceiling" }
1727
+ ]
1728
+ },
1729
+ // SMART — the accuracy tier, and the only one that does not rely on voting.
1730
+ // Every other tier runs several cheap passes and has a grader pick between them;
1731
+ // this one runs a single pass with reasoning and frame sampling turned all the
1732
+ // way up. Priced well above them because it genuinely costs more to run.
1733
+ "smart-video-analysis": {
1734
+ id: "smart-video-analysis",
1735
+ kind: "video",
1736
+ modes: ["video-analysis"],
1737
+ family: "Nodaro",
1738
+ label: "Video Analysis (Smart)",
1739
+ series: "Video Analysis",
1740
+ description: "Highest-accuracy analysis \u2014 a single deep pass that reads the footage frame by frame, finds its own shot boundaries, and identifies the cast by appearance. Best choice when the shot list will drive regeneration. Billed per duration bucket.",
1741
+ useCases: ["video-analysis", "shot-list", "premium", "most-accurate"],
1742
+ pricing: [
1743
+ { identifier: "video-analysis:smart", credits: 346, note: "10-min ceiling (no duration given)" },
1744
+ { identifier: "video-analysis:smart:60s", credits: 42 },
1745
+ { identifier: "video-analysis:smart:180s", credits: 94 },
1746
+ { identifier: "video-analysis:smart:360s", credits: 207 },
1747
+ { identifier: "video-analysis:smart:600s", credits: 346, note: "10-min ceiling" }
1727
1748
  ]
1728
1749
  }
1729
1750
  };
@@ -4371,6 +4392,17 @@ var LLM_MODELS = [
4371
4392
  // Google documents low/medium/high for 3.1 Pro — no `minimal` tier, so
4372
4393
  // this ladder is deliberately shorter than the flash models'.
4373
4394
  directReasoningEfforts: ["low", "medium", "high"],
4395
+ // NO `reasoningEfforts` (the proxied ladder) ON PURPOSE, not an omission.
4396
+ // That endpoint accepts `reasoning_effort: low | high` and already DEFAULTS
4397
+ // to "high", so leaving it unset gets its deepest setting and a ladder here
4398
+ // would unlock nothing. The two lanes are NOT equivalent at their maxima:
4399
+ // verified 2026-07-29 on identical input, the proxy's ceiling produces
4400
+ // roughly a quarter of the reasoning tokens that the direct lane's
4401
+ // `thinkingLevel: HIGH` does, and it does not expose Google's deeper tiers
4402
+ // at all. That difference is visible in fine-detail reading (small on-screen
4403
+ // text such as a name badge), which is exactly what video-analysis casts
4404
+ // identities from — so adding an entry here would silently move analysis to
4405
+ // the shallower lane. Don't. Full comparison lives with the analysis engine.
4374
4406
  // The ONE Gemini model routed direct-first. It is the premium/low-volume
4375
4407
  // tier (video-analysis `pro`, no LLM_FEATURE_DEFAULTS entry), so the ~4×
4376
4408
  // list-price premium lands on the smallest call volume — and it is where
@@ -4671,16 +4703,22 @@ function resolveLlmCreditId(feature, body) {
4671
4703
  );
4672
4704
  }
4673
4705
  var VIDEO_ANALYSIS_LLM_MODELS = LLM_MODELS.filter((m) => getLlmModalityCaps(m.id).video && getLlmModalityCaps(m.id).audio).map((m) => m.id);
4674
- var VIDEO_ANALYSIS_TIERS = { fast: "gemini-3.6-flash", pro: "gemini-3.1-pro" };
4706
+ var VIDEO_ANALYSIS_TIERS = { fast: "gemini-3-flash", pro: "gemini-3.1-pro" };
4675
4707
  var VIDEO_ANALYSIS_LEGACY_MODELS = {
4676
- // fast tier's backing model until 2026-07 (superseded by gemini-3.6-flash)
4677
- "gemini-3-flash": "fast"
4708
+ // Backed the fast tier from 2026-07 until 2026-07-29, when the economy tiers
4709
+ // moved to the cheaper lane and the older, cheaper flash. It is now the engine
4710
+ // behind the `smart` tier — but `smart` is a SENTINEL that never exposes a model
4711
+ // id, so as far as this map is concerned it no longer backs a selectable tier and
4712
+ // belongs here: stored raw `llmModel` values keep resolving and keep pricing
4713
+ // under their own credit family.
4714
+ "gemini-3.6-flash": "fast"
4678
4715
  };
4679
- var VIDEO_ANALYSIS_MIXED_TIERS = ["mixed", "mixed-fast"];
4680
- var VIDEO_ANALYSIS_TIER_ORDER = ["pro", "fast", "mixed", "mixed-fast"];
4716
+ var VIDEO_ANALYSIS_MIXED_TIERS = ["mixed", "mixed-fast", "smart"];
4717
+ var VIDEO_ANALYSIS_TIER_ORDER = ["smart", "pro", "fast", "mixed", "mixed-fast"];
4681
4718
  var DEFAULT_VIDEO_ANALYSIS_TIER = "pro";
4682
4719
  var DEFAULT_VIDEO_ANALYSIS_MODEL = VIDEO_ANALYSIS_TIERS[DEFAULT_VIDEO_ANALYSIS_TIER];
4683
4720
  var VIDEO_ANALYSIS_TIER_LABELS = {
4721
+ smart: "Smart",
4684
4722
  fast: "Fast",
4685
4723
  pro: "Pro",
4686
4724
  mixed: "Mixed",
@@ -12325,6 +12363,19 @@ var entitySlotSchema = z.object({
12325
12363
  * where this entity is clearly visible. Optional/additive: producers may
12326
12364
  * omit it; consumers use it as an identity reference for recreation. */
12327
12365
  refImageUrl: z.string().url().optional(),
12366
+ /**
12367
+ * Why `refImageUrl` is ABSENT, when the analyzer's vision pass actively
12368
+ * refused every candidate frame rather than merely failing to produce one.
12369
+ *
12370
+ * Present only alongside a missing `refImageUrl`, and only for a real refusal
12371
+ * — never for a technical failure, so its presence always carries meaning. The
12372
+ * important case reads like "the shots bound to this slot show someone else —
12373
+ * cast as X, but on screen: Y", which is the analyzer telling you the casting
12374
+ * description and the footage disagree. A consumer should treat that as a
12375
+ * reason to review the slot before spending on regeneration, since a wrong
12376
+ * identity propagates into every regenerated shot.
12377
+ */
12378
+ refRejectedReason: z.string().optional(),
12328
12379
  /** NON-default looks only; present only when at least one exists. */
12329
12380
  variations: z.array(slotVariationSchema).max(VIDEO_ANALYSIS_MAX_VARIATIONS).optional()
12330
12381
  });
@@ -12428,7 +12479,22 @@ var videoAnalysisResultSchema = z.object({
12428
12479
  slotId: z.string(),
12429
12480
  variationId: z.string(),
12430
12481
  label: z.string()
12431
- })).optional()
12482
+ })).optional(),
12483
+ /**
12484
+ * Analyzer diagnostics for THIS result — things the analysis noticed about
12485
+ * itself that a reader should know before spending on regeneration.
12486
+ *
12487
+ * Added because there was previously no channel for them at all: the merge
12488
+ * layer has always produced a warnings list and the auto-cast pass has always
12489
+ * had findings, and every one of them died in a `console.warn` inside a worker
12490
+ * the user cannot see. So a run could quietly drop a duplicated line, fold a
12491
+ * cast look, or conclude a character is not the person their own description
12492
+ * names, and the result looked indistinguishable from a clean one.
12493
+ *
12494
+ * Prose, not codes, and deliberately so — these are read by a human deciding
12495
+ * whether to re-run, not branched on. Absent when there is nothing to report.
12496
+ */
12497
+ warnings: z.array(z.string()).optional()
12432
12498
  });
12433
12499
  function deriveSlotRefs(visual) {
12434
12500
  const out = [];
@@ -12527,27 +12593,35 @@ var WINDOW_OVERLAP = 5;
12527
12593
  var VIDEO_ANALYSIS_WINDOW = { LEN: WINDOW_LEN, STRIDE: WINDOW_STRIDE, OVERLAP: WINDOW_OVERLAP, SINGLE_MAX: 180 };
12528
12594
  var VIDEO_ANALYSIS_BUCKET_CREDITS = {
12529
12595
  // Legacy fast-tier model (pre-2026-07) — kept for stored raw-id configs.
12530
- "video-analysis:gemini-3-flash:60s": 21,
12531
- "video-analysis:gemini-3-flash:180s": 24,
12532
- "video-analysis:gemini-3-flash:360s": 68,
12533
- "video-analysis:gemini-3-flash:600s": 112,
12596
+ "video-analysis:gemini-3-flash:60s": 3,
12597
+ "video-analysis:gemini-3-flash:180s": 4,
12598
+ "video-analysis:gemini-3-flash:360s": 9,
12599
+ "video-analysis:gemini-3-flash:600s": 14,
12534
12600
  // Current fast tier — regenerated from the private formula for its backing
12535
12601
  // model; higher than the legacy fast schedule but still ≤ pro per bucket.
12536
- "video-analysis:gemini-3.6-flash:60s": 54,
12537
- "video-analysis:gemini-3.6-flash:180s": 63,
12538
- "video-analysis:gemini-3.6-flash:360s": 175,
12539
- "video-analysis:gemini-3.6-flash:600s": 291,
12540
- "video-analysis:gemini-3.1-pro:60s": 84,
12541
- "video-analysis:gemini-3.1-pro:180s": 96,
12542
- "video-analysis:gemini-3.1-pro:360s": 269,
12543
- "video-analysis:gemini-3.1-pro:600s": 448,
12602
+ "video-analysis:gemini-3.6-flash:60s": 7,
12603
+ "video-analysis:gemini-3.6-flash:180s": 9,
12604
+ "video-analysis:gemini-3.6-flash:360s": 23,
12605
+ "video-analysis:gemini-3.6-flash:600s": 38,
12606
+ "video-analysis:gemini-3.1-pro:60s": 9,
12607
+ "video-analysis:gemini-3.1-pro:180s": 12,
12608
+ "video-analysis:gemini-3.1-pro:360s": 30,
12609
+ "video-analysis:gemini-3.1-pro:600s": 49,
12544
12610
  // Mixed tiers (`mixed` + `mixed-fast`) share ONE credit family — they are
12545
12611
  // variants of the same engine plan (plan internals live in the private
12546
12612
  // analysis plugin). Admin-tunable via model_pricing like every other row.
12547
- "video-analysis:mixed:60s": 137,
12548
- "video-analysis:mixed:180s": 158,
12549
- "video-analysis:mixed:360s": 443,
12550
- "video-analysis:mixed:600s": 739
12613
+ "video-analysis:mixed:60s": 11,
12614
+ "video-analysis:mixed:180s": 15,
12615
+ "video-analysis:mixed:360s": 38,
12616
+ "video-analysis:mixed:600s": 63,
12617
+ // SMART — the one native-transport plan: a single pass with reasoning and
12618
+ // frame sampling turned all the way up. Priced well above the economy tiers
12619
+ // because it genuinely costs more to run, and it is the only tier whose
12620
+ // accuracy was measured against a hand-counted edit list.
12621
+ "video-analysis:smart:60s": 42,
12622
+ "video-analysis:smart:180s": 94,
12623
+ "video-analysis:smart:360s": 207,
12624
+ "video-analysis:smart:600s": 346
12551
12625
  };
12552
12626
  function videoAnalysisCreditSegment(modelOrSentinel) {
12553
12627
  return modelOrSentinel === "mixed-fast" ? "mixed" : modelOrSentinel;