@shop-os/modelkit 0.2.18 → 0.2.20

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/catalog.cjs CHANGED
@@ -21,6 +21,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
21
21
  var catalog_entry_exports = {};
22
22
  __export(catalog_entry_exports, {
23
23
  ADAPTER_IDS: () => ADAPTER_IDS,
24
+ AUDIO_OUTPUTS: () => AUDIO_OUTPUTS,
24
25
  Catalog: () => Catalog,
25
26
  CatalogModelSchema: () => CatalogModelSchema,
26
27
  CatalogModelSchemaBase: () => CatalogModelSchemaBase,
@@ -30,6 +31,7 @@ __export(catalog_entry_exports, {
30
31
  MODELS: () => MODELS,
31
32
  ModelKitError: () => ModelKitError,
32
33
  OTHER_MODELS: () => OTHER_MODELS,
34
+ REFERENCE_SYNTAXES: () => REFERENCE_SYNTAXES,
33
35
  SURFACES: () => SURFACES2,
34
36
  SurfaceSchema: () => SurfaceSchema,
35
37
  TEXT_MODELS: () => TEXT_MODELS,
@@ -42,7 +44,9 @@ __export(catalog_entry_exports, {
42
44
  liveState: () => liveState,
43
45
  nearestAspectRatio: () => nearestAspectRatio,
44
46
  normalizeExposure: () => normalizeExposure,
47
+ outputAudio: () => outputAudio,
45
48
  primeCatalog: () => primeCatalog,
49
+ promptConventions: () => promptConventions,
46
50
  resetLiveCatalog: () => resetLiveCatalog,
47
51
  resolveAudioOptions: () => resolveAudioOptions,
48
52
  resolveImageOptions: () => resolveImageOptions,
@@ -217,7 +221,9 @@ function geminiImage(id, label, aliases, sizes, display, exposure, references) {
217
221
  const constraints = {
218
222
  aspectRatios: [...GEMINI_RATIOS],
219
223
  sizes,
220
- supports: ["safetySettings", "temperature"]
224
+ supports: ["safetySettings", "temperature"],
225
+ // google-image sends MediaRef.label as a text part beside each reference.
226
+ prompt: { referenceSyntax: "caption" }
221
227
  };
222
228
  if (references !== void 0) constraints.references = references;
223
229
  const model = {
@@ -259,7 +265,7 @@ var IMAGE_MODELS = [
259
265
  ["512", "1K", "2K", "4K"],
260
266
  {
261
267
  provider: "google",
262
- description: "Generate high-quality images at speed. Perfect for brainstorming, moodboards, concept testing, creative exploration, and large batch workflows.",
268
+ description: "Generate high-quality images at speed. Perfect for brainstorming, concept boards, concept testing, creative exploration, and large batch workflows.",
263
269
  logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/192485d2-a76a-4657-9c06-930b2c70badd_compressed.png"
264
270
  },
265
271
  ["cowork", "space_builder"],
@@ -504,6 +510,7 @@ var IMAGE_MODELS = [
504
510
  constraints: {
505
511
  aspectRatios: ["1:1", "2:3", "3:2", "16:9", "9:16", "4:3", "3:4", "4:5", "5:4", "21:9"],
506
512
  sizes: ["1K"],
513
+ references: { images: 8 },
507
514
  // flux-2-pro's job type always returns image/png; only the seed is forwarded.
508
515
  supports: ["seed"]
509
516
  },
@@ -1327,7 +1334,8 @@ var VIDEO_MODELS = [
1327
1334
  resolutions: ["720p", "1080p", "4k"],
1328
1335
  durations: [8],
1329
1336
  references: { images: 3 },
1330
- supports: ["lastFrame", "seed"]
1337
+ supports: ["lastFrame", "seed"],
1338
+ audio: "always"
1331
1339
  },
1332
1340
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
1333
1341
  usage: { ...VIDEO_USAGE, slug: "veo" },
@@ -1357,7 +1365,8 @@ var VIDEO_MODELS = [
1357
1365
  resolutions: ["720p", "1080p", "4k"],
1358
1366
  durations: [4, 6, 8],
1359
1367
  references: { images: 3 },
1360
- supports: ["lastFrame", "seed"]
1368
+ supports: ["lastFrame", "seed"],
1369
+ audio: "always"
1361
1370
  },
1362
1371
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
1363
1372
  usage: { ...VIDEO_USAGE },
@@ -1385,7 +1394,8 @@ var VIDEO_MODELS = [
1385
1394
  aspectRatios: [...OMNI_RATIOS],
1386
1395
  resolutions: ["720p", "1080p"],
1387
1396
  durations: [4, 6, 8],
1388
- supports: ["lastFrame", "seed"]
1397
+ supports: ["lastFrame", "seed"],
1398
+ audio: "always"
1389
1399
  },
1390
1400
  defaults: { durationSeconds: 8, resolution: "720p", aspectRatio: "16:9" },
1391
1401
  usage: { ...VIDEO_USAGE },
@@ -1419,7 +1429,10 @@ var VIDEO_MODELS = [
1419
1429
  durations: [3, 4, 5, 6, 7, 8, 9, 10],
1420
1430
  references: { images: 6, videos: 1, videoSeconds: { max: 10 } },
1421
1431
  sourceVideoSeconds: { max: 10 },
1422
- supports: []
1432
+ supports: [],
1433
+ // generateOmniVideo sends MediaRef.label as a text part beside each image.
1434
+ prompt: { referenceSyntax: "caption" },
1435
+ audio: "always"
1423
1436
  },
1424
1437
  defaults: {},
1425
1438
  usage: { ...VIDEO_USAGE, slug: "gemini_omni" },
@@ -1453,7 +1466,10 @@ var VIDEO_MODELS = [
1453
1466
  // chain by `previousInteractionId` (the API rejects the id together
1454
1467
  // with a video task, so those calls carry the prompt alone).
1455
1468
  supports: ["videoExtension"],
1456
- extension: { segmentSeconds: 10, maxTotalSeconds: 40 }
1469
+ extension: { segmentSeconds: 10, maxTotalSeconds: 40 },
1470
+ // generateOmniVideo sends MediaRef.label as a text part beside each image.
1471
+ prompt: { referenceSyntax: "caption" },
1472
+ audio: "always"
1457
1473
  },
1458
1474
  defaults: {},
1459
1475
  usage: { ...VIDEO_USAGE },
@@ -1489,7 +1505,8 @@ var VIDEO_MODELS = [
1489
1505
  },
1490
1506
  sourceVideoSeconds: { min: 2, max: 15, inReferenceTotal: true },
1491
1507
  ratioIgnoredWith: ["firstFrame", "sourceVideo"],
1492
- supports: ["generateAudio", "seed", "lastFrame", "watermark"]
1508
+ supports: ["generateAudio", "seed", "lastFrame", "watermark"],
1509
+ audio: "optional"
1493
1510
  },
1494
1511
  defaults: {
1495
1512
  durationSeconds: 5,
@@ -1528,7 +1545,8 @@ var VIDEO_MODELS = [
1528
1545
  },
1529
1546
  sourceVideoSeconds: { min: 2, max: 15, inReferenceTotal: true },
1530
1547
  ratioIgnoredWith: ["firstFrame", "sourceVideo"],
1531
- supports: ["generateAudio", "seed", "lastFrame", "watermark"]
1548
+ supports: ["generateAudio", "seed", "lastFrame", "watermark"],
1549
+ audio: "optional"
1532
1550
  },
1533
1551
  defaults: {
1534
1552
  durationSeconds: 5,
@@ -1568,7 +1586,8 @@ var VIDEO_MODELS = [
1568
1586
  },
1569
1587
  sourceVideoSeconds: { min: 2, max: 30, editMin: 4, inReferenceTotal: true },
1570
1588
  ratioIgnoredWith: ["firstFrame", "sourceVideo"],
1571
- supports: ["generateAudio", "seed", "lastFrame", "watermark", "taskType"]
1589
+ supports: ["generateAudio", "seed", "lastFrame", "watermark", "taskType"],
1590
+ audio: "optional"
1572
1591
  },
1573
1592
  defaults: {
1574
1593
  durationSeconds: 5,
@@ -1601,7 +1620,9 @@ var VIDEO_MODELS = [
1601
1620
  durations: { min: 1, max: 15 },
1602
1621
  durationPresets: [4, 6, 8, 10],
1603
1622
  references: { images: 5 },
1604
- supports: []
1623
+ supports: [],
1624
+ // xAI can switch sound off (generate_audio); xai-video.ts never sends it.
1625
+ audio: "always"
1605
1626
  },
1606
1627
  // No resolution default: xAI picks its own unless the caller asks.
1607
1628
  defaults: { durationSeconds: 8, aspectRatio: "16:9" },
@@ -1627,7 +1648,8 @@ var VIDEO_MODELS = [
1627
1648
  aspectRatios: [...KLING_RATIOS],
1628
1649
  durations: [5, 10],
1629
1650
  requires: ["firstFrame"],
1630
- supports: ["cfgScale", "negativePrompt", "lastFrame"]
1651
+ supports: ["cfgScale", "negativePrompt", "lastFrame"],
1652
+ audio: "never"
1631
1653
  },
1632
1654
  defaults: {
1633
1655
  durationSeconds: 5,
@@ -1658,7 +1680,9 @@ var VIDEO_MODELS = [
1658
1680
  aspectRatios: [...KLING_RATIOS],
1659
1681
  durations: { min: 3, max: 15 },
1660
1682
  requires: ["firstFrame"],
1661
- supports: ["cfgScale", "negativePrompt", "lastFrame"]
1683
+ supports: ["cfgScale", "negativePrompt", "lastFrame"],
1684
+ // Higgsfield has a `sound` switch (default on); KlingCreate doesn't send it.
1685
+ audio: "always"
1662
1686
  },
1663
1687
  defaults: {
1664
1688
  durationSeconds: 5,
@@ -1693,7 +1717,8 @@ var VIDEO_MODELS = [
1693
1717
  resolutions: ["720p", "1080p"],
1694
1718
  durations: { min: 3, max: 15 },
1695
1719
  references: { images: 7, imagesWithVideo: 4 },
1696
- supports: ["generateAudio", "lastFrame"]
1720
+ supports: ["generateAudio", "lastFrame"],
1721
+ audio: "optional"
1697
1722
  },
1698
1723
  defaults: { durationSeconds: 5, aspectRatio: "16:9", generateAudio: false, mode: "pro" },
1699
1724
  usage: { unit: "compute_seconds" },
@@ -1718,7 +1743,8 @@ var VIDEO_MODELS = [
1718
1743
  aspectRatios: [...H3_RATIOS],
1719
1744
  resolutions: ["480p", "768p", "2k", "4k"],
1720
1745
  durations: { min: 5, max: 15 },
1721
- supports: ["seed", "promptExpansion", "lastFrame", "safetyChecker"]
1746
+ supports: ["seed", "promptExpansion", "lastFrame", "safetyChecker"],
1747
+ audio: "always"
1722
1748
  },
1723
1749
  defaults: {
1724
1750
  durationSeconds: 5,
@@ -1748,7 +1774,8 @@ var VIDEO_MODELS = [
1748
1774
  aspectRatios: [...H3_RATIOS],
1749
1775
  resolutions: ["480p", "768p"],
1750
1776
  durations: { min: 5, max: 15 },
1751
- supports: ["seed", "promptExpansion", "lastFrame", "safetyChecker"]
1777
+ supports: ["seed", "promptExpansion", "lastFrame", "safetyChecker"],
1778
+ audio: "always"
1752
1779
  },
1753
1780
  defaults: {
1754
1781
  durationSeconds: 5,
@@ -1786,7 +1813,8 @@ var VIDEO_MODELS = [
1786
1813
  audioOnly: false,
1787
1814
  videoSeconds: { min: 2, max: 15, total: 15 }
1788
1815
  },
1789
- supports: ["seed", "promptExpansion", "safetyChecker"]
1816
+ supports: ["seed", "promptExpansion", "safetyChecker"],
1817
+ audio: "always"
1790
1818
  },
1791
1819
  defaults: {
1792
1820
  durationSeconds: 5,
@@ -1801,7 +1829,9 @@ var VIDEO_MODELS = [
1801
1829
  logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png",
1802
1830
  description: "MiniMax H3 reference-to-video mode guided by up to 9 reference images, 3 reference videos, and 3 audio clips; reference and image-to-video inputs cannot be mixed."
1803
1831
  },
1804
- capabilities: {}
1832
+ // fal's reference-to-video endpoint never reads a frame; the resolver must drop the
1833
+ // references instead of the adapter silently dropping the frame.
1834
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
1805
1835
  },
1806
1836
  {
1807
1837
  id: "minimax-h3-max-reference",
@@ -1824,7 +1854,8 @@ var VIDEO_MODELS = [
1824
1854
  audioOnly: false,
1825
1855
  videoSeconds: { min: 2, max: 15, total: 15 }
1826
1856
  },
1827
- supports: ["seed", "promptExpansion", "safetyChecker"]
1857
+ supports: ["seed", "promptExpansion", "safetyChecker"],
1858
+ audio: "always"
1828
1859
  },
1829
1860
  defaults: {
1830
1861
  durationSeconds: 5,
@@ -1839,7 +1870,9 @@ var VIDEO_MODELS = [
1839
1870
  logo: "https://d31vvfpk2ppdyq.cloudfront.net/assets/image/f4c2e906-28b7-4a4a-b491-df8fef7808ed.png",
1840
1871
  description: "MiniMax H3 Max reference-to-video on fal; conditions on reference images, videos, and audio. MiniMax's own docs do not list a reference mode for H3 Max."
1841
1872
  },
1842
- capabilities: {}
1873
+ // fal's reference-to-video endpoint never reads a frame; the resolver must drop the
1874
+ // references instead of the adapter silently dropping the frame.
1875
+ capabilities: { ...FRAMES_EXCLUDE_REFERENCES }
1843
1876
  },
1844
1877
  {
1845
1878
  // Duration 3-10s per trigger-workflows mapDuration; the endpoint takes no resolution.
@@ -1856,7 +1889,8 @@ var VIDEO_MODELS = [
1856
1889
  durations: { min: 3, max: 10 },
1857
1890
  requires: ["sourceVideo"],
1858
1891
  sourceVideoSeconds: { min: 3, max: 10.05 },
1859
- supports: []
1892
+ supports: [],
1893
+ audio: "never"
1860
1894
  },
1861
1895
  defaults: { durationSeconds: 5, aspectRatio: "16:9" },
1862
1896
  usage: { ...VIDEO_USAGE },
@@ -1880,7 +1914,8 @@ var VIDEO_MODELS = [
1880
1914
  constraints: {
1881
1915
  resolutions: ["768p"],
1882
1916
  durations: [6, 10],
1883
- supports: ["lastFrame"]
1917
+ supports: ["lastFrame"],
1918
+ audio: "never"
1884
1919
  },
1885
1920
  defaults: { durationSeconds: 6, resolution: "768p" },
1886
1921
  usage: { unit: "compute_seconds" },
@@ -1903,7 +1938,8 @@ var VIDEO_MODELS = [
1903
1938
  exposure: [],
1904
1939
  constraints: {
1905
1940
  requires: ["firstFrame"],
1906
- supports: ["seed", "lastFrame"]
1941
+ supports: ["seed", "lastFrame"],
1942
+ audio: "never"
1907
1943
  },
1908
1944
  defaults: {},
1909
1945
  usage: { ...VIDEO_USAGE },
@@ -1925,7 +1961,7 @@ var MODELS = [
1925
1961
  ];
1926
1962
 
1927
1963
  // src/catalog/schema.ts
1928
- var import_zod2 = require("zod");
1964
+ var import_zod3 = require("zod");
1929
1965
 
1930
1966
  // src/catalog/collisions.ts
1931
1967
  function collisionIssues(rows) {
@@ -1972,8 +2008,61 @@ function collisionIssues(rows) {
1972
2008
  return issues;
1973
2009
  }
1974
2010
 
1975
- // src/catalog/input-spec.ts
2011
+ // src/catalog/conventions.ts
1976
2012
  var import_zod = require("zod");
2013
+ var AudioOutputSchema = import_zod.z.enum(["always", "optional", "never"]);
2014
+ var ReferenceSyntaxSchema = import_zod.z.enum(["numbered", "caption", "descriptive"]);
2015
+ var MaxCharsSchema = import_zod.z.number().int().positive();
2016
+ var PromptConventionsSchema = import_zod.z.strictObject({
2017
+ referenceSyntax: ReferenceSyntaxSchema,
2018
+ maxChars: MaxCharsSchema.optional()
2019
+ });
2020
+ var AUDIO_OUTPUTS = AudioOutputSchema.options;
2021
+ var REFERENCE_SYNTAXES = ReferenceSyntaxSchema.options;
2022
+ var ConstraintsReadView = import_zod.z.looseObject({
2023
+ audio: AudioOutputSchema.optional().catch(void 0),
2024
+ prompt: import_zod.z.looseObject({
2025
+ referenceSyntax: ReferenceSyntaxSchema.catch("numbered"),
2026
+ maxChars: MaxCharsSchema.optional().catch(void 0)
2027
+ }).optional().catch(void 0)
2028
+ });
2029
+ var DEFAULT_CONVENTIONS = { referenceSyntax: "numbered" };
2030
+ function outputAudio(row) {
2031
+ const view = ConstraintsReadView.safeParse(row.constraints);
2032
+ return view.success ? view.data.audio : void 0;
2033
+ }
2034
+ function promptConventions(row) {
2035
+ const view = ConstraintsReadView.safeParse(row.constraints);
2036
+ const prompt = view.success ? view.data.prompt : void 0;
2037
+ if (prompt === void 0) return { ...DEFAULT_CONVENTIONS };
2038
+ const result = { referenceSyntax: prompt.referenceSyntax };
2039
+ if (prompt.maxChars !== void 0) result.maxChars = prompt.maxChars;
2040
+ return result;
2041
+ }
2042
+ var RawConventionsView = import_zod.z.looseObject({
2043
+ audio: import_zod.z.unknown().optional(),
2044
+ prompt: import_zod.z.unknown().optional()
2045
+ });
2046
+ function normaliseConventions(row) {
2047
+ const view = RawConventionsView.safeParse(row.constraints);
2048
+ if (!view.success) return { row, invalidKeys: [] };
2049
+ const { audio, prompt } = view.data;
2050
+ const badAudio = audio !== void 0 && !AudioOutputSchema.safeParse(audio).success;
2051
+ const badPrompt = prompt !== void 0 && !PromptConventionsSchema.safeParse(prompt).success;
2052
+ if (!badAudio && !badPrompt) return { row, invalidKeys: [] };
2053
+ const invalidKeys = [];
2054
+ if (badAudio) invalidKeys.push("constraints.audio");
2055
+ if (badPrompt) invalidKeys.push("constraints.prompt");
2056
+ const entries = Object.entries(row.constraints).flatMap(([key, value]) => {
2057
+ if (key === "audio" && badAudio) return [];
2058
+ if (key === "prompt" && badPrompt) return [[key, promptConventions(row)]];
2059
+ return [[key, value]];
2060
+ });
2061
+ return { row: { ...row, constraints: Object.fromEntries(entries) }, invalidKeys };
2062
+ }
2063
+
2064
+ // src/catalog/input-spec.ts
2065
+ var import_zod2 = require("zod");
1977
2066
  var VIDEO_INPUT_SPEC_KEYS = [
1978
2067
  "prompt",
1979
2068
  "durationSeconds",
@@ -2012,8 +2101,8 @@ var ALL_KEY_SET = /* @__PURE__ */ new Set([
2012
2101
  ...VIDEO_INPUT_SPEC_KEYS,
2013
2102
  ...AUDIO_INPUT_SPEC_KEYS
2014
2103
  ]);
2015
- var ProviderScalarSchema = import_zod.z.union([import_zod.z.string(), import_zod.z.number(), import_zod.z.boolean()]);
2016
- var FieldsSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.string().min(1)).superRefine((fields, ctx) => {
2104
+ var ProviderScalarSchema = import_zod2.z.union([import_zod2.z.string(), import_zod2.z.number(), import_zod2.z.boolean()]);
2105
+ var FieldsSchema = import_zod2.z.record(import_zod2.z.string(), import_zod2.z.string().min(1)).superRefine((fields, ctx) => {
2017
2106
  const keys = Object.keys(fields);
2018
2107
  if (keys.length === 0) {
2019
2108
  ctx.addIssue({
@@ -2031,7 +2120,7 @@ var FieldsSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.strin
2031
2120
  }
2032
2121
  }
2033
2122
  });
2034
- var ValuesSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.record(import_zod.z.string(), ProviderScalarSchema)).superRefine((values, ctx) => {
2123
+ var ValuesSchema = import_zod2.z.record(import_zod2.z.string(), import_zod2.z.record(import_zod2.z.string(), ProviderScalarSchema)).superRefine((values, ctx) => {
2035
2124
  for (const key of Object.keys(values)) {
2036
2125
  if (!ALL_KEY_SET.has(key)) {
2037
2126
  ctx.addIssue({
@@ -2041,8 +2130,8 @@ var ValuesSchema = import_zod.z.record(import_zod.z.string(), import_zod.z.recor
2041
2130
  }
2042
2131
  }
2043
2132
  });
2044
- var StaticSchema = import_zod.z.record(import_zod.z.string(), ProviderScalarSchema);
2045
- var InputSpecSchema = import_zod.z.strictObject({
2133
+ var StaticSchema = import_zod2.z.record(import_zod2.z.string(), ProviderScalarSchema);
2134
+ var InputSpecSchema = import_zod2.z.strictObject({
2046
2135
  fields: FieldsSchema,
2047
2136
  values: ValuesSchema.optional(),
2048
2137
  static: StaticSchema.optional()
@@ -2146,16 +2235,16 @@ var ADAPTER_IDS = [
2146
2235
  "higgsfield",
2147
2236
  "xai-video"
2148
2237
  ];
2149
- var ModelTypeSchema = import_zod2.z.enum(["text", "image", "video", "audio", "upscale", "bg-remove"]);
2150
- var LifecycleSchema = import_zod2.z.enum(["active", "deprecated", "retired"]);
2151
- var SurfaceSchema = import_zod2.z.enum(["cowork", "space_builder"]);
2238
+ var ModelTypeSchema = import_zod3.z.enum(["text", "image", "video", "audio", "upscale", "bg-remove"]);
2239
+ var LifecycleSchema = import_zod3.z.enum(["active", "deprecated", "retired"]);
2240
+ var SurfaceSchema = import_zod3.z.enum(["cowork", "space_builder"]);
2152
2241
  var SURFACES2 = SurfaceSchema.options;
2153
- var ExposureSchema = import_zod2.z.preprocess(
2242
+ var ExposureSchema = import_zod3.z.preprocess(
2154
2243
  normalizeExposure,
2155
- import_zod2.z.array(SurfaceSchema)
2244
+ import_zod3.z.array(SurfaceSchema)
2156
2245
  );
2157
- var AdapterSchema = import_zod2.z.enum(ADAPTER_IDS);
2158
- var AspectRatioSchema = import_zod2.z.enum([
2246
+ var AdapterSchema = import_zod3.z.enum(ADAPTER_IDS);
2247
+ var AspectRatioSchema = import_zod3.z.enum([
2159
2248
  "1:1",
2160
2249
  "16:9",
2161
2250
  "9:16",
@@ -2170,12 +2259,12 @@ var AspectRatioSchema = import_zod2.z.enum([
2170
2259
  "97:30",
2171
2260
  "adaptive"
2172
2261
  ]);
2173
- var ImageSizeSchema = import_zod2.z.enum(["512", "1K", "2K", "4K"]);
2174
- var VideoResolutionSchema = import_zod2.z.enum(["360p", "480p", "720p", "768p", "1080p", "2k", "4k"]);
2175
- var ImageQualitySchema = import_zod2.z.enum(["auto", "low", "medium", "high", "xhigh", "max"]);
2176
- var OutputFormatSchema = import_zod2.z.enum(["png", "jpeg", "webp"]);
2177
- var RequiredInputSchema = import_zod2.z.enum(["firstFrame", "sourceVideo", "references"]);
2178
- var SupportedOptionSchema = import_zod2.z.enum([
2262
+ var ImageSizeSchema = import_zod3.z.enum(["512", "1K", "2K", "4K"]);
2263
+ var VideoResolutionSchema = import_zod3.z.enum(["360p", "480p", "720p", "768p", "1080p", "2k", "4k"]);
2264
+ var ImageQualitySchema = import_zod3.z.enum(["auto", "low", "medium", "high", "xhigh", "max"]);
2265
+ var OutputFormatSchema = import_zod3.z.enum(["png", "jpeg", "webp"]);
2266
+ var RequiredInputSchema = import_zod3.z.enum(["firstFrame", "sourceVideo", "references"]);
2267
+ var SupportedOptionSchema = import_zod3.z.enum([
2179
2268
  "seed",
2180
2269
  "quality",
2181
2270
  "negativePrompt",
@@ -2195,142 +2284,146 @@ var SupportedOptionSchema = import_zod2.z.enum([
2195
2284
  "videoExtension",
2196
2285
  "instrumental"
2197
2286
  ]);
2198
- var UsageUnitSchema = import_zod2.z.enum([
2287
+ var UsageUnitSchema = import_zod3.z.enum([
2199
2288
  "tokens",
2200
2289
  "images",
2201
2290
  "seconds",
2202
2291
  "reported_cost_usd",
2203
2292
  "compute_seconds"
2204
2293
  ]);
2205
- var PricingKindSchema = import_zod2.z.enum(["token", "image_size", "video_per_second", "flat"]);
2206
- var ProviderOptionValueSchema = import_zod2.z.lazy(
2207
- () => import_zod2.z.union([
2208
- import_zod2.z.string(),
2209
- import_zod2.z.number(),
2210
- import_zod2.z.boolean(),
2211
- import_zod2.z.array(ProviderOptionValueSchema),
2212
- import_zod2.z.record(import_zod2.z.string(), ProviderOptionValueSchema)
2294
+ var PricingKindSchema = import_zod3.z.enum(["token", "image_size", "video_per_second", "flat"]);
2295
+ var ProviderOptionValueSchema = import_zod3.z.lazy(
2296
+ () => import_zod3.z.union([
2297
+ import_zod3.z.string(),
2298
+ import_zod3.z.number(),
2299
+ import_zod3.z.boolean(),
2300
+ import_zod3.z.array(ProviderOptionValueSchema),
2301
+ import_zod3.z.record(import_zod3.z.string(), ProviderOptionValueSchema)
2213
2302
  ])
2214
2303
  );
2215
- var ProviderOptionsSchema = import_zod2.z.record(import_zod2.z.string(), import_zod2.z.record(import_zod2.z.string(), ProviderOptionValueSchema));
2216
- var VideoSecondsLimitsSchema = import_zod2.z.looseObject({
2217
- min: import_zod2.z.number().optional(),
2218
- max: import_zod2.z.number().optional(),
2219
- total: import_zod2.z.number().optional(),
2220
- editMin: import_zod2.z.number().optional()
2304
+ var ProviderOptionsSchema = import_zod3.z.record(import_zod3.z.string(), import_zod3.z.record(import_zod3.z.string(), ProviderOptionValueSchema));
2305
+ var VideoSecondsLimitsSchema = import_zod3.z.looseObject({
2306
+ min: import_zod3.z.number().optional(),
2307
+ max: import_zod3.z.number().optional(),
2308
+ total: import_zod3.z.number().optional(),
2309
+ editMin: import_zod3.z.number().optional()
2221
2310
  });
2222
- var ReferenceLimitsSchema = import_zod2.z.looseObject({
2223
- images: import_zod2.z.number().optional(),
2224
- imagesWithVideo: import_zod2.z.number().optional(),
2225
- videos: import_zod2.z.number().optional(),
2226
- audios: import_zod2.z.number().optional(),
2227
- total: import_zod2.z.number().optional(),
2228
- audioOnly: import_zod2.z.boolean().optional(),
2311
+ var ReferenceLimitsSchema = import_zod3.z.looseObject({
2312
+ images: import_zod3.z.number().optional(),
2313
+ imagesWithVideo: import_zod3.z.number().optional(),
2314
+ videos: import_zod3.z.number().optional(),
2315
+ audios: import_zod3.z.number().optional(),
2316
+ total: import_zod3.z.number().optional(),
2317
+ audioOnly: import_zod3.z.boolean().optional(),
2229
2318
  videoSeconds: VideoSecondsLimitsSchema.optional()
2230
2319
  });
2231
- var ModelConstraintsSchema = import_zod2.z.looseObject({
2232
- aspectRatios: import_zod2.z.array(AspectRatioSchema).optional(),
2233
- sizes: import_zod2.z.array(ImageSizeSchema).optional(),
2234
- resolutions: import_zod2.z.array(VideoResolutionSchema).optional(),
2235
- durations: import_zod2.z.union([import_zod2.z.looseObject({ min: import_zod2.z.number(), max: import_zod2.z.number() }), import_zod2.z.array(import_zod2.z.number())]).optional(),
2236
- durationPresets: import_zod2.z.array(import_zod2.z.number()).optional(),
2237
- qualityOptions: import_zod2.z.array(import_zod2.z.string()).optional(),
2238
- exactSizes: import_zod2.z.record(import_zod2.z.string(), import_zod2.z.string()).optional(),
2320
+ var ModelConstraintsSchema = import_zod3.z.looseObject({
2321
+ aspectRatios: import_zod3.z.array(AspectRatioSchema).optional(),
2322
+ sizes: import_zod3.z.array(ImageSizeSchema).optional(),
2323
+ resolutions: import_zod3.z.array(VideoResolutionSchema).optional(),
2324
+ durations: import_zod3.z.union([import_zod3.z.looseObject({ min: import_zod3.z.number(), max: import_zod3.z.number() }), import_zod3.z.array(import_zod3.z.number())]).optional(),
2325
+ durationPresets: import_zod3.z.array(import_zod3.z.number()).optional(),
2326
+ qualityOptions: import_zod3.z.array(import_zod3.z.string()).optional(),
2327
+ exactSizes: import_zod3.z.record(import_zod3.z.string(), import_zod3.z.string()).optional(),
2239
2328
  references: ReferenceLimitsSchema.optional(),
2240
- requires: import_zod2.z.array(RequiredInputSchema).optional(),
2241
- supports: import_zod2.z.array(SupportedOptionSchema).optional(),
2242
- ratioIgnoredWith: import_zod2.z.array(import_zod2.z.enum(["firstFrame", "sourceVideo"])).optional(),
2243
- sourceVideoSeconds: VideoSecondsLimitsSchema.omit({ total: true }).extend({ inReferenceTotal: import_zod2.z.boolean().optional() }).optional(),
2244
- extension: import_zod2.z.looseObject({ segmentSeconds: import_zod2.z.number(), maxTotalSeconds: import_zod2.z.number() }).optional()
2329
+ requires: import_zod3.z.array(RequiredInputSchema).optional(),
2330
+ supports: import_zod3.z.array(SupportedOptionSchema).optional(),
2331
+ ratioIgnoredWith: import_zod3.z.array(import_zod3.z.enum(["firstFrame", "sourceVideo"])).optional(),
2332
+ sourceVideoSeconds: VideoSecondsLimitsSchema.omit({ total: true }).extend({ inReferenceTotal: import_zod3.z.boolean().optional() }).optional(),
2333
+ extension: import_zod3.z.looseObject({ segmentSeconds: import_zod3.z.number(), maxTotalSeconds: import_zod3.z.number() }).optional(),
2334
+ // Loose on purpose: the read path keeps a row whose value is invalid (the accessors in
2335
+ // conventions.ts read it as "not set"); CatalogModelSchema below rejects it on write.
2336
+ audio: import_zod3.z.unknown().optional(),
2337
+ prompt: import_zod3.z.unknown().optional()
2245
2338
  });
2246
- var MediaRefSchema = import_zod2.z.union([
2247
- import_zod2.z.looseObject({
2248
- url: import_zod2.z.string(),
2249
- label: import_zod2.z.string().optional(),
2250
- durationSeconds: import_zod2.z.number().optional()
2339
+ var MediaRefSchema = import_zod3.z.union([
2340
+ import_zod3.z.looseObject({
2341
+ url: import_zod3.z.string(),
2342
+ label: import_zod3.z.string().optional(),
2343
+ durationSeconds: import_zod3.z.number().optional()
2251
2344
  }),
2252
- import_zod2.z.looseObject({
2253
- bytes: import_zod2.z.instanceof(Uint8Array),
2254
- mime: import_zod2.z.string(),
2255
- label: import_zod2.z.string().optional(),
2256
- durationSeconds: import_zod2.z.number().optional()
2345
+ import_zod3.z.looseObject({
2346
+ bytes: import_zod3.z.instanceof(Uint8Array),
2347
+ mime: import_zod3.z.string(),
2348
+ label: import_zod3.z.string().optional(),
2349
+ durationSeconds: import_zod3.z.number().optional()
2257
2350
  })
2258
2351
  ]);
2259
- var ImageSafetySettingSchema = import_zod2.z.looseObject({ category: import_zod2.z.string(), threshold: import_zod2.z.string() });
2260
- var UpscaleOptionsSchema = import_zod2.z.looseObject({
2261
- enhanceModel: import_zod2.z.string().optional(),
2262
- subjectDetection: import_zod2.z.string().optional(),
2263
- faceEnhancement: import_zod2.z.boolean().optional(),
2264
- faceEnhancementCreativity: import_zod2.z.number().optional(),
2265
- faceEnhancementStrength: import_zod2.z.number().optional()
2352
+ var ImageSafetySettingSchema = import_zod3.z.looseObject({ category: import_zod3.z.string(), threshold: import_zod3.z.string() });
2353
+ var UpscaleOptionsSchema = import_zod3.z.looseObject({
2354
+ enhanceModel: import_zod3.z.string().optional(),
2355
+ subjectDetection: import_zod3.z.string().optional(),
2356
+ faceEnhancement: import_zod3.z.boolean().optional(),
2357
+ faceEnhancementCreativity: import_zod3.z.number().optional(),
2358
+ faceEnhancementStrength: import_zod3.z.number().optional()
2266
2359
  });
2267
- var DefaultsSchema = import_zod2.z.looseObject({
2268
- references: import_zod2.z.array(MediaRefSchema).optional(),
2360
+ var DefaultsSchema = import_zod3.z.looseObject({
2361
+ references: import_zod3.z.array(MediaRefSchema).optional(),
2269
2362
  aspectRatio: AspectRatioSchema.optional(),
2270
2363
  size: ImageSizeSchema.optional(),
2271
- exactSize: import_zod2.z.string().optional(),
2364
+ exactSize: import_zod3.z.string().optional(),
2272
2365
  quality: ImageQualitySchema.optional(),
2273
- seed: import_zod2.z.number().optional(),
2274
- count: import_zod2.z.number().optional(),
2366
+ seed: import_zod3.z.number().optional(),
2367
+ count: import_zod3.z.number().optional(),
2275
2368
  outputFormat: OutputFormatSchema.optional(),
2276
- scaleFactor: import_zod2.z.number().optional(),
2277
- safetySettings: import_zod2.z.array(ImageSafetySettingSchema).optional(),
2278
- temperature: import_zod2.z.number().optional(),
2369
+ scaleFactor: import_zod3.z.number().optional(),
2370
+ safetySettings: import_zod3.z.array(ImageSafetySettingSchema).optional(),
2371
+ temperature: import_zod3.z.number().optional(),
2279
2372
  upscale: UpscaleOptionsSchema.optional(),
2280
2373
  firstFrame: MediaRefSchema.optional(),
2281
2374
  lastFrame: MediaRefSchema.optional(),
2282
2375
  sourceVideo: MediaRefSchema.optional(),
2283
- referenceImages: import_zod2.z.array(MediaRefSchema).optional(),
2284
- referenceVideos: import_zod2.z.array(MediaRefSchema).optional(),
2285
- referenceAudios: import_zod2.z.array(MediaRefSchema).optional(),
2376
+ referenceImages: import_zod3.z.array(MediaRefSchema).optional(),
2377
+ referenceVideos: import_zod3.z.array(MediaRefSchema).optional(),
2378
+ referenceAudios: import_zod3.z.array(MediaRefSchema).optional(),
2286
2379
  resolution: VideoResolutionSchema.optional(),
2287
- durationSeconds: import_zod2.z.number().optional(),
2288
- generateAudio: import_zod2.z.boolean().optional(),
2289
- negativePrompt: import_zod2.z.string().optional(),
2290
- cfgScale: import_zod2.z.number().optional(),
2291
- promptExpansion: import_zod2.z.enum(["fast", "balanced", "quality"]).optional(),
2292
- watermark: import_zod2.z.boolean().optional(),
2293
- safetyChecker: import_zod2.z.boolean().optional(),
2294
- taskType: import_zod2.z.enum(["reference", "edit", "extend"]).optional(),
2295
- mode: import_zod2.z.enum(["standard", "pro"]).optional(),
2296
- instrumental: import_zod2.z.boolean().optional()
2380
+ durationSeconds: import_zod3.z.number().optional(),
2381
+ generateAudio: import_zod3.z.boolean().optional(),
2382
+ negativePrompt: import_zod3.z.string().optional(),
2383
+ cfgScale: import_zod3.z.number().optional(),
2384
+ promptExpansion: import_zod3.z.enum(["fast", "balanced", "quality"]).optional(),
2385
+ watermark: import_zod3.z.boolean().optional(),
2386
+ safetyChecker: import_zod3.z.boolean().optional(),
2387
+ taskType: import_zod3.z.enum(["reference", "edit", "extend"]).optional(),
2388
+ mode: import_zod3.z.enum(["standard", "pro"]).optional(),
2389
+ instrumental: import_zod3.z.boolean().optional()
2297
2390
  });
2298
- var CatalogDisplaySchema = import_zod2.z.looseObject({
2299
- provider: import_zod2.z.string(),
2300
- description: import_zod2.z.string(),
2301
- logo: import_zod2.z.string().optional(),
2302
- costTier: import_zod2.z.union([import_zod2.z.literal(1), import_zod2.z.literal(2), import_zod2.z.literal(3)]).optional(),
2303
- recommended: import_zod2.z.boolean().optional(),
2304
- sortOrder: import_zod2.z.number().optional(),
2305
- chat: import_zod2.z.looseObject({
2391
+ var CatalogDisplaySchema = import_zod3.z.looseObject({
2392
+ provider: import_zod3.z.string(),
2393
+ description: import_zod3.z.string(),
2394
+ logo: import_zod3.z.string().optional(),
2395
+ costTier: import_zod3.z.union([import_zod3.z.literal(1), import_zod3.z.literal(2), import_zod3.z.literal(3)]).optional(),
2396
+ recommended: import_zod3.z.boolean().optional(),
2397
+ sortOrder: import_zod3.z.number().optional(),
2398
+ chat: import_zod3.z.looseObject({
2306
2399
  providerOptions: ProviderOptionsSchema.optional(),
2307
- temperature: import_zod2.z.number().optional()
2400
+ temperature: import_zod3.z.number().optional()
2308
2401
  }).optional()
2309
2402
  });
2310
- var CatalogCapabilitiesSchema = import_zod2.z.looseObject({
2311
- acceptsSourceVideo: import_zod2.z.boolean().optional(),
2312
- framesExcludeReferences: import_zod2.z.boolean().optional(),
2313
- reasoning: import_zod2.z.boolean().optional(),
2314
- vision: import_zod2.z.boolean().optional(),
2315
- contextWindow: import_zod2.z.number().optional()
2403
+ var CatalogCapabilitiesSchema = import_zod3.z.looseObject({
2404
+ acceptsSourceVideo: import_zod3.z.boolean().optional(),
2405
+ framesExcludeReferences: import_zod3.z.boolean().optional(),
2406
+ reasoning: import_zod3.z.boolean().optional(),
2407
+ vision: import_zod3.z.boolean().optional(),
2408
+ contextWindow: import_zod3.z.number().optional()
2316
2409
  });
2317
- var CatalogModelSchemaBase = import_zod2.z.looseObject({
2318
- id: import_zod2.z.string().min(1),
2319
- aliases: import_zod2.z.array(import_zod2.z.string()).default([]),
2320
- label: import_zod2.z.string().min(1),
2410
+ var CatalogModelSchemaBase = import_zod3.z.looseObject({
2411
+ id: import_zod3.z.string().min(1),
2412
+ aliases: import_zod3.z.array(import_zod3.z.string()).default([]),
2413
+ label: import_zod3.z.string().min(1),
2321
2414
  type: ModelTypeSchema,
2322
2415
  adapter: AdapterSchema,
2323
- providerModelId: import_zod2.z.string().min(1),
2416
+ providerModelId: import_zod3.z.string().min(1),
2324
2417
  lifecycle: LifecycleSchema,
2325
- replacedBy: import_zod2.z.string().optional(),
2418
+ replacedBy: import_zod3.z.string().optional(),
2326
2419
  exposure: ExposureSchema,
2327
2420
  constraints: ModelConstraintsSchema,
2328
2421
  defaults: DefaultsSchema,
2329
2422
  providerOptions: ProviderOptionsSchema.optional(),
2330
- usage: import_zod2.z.looseObject({
2423
+ usage: import_zod3.z.looseObject({
2331
2424
  unit: UsageUnitSchema,
2332
- slug: import_zod2.z.string().optional(),
2333
- providerLabel: import_zod2.z.string().optional()
2425
+ slug: import_zod3.z.string().optional(),
2426
+ providerLabel: import_zod3.z.string().optional()
2334
2427
  }),
2335
2428
  pricingKind: PricingKindSchema,
2336
2429
  display: CatalogDisplaySchema.optional(),
@@ -2381,9 +2474,30 @@ var CatalogModelSchema = CatalogModelSchemaBase.superRefine(
2381
2474
  }
2382
2475
  }
2383
2476
  }
2477
+ const audio = row.constraints.audio;
2478
+ if (audio !== void 0 && !AudioOutputSchema.safeParse(audio).success) {
2479
+ ctx.addIssue({
2480
+ code: "custom",
2481
+ path: ["constraints", "audio"],
2482
+ message: 'audio must be "always", "optional" or "never"'
2483
+ });
2484
+ }
2485
+ const prompt = row.constraints.prompt;
2486
+ if (prompt !== void 0) {
2487
+ const parsed = PromptConventionsSchema.safeParse(prompt);
2488
+ if (!parsed.success) {
2489
+ for (const issue of parsed.error.issues) {
2490
+ ctx.addIssue({
2491
+ code: "custom",
2492
+ path: ["constraints", "prompt", ...issue.path.map(String)],
2493
+ message: issue.message
2494
+ });
2495
+ }
2496
+ }
2497
+ }
2384
2498
  }
2385
2499
  );
2386
- var CatalogSchema = import_zod2.z.array(CatalogModelSchemaBase).superRefine((rows, ctx) => {
2500
+ var CatalogSchema = import_zod3.z.array(CatalogModelSchemaBase.transform((row) => normaliseConventions(row).row)).superRefine((rows, ctx) => {
2387
2501
  for (const issue of collisionIssues(rows)) {
2388
2502
  ctx.addIssue({
2389
2503
  code: "custom",
@@ -2406,42 +2520,42 @@ var liveState = store[KEY] ??= {
2406
2520
  var liveCatalog = liveState.catalog;
2407
2521
 
2408
2522
  // src/json.ts
2409
- var import_zod3 = require("zod");
2410
- var JsonValueSchema = import_zod3.z.lazy(
2411
- () => import_zod3.z.union([
2412
- import_zod3.z.string(),
2413
- import_zod3.z.number(),
2414
- import_zod3.z.boolean(),
2415
- import_zod3.z.null(),
2416
- import_zod3.z.array(JsonValueSchema),
2417
- import_zod3.z.record(import_zod3.z.string(), JsonValueSchema)
2523
+ var import_zod4 = require("zod");
2524
+ var JsonValueSchema = import_zod4.z.lazy(
2525
+ () => import_zod4.z.union([
2526
+ import_zod4.z.string(),
2527
+ import_zod4.z.number(),
2528
+ import_zod4.z.boolean(),
2529
+ import_zod4.z.null(),
2530
+ import_zod4.z.array(JsonValueSchema),
2531
+ import_zod4.z.record(import_zod4.z.string(), JsonValueSchema)
2418
2532
  ])
2419
2533
  );
2420
- var JsonObjectSchema = import_zod3.z.record(import_zod3.z.string(), JsonValueSchema);
2421
- var thrownErrorSchema = import_zod3.z.object({
2422
- message: import_zod3.z.string().optional(),
2423
- status: import_zod3.z.number().optional(),
2424
- statusCode: import_zod3.z.number().optional(),
2425
- responseBody: import_zod3.z.string().optional()
2534
+ var JsonObjectSchema = import_zod4.z.record(import_zod4.z.string(), JsonValueSchema);
2535
+ var thrownErrorSchema = import_zod4.z.object({
2536
+ message: import_zod4.z.string().optional(),
2537
+ status: import_zod4.z.number().optional(),
2538
+ statusCode: import_zod4.z.number().optional(),
2539
+ responseBody: import_zod4.z.string().optional()
2426
2540
  });
2427
2541
 
2428
2542
  // src/catalog/load.ts
2429
- var import_zod4 = require("zod");
2543
+ var import_zod5 = require("zod");
2430
2544
  function rowCount() {
2431
2545
  return liveCatalog.list({ lifecycle: ["active", "deprecated", "retired"] }).length;
2432
2546
  }
2433
2547
  function authHeaders(auth) {
2434
2548
  return "bearer" in auth ? { Authorization: `Bearer ${auth.bearer}` } : { "x-api-key": auth.apiKey };
2435
2549
  }
2436
- var EnvelopeSchema = import_zod4.z.object({
2437
- rows: import_zod4.z.array(JsonValueSchema),
2438
- revision: import_zod4.z.string().optional()
2550
+ var EnvelopeSchema = import_zod5.z.object({
2551
+ rows: import_zod5.z.array(JsonValueSchema),
2552
+ revision: import_zod5.z.string().optional()
2439
2553
  });
2440
2554
  function dropReason(path, message) {
2441
2555
  return path.length === 0 ? message : `${path.map((part) => String(part)).join(".")} ${message}`;
2442
2556
  }
2443
2557
  function rowId(raw) {
2444
- const parsed = import_zod4.z.object({ id: import_zod4.z.string().min(1) }).loose().safeParse(raw);
2558
+ const parsed = import_zod5.z.object({ id: import_zod5.z.string().min(1) }).loose().safeParse(raw);
2445
2559
  if (!parsed.success) return "?";
2446
2560
  return parsed.data.id;
2447
2561
  }
@@ -2469,7 +2583,13 @@ function quarantine(rawRows, logger) {
2469
2583
  );
2470
2584
  }
2471
2585
  }
2472
- valid.push(row);
2586
+ const normalised = normaliseConventions(row);
2587
+ if (normalised.invalidKeys.length > 0) {
2588
+ logger.warn(
2589
+ `[modelkit] catalog row ${row.id} has an invalid ${normalised.invalidKeys.join(", ")}; read as not set`
2590
+ );
2591
+ }
2592
+ valid.push(normalised.row);
2473
2593
  }
2474
2594
  let kept = valid;
2475
2595
  for (; ; ) {