@koda-sl/baker-cli 0.393.0-dev.10b6da011 → 0.396.0-dev.88120240

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.
Files changed (28) hide show
  1. package/README.md +96 -32
  2. package/canvas/static-ad-composition/index.html +197 -0
  3. package/canvas/static-ad-composition/meta.json +53 -0
  4. package/dist/{chunk-AOVFDDVW.js → chunk-7OVZ6SOA.js} +3 -2
  5. package/dist/{chunk-AOVFDDVW.js.map → chunk-7OVZ6SOA.js.map} +1 -1
  6. package/dist/{chunk-NEZ3NAJV.js → chunk-EYN7G4KF.js} +4 -4
  7. package/dist/{chunk-T2UNK5BW.js → chunk-J76AGFBH.js} +3 -3
  8. package/dist/{chunk-FEJQJ64L.js → chunk-MNSF5SQ3.js} +131 -22
  9. package/dist/chunk-MNSF5SQ3.js.map +1 -0
  10. package/dist/{chunk-QIQ57EIA.js → chunk-TWSWUIDI.js} +2 -2
  11. package/dist/{chunk-OKE2QJSJ.js → chunk-Z7WHG6TA.js} +3 -3
  12. package/dist/cli.js +6866 -5263
  13. package/dist/cli.js.map +1 -1
  14. package/dist/{client-EQOSDYJL.js → client-YUWLIYLF.js} +4 -4
  15. package/dist/engine/index.js +3 -3
  16. package/dist/{env-ANKM47IJ.js → env-RQGMYIQN.js} +2 -2
  17. package/dist/{output-NR4EJQDV.js → output-POG3LVBW.js} +5 -5
  18. package/dist/{shared-SLCDVV45.js → shared-ZAEUTUNU.js} +6 -6
  19. package/package.json +2 -1
  20. package/dist/chunk-FEJQJ64L.js.map +0 -1
  21. /package/dist/{chunk-NEZ3NAJV.js.map → chunk-EYN7G4KF.js.map} +0 -0
  22. /package/dist/{chunk-T2UNK5BW.js.map → chunk-J76AGFBH.js.map} +0 -0
  23. /package/dist/{chunk-QIQ57EIA.js.map → chunk-TWSWUIDI.js.map} +0 -0
  24. /package/dist/{chunk-OKE2QJSJ.js.map → chunk-Z7WHG6TA.js.map} +0 -0
  25. /package/dist/{client-EQOSDYJL.js.map → client-YUWLIYLF.js.map} +0 -0
  26. /package/dist/{env-ANKM47IJ.js.map → env-RQGMYIQN.js.map} +0 -0
  27. /package/dist/{output-NR4EJQDV.js.map → output-POG3LVBW.js.map} +0 -0
  28. /package/dist/{shared-SLCDVV45.js.map → shared-ZAEUTUNU.js.map} +0 -0
@@ -2,13 +2,13 @@ import {
2
2
  handleConnectionError,
3
3
  needsConnectionFix,
4
4
  writeAdsJson
5
- } from "./chunk-T2UNK5BW.js";
5
+ } from "./chunk-J76AGFBH.js";
6
6
  import {
7
7
  ApiError
8
- } from "./chunk-OKE2QJSJ.js";
8
+ } from "./chunk-Z7WHG6TA.js";
9
9
  import {
10
10
  getEnv
11
- } from "./chunk-AOVFDDVW.js";
11
+ } from "./chunk-7OVZ6SOA.js";
12
12
 
13
13
  // src/commands/ads/meta/shared.ts
14
14
  var DAY_MS = 864e5;
@@ -133,4 +133,4 @@ export {
133
133
  resolveEffectiveStatus,
134
134
  statusFilterHints
135
135
  };
136
- //# sourceMappingURL=chunk-NEZ3NAJV.js.map
136
+ //# sourceMappingURL=chunk-EYN7G4KF.js.map
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  ApiError,
3
3
  apiGet
4
- } from "./chunk-OKE2QJSJ.js";
4
+ } from "./chunk-Z7WHG6TA.js";
5
5
  import {
6
6
  getEnv
7
- } from "./chunk-AOVFDDVW.js";
7
+ } from "./chunk-7OVZ6SOA.js";
8
8
 
