@nodaro/shared 2.23.0 → 2.26.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 +225 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +80 -1
- package/dist/index.d.ts +80 -1
- package/dist/index.js +223 -58
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__tests__/llm-models.test.ts +122 -3
- package/src/__tests__/studio-transient.test.ts +205 -0
- package/src/__tests__/video-analysis-catalog-sync.test.ts +1 -1
- package/src/__tests__/video-analysis-pricing.test.ts +6 -6
- package/src/index.ts +7 -0
- package/src/llm-models.ts +138 -4
- package/src/model-catalog.ts +30 -30
- package/src/studio-transient.ts +124 -0
- package/src/video-analysis-pricing.ts +30 -23
package/dist/index.cjs
CHANGED
|
@@ -1983,11 +1983,11 @@ var VIDEO_MODELS = {
|
|
|
1983
1983
|
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.",
|
|
1984
1984
|
useCases: ["video-analysis", "shot-list", "fast"],
|
|
1985
1985
|
pricing: [
|
|
1986
|
-
{ identifier: "video-analysis:gemini-3-flash", credits:
|
|
1986
|
+
{ identifier: "video-analysis:gemini-3-flash", credits: 849, note: "10-min ceiling (no duration given)" },
|
|
1987
1987
|
{ identifier: "video-analysis:gemini-3-flash:60s", credits: 181 },
|
|
1988
|
-
{ identifier: "video-analysis:gemini-3-flash:180s", credits:
|
|
1989
|
-
{ identifier: "video-analysis:gemini-3-flash:360s", credits:
|
|
1990
|
-
{ identifier: "video-analysis:gemini-3-flash:600s", credits:
|
|
1988
|
+
{ identifier: "video-analysis:gemini-3-flash:180s", credits: 186 },
|
|
1989
|
+
{ identifier: "video-analysis:gemini-3-flash:360s", credits: 516 },
|
|
1990
|
+
{ identifier: "video-analysis:gemini-3-flash:600s", credits: 849, note: "10-min ceiling" }
|
|
1991
1991
|
]
|
|
1992
1992
|
},
|
|
1993
1993
|
"gemini-3.6-flash-video-analysis": {
|
|
@@ -2000,11 +2000,11 @@ var VIDEO_MODELS = {
|
|
|
2000
2000
|
description: "Analyze a video into a structured shot list (scenes, camera, audio) \u2014 fast, economy tier. Billed per duration bucket.",
|
|
2001
2001
|
useCases: ["video-analysis", "shot-list", "fast"],
|
|
2002
2002
|
pricing: [
|
|
2003
|
-
{ identifier: "video-analysis:gemini-3.6-flash", credits:
|
|
2004
|
-
{ identifier: "video-analysis:gemini-3.6-flash:60s", credits:
|
|
2003
|
+
{ identifier: "video-analysis:gemini-3.6-flash", credits: 995, note: "10-min ceiling (no duration given)" },
|
|
2004
|
+
{ identifier: "video-analysis:gemini-3.6-flash:60s", credits: 205 },
|
|
2005
2005
|
{ identifier: "video-analysis:gemini-3.6-flash:180s", credits: 219 },
|
|
2006
|
-
{ identifier: "video-analysis:gemini-3.6-flash:360s", credits:
|
|
2007
|
-
{ identifier: "video-analysis:gemini-3.6-flash:600s", credits:
|
|
2006
|
+
{ identifier: "video-analysis:gemini-3.6-flash:360s", credits: 603 },
|
|
2007
|
+
{ identifier: "video-analysis:gemini-3.6-flash:600s", credits: 995, note: "10-min ceiling" }
|
|
2008
2008
|
]
|
|
2009
2009
|
},
|
|
2010
2010
|
"gemini-3.1-pro-video-analysis": {
|
|
@@ -2017,11 +2017,11 @@ var VIDEO_MODELS = {
|
|
|
2017
2017
|
description: "Analyze a video into a structured shot list (scenes, camera, audio) \u2014 higher-fidelity, default tier. Billed per duration bucket.",
|
|
2018
2018
|
useCases: ["video-analysis", "shot-list", "cinematic"],
|
|
2019
2019
|
pricing: [
|
|
2020
|
-
{ identifier: "video-analysis:gemini-3.1-pro", credits:
|
|
2021
|
-
{ identifier: "video-analysis:gemini-3.1-pro:60s", credits:
|
|
2022
|
-
{ identifier: "video-analysis:gemini-3.1-pro:180s", credits:
|
|
2023
|
-
{ identifier: "video-analysis:gemini-3.1-pro:360s", credits:
|
|
2024
|
-
{ identifier: "video-analysis:gemini-3.1-pro:600s", credits:
|
|
2020
|
+
{ identifier: "video-analysis:gemini-3.1-pro", credits: 1059, note: "10-min ceiling (no duration given)" },
|
|
2021
|
+
{ identifier: "video-analysis:gemini-3.1-pro:60s", credits: 217 },
|
|
2022
|
+
{ identifier: "video-analysis:gemini-3.1-pro:180s", credits: 233 },
|
|
2023
|
+
{ identifier: "video-analysis:gemini-3.1-pro:360s", credits: 642 },
|
|
2024
|
+
{ identifier: "video-analysis:gemini-3.1-pro:600s", credits: 1059, note: "10-min ceiling" }
|
|
2025
2025
|
]
|
|
2026
2026
|
},
|
|
2027
2027
|
// Both mixed tiers are variants of the same advanced multi-engine analysis
|
|
@@ -2037,11 +2037,11 @@ var VIDEO_MODELS = {
|
|
|
2037
2037
|
description: "Our most advanced analysis tier \u2014 multiple analysis engines combined into one result for maximum completeness and accuracy. Billed per duration bucket.",
|
|
2038
2038
|
useCases: ["video-analysis", "shot-list", "premium", "most-complete"],
|
|
2039
2039
|
pricing: [
|
|
2040
|
-
{ identifier: "video-analysis:mixed", credits:
|
|
2040
|
+
{ identifier: "video-analysis:mixed", credits: 1181, note: "10-min ceiling (no duration given)" },
|
|
2041
2041
|
{ identifier: "video-analysis:mixed:60s", credits: 270 },
|
|
2042
|
-
{ identifier: "video-analysis:mixed:180s", credits:
|
|
2043
|
-
{ identifier: "video-analysis:mixed:360s", credits:
|
|
2044
|
-
{ identifier: "video-analysis:mixed:600s", credits:
|
|
2042
|
+
{ identifier: "video-analysis:mixed:180s", credits: 292 },
|
|
2043
|
+
{ identifier: "video-analysis:mixed:360s", credits: 731 },
|
|
2044
|
+
{ identifier: "video-analysis:mixed:600s", credits: 1181, note: "10-min ceiling" }
|
|
2045
2045
|
]
|
|
2046
2046
|
},
|
|
2047
2047
|
// SMART — the accuracy tier. Since the 2026-08-03 hybrid re-plan it is a
|
|
@@ -2059,11 +2059,11 @@ var VIDEO_MODELS = {
|
|
|
2059
2059
|
description: "Highest-accuracy analysis \u2014 a hybrid pass that blends a native skeleton read with several donor analysis rolls, then always refines the merged result to find shot boundaries and identify the cast by appearance. Best choice when the shot list will drive regeneration. Billed per duration bucket.",
|
|
2060
2060
|
useCases: ["video-analysis", "shot-list", "premium", "most-accurate"],
|
|
2061
2061
|
pricing: [
|
|
2062
|
-
{ identifier: "video-analysis:smart", credits:
|
|
2063
|
-
{ identifier: "video-analysis:smart:60s", credits:
|
|
2064
|
-
{ identifier: "video-analysis:smart:180s", credits:
|
|
2065
|
-
{ identifier: "video-analysis:smart:360s", credits:
|
|
2066
|
-
{ identifier: "video-analysis:smart:600s", credits:
|
|
2062
|
+
{ identifier: "video-analysis:smart", credits: 2081, note: "10-min ceiling (no duration given)" },
|
|
2063
|
+
{ identifier: "video-analysis:smart:60s", credits: 414 },
|
|
2064
|
+
{ identifier: "video-analysis:smart:180s", credits: 504 },
|
|
2065
|
+
{ identifier: "video-analysis:smart:360s", credits: 1270 },
|
|
2066
|
+
{ identifier: "video-analysis:smart:600s", credits: 2081, note: "10-min ceiling" }
|
|
2067
2067
|
]
|
|
2068
2068
|
},
|
|
2069
2069
|
// ── AI Audit (`video-audit`) ── a SEPARATE node from video-analysis (own
|
|
@@ -2087,11 +2087,11 @@ var VIDEO_MODELS = {
|
|
|
2087
2087
|
description: "Re-watches a clip against a wired analysis, applies video-verified corrections under guards, and returns a disclosed report of what changed. Billed per duration bucket.",
|
|
2088
2088
|
useCases: ["video-audit", "qa", "shot-list", "verification"],
|
|
2089
2089
|
pricing: [
|
|
2090
|
-
{ identifier: "video-audit", credits:
|
|
2090
|
+
{ identifier: "video-audit", credits: 1075, note: "10-min ceiling (no duration given)" },
|
|
2091
2091
|
{ identifier: "video-audit:60s", credits: 215 },
|
|
2092
|
-
{ identifier: "video-audit:180s", credits:
|
|
2093
|
-
{ identifier: "video-audit:360s", credits:
|
|
2094
|
-
{ identifier: "video-audit:600s", credits:
|
|
2092
|
+
{ identifier: "video-audit:180s", credits: 291 },
|
|
2093
|
+
{ identifier: "video-audit:360s", credits: 664 },
|
|
2094
|
+
{ identifier: "video-audit:600s", credits: 1075, note: "10-min ceiling" }
|
|
2095
2095
|
]
|
|
2096
2096
|
},
|
|
2097
2097
|
"video-audit-auto": {
|
|
@@ -2103,11 +2103,11 @@ var VIDEO_MODELS = {
|
|
|
2103
2103
|
description: "Same video-verified audit as AI Audit, but auto-runs a fast analysis first when none is wired in, then applies corrections under guards and returns a disclosed report. Billed per duration bucket.",
|
|
2104
2104
|
useCases: ["video-audit", "qa", "shot-list", "verification", "auto-analysis"],
|
|
2105
2105
|
pricing: [
|
|
2106
|
-
{ identifier: "video-audit:auto", credits:
|
|
2106
|
+
{ identifier: "video-audit:auto", credits: 1924, note: "10-min ceiling (no duration given)" },
|
|
2107
2107
|
{ identifier: "video-audit:auto:60s", credits: 396 },
|
|
2108
|
-
{ identifier: "video-audit:auto:180s", credits:
|
|
2109
|
-
{ identifier: "video-audit:auto:360s", credits:
|
|
2110
|
-
{ identifier: "video-audit:auto:600s", credits:
|
|
2108
|
+
{ identifier: "video-audit:auto:180s", credits: 477 },
|
|
2109
|
+
{ identifier: "video-audit:auto:360s", credits: 1180 },
|
|
2110
|
+
{ identifier: "video-audit:auto:600s", credits: 1924, note: "10-min ceiling" }
|
|
2111
2111
|
]
|
|
2112
2112
|
}
|
|
2113
2113
|
};
|
|
@@ -5426,7 +5426,9 @@ var LLM_MODELS = [
|
|
|
5426
5426
|
{
|
|
5427
5427
|
id: "gemini-3.6-flash",
|
|
5428
5428
|
displayName: "Gemini 3.6 Flash",
|
|
5429
|
-
|
|
5429
|
+
// Demoted 2026-09-06 alongside 3.7: superlatives belong to the CURRENT top
|
|
5430
|
+
// model of a family only, and 3.8 now holds that slot.
|
|
5431
|
+
desc: "Fast Gemini, sharper reasoning",
|
|
5430
5432
|
tier: "economy",
|
|
5431
5433
|
kieFormat: "chat-completions",
|
|
5432
5434
|
// KIE serves Gemini 3.6 Flash on the OpenAI-compatible dialect under this
|
|
@@ -5456,7 +5458,11 @@ var LLM_MODELS = [
|
|
|
5456
5458
|
{
|
|
5457
5459
|
id: "gemini-3.7-flash",
|
|
5458
5460
|
displayName: "Gemini 3.7 Flash",
|
|
5459
|
-
|
|
5461
|
+
// Demoted 2026-09-06 when 3.8 registered below: superlatives belong to the
|
|
5462
|
+
// CURRENT top model of a family only (same rule the Opus entries follow) —
|
|
5463
|
+
// `desc` renders in every picker, so leaving "Newest" on the older flash
|
|
5464
|
+
// steers the A/B's traffic backwards.
|
|
5465
|
+
desc: "Fast Gemini, agentic-tuned",
|
|
5460
5466
|
tier: "economy",
|
|
5461
5467
|
kieFormat: "chat-completions",
|
|
5462
5468
|
// KIE serves it on the OpenAI-compatible dialect under this slug
|
|
@@ -5477,6 +5483,46 @@ var LLM_MODELS = [
|
|
|
5477
5483
|
directReasoningEfforts: ["none", "low", "medium", "high"],
|
|
5478
5484
|
directGeminiModel: "gemini-3.7-flash"
|
|
5479
5485
|
},
|
|
5486
|
+
{
|
|
5487
|
+
id: "gemini-3.8-flash",
|
|
5488
|
+
displayName: "Gemini 3.8 Flash",
|
|
5489
|
+
// Inherits "Newest" from 3.7 (demoted above). Deliberately does NOT name
|
|
5490
|
+
// agentic video: that capability exists only on the direct Google lane
|
|
5491
|
+
// (Interactions API, not wired here) and the modality caps below withhold
|
|
5492
|
+
// video — a picker desc must not promise a lever this entry cannot expose.
|
|
5493
|
+
desc: "Newest fast Gemini, agentic-tuned",
|
|
5494
|
+
tier: "economy",
|
|
5495
|
+
kieFormat: "chat-completions",
|
|
5496
|
+
// KIE serves it on the OpenAI-compatible dialect under this slug
|
|
5497
|
+
// (docs.kie.ai/market/gemini/gemini-3-8-flash-openai.md) — identical
|
|
5498
|
+
// chat-completions path shape to gemini-3.7-flash / gemini-3.6-flash,
|
|
5499
|
+
// different slug prefix.
|
|
5500
|
+
kieSlugOrModel: "gemini-3-8-flash-openai",
|
|
5501
|
+
vendor: "google",
|
|
5502
|
+
// Live-verified 2026-09-06 on the KIE lane: `response_format: json_schema`
|
|
5503
|
+
// is ENFORCED (the reply came back exact-schema valid, credits_consumed
|
|
5504
|
+
// present) — not merely accepted-and-ignored.
|
|
5505
|
+
structuredOutputMode: "kie-response-format",
|
|
5506
|
+
supportsImages: true,
|
|
5507
|
+
// 16384 here, NOT the 8192 its 3.6 / 3.7 siblings sit at. Those two stay at
|
|
5508
|
+
// the KIE-safe intersection because nobody measured their endpoints past
|
|
5509
|
+
// it; 3.8's WAS measured — live-verified 2026-09-06, `max_tokens: 20000`
|
|
5510
|
+
// was honored for 14,892 completion tokens with finish_reason "stop" (no
|
|
5511
|
+
// truncation), so the KIE lane is not the binding constraint. 16384 keeps
|
|
5512
|
+
// it level with the rest of the registry's ceiling rather than at the cap.
|
|
5513
|
+
maxOutputTokens: 16384,
|
|
5514
|
+
// KIE's 3.8 endpoint enumerates reasoning_effort low | high (its doc enum),
|
|
5515
|
+
// and usage carries completion_tokens_details.reasoning_tokens — same
|
|
5516
|
+
// KIE-safe intersection as 3.6 / 3.7, because ONE field feeds both lanes
|
|
5517
|
+
// and this model is KIE-first.
|
|
5518
|
+
reasoningEfforts: ["low", "high"],
|
|
5519
|
+
// Google's own API accepts the full minimal→high ladder here (`none` maps
|
|
5520
|
+
// to `minimal`), same as 3.7. Advanced mode is what unlocks it.
|
|
5521
|
+
directReasoningEfforts: ["none", "low", "medium", "high"],
|
|
5522
|
+
// KIE-first (no `preferDirect`) — 3.7's posture exactly: the cheap lane
|
|
5523
|
+
// serves the A/B, direct is Advanced mode + the reliability fallback.
|
|
5524
|
+
directGeminiModel: "gemini-3.8-flash"
|
|
5525
|
+
},
|
|
5480
5526
|
{
|
|
5481
5527
|
id: "claude-haiku-4.5",
|
|
5482
5528
|
displayName: "Claude Haiku 4.5",
|
|
@@ -5573,7 +5619,9 @@ var LLM_MODELS = [
|
|
|
5573
5619
|
{
|
|
5574
5620
|
id: "gpt-5.4",
|
|
5575
5621
|
displayName: "GPT-5.4",
|
|
5576
|
-
|
|
5622
|
+
// Demoted 2026-09-06: two GPT generations have shipped above it, so
|
|
5623
|
+
// "Latest" steered the picker at the oldest premium GPT in the registry.
|
|
5624
|
+
desc: "Older GPT, premium quality",
|
|
5577
5625
|
tier: "premium",
|
|
5578
5626
|
kieFormat: "responses",
|
|
5579
5627
|
kieSlugOrModel: "gpt-5-4",
|
|
@@ -5628,7 +5676,11 @@ var LLM_MODELS = [
|
|
|
5628
5676
|
{
|
|
5629
5677
|
id: "gpt-5.6-sol",
|
|
5630
5678
|
displayName: "GPT-5.6 Sol",
|
|
5631
|
-
|
|
5679
|
+
// Demoted 2026-09-06 when gpt-6-astra registered below — "Flagship /
|
|
5680
|
+
// deepest" is the current top GPT's copy only. Worded to stay distinct
|
|
5681
|
+
// from gpt-5.5's "Previous flagship GPT, deep reasoning": all three read
|
|
5682
|
+
// premium on the invoice, so a stale superlative mis-steers silently.
|
|
5683
|
+
desc: "Previous flagship GPT-5.6, deep reasoning",
|
|
5632
5684
|
tier: "premium",
|
|
5633
5685
|
kieFormat: "responses",
|
|
5634
5686
|
kieSlugOrModel: "gpt-5-6-sol",
|
|
@@ -5639,6 +5691,61 @@ var LLM_MODELS = [
|
|
|
5639
5691
|
reasoningEfforts: ["none", "low", "medium", "high", "xhigh", "max"],
|
|
5640
5692
|
supportsTemperature: false
|
|
5641
5693
|
},
|
|
5694
|
+
{
|
|
5695
|
+
id: "gpt-6-astra",
|
|
5696
|
+
displayName: "GPT-6 Astra",
|
|
5697
|
+
desc: "Flagship GPT-6, deepest reasoning",
|
|
5698
|
+
tier: "premium",
|
|
5699
|
+
kieFormat: "responses",
|
|
5700
|
+
// KIE serves GPT-6 on the responses dialect under the OpenAI family path —
|
|
5701
|
+
// codex/v1/responses, which llm-client DERIVES from `vendor` (the same
|
|
5702
|
+
// derivation that keeps Grok on grok/v1/responses). So this field is the
|
|
5703
|
+
// body `model` only, not a path segment. Live-verified 2026-09-06 on the
|
|
5704
|
+
// streaming path (array `input`, SSE deltas), which is the ONLY path we
|
|
5705
|
+
// serve it on — see `kieCollapseStream` below. The non-stream reply does
|
|
5706
|
+
// carry `credits_consumed` (and cached_tokens/cache_write_tokens in usage)
|
|
5707
|
+
// on the ~1 call in 3 that returns one, but we no longer take that reply,
|
|
5708
|
+
// so provider cost here is the rate-table estimate.
|
|
5709
|
+
// KIE's codex/v1/responses injects its own Codex-agent `instructions`
|
|
5710
|
+
// prompt ABOVE the caller's `developer` message — observed in the
|
|
5711
|
+
// 2026-07-14 live probe of that endpoint, and unchanged for GPT-6. Budget
|
|
5712
|
+
// for it when a developer message has to dominate.
|
|
5713
|
+
kieSlugOrModel: "gpt-6-astra",
|
|
5714
|
+
vendor: "openai",
|
|
5715
|
+
// Live-verified 2026-09-06: `text.format: json_schema` is passed through
|
|
5716
|
+
// and ENFORCED — the server echoed `strict: true` and returned
|
|
5717
|
+
// schema-valid JSON.
|
|
5718
|
+
structuredOutputMode: "responses-json-schema",
|
|
5719
|
+
// text + image + file inputs per KIE's doc. No video/audio — see the
|
|
5720
|
+
// image-only LLM_MODALITY_CAPS row below.
|
|
5721
|
+
supportsImages: true,
|
|
5722
|
+
maxOutputTokens: 16384,
|
|
5723
|
+
// KIE's documented enum for this endpoint. No `none` on purpose: the
|
|
5724
|
+
// endpoint reasons unconditionally (see thinkingDefaultOn below), so a
|
|
5725
|
+
// "none" level would be a lie the wire silently overrides.
|
|
5726
|
+
reasoningEfforts: ["low", "medium", "high", "xhigh"],
|
|
5727
|
+
// Live-probed 2026-09-06: `temperature: 0.2` was sent and the request echo
|
|
5728
|
+
// stayed at 1.0 — silently IGNORED, so never send it. Same treatment as the
|
|
5729
|
+
// GPT-5.6 family and grok-4.6.
|
|
5730
|
+
supportsTemperature: false,
|
|
5731
|
+
// With NO reasoning param sent, the server echoed effort "medium" — it
|
|
5732
|
+
// reasons by default (2026-09-06), so reasoning tokens share `max_tokens`
|
|
5733
|
+
// on EVERY call, not just effort-bearing ones. Consumers must floor output
|
|
5734
|
+
// headroom off this flag or a premium answer truncates into a paid-for
|
|
5735
|
+
// empty reply.
|
|
5736
|
+
thinkingDefaultOn: true,
|
|
5737
|
+
// Measured 2026-09-06, 12 identical requests (developer + user message,
|
|
5738
|
+
// reasoning.effort low, text.format json_schema): `stream: false`
|
|
5739
|
+
// succeeded 2/6 in 4–5 s and 500'd 4/6 with
|
|
5740
|
+
// {"error":{"type":"server_error"}} after 34, 34, 35 and 64 s, while the
|
|
5741
|
+
// same body with `stream: true` succeeded 5/6 in the same 4–5 s. An
|
|
5742
|
+
// earlier non-stream probe timed out at 90 s with 0 bytes, and a
|
|
5743
|
+
// non-stream call WITHOUT a schema 500'd after 65 s — the schema is not
|
|
5744
|
+
// the trigger, the non-stream lane is. The very same endpoint serves
|
|
5745
|
+
// gpt-5.4/5.5/5.6 non-stream reliably (live-verified 2026-07-14), which is
|
|
5746
|
+
// why this is per-model and not a lane-wide flag.
|
|
5747
|
+
kieCollapseStream: true
|
|
5748
|
+
},
|
|
5642
5749
|
{
|
|
5643
5750
|
id: "grok-4.6",
|
|
5644
5751
|
displayName: "Grok 4.6",
|
|
@@ -5793,6 +5900,15 @@ var LLM_MODALITY_CAPS = {
|
|
|
5793
5900
|
// deferred while the smart-family A/B routes this model internally (#747).
|
|
5794
5901
|
// Flip these two flags ONLY together with that VA-side decision.
|
|
5795
5902
|
"gemini-3.7-flash": { image: true, video: false, audio: false },
|
|
5903
|
+
// gemini-3.8-flash is IMAGE-ONLY by DECISION, not omission — 3.7's rationale
|
|
5904
|
+
// exactly: full video+audio caps would auto-enroll it in
|
|
5905
|
+
// VIDEO_ANALYSIS_LLM_MODELS (derived below) and force a video-analysis tier +
|
|
5906
|
+
// pricing decision that stays deferred until the 3.8-vs-3.7 analysis A/B
|
|
5907
|
+
// concludes. Google's own 3.8 lane DOES understand video (agentic video, via
|
|
5908
|
+
// the Interactions API we don't wire) — which is precisely why withholding it
|
|
5909
|
+
// has to be a decision rather than a gap. Flip these two flags ONLY together
|
|
5910
|
+
// with that VA-side decision.
|
|
5911
|
+
"gemini-3.8-flash": { image: true, video: false, audio: false },
|
|
5796
5912
|
"gemini-3.1-pro": { image: true, video: true, audio: true },
|
|
5797
5913
|
"claude-haiku-4.5": { image: true, video: false, audio: false },
|
|
5798
5914
|
"claude-sonnet-4.6": { image: true, video: false, audio: false },
|
|
@@ -5803,6 +5919,8 @@ var LLM_MODALITY_CAPS = {
|
|
|
5803
5919
|
"gpt-5.6-luna": { image: true, video: false, audio: false },
|
|
5804
5920
|
"gpt-5.6-terra": { image: true, video: false, audio: false },
|
|
5805
5921
|
"gpt-5.6-sol": { image: true, video: false, audio: false },
|
|
5922
|
+
// KIE's GPT-6 doc lists text + image + file inputs only — no video, no audio.
|
|
5923
|
+
"gpt-6-astra": { image: true, video: false, audio: false },
|
|
5806
5924
|
"grok-4.6": { image: true, video: false, audio: false },
|
|
5807
5925
|
"claude-sonnet-5": { image: true, video: false, audio: false },
|
|
5808
5926
|
"claude-opus-4.8": { image: true, video: false, audio: false },
|
|
@@ -14289,36 +14407,36 @@ var VIDEO_ANALYSIS_WINDOW = { LEN: WINDOW_LEN, STRIDE: WINDOW_STRIDE, OVERLAP: W
|
|
|
14289
14407
|
var VIDEO_ANALYSIS_BUCKET_CREDITS = {
|
|
14290
14408
|
// Legacy fast-tier model (pre-2026-07) — kept for stored raw-id configs.
|
|
14291
14409
|
"video-analysis:gemini-3-flash:60s": 181,
|
|
14292
|
-
"video-analysis:gemini-3-flash:180s":
|
|
14293
|
-
"video-analysis:gemini-3-flash:360s":
|
|
14294
|
-
"video-analysis:gemini-3-flash:600s":
|
|
14410
|
+
"video-analysis:gemini-3-flash:180s": 186,
|
|
14411
|
+
"video-analysis:gemini-3-flash:360s": 516,
|
|
14412
|
+
"video-analysis:gemini-3-flash:600s": 849,
|
|
14295
14413
|
// Current fast tier — regenerated from the private formula for its backing
|
|
14296
14414
|
// model; higher than the legacy fast schedule but still ≤ pro per bucket.
|
|
14297
|
-
"video-analysis:gemini-3.6-flash:60s":
|
|
14415
|
+
"video-analysis:gemini-3.6-flash:60s": 205,
|
|
14298
14416
|
"video-analysis:gemini-3.6-flash:180s": 219,
|
|
14299
|
-
"video-analysis:gemini-3.6-flash:360s":
|
|
14300
|
-
"video-analysis:gemini-3.6-flash:600s":
|
|
14301
|
-
"video-analysis:gemini-3.1-pro:60s":
|
|
14302
|
-
"video-analysis:gemini-3.1-pro:180s":
|
|
14303
|
-
"video-analysis:gemini-3.1-pro:360s":
|
|
14304
|
-
"video-analysis:gemini-3.1-pro:600s":
|
|
14417
|
+
"video-analysis:gemini-3.6-flash:360s": 603,
|
|
14418
|
+
"video-analysis:gemini-3.6-flash:600s": 995,
|
|
14419
|
+
"video-analysis:gemini-3.1-pro:60s": 217,
|
|
14420
|
+
"video-analysis:gemini-3.1-pro:180s": 233,
|
|
14421
|
+
"video-analysis:gemini-3.1-pro:360s": 642,
|
|
14422
|
+
"video-analysis:gemini-3.1-pro:600s": 1059,
|
|
14305
14423
|
// Mixed tiers (`mixed` + `mixed-fast`) share ONE credit family — they are
|
|
14306
14424
|
// variants of the same engine plan (plan internals live in the private
|
|
14307
14425
|
// analysis plugin). Admin-tunable via model_pricing like every other row.
|
|
14308
14426
|
"video-analysis:mixed:60s": 270,
|
|
14309
|
-
"video-analysis:mixed:180s":
|
|
14310
|
-
"video-analysis:mixed:360s":
|
|
14311
|
-
"video-analysis:mixed:600s":
|
|
14427
|
+
"video-analysis:mixed:180s": 292,
|
|
14428
|
+
"video-analysis:mixed:360s": 731,
|
|
14429
|
+
"video-analysis:mixed:600s": 1181,
|
|
14312
14430
|
// SMART — the accuracy tier, and since the 2026-08-03 re-plan a multi-roll
|
|
14313
14431
|
// plan like the others, always refined (`selectionMode` does not apply
|
|
14314
14432
|
// here — smart always refines; it never offers a cheaper "choose" path).
|
|
14315
14433
|
// Priced above the economy tiers because it genuinely costs more to run;
|
|
14316
14434
|
// the only tier whose accuracy is validated against a hand-counted edit
|
|
14317
14435
|
// list, re-validated at the current plan before this schedule shipped.
|
|
14318
|
-
"video-analysis:smart:60s":
|
|
14319
|
-
"video-analysis:smart:180s":
|
|
14320
|
-
"video-analysis:smart:360s":
|
|
14321
|
-
"video-analysis:smart:600s":
|
|
14436
|
+
"video-analysis:smart:60s": 414,
|
|
14437
|
+
"video-analysis:smart:180s": 504,
|
|
14438
|
+
"video-analysis:smart:360s": 1270,
|
|
14439
|
+
"video-analysis:smart:600s": 2081
|
|
14322
14440
|
};
|
|
14323
14441
|
function videoAnalysisCreditSegment(modelOrSentinel) {
|
|
14324
14442
|
return modelOrSentinel === "mixed-fast" ? "mixed" : modelOrSentinel;
|
|
@@ -14340,13 +14458,13 @@ function videoAnalysisNumWindows(bucketSec) {
|
|
|
14340
14458
|
}
|
|
14341
14459
|
var VIDEO_AUDIT_BUCKET_CREDITS = {
|
|
14342
14460
|
"video-audit:60s": 215,
|
|
14343
|
-
"video-audit:180s":
|
|
14344
|
-
"video-audit:360s":
|
|
14345
|
-
"video-audit:600s":
|
|
14461
|
+
"video-audit:180s": 291,
|
|
14462
|
+
"video-audit:360s": 664,
|
|
14463
|
+
"video-audit:600s": 1075,
|
|
14346
14464
|
"video-audit:auto:60s": 396,
|
|
14347
|
-
"video-audit:auto:180s":
|
|
14348
|
-
"video-audit:auto:360s":
|
|
14349
|
-
"video-audit:auto:600s":
|
|
14465
|
+
"video-audit:auto:180s": 477,
|
|
14466
|
+
"video-audit:auto:360s": 1180,
|
|
14467
|
+
"video-audit:auto:600s": 1924
|
|
14350
14468
|
};
|
|
14351
14469
|
function buildVideoAuditCreditId(args) {
|
|
14352
14470
|
const { analysisProvided, durationSec } = args;
|
|
@@ -14561,6 +14679,53 @@ function entityScalarFields(kind) {
|
|
|
14561
14679
|
return [...ENTITY_SCALAR_FIELDS, ...ENTITY_KIND_SCALAR_FIELDS[kind]];
|
|
14562
14680
|
}
|
|
14563
14681
|
|
|
14682
|
+
// src/studio-transient.ts
|
|
14683
|
+
var STUDIO_TRANSIENT_KEYS = [
|
|
14684
|
+
"trash",
|
|
14685
|
+
"pendingStills",
|
|
14686
|
+
"pendingClips",
|
|
14687
|
+
// The two markers that genuinely DO live at this level: a soundtrack render
|
|
14688
|
+
// and a story-planning run in flight. Same rule as the per-shot pair — they
|
|
14689
|
+
// name jobs on the owner's account and nobody else can land them.
|
|
14690
|
+
"pendingMusic",
|
|
14691
|
+
"pendingDraft",
|
|
14692
|
+
"freecutDraftUrl"
|
|
14693
|
+
];
|
|
14694
|
+
var STUDIO_SHOT_TRANSIENT_KEYS = ["pendingClips", "pendingClip", "pendingStills"];
|
|
14695
|
+
function withoutKeys(source, drop) {
|
|
14696
|
+
const kept = {};
|
|
14697
|
+
for (const [key, value] of Object.entries(source)) {
|
|
14698
|
+
if (drop.includes(key)) continue;
|
|
14699
|
+
kept[key] = value;
|
|
14700
|
+
}
|
|
14701
|
+
return kept;
|
|
14702
|
+
}
|
|
14703
|
+
function stripShots(value) {
|
|
14704
|
+
if (!Array.isArray(value)) return value;
|
|
14705
|
+
let changed = false;
|
|
14706
|
+
const out = value.map((entry) => {
|
|
14707
|
+
if (!entry || typeof entry !== "object" || Array.isArray(entry)) return entry;
|
|
14708
|
+
const shot = entry;
|
|
14709
|
+
if (!STUDIO_SHOT_TRANSIENT_KEYS.some((key) => key in shot)) return entry;
|
|
14710
|
+
changed = true;
|
|
14711
|
+
return withoutKeys(shot, STUDIO_SHOT_TRANSIENT_KEYS);
|
|
14712
|
+
});
|
|
14713
|
+
return changed ? out : value;
|
|
14714
|
+
}
|
|
14715
|
+
function stripStudioTransientSettings(settings) {
|
|
14716
|
+
if (!settings || typeof settings !== "object") return settings;
|
|
14717
|
+
const studio = settings.studio;
|
|
14718
|
+
if (!studio || typeof studio !== "object" || Array.isArray(studio)) return settings;
|
|
14719
|
+
const source = studio;
|
|
14720
|
+
const kept = withoutKeys(source, STUDIO_TRANSIENT_KEYS);
|
|
14721
|
+
const shots = stripShots(source.shots);
|
|
14722
|
+
if (source.shots !== void 0) kept.shots = shots;
|
|
14723
|
+
if (Object.keys(kept).length === Object.keys(source).length && shots === source.shots) {
|
|
14724
|
+
return settings;
|
|
14725
|
+
}
|
|
14726
|
+
return { ...settings, studio: kept };
|
|
14727
|
+
}
|
|
14728
|
+
|
|
14564
14729
|
exports.ACCESS_LEVELS = ACCESS_LEVELS;
|
|
14565
14730
|
exports.ACTIVE_SCENE_HELPERS = ACTIVE_SCENE_HELPERS;
|
|
14566
14731
|
exports.ADVANCED_MODE_UNAVAILABLE_REASON = ADVANCED_MODE_UNAVAILABLE_REASON;
|
|
@@ -14924,6 +15089,8 @@ exports.STAGE_PATCH_SCHEMA = STAGE_PATCH_SCHEMA;
|
|
|
14924
15089
|
exports.STATIC_CAPTION_STYLES = STATIC_CAPTION_STYLES;
|
|
14925
15090
|
exports.STRUCTURAL_SECTIONS = STRUCTURAL_SECTIONS;
|
|
14926
15091
|
exports.STRUCTURED_VISION_MODELS = STRUCTURED_VISION_MODELS;
|
|
15092
|
+
exports.STUDIO_SHOT_TRANSIENT_KEYS = STUDIO_SHOT_TRANSIENT_KEYS;
|
|
15093
|
+
exports.STUDIO_TRANSIENT_KEYS = STUDIO_TRANSIENT_KEYS;
|
|
14927
15094
|
exports.SUBMISSION_STATUSES = SUBMISSION_STATUSES;
|
|
14928
15095
|
exports.SUNO_ADD_TRACK_MODELS = SUNO_ADD_TRACK_MODELS;
|
|
14929
15096
|
exports.SUNO_FIELD_HANDLE_FIELDS = SUNO_FIELD_HANDLE_FIELDS;
|
|
@@ -15372,6 +15539,7 @@ exports.spreadJsonArrayIfSingleton = spreadJsonArrayIfSingleton;
|
|
|
15372
15539
|
exports.stringifyPathResults = stringifyPathResults;
|
|
15373
15540
|
exports.stripDerivedAnalysisFields = stripDerivedAnalysisFields;
|
|
15374
15541
|
exports.stripExportContent = stripExportContent;
|
|
15542
|
+
exports.stripStudioTransientSettings = stripStudioTransientSettings;
|
|
15375
15543
|
exports.stripTransientRuntimeData = stripTransientRuntimeData;
|
|
15376
15544
|
exports.sunoCreditType = sunoCreditType;
|
|
15377
15545
|
exports.supportedDefaultDimensions = supportedDefaultDimensions;
|