@howells/motif-sdk 5.1.1 → 5.2.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 CHANGED
@@ -707,7 +707,7 @@ function getOpenAiKeyFromEnv(input = process.env) {
707
707
  }
708
708
  //#endregion
709
709
  //#region src/models.ts
710
- const AA_IMAGE_LEADERBOARD_SNAPSHOT = "2026-08-23";
710
+ const AA_IMAGE_LEADERBOARD_SNAPSHOT = "2026-10-07";
711
711
  const AA_IMAGE_SOURCES = ["https://artificialanalysis.ai/image/leaderboard/text-to-image", "https://artificialanalysis.ai/image/leaderboard/editing"];
712
712
  const FAL_PRICING_CHECKED_AT = "2026-05-12";
713
713
  const FAL_PRICING_CHECKED_JUL_2026 = "2026-07-11";
@@ -715,6 +715,22 @@ const FAL_PRICING_CHECKED_AUG_2026 = "2026-08-23";
715
715
  const FAL_PRICING_CHECKED_SEP_2026 = "2026-09-16";
716
716
  const MODELS = {
717
717
  flare: {
718
+ benchmark: {
719
+ artificialAnalysis: {
720
+ editing: {
721
+ elo: 1163,
722
+ rank: 2
723
+ },
724
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
725
+ sourceUrls: AA_IMAGE_SOURCES,
726
+ textToImage: {
727
+ elo: 1191,
728
+ rank: 2
729
+ }
730
+ },
731
+ useCase: "Frontier generation and editing, evaluated at max quality"
732
+ },
733
+ defaultQuality: "max",
718
734
  customImageSize: {
719
735
  maxEdge: 3840,
720
736
  maxPixels: 8294400,
@@ -751,6 +767,22 @@ const MODELS = {
751
767
  useQueue: true
752
768
  },
753
769
  sunburst: {
770
+ benchmark: {
771
+ artificialAnalysis: {
772
+ editing: {
773
+ elo: 1183,
774
+ rank: 1
775
+ },
776
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
777
+ sourceUrls: AA_IMAGE_SOURCES,
778
+ textToImage: {
779
+ elo: 1198,
780
+ rank: 1
781
+ }
782
+ },
783
+ useCase: "Frontier generation and editing, evaluated at max quality"
784
+ },
785
+ defaultQuality: "max",
754
786
  customImageSize: {
755
787
  maxEdge: 3840,
756
788
  maxPixels: 8294400,
@@ -790,14 +822,14 @@ const MODELS = {
790
822
  benchmark: {
791
823
  artificialAnalysis: {
792
824
  editing: {
793
- elo: 1256,
794
- rank: 3
825
+ elo: 1125,
826
+ rank: 5
795
827
  },
796
828
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
797
829
  sourceUrls: AA_IMAGE_SOURCES,
798
830
  textToImage: {
799
- elo: 1369,
800
- rank: 1
831
+ elo: 1172,
832
+ rank: 3
801
833
  }
802
834
  },
803
835
  speed: {
@@ -810,7 +842,7 @@ const MODELS = {
810
842
  quality: "frontier",
811
843
  speed: "very_slow"
812
844
  },
813
- useCase: "Highest-ranked text-to-image quality and transparent PNGs"
845
+ useCase: "Established frontier generation and transparent PNGs"
814
846
  },
815
847
  customImageSize: {
816
848
  maxEdge: 3840,
@@ -861,14 +893,14 @@ const MODELS = {
861
893
  benchmark: {
862
894
  artificialAnalysis: {
863
895
  editing: {
864
- elo: 1250,
865
- rank: 5
896
+ elo: 1103,
897
+ rank: 12
866
898
  },
867
899
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
868
900
  sourceUrls: AA_IMAGE_SOURCES,
869
901
  textToImage: {
870
- elo: 1310,
871
- rank: 4
902
+ elo: 1107,
903
+ rank: 8
872
904
  }
873
905
  },
874
906
  speed: {
@@ -881,7 +913,7 @@ const MODELS = {
881
913
  quality: "frontier",
882
914
  speed: "slow"
883
915
  },
884
- useCase: "Best OpenAI edit quality with transparent PNG support"
916
+ useCase: "Established OpenAI editor with transparent PNG support"
885
917
  },
886
918
  editEndpoint: "fal-ai/gpt-image-1.5/edit",
887
919
  endpoint: "fal-ai/gpt-image-1.5",
@@ -914,18 +946,103 @@ const MODELS = {
914
946
  supportsSyncMode: true,
915
947
  type: "generation"
916
948
  },
917
- banana2: {
949
+ banana21: {
950
+ benchmark: { useCase: "Efficient generation and reference editing; Arena #5 generation / #6 editing, preliminary 2026-10-06" },
951
+ editEndpoint: "google/nano-banana-2.1/edit",
952
+ endpoint: "google/nano-banana-2.1",
953
+ maxReferenceImages: 14,
954
+ name: "Nano Banana 2.1",
955
+ pricePerImageUsd: null,
956
+ pricing: "Token-based: input $1.764/M, text/thinking output $8.823/M, image output $35.294/M; ~ $0.040 / $0.059 / $0.134 at 1K / 2K / 4K plus variable usage",
957
+ sizeMode: "aspect_ratio",
958
+ supportedAspects: [
959
+ "auto",
960
+ "21:9",
961
+ "16:9",
962
+ "3:2",
963
+ "4:3",
964
+ "5:4",
965
+ "1:1",
966
+ "4:5",
967
+ "3:4",
968
+ "2:3",
969
+ "9:16",
970
+ "4:1",
971
+ "1:4",
972
+ "8:1",
973
+ "1:8"
974
+ ],
975
+ supportedResolutions: [
976
+ "1K",
977
+ "2K",
978
+ "4K"
979
+ ],
980
+ supportsAspect: true,
981
+ supportsEdit: true,
982
+ supportsLimitGenerations: true,
983
+ supportsNumImages: true,
984
+ supportsOutputFormat: true,
985
+ supportsResolution: true,
986
+ supportsSafetyTolerance: true,
987
+ supportsSeed: true,
988
+ supportsSyncMode: true,
989
+ supportsThinkingLevel: true,
990
+ supportsWebSearch: true,
991
+ type: "generation"
992
+ },
993
+ "mai-image-2.5": {
918
994
  benchmark: {
919
995
  artificialAnalysis: {
920
996
  editing: {
921
- elo: 1249,
997
+ elo: 1114,
922
998
  rank: 7
923
999
  },
924
1000
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
925
1001
  sourceUrls: AA_IMAGE_SOURCES,
926
1002
  textToImage: {
927
- elo: 1320,
928
- rank: 3
1003
+ elo: 1104,
1004
+ rank: 10
1005
+ }
1006
+ },
1007
+ useCase: "Strong single-reference editing at a lower price than MAI 2.5 Pro"
1008
+ },
1009
+ editEndpoint: "microsoft/mai-image-2.5/edit",
1010
+ endpoint: "microsoft/mai-image-2.5",
1011
+ maxReferenceImages: 1,
1012
+ name: "MAI Image 2.5",
1013
+ pricePerImageUsd: null,
1014
+ pricing: "Token-based: text input $5/M, image input $8/M; ~$0.05 image output plus input",
1015
+ sizeMode: "aspect_ratio",
1016
+ supportedAspects: [
1017
+ "auto",
1018
+ "1:1",
1019
+ "4:3",
1020
+ "3:4",
1021
+ "16:9",
1022
+ "9:16",
1023
+ "3:2",
1024
+ "2:3"
1025
+ ],
1026
+ supportsAspect: true,
1027
+ supportsEdit: true,
1028
+ supportsNumImages: true,
1029
+ supportsOutputFormat: true,
1030
+ supportsResolution: false,
1031
+ supportsSyncMode: true,
1032
+ type: "generation"
1033
+ },
1034
+ banana2: {
1035
+ benchmark: {
1036
+ artificialAnalysis: {
1037
+ editing: {
1038
+ elo: 1110,
1039
+ rank: 9
1040
+ },
1041
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1042
+ sourceUrls: AA_IMAGE_SOURCES,
1043
+ textToImage: {
1044
+ elo: 1126,
1045
+ rank: 6
929
1046
  }
930
1047
  },
931
1048
  tiers: {
@@ -933,7 +1050,7 @@ const MODELS = {
933
1050
  quality: "frontier",
934
1051
  speed: "unknown"
935
1052
  },
936
- useCase: "Best balance of quality, edit support, web search, and cost"
1053
+ useCase: "Previous-generation Gemini workhorse; retains 0.5K output"
937
1054
  },
938
1055
  editEndpoint: "fal-ai/nano-banana-2/edit",
939
1056
  endpoint: "fal-ai/nano-banana-2",
@@ -969,14 +1086,14 @@ const MODELS = {
969
1086
  benchmark: {
970
1087
  artificialAnalysis: {
971
1088
  editing: {
972
- elo: 1245,
973
- rank: 9
1089
+ elo: 1101,
1090
+ rank: 13
974
1091
  },
975
1092
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
976
1093
  sourceUrls: AA_IMAGE_SOURCES,
977
1094
  textToImage: {
978
- elo: 1297,
979
- rank: 6
1095
+ elo: 1102,
1096
+ rank: 11
980
1097
  }
981
1098
  },
982
1099
  speed: {
@@ -1041,11 +1158,15 @@ const MODELS = {
1041
1158
  gemini: {
1042
1159
  benchmark: { artificialAnalysis: {
1043
1160
  editing: {
1044
- elo: 1180,
1045
- rank: 29
1161
+ elo: 987,
1162
+ rank: 50
1046
1163
  },
1047
1164
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1048
- sourceUrls: AA_IMAGE_SOURCES
1165
+ sourceUrls: AA_IMAGE_SOURCES,
1166
+ textToImage: {
1167
+ elo: 985,
1168
+ rank: 60
1169
+ }
1049
1170
  } },
1050
1171
  editEndpoint: "fal-ai/gemini-25-flash-image/edit",
1051
1172
  endpoint: "fal-ai/gemini-25-flash-image",
@@ -1086,18 +1207,6 @@ const MODELS = {
1086
1207
  type: "generation"
1087
1208
  },
1088
1209
  gemini3: {
1089
- benchmark: { artificialAnalysis: {
1090
- editing: {
1091
- elo: 1245,
1092
- rank: 9
1093
- },
1094
- snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1095
- sourceUrls: AA_IMAGE_SOURCES,
1096
- textToImage: {
1097
- elo: 1297,
1098
- rank: 6
1099
- }
1100
- } },
1101
1210
  editEndpoint: "fal-ai/gemini-3-pro-image-preview/edit",
1102
1211
  endpoint: "fal-ai/gemini-3-pro-image-preview",
1103
1212
  falPricing: {
@@ -1147,14 +1256,14 @@ const MODELS = {
1147
1256
  benchmark: {
1148
1257
  artificialAnalysis: {
1149
1258
  editing: {
1150
- elo: 1185,
1151
- rank: 28
1259
+ elo: 1015,
1260
+ rank: 36
1152
1261
  },
1153
1262
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1154
1263
  sourceUrls: AA_IMAGE_SOURCES,
1155
1264
  textToImage: {
1156
- elo: 1226,
1157
- rank: 16
1265
+ elo: 1030,
1266
+ rank: 21
1158
1267
  }
1159
1268
  },
1160
1269
  speed: {
@@ -1167,7 +1276,7 @@ const MODELS = {
1167
1276
  quality: "best",
1168
1277
  speed: "balanced"
1169
1278
  },
1170
- useCase: "High-ranked budget generation and large multi-reference edits"
1279
+ useCase: "Legacy budget generation and large multi-reference edits"
1171
1280
  },
1172
1281
  customImageSize: {
1173
1282
  maxPixels: 16777216,
@@ -1201,14 +1310,14 @@ const MODELS = {
1201
1310
  benchmark: {
1202
1311
  artificialAnalysis: {
1203
1312
  editing: {
1204
- elo: 1186,
1205
- rank: 26
1313
+ elo: 1037,
1314
+ rank: 32
1206
1315
  },
1207
1316
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1208
1317
  sourceUrls: AA_IMAGE_SOURCES,
1209
1318
  textToImage: {
1210
- elo: 1203,
1211
- rank: 32
1319
+ elo: 1022,
1320
+ rank: 26
1212
1321
  }
1213
1322
  },
1214
1323
  speed: {
@@ -1254,14 +1363,14 @@ const MODELS = {
1254
1363
  seedream5: {
1255
1364
  benchmark: { artificialAnalysis: {
1256
1365
  editing: {
1257
- elo: 1248,
1258
- rank: 8
1366
+ elo: 1108,
1367
+ rank: 11
1259
1368
  },
1260
1369
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1261
1370
  sourceUrls: AA_IMAGE_SOURCES,
1262
1371
  textToImage: {
1263
- elo: 1279,
1264
- rank: 10
1372
+ elo: 1081,
1373
+ rank: 15
1265
1374
  }
1266
1375
  } },
1267
1376
  customImageSize: {
@@ -1296,11 +1405,15 @@ const MODELS = {
1296
1405
  "seedream5-lite": {
1297
1406
  benchmark: { artificialAnalysis: {
1298
1407
  editing: {
1299
- elo: 1169,
1300
- rank: 32
1408
+ elo: 1057,
1409
+ rank: 24
1301
1410
  },
1302
1411
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1303
- sourceUrls: AA_IMAGE_SOURCES
1412
+ sourceUrls: AA_IMAGE_SOURCES,
1413
+ textToImage: {
1414
+ elo: 1012,
1415
+ rank: 36
1416
+ }
1304
1417
  } },
1305
1418
  customImageSize: {
1306
1419
  maxPixels: 16777216,
@@ -1334,14 +1447,14 @@ const MODELS = {
1334
1447
  benchmark: {
1335
1448
  artificialAnalysis: {
1336
1449
  editing: {
1337
- elo: 1201,
1338
- rank: 19
1450
+ elo: 997,
1451
+ rank: 49
1339
1452
  },
1340
1453
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1341
1454
  sourceUrls: AA_IMAGE_SOURCES,
1342
1455
  textToImage: {
1343
- elo: 1225,
1344
- rank: 17
1456
+ elo: 1020,
1457
+ rank: 28
1345
1458
  }
1346
1459
  },
1347
1460
  speed: {
@@ -1393,14 +1506,14 @@ const MODELS = {
1393
1506
  benchmark: {
1394
1507
  artificialAnalysis: {
1395
1508
  editing: {
1396
- elo: 1170,
1397
- rank: 31
1509
+ elo: 1007,
1510
+ rank: 41
1398
1511
  },
1399
1512
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1400
1513
  sourceUrls: AA_IMAGE_SOURCES,
1401
1514
  textToImage: {
1402
- elo: 1207,
1403
- rank: 30
1515
+ elo: 1004,
1516
+ rank: 41
1404
1517
  }
1405
1518
  },
1406
1519
  speed: {
@@ -1451,11 +1564,15 @@ const MODELS = {
1451
1564
  "flux2-flex": {
1452
1565
  benchmark: {
1453
1566
  artificialAnalysis: {
1567
+ editing: {
1568
+ elo: 1007,
1569
+ rank: 42
1570
+ },
1454
1571
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1455
1572
  sourceUrls: AA_IMAGE_SOURCES,
1456
1573
  textToImage: {
1457
- elo: 1223,
1458
- rank: 18
1574
+ elo: 1027,
1575
+ rank: 22
1459
1576
  }
1460
1577
  },
1461
1578
  speed: {
@@ -1509,8 +1626,16 @@ const MODELS = {
1509
1626
  "flux2-dev": {
1510
1627
  benchmark: {
1511
1628
  artificialAnalysis: {
1629
+ editing: {
1630
+ elo: 1e3,
1631
+ rank: 45
1632
+ },
1512
1633
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1513
- sourceUrls: AA_IMAGE_SOURCES
1634
+ sourceUrls: AA_IMAGE_SOURCES,
1635
+ textToImage: {
1636
+ elo: 1e3,
1637
+ rank: 42
1638
+ }
1514
1639
  },
1515
1640
  speed: {
1516
1641
  medianSeconds: 4.6,
@@ -1673,24 +1798,12 @@ const MODELS = {
1673
1798
  },
1674
1799
  reve: {
1675
1800
  benchmark: {
1676
- artificialAnalysis: {
1677
- editing: {
1678
- elo: 1263,
1679
- rank: 2
1680
- },
1681
- snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1682
- sourceUrls: AA_IMAGE_SOURCES,
1683
- textToImage: {
1684
- elo: 1322,
1685
- rank: 2
1686
- }
1687
- },
1688
1801
  tiers: {
1689
1802
  price: "premium",
1690
1803
  quality: "frontier",
1691
1804
  speed: "unknown"
1692
1805
  },
1693
- useCase: "Highest-ranked editor reachable on fal; strong prompt adherence and text rendering"
1806
+ useCase: "Historical Reve route; not currently verified on fal"
1694
1807
  },
1695
1808
  editEndpoint: "fal-ai/reve/edit",
1696
1809
  endpoint: "fal-ai/reve/text-to-image",
@@ -1731,8 +1844,8 @@ const MODELS = {
1731
1844
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1732
1845
  sourceUrls: AA_IMAGE_SOURCES,
1733
1846
  textToImage: {
1734
- elo: 1215,
1735
- rank: 25
1847
+ elo: 984,
1848
+ rank: 62
1736
1849
  }
1737
1850
  } },
1738
1851
  customImageSize: {},
@@ -1790,8 +1903,8 @@ const MODELS = {
1790
1903
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1791
1904
  sourceUrls: AA_IMAGE_SOURCES,
1792
1905
  textToImage: {
1793
- elo: 1220,
1794
- rank: 19
1906
+ elo: 1004,
1907
+ rank: 40
1795
1908
  }
1796
1909
  } },
1797
1910
  customImageSize: {
@@ -1829,14 +1942,14 @@ const MODELS = {
1829
1942
  benchmark: {
1830
1943
  artificialAnalysis: {
1831
1944
  editing: {
1832
- elo: 1214,
1833
- rank: 16
1945
+ elo: 1073,
1946
+ rank: 19
1834
1947
  },
1835
1948
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1836
1949
  sourceUrls: AA_IMAGE_SOURCES,
1837
1950
  textToImage: {
1838
- elo: 1216,
1839
- rank: 23
1951
+ elo: 1019,
1952
+ rank: 30
1840
1953
  }
1841
1954
  },
1842
1955
  speed: {
@@ -1889,7 +2002,11 @@ const MODELS = {
1889
2002
  benchmark: {
1890
2003
  artificialAnalysis: {
1891
2004
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1892
- sourceUrls: AA_IMAGE_SOURCES
2005
+ sourceUrls: AA_IMAGE_SOURCES,
2006
+ textToImage: {
2007
+ elo: 890,
2008
+ rank: 106
2009
+ }
1893
2010
  },
1894
2011
  speed: {
1895
2012
  medianSeconds: 23.3,
@@ -1931,14 +2048,14 @@ const MODELS = {
1931
2048
  benchmark: {
1932
2049
  artificialAnalysis: {
1933
2050
  editing: {
1934
- elo: 1218,
1935
- rank: 15
2051
+ elo: 1056,
2052
+ rank: 25
1936
2053
  },
1937
2054
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1938
2055
  sourceUrls: AA_IMAGE_SOURCES,
1939
2056
  textToImage: {
1940
- elo: 1272,
1941
- rank: 11
2057
+ elo: 1075,
2058
+ rank: 16
1942
2059
  }
1943
2060
  },
1944
2061
  tiers: {
@@ -1946,7 +2063,7 @@ const MODELS = {
1946
2063
  quality: "better",
1947
2064
  speed: "unknown"
1948
2065
  },
1949
- useCase: "Strong quality per dollar - 11th on text-to-image at $30/1k"
2066
+ useCase: "Strong generation with negative-prompt and seed controls"
1950
2067
  },
1951
2068
  customImageSize: {
1952
2069
  maxPixels: 4194304,
@@ -1980,17 +2097,17 @@ const MODELS = {
1980
2097
  benchmark: {
1981
2098
  artificialAnalysis: {
1982
2099
  editing: {
1983
- elo: 1272,
1984
- rank: 1
2100
+ elo: 1110,
2101
+ rank: 10
1985
2102
  },
1986
2103
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1987
2104
  sourceUrls: AA_IMAGE_SOURCES,
1988
2105
  textToImage: {
1989
- elo: 1293,
1990
- rank: 7
2106
+ elo: 1100,
2107
+ rank: 12
1991
2108
  }
1992
2109
  },
1993
- useCase: "Highest-ranked image editor, single reference image"
2110
+ useCase: "Strong single-reference editor; MAI 2.5 ranks higher on the current editing board"
1994
2111
  },
1995
2112
  editEndpoint: "microsoft/mai-image-2.5-pro/edit",
1996
2113
  editImagesField: "image_url",
@@ -2029,20 +2146,26 @@ const MODELS = {
2029
2146
  },
2030
2147
  "banana2-lite": {
2031
2148
  benchmark: { artificialAnalysis: {
2149
+ editing: {
2150
+ elo: 1046,
2151
+ rank: 26
2152
+ },
2032
2153
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
2033
2154
  sourceUrls: AA_IMAGE_SOURCES,
2034
2155
  textToImage: {
2035
- elo: 1289,
2036
- rank: 8
2156
+ elo: 1095,
2157
+ rank: 13
2037
2158
  }
2038
2159
  } },
2160
+ editEndpoint: "google/nano-banana-2-lite/edit",
2161
+ maxReferenceImages: 14,
2039
2162
  endpoint: "google/nano-banana-2-lite",
2040
2163
  name: "Nano Banana 2 Lite",
2041
- pricing: "Token-based: text $0.3125/M input, $1.875/M output; image $0.3125/M input, $37.50/M output; fixed 1K output (~$0.048)",
2042
- pricePerImageUsd: .048,
2164
+ pricing: "Token-based: text $0.3125/M input, $1.875/M output; image $0.3125/M input, $37.50/M output; fixed 1K output (~$0.042 image output, plus input/thinking)",
2165
+ pricePerImageUsd: null,
2043
2166
  sizeMode: "aspect_ratio",
2044
2167
  supportsAspect: true,
2045
- supportsEdit: false,
2168
+ supportsEdit: true,
2046
2169
  supportsLimitGenerations: true,
2047
2170
  supportsNumImages: true,
2048
2171
  supportsOutputFormat: true,
@@ -2115,6 +2238,21 @@ const MODELS = {
2115
2238
  type: "generation"
2116
2239
  },
2117
2240
  "grok-image-2": {
2241
+ benchmark: {
2242
+ artificialAnalysis: {
2243
+ editing: {
2244
+ elo: 1110,
2245
+ rank: 8
2246
+ },
2247
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
2248
+ sourceUrls: AA_IMAGE_SOURCES,
2249
+ textToImage: {
2250
+ elo: 1156,
2251
+ rank: 4
2252
+ }
2253
+ },
2254
+ useCase: "Strong generation and editing with predictable per-image billing"
2255
+ },
2118
2256
  editEndpoint: "xai/grok-imagine-image/v2.0/edit",
2119
2257
  endpoint: "xai/grok-imagine-image/v2.0/text-to-image",
2120
2258
  falPricing: {
@@ -2212,38 +2350,44 @@ const MODELS = {
2212
2350
  type: "utility"
2213
2351
  }
2214
2352
  };
2353
+ /** Curated generation choices; predecessor routes are explicit-only. */
2215
2354
  const GENERATION_MODELS = [
2216
- "flare",
2217
2355
  "sunburst",
2356
+ "flare",
2218
2357
  "gpt2",
2219
2358
  "gpt",
2359
+ "banana21",
2220
2360
  "banana2",
2221
2361
  "banana",
2362
+ "mai-image-2.5",
2363
+ "mai-image-2.5-pro",
2364
+ "seedream5",
2365
+ "qwen3",
2366
+ "banana2-lite",
2367
+ "grok-image-2",
2368
+ "grok-image",
2369
+ "flux2-flex",
2370
+ "flux2-pro",
2371
+ "flux2-turbo",
2372
+ "seedream5-lite",
2373
+ "ideogram4",
2374
+ "ideogram3-transparent",
2375
+ "recraft41"
2376
+ ];
2377
+ /** Retained for old pins, explicit overrides and tuned Looks, never auto-selected. */
2378
+ const LEGACY_GENERATION_MODELS = [
2222
2379
  "gemini",
2223
2380
  "gemini3",
2224
2381
  "seedream4",
2225
2382
  "seedream45",
2226
- "seedream5",
2227
- "seedream5-lite",
2228
2383
  "flux2-max",
2229
- "flux2-pro",
2230
- "flux2-flex",
2231
2384
  "flux2-dev",
2232
- "flux2-turbo",
2233
2385
  "flux",
2234
2386
  "flux-fast",
2235
2387
  "recraft",
2236
2388
  "recraft4",
2237
2389
  "ideogram",
2238
- "ideogram4",
2239
- "grok-image",
2240
- "grok-image-2",
2241
- "qwen",
2242
- "qwen3",
2243
- "mai-image-2.5-pro",
2244
- "banana2-lite",
2245
- "ideogram3-transparent",
2246
- "recraft41"
2390
+ "qwen"
2247
2391
  ];
2248
2392
  GENERATION_MODELS.filter((id) => MODELS[id]?.supportsEdit === true);
2249
2393
  const UTILITY_MODELS = [
@@ -2620,7 +2764,7 @@ function buildGenerateBody(options) {
2620
2764
  if (config.supportsAspect) body.aspect_ratio = aspect;
2621
2765
  if (config.supportsResolution) body.resolution = model === "grok-image" || model === "grok-image-2" ? resolution.toLowerCase() : resolution;
2622
2766
  }
2623
- if (config.supportsQuality === true) body.quality = quality ?? "high";
2767
+ if (config.supportsQuality === true) body.quality = quality ?? config.defaultQuality ?? "high";
2624
2768
  if (config.supportsBackground === true && background) body.background = background;
2625
2769
  if (config.supportsBackground === true && transparent === true) body.background = "transparent";
2626
2770
  if (transparent === true && config.supportsOutputFormat === true) body.output_format = "png";
@@ -5048,134 +5192,7 @@ const TIERS = [
5048
5192
  ];
5049
5193
  const DEFAULT_TIER = "balanced";
5050
5194
  const HAND_RANKED_AT = "2026-09-16";
5051
- const GENERATION_MODELS_RANKED = [
5052
- {
5053
- model: "gpt2",
5054
- tier: "quality"
5055
- },
5056
- {
5057
- model: "banana2",
5058
- tier: "quality"
5059
- },
5060
- {
5061
- model: "gpt",
5062
- tier: "quality"
5063
- },
5064
- {
5065
- model: "sunburst",
5066
- tier: "quality"
5067
- },
5068
- {
5069
- model: "gemini3",
5070
- tier: "quality"
5071
- },
5072
- {
5073
- model: "mai-image-2.5-pro",
5074
- tier: "quality"
5075
- },
5076
- {
5077
- model: "seedream5",
5078
- tier: "quality"
5079
- },
5080
- {
5081
- model: "flux2-max",
5082
- tier: "quality"
5083
- },
5084
- {
5085
- model: "banana",
5086
- tier: "balanced"
5087
- },
5088
- {
5089
- model: "ideogram3-transparent",
5090
- requires: ["transparency"],
5091
- supports: ["transparency"],
5092
- tier: "balanced"
5093
- },
5094
- {
5095
- model: "flare",
5096
- tier: "balanced"
5097
- },
5098
- {
5099
- model: "banana2-lite",
5100
- tier: "balanced"
5101
- },
5102
- {
5103
- model: "qwen3",
5104
- tier: "balanced"
5105
- },
5106
- {
5107
- model: "seedream4",
5108
- tier: "balanced"
5109
- },
5110
- {
5111
- model: "flux2-flex",
5112
- tier: "balanced"
5113
- },
5114
- {
5115
- model: "ideogram4",
5116
- tier: "balanced"
5117
- },
5118
- {
5119
- model: "grok-image",
5120
- tier: "balanced"
5121
- },
5122
- {
5123
- model: "recraft4",
5124
- tier: "balanced"
5125
- },
5126
- {
5127
- model: "flux2-pro",
5128
- tier: "balanced"
5129
- },
5130
- {
5131
- model: "seedream45",
5132
- tier: "balanced"
5133
- },
5134
- {
5135
- model: "grok-image-2",
5136
- tier: "balanced"
5137
- },
5138
- {
5139
- model: "recraft41",
5140
- tier: "balanced"
5141
- },
5142
- {
5143
- model: "flux2-turbo",
5144
- tier: "fast"
5145
- },
5146
- {
5147
- model: "flux2-dev",
5148
- tier: "fast"
5149
- },
5150
- {
5151
- model: "flux-fast",
5152
- tier: "fast"
5153
- },
5154
- {
5155
- model: "seedream5-lite",
5156
- tier: "fast"
5157
- },
5158
- {
5159
- model: "gemini",
5160
- tier: "fast"
5161
- },
5162
- {
5163
- model: "qwen",
5164
- tier: "fast"
5165
- },
5166
- {
5167
- model: "ideogram",
5168
- tier: "fast"
5169
- },
5170
- {
5171
- model: "recraft",
5172
- tier: "fast"
5173
- },
5174
- {
5175
- model: "flux",
5176
- tier: "fast"
5177
- }
5178
- ];
5195
+ const IMAGE_RANKED_AT = "2026-10-07";
5179
5196
  /** Every Task with a Model. A Task is absent here until it has at least one Model. */
5180
5197
  const TASKS = {
5181
5198
  animate: {
@@ -5346,10 +5363,97 @@ const TASKS = {
5346
5363
  summary: "Remove an object, person, text or clutter from an image and fill the gap."
5347
5364
  },
5348
5365
  generate: {
5349
- basis: "Hand-ranked. Tiers set by fal price per image (quality ≥ $0.07, balanced $0.02-$0.15 with edit quality, fast ≤ $0.04); order within a tier by Artificial Analysis text-to-image Elo, snapshot 2026-08-23, unranked models last. banana leads balanced because it is the house default the looks are tuned on. Ideogram V3 Transparent follows it but is chosen only for a transparent request, so transparency needs no OpenAI key at balanced; token-metered Nano Banana 2 Lite sits in balanced by its Elo.",
5350
- models: GENERATION_MODELS_RANKED,
5366
+ basis: "Curated from Artificial Analysis v2, captured 2026-10-07, and Arena 2026-10-06. Sunburst and Flare lead quality at the benchmarked max setting. Nano Banana 2.1 leads balanced on preliminary Arena evidence and lower representative cost; Grok Image 2 and MAI 2.5 are established alternatives. Fast keeps Nano Banana 2 Lite, budget Grok and Seedream 5 Lite, and FLUX.2 Turbo. Design, transparency and tuned Look routes are capability exceptions. Generation with References uses the separate editing ranking. Older routes are explicit/pin/Look-only.",
5367
+ models: [
5368
+ {
5369
+ model: "sunburst",
5370
+ tier: "quality"
5371
+ },
5372
+ {
5373
+ model: "flare",
5374
+ tier: "quality"
5375
+ },
5376
+ {
5377
+ model: "gpt2",
5378
+ tier: "quality"
5379
+ },
5380
+ {
5381
+ model: "gpt",
5382
+ tier: "quality"
5383
+ },
5384
+ {
5385
+ model: "mai-image-2.5-pro",
5386
+ tier: "quality"
5387
+ },
5388
+ {
5389
+ model: "seedream5",
5390
+ tier: "quality"
5391
+ },
5392
+ {
5393
+ model: "banana21",
5394
+ tier: "balanced"
5395
+ },
5396
+ {
5397
+ model: "grok-image-2",
5398
+ tier: "balanced"
5399
+ },
5400
+ {
5401
+ model: "banana2",
5402
+ tier: "balanced"
5403
+ },
5404
+ {
5405
+ model: "mai-image-2.5",
5406
+ tier: "balanced"
5407
+ },
5408
+ {
5409
+ model: "banana",
5410
+ tier: "balanced"
5411
+ },
5412
+ {
5413
+ model: "qwen3",
5414
+ tier: "balanced"
5415
+ },
5416
+ {
5417
+ model: "flux2-flex",
5418
+ tier: "balanced"
5419
+ },
5420
+ {
5421
+ model: "flux2-pro",
5422
+ tier: "balanced"
5423
+ },
5424
+ {
5425
+ model: "ideogram4",
5426
+ tier: "balanced"
5427
+ },
5428
+ {
5429
+ model: "recraft41",
5430
+ tier: "balanced"
5431
+ },
5432
+ {
5433
+ model: "ideogram3-transparent",
5434
+ requires: ["transparency"],
5435
+ supports: ["transparency"],
5436
+ tier: "balanced"
5437
+ },
5438
+ {
5439
+ model: "banana2-lite",
5440
+ tier: "fast"
5441
+ },
5442
+ {
5443
+ model: "grok-image",
5444
+ tier: "fast"
5445
+ },
5446
+ {
5447
+ model: "seedream5-lite",
5448
+ tier: "fast"
5449
+ },
5450
+ {
5451
+ model: "flux2-turbo",
5452
+ tier: "fast"
5453
+ }
5454
+ ],
5351
5455
  notFor: "Variations of an image you already have (vary), or a consistent set of images (series run).",
5352
- rankedAt: HAND_RANKED_AT,
5456
+ rankedAt: IMAGE_RANKED_AT,
5353
5457
  rankedFrom: "hand",
5354
5458
  summary: "Make an image from a prompt, or change an image you pass as a reference."
5355
5459
  },
@@ -5834,10 +5938,75 @@ const TASKS = {
5834
5938
  summary: "Trace a raster image to a clean SVG."
5835
5939
  },
5836
5940
  vary: {
5837
- basis: "The generate ranking, filtered to Models that can edit. vary reuses the Model of the image it varies while Motif still offers it.",
5838
- models: GENERATION_MODELS_RANKED.filter(({ model }) => MODELS[model]?.supportsEdit === true),
5941
+ basis: "Curated from Artificial Analysis v2 editing, captured 2026-10-07, and preliminary Arena 2026-10-06 evidence for Nano Banana 2.1. Editing order differs from generation: MAI 2.5 outranks Grok Image 2, and Seedream 5 Pro outranks GPT Image 1.5. Sunburst and Flare use max quality. vary reuses a previously chosen Model when explicitly supplied, including retained legacy routes.",
5942
+ models: [
5943
+ {
5944
+ model: "sunburst",
5945
+ tier: "quality"
5946
+ },
5947
+ {
5948
+ model: "flare",
5949
+ tier: "quality"
5950
+ },
5951
+ {
5952
+ model: "gpt2",
5953
+ tier: "quality"
5954
+ },
5955
+ {
5956
+ model: "mai-image-2.5-pro",
5957
+ tier: "quality"
5958
+ },
5959
+ {
5960
+ model: "seedream5",
5961
+ tier: "quality"
5962
+ },
5963
+ {
5964
+ model: "gpt",
5965
+ tier: "quality"
5966
+ },
5967
+ {
5968
+ model: "banana21",
5969
+ tier: "balanced"
5970
+ },
5971
+ {
5972
+ model: "mai-image-2.5",
5973
+ tier: "balanced"
5974
+ },
5975
+ {
5976
+ model: "grok-image-2",
5977
+ tier: "balanced"
5978
+ },
5979
+ {
5980
+ model: "banana2",
5981
+ tier: "balanced"
5982
+ },
5983
+ {
5984
+ model: "banana",
5985
+ tier: "balanced"
5986
+ },
5987
+ {
5988
+ model: "flux2-pro",
5989
+ tier: "balanced"
5990
+ },
5991
+ {
5992
+ model: "flux2-flex",
5993
+ tier: "balanced"
5994
+ },
5995
+ {
5996
+ model: "grok-image",
5997
+ tier: "fast"
5998
+ },
5999
+ {
6000
+ model: "seedream5-lite",
6001
+ tier: "fast"
6002
+ },
6003
+ {
6004
+ model: "banana2-lite",
6005
+ tier: "fast"
6006
+ }
6007
+ ],
5839
6008
  notFor: "A specific change to an image described in words (generate with a reference), or a set of different scenes in one style (series run).",
5840
- rankedAt: HAND_RANKED_AT,
6009
+ rankedAt: IMAGE_RANKED_AT,
5841
6010
  rankedFrom: "hand",
5842
6011
  summary: "Make variations of an image you already have."
5843
6012
  }
@@ -8222,7 +8391,7 @@ function resolveFixed(task, fixed, request, needed, keys) {
8222
8391
  const { chosenBy, model } = fixed;
8223
8392
  const tier = request.tier ?? "balanced";
8224
8393
  const entries = TASKS[task].models;
8225
- const entry = entries.find((candidate) => candidate.model === model && candidate.mode === request.mode);
8394
+ const entry = entries.find((candidate) => candidate.model === model && candidate.mode === request.mode) ?? legacyEntry(task, model, request.mode, tier);
8226
8395
  const profile = modelProfile(model);
8227
8396
  if (entry === void 0 || profile === void 0) {
8228
8397
  const servesTask = entries.some((candidate) => candidate.model === model);
@@ -8235,6 +8404,14 @@ function resolveFixed(task, fixed, request, needed, keys) {
8235
8404
  unblockers.push(unblockerFor(result));
8236
8405
  return unresolved(task, result.blockedBy, unblockers, `${model} (${chosenBy}) ${describeBlock(result.blockedBy, result.missingKey, result.missingInput)}.`, result.missingKey);
8237
8406
  }
8407
+ /** Old pins and tuned Looks remain usable without recommending predecessors. */
8408
+ function legacyEntry(task, model, mode, tier) {
8409
+ if (mode !== void 0 || task !== "generate" && task !== "vary" || !LEGACY_GENERATION_MODELS.some((id) => id === model) || task === "vary" && MODELS[model]?.supportsEdit !== true) return;
8410
+ return {
8411
+ model,
8412
+ tier
8413
+ };
8414
+ }
8238
8415
  function unknownForMode(task, model, mode, entries) {
8239
8416
  const otherModes = entries.filter((candidate) => candidate.model === model).map((candidate) => candidate.mode ?? "no mode");
8240
8417
  const inMode = [...new Set(entries.filter((candidate) => candidate.mode === mode).map((candidate) => candidate.model))];
@@ -8251,7 +8428,7 @@ function resolveRanked(task, request, needed, keys) {
8251
8428
  const qualifying = /* @__PURE__ */ new Map();
8252
8429
  let firstBlock;
8253
8430
  let keyBlock;
8254
- const definition = TASKS[task];
8431
+ const definition = task === "generate" && (request.references ?? 0) > 0 ? TASKS.vary : TASKS[task];
8255
8432
  for (const entry of definition.models) {
8256
8433
  if (entry.mode !== request.mode) continue;
8257
8434
  const { model, tier: modelTier } = entry;