@just-every/ensemble 0.2.257 → 0.2.258

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.
@@ -620,6 +620,24 @@ function isGemmaModel(model) {
620
620
  const modelId = model.startsWith('models/') ? model.slice('models/'.length) : model;
621
621
  return modelId.startsWith('gemma-4-');
622
622
  }
623
+ function isGemini25FlashImageModel(model) {
624
+ return model.includes('gemini-2.5-flash-image');
625
+ }
626
+ function isGemini31FlashImageModel(model) {
627
+ return model.includes('gemini-3.1-flash-image');
628
+ }
629
+ function isGemini31FlashLiteImageModel(model) {
630
+ return model.includes('gemini-3.1-flash-lite-image');
631
+ }
632
+ function isGemini3ProImageModel(model) {
633
+ return model.includes('gemini-3-pro-image');
634
+ }
635
+ function isGeminiStreamingImageModel(model) {
636
+ return (isGemini25FlashImageModel(model) ||
637
+ isGemini31FlashImageModel(model) ||
638
+ isGemini31FlashLiteImageModel(model) ||
639
+ isGemini3ProImageModel(model));
640
+ }
623
641
  function getSupportedThinkingLevels(model) {
624
642
  if (isGemmaModel(model)) {
625
643
  return new Set(['HIGH']);
@@ -627,17 +645,17 @@ function getSupportedThinkingLevels(model) {
627
645
  if (model.includes('gemini-3.1-pro-preview') || model.includes('gemini-3-pro-preview')) {
628
646
  return new Set(['LOW', 'MEDIUM', 'HIGH']);
629
647
  }
648
+ if (isGemini31FlashImageModel(model) || isGemini31FlashLiteImageModel(model)) {
649
+ return new Set(['MINIMAL', 'HIGH']);
650
+ }
651
+ if (isGemini3ProImageModel(model)) {
652
+ return new Set(['HIGH']);
653
+ }
630
654
  if (model.includes('gemini-3.5-flash') ||
631
655
  model.includes('gemini-3.1-flash-lite') ||
632
656
  model.includes('gemini-3-flash-preview')) {
633
657
  return new Set(['MINIMAL', 'LOW', 'MEDIUM', 'HIGH']);
634
658
  }
635
- if (model.includes('gemini-3.1-flash-image-preview')) {
636
- return new Set(['MINIMAL', 'HIGH']);
637
- }
638
- if (model.includes('gemini-3-pro-image-preview')) {
639
- return new Set(['HIGH']);
640
- }
641
659
  return null;
642
660
  }
643
661
  const GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS = {
@@ -1268,7 +1286,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1268
1286
  const requestId = `req_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
1269
1287
  let finalRequestId = requestId;
1270
1288
  try {
1271
- model = model || 'gemini-2.5-flash-image-preview';
1289
+ model = model || 'gemini-3.1-flash-image';
1272
1290
  const numberOfImages = opts?.n ?? 1;
1273
1291
  if (!Number.isInteger(numberOfImages) || numberOfImages < 1) {
1274
1292
  throw new Error('[Gemini] ImageGenerationOpts.n must be a positive integer.');
@@ -1282,11 +1300,17 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1282
1300
  }
1283
1301
  const explicitWebGrounding = opts?.grounding?.web_search;
1284
1302
  const explicitImageGrounding = opts?.grounding?.image_search;
1285
- const enableWebGrounding = explicitWebGrounding ?? hasGoogleWebSearch ?? false;
1286
- const isGemini31FlashImageModel = model.includes('gemini-3.1-flash-image-preview');
1287
- const enableImageGrounding = explicitImageGrounding === true && isGemini31FlashImageModel;
1288
- if (explicitImageGrounding && !isGemini31FlashImageModel) {
1289
- console.warn('[Gemini] Image Search grounding is only available for gemini-3.1-flash-image-preview. Ignoring image_search=true.');
1303
+ const isGemini31FlashImage = isGemini31FlashImageModel(model);
1304
+ const isGemini31FlashLiteImage = isGemini31FlashLiteImageModel(model);
1305
+ const isGemini3ProImage = isGemini3ProImageModel(model);
1306
+ const supportsWebGrounding = isGemini31FlashImage || isGemini3ProImage;
1307
+ const enableWebGrounding = supportsWebGrounding && (explicitWebGrounding ?? hasGoogleWebSearch ?? false);
1308
+ const enableImageGrounding = explicitImageGrounding === true && isGemini31FlashImage;
1309
+ if ((explicitWebGrounding || hasGoogleWebSearch) && !supportsWebGrounding) {
1310
+ console.warn('[Gemini] Google Search grounding is only available for gemini-3.1-flash-image and gemini-3-pro-image. Ignoring web_search=true.');
1311
+ }
1312
+ if (explicitImageGrounding && !isGemini31FlashImage) {
1313
+ console.warn('[Gemini] Image Search grounding is only available for gemini-3.1-flash-image. Ignoring image_search=true.');
1290
1314
  }
1291
1315
  const thinkingOptions = opts?.thinking;
1292
1316
  const hasThinkingOptionsObject = thinkingOptions !== null && typeof thinkingOptions === 'object' && !Array.isArray(thinkingOptions);
@@ -1296,11 +1320,12 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1296
1320
  ? thinkingOptions.level
1297
1321
  : undefined;
1298
1322
  const thinkingLevel = requestedThinkingLevel === 'high' ? 'High' : requestedThinkingLevel ? 'Minimal' : undefined;
1299
- if (requestedThinkingLevel && !isGemini31FlashImageModel) {
1300
- console.warn('[Gemini] thinking.level is currently supported for gemini-3.1-flash-image-preview only. Ignoring thinking level.');
1323
+ const supportsImageThinkingControls = isGemini31FlashImage || isGemini31FlashLiteImage;
1324
+ if (requestedThinkingLevel && !supportsImageThinkingControls) {
1325
+ console.warn('[Gemini] thinking.level is currently supported for gemini-3.1-flash-image and gemini-3.1-flash-lite-image only. Ignoring thinking level.');
1301
1326
  }
1302
- if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && !isGemini31FlashImageModel) {
1303
- console.warn('[Gemini] thinking.include_thoughts is currently supported for gemini-3.1-flash-image-preview only. Ignoring include_thoughts.');
1327
+ if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && !supportsImageThinkingControls) {
1328
+ console.warn('[Gemini] thinking.include_thoughts is currently supported for gemini-3.1-flash-image and gemini-3.1-flash-lite-image only. Ignoring include_thoughts.');
1304
1329
  }
1305
1330
  let aspectRatio = '1:1';
1306
1331
  if (opts?.size === 'landscape')
@@ -1308,9 +1333,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1308
1333
  else if (opts?.size === 'portrait')
1309
1334
  aspectRatio = '2:3';
1310
1335
  console.log(`[Gemini] Generating ${numberOfImages} image(s) with model ${model}, prompt: "${prompt.substring(0, 100)}${prompt.length > 100 ? '...' : ''}"`);
1311
- if (model.includes('gemini-2.5-flash-image-preview') ||
1312
- model.includes('gemini-3.1-flash-image-preview') ||
1313
- model.includes('gemini-3-pro-image-preview')) {
1336
+ if (isGeminiStreamingImageModel(model)) {
1314
1337
  let aggregateMetadata = { model };
1315
1338
  const sizeMap = {
1316
1339
  '1:1': { ar: '1:1' },
@@ -1341,7 +1364,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1341
1364
  '1024x1792': { ar: '9:16' },
1342
1365
  };
1343
1366
  const sm = opts?.size ? sizeMap[String(opts.size)] : undefined;
1344
- const gemini3ProDimensionPreset = model.includes('gemini-3-pro-image-preview')
1367
+ const gemini3ProDimensionPreset = isGemini3ProImage
1345
1368
  ? GEMINI_3_PRO_IMAGE_DIMENSION_PRESETS[String(opts?.size)]
1346
1369
  : undefined;
1347
1370
  const imageConfig = {};
@@ -1350,7 +1373,24 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1350
1373
  if (gemini3ProDimensionPreset?.ar)
1351
1374
  imageConfig.aspectRatio = gemini3ProDimensionPreset.ar;
1352
1375
  const qualityKey = typeof opts?.quality === 'string' ? opts.quality.toLowerCase() : '';
1353
- const imageSizeMap = isGemini31FlashImageModel
1376
+ if (isGemini31FlashLiteImage && imageConfig.aspectRatio) {
1377
+ const liteAspectRatios = new Set([
1378
+ '1:1',
1379
+ '2:3',
1380
+ '3:2',
1381
+ '3:4',
1382
+ '4:3',
1383
+ '4:5',
1384
+ '5:4',
1385
+ '9:16',
1386
+ '16:9',
1387
+ '21:9',
1388
+ ]);
1389
+ if (!liteAspectRatios.has(imageConfig.aspectRatio)) {
1390
+ throw new Error(`[Gemini] gemini-3.1-flash-lite-image does not support aspect ratio ${imageConfig.aspectRatio}.`);
1391
+ }
1392
+ }
1393
+ const imageSizeMap = isGemini31FlashImage
1354
1394
  ? {
1355
1395
  low: '0.5K',
1356
1396
  standard: '1K',
@@ -1358,28 +1398,44 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1358
1398
  hd: '4K',
1359
1399
  high: '4K',
1360
1400
  }
1361
- : {
1362
- low: '1K',
1363
- standard: '2K',
1364
- medium: '2K',
1365
- hd: '4K',
1366
- high: '4K',
1367
- };
1401
+ : isGemini31FlashLiteImage
1402
+ ? {
1403
+ low: '1K',
1404
+ standard: '1K',
1405
+ medium: '1K',
1406
+ hd: '1K',
1407
+ high: '1K',
1408
+ }
1409
+ : {
1410
+ low: '1K',
1411
+ standard: '2K',
1412
+ medium: '2K',
1413
+ hd: '4K',
1414
+ high: '4K',
1415
+ };
1368
1416
  let imageSize = imageSizeMap[qualityKey];
1369
1417
  if (gemini3ProDimensionPreset?.imageSize) {
1370
1418
  imageSize = gemini3ProDimensionPreset.imageSize;
1371
1419
  }
1372
- if (isGemini31FlashImageModel && opts?.size === '512x512') {
1420
+ if (isGemini31FlashImage && opts?.size === '512x512') {
1373
1421
  imageSize = '0.5K';
1374
1422
  }
1423
+ if (isGemini31FlashLiteImage) {
1424
+ imageSize = '1K';
1425
+ if (opts?.size === '512x512') {
1426
+ throw new Error('[Gemini] gemini-3.1-flash-lite-image only supports 1K image output.');
1427
+ }
1428
+ }
1375
1429
  const requestImageSize = imageSize === '0.5K' ? '512' : imageSize;
1376
1430
  if (requestImageSize)
1377
1431
  imageConfig.imageSize = requestImageSize;
1378
1432
  const thinkingConfig = {};
1379
- if (hasThinkingOptionsObject && 'include_thoughts' in thinkingOptions && isGemini31FlashImageModel) {
1433
+ if (hasThinkingOptionsObject &&
1434
+ 'include_thoughts' in thinkingOptions &&
1435
+ supportsImageThinkingControls) {
1380
1436
  thinkingConfig.includeThoughts = includeThoughts;
1381
1437
  }
1382
- if (thinkingLevel && isGemini31FlashImageModel) {
1438
+ if (thinkingLevel && supportsImageThinkingControls) {
1383
1439
  thinkingConfig.thinkingLevel = thinkingLevel;
1384
1440
  }
1385
1441
  const searchTypes = {};
@@ -1695,7 +1751,7 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1695
1751
  }
1696
1752
  }
1697
1753
  getImageCost(model, imageSize) {
1698
- if (model.includes('gemini-3.1-flash-image-preview')) {
1754
+ if (isGemini31FlashImageModel(model)) {
1699
1755
  if (imageSize === '4K')
1700
1756
  return 0.151;
1701
1757
  if (imageSize === '2K')
@@ -1704,10 +1760,13 @@ class GeminiProvider extends base_provider_js_1.BaseModelProvider {
1704
1760
  return 0.045;
1705
1761
  return 0.067;
1706
1762
  }
1707
- else if (model.includes('gemini-2.5-flash-image-preview')) {
1763
+ else if (isGemini31FlashLiteImageModel(model)) {
1764
+ return 0.0336;
1765
+ }
1766
+ else if (isGemini25FlashImageModel(model)) {
1708
1767
  return 0.039;
1709
1768
  }
1710
- else if (model.includes('gemini-3-pro-image-preview')) {
1769
+ else if (isGemini3ProImageModel(model)) {
1711
1770
  if (imageSize === '4K')
1712
1771
  return 0.24;
1713
1772
  return 0.134;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../model_providers/gemini.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAGH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EAInB,mBAAmB,EAEnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EAOd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA6NvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAmCD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AAqgBD,qBAAa,cAAe,SAAQ,iBAAiB;IACjD,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM;IAS3B,OAAO,KAAK,MAAM,GAejB;IASK,eAAe,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;YAmKlB,2BAA2B;IA+BnC,oBAAoB,CACvB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,SAAS,CAAC,EAAE,MAAM,GACnB,cAAc,CAAC,mBAAmB,CAAC;IAukBhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IA4hBpB,OAAO,CAAC,YAAY;IAmCd,WAAW,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;IAgMpD,OAAO,CAAC,gBAAgB;IA6DjB,mBAAmB,CACtB,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,iBAAiB,GACzB,cAAc,CAAC,kBAAkB,CAAC;IA6S/B,iBAAiB,CACnB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC;CAyB1B;AAyfD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../model_providers/gemini.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAGH,mBAAmB,EACnB,aAAa,EACb,eAAe,EACf,mBAAmB,EAInB,mBAAmB,EAEnB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,EAOd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AA6NvD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAO1D;AAmCD,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzD;AA8hBD,qBAAa,cAAe,SAAQ,iBAAiB;IACjD,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,MAAM,CAAC,CAAS;gBAEZ,MAAM,CAAC,EAAE,MAAM;IAS3B,OAAO,KAAK,MAAM,GAejB;IASK,eAAe,CACjB,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC;YAmKlB,2BAA2B;IA+BnC,oBAAoB,CACvB,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,SAAS,CAAC,EAAE,MAAM,GACnB,cAAc,CAAC,mBAAmB,CAAC;IAukBhC,WAAW,CACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC;IAwkBpB,OAAO,CAAC,YAAY;IAsCd,WAAW,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,eAAe,EACtB,IAAI,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;IAgMpD,OAAO,CAAC,gBAAgB;IA6DjB,mBAAmB,CACtB,KAAK,EAAE,wBAAwB,EAC/B,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,iBAAiB,GACzB,cAAc,CAAC,kBAAkB,CAAC;IA6S/B,iBAAiB,CACnB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,eAAe,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,WAAW,CAAC;CAyB1B;AAyfD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}