9
9
  // src/error-handler.ts
10
10
  var REQUEST_CONNECTION_PLATFORM = {
@@ -298,4 +298,4 @@ export {
298
298
  writeAdsOutput,
299
299
  resolveCustomerId
300
300
  };
301
- //# sourceMappingURL=chunk-T2UNK5BW.js.map
301
+ //# sourceMappingURL=chunk-J76AGFBH.js.map
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  debugLogHttp,
3
3
  readBodyForLog
4
- } from "./chunk-QIQ57EIA.js";
4
+ } from "./chunk-TWSWUIDI.js";
5
5
  import {
6
6
  API_KEY_FORMAT_MESSAGE,
7
7
  DIRECT_ROUTE,
@@ -18,11 +18,11 @@ import {
18
18
  refuseNonPublicUrl,
19
19
  requireConnection,
20
20
  shouldEscalate
21
- } from "./chunk-AOVFDDVW.js";
21
+ } from "./chunk-7OVZ6SOA.js";
22
22
 
23
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/509a695c9237c6e3727f1f1f99169917f329e3ff3f7877be290b684e24bf153d/node_modules/safe-stable-stringify/index.js
23
+ // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js
24
24
  var require_safe_stable_stringify = __commonJS({
25
- "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/509a695c9237c6e3727f1f1f99169917f329e3ff3f7877be290b684e24bf153d/node_modules/safe-stable-stringify/index.js"(exports, module) {
25
+ "../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/index.js"(exports, module) {
26
26
  "use strict";
27
27
  var { hasOwnProperty } = Object.prototype;
28
28
  var stringify = configure2();
@@ -1123,7 +1123,7 @@ function resolveAdaptFormats(params) {
1123
1123
  return params.formats ?? [];
1124
1124
  }
1125
1125
 
1126
- // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/509a695c9237c6e3727f1f1f99169917f329e3ff3f7877be290b684e24bf153d/node_modules/safe-stable-stringify/esm/wrapper.js
1126
+ // ../../.pnpm-store/v10/links/@/safe-stable-stringify/2.5.0/810146e81bae4e3a061fe487864f2fde80c4b03b886877dc0f1fffbc6480b67e/node_modules/safe-stable-stringify/esm/wrapper.js
1127
1127
  var import__ = __toESM(require_safe_stable_stringify(), 1);
1128
1128
  var configure = import__.default.configure;
1129
1129
  var wrapper_default = import__.default;
@@ -1340,12 +1340,17 @@ var IMAGE_GENERATE_MODELS = [
1340
1340
  "openai/gpt-image-2.5-sunburst",
1341
1341
  "openai/gpt-image-2",
1342
1342
  "openai/gpt-5.4-image-2",
1343
- "google/gemini-3.1-flash-image-preview",
1343
+ "google/gemini-3.1-flash-image",
1344
1344
  "google/gemini-3.1-flash-lite-image",
1345
- "google/gemini-3-pro-image-preview",
1346
- "recraft/recraft-v4.1-pro-vector"
1345
+ "google/gemini-3-pro-image",
1346
+ "recraft/recraft-v4.1-pro-vector",
1347
+ // LEGACY — the preview ids the Gemini image models shipped under until they went GA
1348
+ // on 2026-06-18. Kept so every canvas written with them still validates and re-runs;
1349
+ // never pick them for new work.
1350
+ "google/gemini-3.1-flash-image-preview",
1351
+ "google/gemini-3-pro-image-preview"
1347
1352
  ];
1348
- var DEFAULT_IMAGE_GENERATE_MODEL = "google/gemini-3.1-flash-image-preview";
1353
+ var DEFAULT_IMAGE_GENERATE_MODEL = "google/gemini-3.1-flash-image";
1349
1354
  var VIDEO_GENERATE_MODELS = [
1350
1355
  "bytedance/seedance-2.0",
1351
1356
  "bytedance/seedance-2.5",
@@ -1536,6 +1541,32 @@ var MODEL_REGISTRY = {
1536
1541
  quality: { kind: "string", enum: OPENROUTER_IMAGE_QUALITY }
1537
1542
  }
1538
1543
  },
1544
+ // The GA Nano Banana ids (2026-06-18). Same surface as the preview entries they
1545
+ // replace — read off GET /api/v1/images/models/google/gemini-3.1-flash-image/endpoints
1546
+ // and .../gemini-3-pro-image/endpoints — so a canvas moves between them unchanged.
1547
+ "google/gemini-3.1-flash-image": {
1548
+ label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1549
+ inputs: [],
1550
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1551
+ required: ["prompt"],
1552
+ params: {
1553
+ prompt: { kind: "string" },
1554
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1555
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1556
+ }
1557
+ },
1558
+ "google/gemini-3-pro-image": {
1559
+ label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1560
+ inputs: [],
1561
+ optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1562
+ required: ["prompt"],
1563
+ params: {
1564
+ prompt: { kind: "string" },
1565
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1566
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1567
+ }
1568
+ },
1569
+ // LEGACY preview ids — see IMAGE_GENERATE_MODELS.
1539
1570
  "google/gemini-3.1-flash-image-preview": {
1540
1571
  label: "Google Gemini 3.1 Flash Image (Preview)",
1541
1572
  inputs: [],
@@ -1573,7 +1604,7 @@ var MODEL_REGISTRY = {
1573
1604
  }
1574
1605
  },
1575
1606
  "google/gemini-3-pro-image-preview": {
1576
- label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1607
+ label: "Google Gemini 3 Pro Image (Preview)",
1577
1608
  inputs: [],
1578
1609
  optional_inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES, max: GEMINI_IMAGE_MAX_REFERENCES }],
1579
1610
  required: ["prompt"],
@@ -1616,6 +1647,35 @@ var MODEL_REGISTRY = {
1616
1647
  // is baked into the backend handler — params here are semantic levers
1617
1648
  // only. Both models consume MULTIPLE reference images via the `references`
1618
1649
  // input slot (required: a sheet without source images is just image_generate).
1650
+ "google/gemini-3-pro-image": {
1651
+ label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1652
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1653
+ required: ["subject_description", "subject_type"],
1654
+ params: {
1655
+ subject_description: { kind: "string" },
1656
+ subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1657
+ views: { kind: "json" },
1658
+ style: { kind: "string" },
1659
+ prompt_override: { kind: "string" },
1660
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR },
1661
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1662
+ }
1663
+ },
1664
+ "google/gemini-3.1-flash-image": {
1665
+ label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1666
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1667
+ required: ["subject_description", "subject_type"],
1668
+ params: {
1669
+ subject_description: { kind: "string" },
1670
+ subject_type: { kind: "string", enum: ["character", "person", "product", "location"] },
1671
+ views: { kind: "json" },
1672
+ style: { kind: "string" },
1673
+ prompt_override: { kind: "string" },
1674
+ aspect_ratio: { kind: "string", enum: OPENROUTER_IMAGE_AR_EXTREME },
1675
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1676
+ }
1677
+ },
1678
+ // LEGACY preview ids, kept so existing canvases re-run.
1619
1679
  "google/gemini-3-pro-image-preview": {
1620
1680
  label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1621
1681
  inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
@@ -1654,6 +1714,29 @@ var MODEL_REGISTRY = {
1654
1714
  // registry can't express "one of" or gate array elements), so `formats`
1655
1715
  // is not listed as registry-required. The source creative is a required
1656
1716
  // input slot.
1717
+ "google/gemini-3-pro-image": {
1718
+ label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1719
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1720
+ required: [],
1721
+ params: {
1722
+ formats: { kind: "json" },
1723
+ platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1724
+ guidance: { kind: "string" },
1725
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE }
1726
+ }
1727
+ },
1728
+ "google/gemini-3.1-flash-image": {
1729
+ label: "Google Gemini 3.1 Flash Image (Nano Banana 2)",
1730
+ inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
1731
+ required: [],
1732
+ params: {
1733
+ formats: { kind: "json" },
1734
+ platform: { kind: "string", enum: AD_FORMAT_PLATFORMS },
1735
+ guidance: { kind: "string" },
1736
+ image_size: { kind: "string", enum: OPENROUTER_IMAGE_SIZE_EXTENDED }
1737
+ }
1738
+ },
1739
+ // LEGACY preview ids, kept so existing canvases re-run.
1657
1740
  "google/gemini-3-pro-image-preview": {
1658
1741
  label: "Google Gemini 3 Pro Image (Nano Banana Pro)",
1659
1742
  inputs: [{ kind: "image", mimes: OPENROUTER_IMAGE_MIMES }],
@@ -3133,7 +3216,7 @@ var LocalAssetStore = class {
3133
3216
  );
3134
3217
  const written = await readFile(tmp);
3135
3218
  const computed = sha256Hex(written);
3136
- if (computed !== args.sha256) {
3219
+ if (computed !== args.sha256 && !cdnReencodedImage(res, args.kind)) {
3137
3220
  throw new Error(`asset-store: sha mismatch for ${args.url} (got ${computed}, expected ${args.sha256})`);
3138
3221
  }
3139
3222
  await rename(tmp, dest);
@@ -3154,6 +3237,9 @@ var LocalAssetStore = class {
3154
3237
  });
3155
3238
  }
3156
3239
  };
3240
+ function cdnReencodedImage(res, kind) {
3241
+ return kind === "image" && res.headers.get("cf-polished") !== null;
3242
+ }
3157
3243
  function byteLimit(url, maxBytes) {
3158
3244
  let total = 0;
3159
3245
  return new Transform({
@@ -7692,7 +7778,7 @@ async function collectFiles(root, current) {
7692
7778
  import { readFile as readFile9 } from "fs/promises";
7693
7779
  import path12 from "path";
7694
7780
  import { z as z10 } from "zod";
7695
- var InputKind = z10.enum(["video", "image", "audio", "json"]);
7781
+ var InputKind = z10.enum(["video", "image", "audio", "json", "font"]);
7696
7782
  var InputSpec = z10.object({
7697
7783
  kind: InputKind,
7698
7784
  required: z10.boolean().optional().default(false),
@@ -7841,6 +7927,7 @@ function finalize(schema, dflt, required) {
7841
7927
  }
7842
7928
  function defaultFilenameForInput(key, kind) {
7843
7929
  if (kind === "video") return `${key}.mp4`;
7930
+ if (kind === "font") return `${key}.font`;
7844
7931
  if (kind === "audio") return `${key}.mp3`;
7845
7932
  if (kind === "json") return `${key}.json`;
7846
7933
  return `${key}.png`;
@@ -8335,7 +8422,7 @@ async function validateComposition(rawParams) {
8335
8422
  }
8336
8423
  return issues;
8337
8424
  }
8338
- async function validateCompositionParams(rawParams) {
8425
+ async function validateCompositionParams(rawParams, ownedKeys = NODE_OWNED_PARAM_KEYS) {
8339
8426
  const issues = [];
8340
8427
  if (!rawParams || typeof rawParams !== "object") return issues;
8341
8428
  const params = rawParams;
@@ -8357,7 +8444,7 @@ async function validateCompositionParams(rawParams) {
8357
8444
  }
8358
8445
  const dynamic = {};
8359
8446
  for (const [k, v] of Object.entries(params)) {
8360
- if (NODE_OWNED_PARAM_KEYS.has(k)) continue;
8447
+ if (ownedKeys.has(k)) continue;
8361
8448
  dynamic[k] = v;
8362
8449
  }
8363
8450
  for (const key of Object.keys(dynamic)) {
@@ -8567,7 +8654,9 @@ var hyperframeSnapshotNode = defineNode({
8567
8654
  params: HyperframeSnapshotParams,
8568
8655
  outputs: HyperframeSnapshotOutputs,
8569
8656
  cost: () => ({ credits: 0, seconds_estimate: 3 }),
8570
- validateExtra: ({ rawParams }) => validateCompositionParams(rawParams),
8657
+ // The snapshot's own keys (`wait_for`) are not composition params: checked against the
8658
+ // render node's key set, a canvas that waited on a selector failed validate every time.
8659
+ validateExtra: ({ rawParams }) => validateCompositionParams(rawParams, NODE_OWNED_PARAM_KEYS2),
8571
8660
  cacheKeyExtras: async ({ params }) => {
8572
8661
  const out = {};
8573
8662
  const composition = params.composition;
@@ -8923,7 +9012,16 @@ var imageGenerateNode = delegated({
8923
9012
 
8924
9013
  // src/engine/nodes/remote/imageAspectAdapt.ts
8925
9014
  import { z as z18 } from "zod";
8926
- var ASPECT_ADAPT_MODELS = ["google/gemini-3-pro-image-preview", "google/gemini-3.1-flash-image-preview"];
9015
+ var ASPECT_ADAPT_MODELS = [
9016
+ "google/gemini-3-pro-image",
9017
+ "google/gemini-3.1-flash-image",
9018
+ "google/gemini-3-pro-image-preview",
9019
+ "google/gemini-3.1-flash-image-preview"
9020
+ ];
9021
+ var PRO_ADAPT_MODELS = /* @__PURE__ */ new Set([
9022
+ "google/gemini-3-pro-image",
9023
+ "google/gemini-3-pro-image-preview"
9024
+ ]);
8927
9025
  var ASPECT_ADAPT_FORMATS = ["1:1", "2:3", "3:2", "3:4", "4:3", "4:5", "5:4", "9:16", "16:9", "21:9"];
8928
9026
  var ImageAspectAdaptParams = z18.object({
8929
9027
  model: z18.enum(ASPECT_ADAPT_MODELS),
@@ -8940,7 +9038,7 @@ var imageAspectAdaptNode = delegated({
8940
9038
  version: "1.0.0",
8941
9039
  category: "image",
8942
9040
  summary: "Adapt ONE creative into multiple aspect ratios (Meta: 9:16 stories, 1:1 feed, 4:5, 16:9\u2026) in a single step. Give it either an explicit `formats` list OR a `platform` preset (meta_feed, meta_feed_stories, meta_all, linkedin, google_demandgen, tiktok, youtube) that expands to that platform's canonical set. AI recomposes the layout per format \u2014 identical subject, text, logos, colors, and style; the scene is extended/restructured, never stretched or cropped. Formats that already match the source ratio pass through unchanged at zero cost. Outputs are ordered exactly as the resolved format list.",
8943
- when_to_use: "Use after a hero creative exists (image_generate, ingest, image_search) to fan it out to every placement format \u2014 wire the creative into `source` and set EITHER `formats` (exact ratios) OR `platform` (e.g. `meta_feed_stories`). Cost is estimated per format; formats matching the source ratio are free pass-throughs. Off-grid platform targets (e.g. Google 1.91:1) are not rendered here \u2014 crop them from the nearest ratio with `baker images crop`. Pick `google/gemini-3.1-flash-image-preview` (Nano Banana flash) while iterating, `google/gemini-3-pro-image-preview` (Nano Banana Pro) for final-quality adaptation.",
9041
+ when_to_use: "Use after a hero creative exists (image_generate, ingest, image_search) to fan it out to every placement format \u2014 wire the creative into `source` and set EITHER `formats` (exact ratios) OR `platform` (e.g. `meta_feed_stories`). Cost is estimated per format; formats matching the source ratio are free pass-throughs. Off-grid platform targets (e.g. Google 1.91:1) are not rendered here \u2014 crop them from the nearest ratio with `baker images crop`. Pick `google/gemini-3.1-flash-image` (Nano Banana 2) while iterating, `google/gemini-3-pro-image` (Nano Banana Pro) for final-quality adaptation.",
8944
9042
  inputs: z18.object({ source: ImageRef }).loose(),
8945
9043
  params: ImageAspectAdaptParams,
8946
9044
  outputs: z18.object({ images: z18.array(ImageRef).min(1) }).strict(),
@@ -8949,7 +9047,7 @@ var imageAspectAdaptNode = delegated({
8949
9047
  const p = params;
8950
9048
  const count = Math.max(1, resolveAdaptFormats(p ?? {}).length);
8951
9049
  return {
8952
- credits: count * (p?.model === "google/gemini-3-pro-image-preview" ? 20 : 5),
9050
+ credits: count * (PRO_ADAPT_MODELS.has(String(p?.model)) ? 20 : 5),
8953
9051
  seconds_estimate: 30 + 30 * count
8954
9052
  };
8955
9053
  }
@@ -9035,7 +9133,16 @@ var imageLayerizeNode = delegated({
9035
9133
 
9036
9134
  // src/engine/nodes/remote/imageReferenceSheet.ts
9037
9135
  import { z as z22 } from "zod";
9038
- var REFERENCE_SHEET_MODELS = ["google/gemini-3-pro-image-preview", "google/gemini-3.1-flash-image-preview"];
9136
+ var REFERENCE_SHEET_MODELS = [
9137
+ "google/gemini-3-pro-image",
9138
+ "google/gemini-3.1-flash-image",
9139
+ "google/gemini-3-pro-image-preview",
9140
+ "google/gemini-3.1-flash-image-preview"
9141
+ ];
9142
+ var PRO_SHEET_MODELS = /* @__PURE__ */ new Set([
9143
+ "google/gemini-3-pro-image",
9144
+ "google/gemini-3-pro-image-preview"
9145
+ ]);
9039
9146
  var ImageReferenceSheetParams = z22.object({
9040
9147
  model: z22.enum(REFERENCE_SHEET_MODELS),
9041
9148
  subject_description: z22.string().min(1),
@@ -9053,13 +9160,13 @@ var imageReferenceSheetNode = delegated({
9053
9160
  version: "1.0.0",
9054
9161
  category: "image",
9055
9162
  summary: "Fuse 1\u20136 images of a single subject (person, character, product, or location/set) into ONE multi-view reference sheet \u2014 a labeled grid in consistent style and lighting: a turnaround (FRONT / SIDE / BACK\u2026) for a person/character/product, or several camera angles of the same room (WIDE / REVERSE / DETAIL\u2026) for a location. Curated models: Gemini 3 Pro Image (best fusion + labels), Gemini 3.1 Flash Image (cheap iteration).",
9056
- when_to_use: "Use before image_generate / video_generate when a subject must stay consistent across many creatives \u2014 wire the `sheet` output into their `reference` input instead of re-describing the subject per prompt. `subject_description` should be the exact wording you reuse downstream. Pick `google/gemini-3-pro-image-preview` for final 6-view sheets at 2K+, `google/gemini-3.1-flash-image-preview` while iterating.",
9163
+ when_to_use: "Use before image_generate / video_generate when a subject must stay consistent across many creatives \u2014 wire the `sheet` output into their `reference` input instead of re-describing the subject per prompt. `subject_description` should be the exact wording you reuse downstream. Pick `google/gemini-3-pro-image` for final 6-view sheets at 2K+, `google/gemini-3.1-flash-image` while iterating.",
9057
9164
  inputs: z22.object({ references: z22.array(ImageRef).min(1).max(6) }).loose(),
9058
9165
  params: ImageReferenceSheetParams,
9059
9166
  outputs: z22.object({ sheet: ImageRef }).strict(),
9060
9167
  outputKinds: { sheet: "image" },
9061
9168
  cost: ({ params }) => ({
9062
- credits: params?.model === "google/gemini-3-pro-image-preview" ? 20 : 5,
9169
+ credits: PRO_SHEET_MODELS.has(String(params?.model)) ? 20 : 5,
9063
9170
  seconds_estimate: 30
9064
9171
  })
9065
9172
  });
@@ -9920,6 +10027,7 @@ export {
9920
10027
  runFailureCode,
9921
10028
  AD_FORMAT_PLATFORMS,
9922
10029
  platformFormats,
10030
+ resolveAdaptFormats,
9923
10031
  withoutCastName,
9924
10032
  frameRealismDirection,
9925
10033
  SEEDANCE_DURATIONS,
@@ -9975,6 +10083,7 @@ export {
9975
10083
  canonicalUrl,
9976
10084
  coercePathUrlToUrl,
9977
10085
  toModelSafeImage,
10086
+ loadCompositionMeta,
9978
10087
  catalogView,
9979
10088
  BackendClient2,
9980
10089
  Engine2 as Engine,
@@ -9986,4 +10095,4 @@ export {
9986
10095
  defaultRegistry,
9987
10096
  createEngineFromEnv
9988
10097
  };
9989
- //# sourceMappingURL=chunk-FEJQJ64L.js.map
10098
+ //# sourceMappingURL=chunk-MNSF5SQ3.js.map