@howells/motif-sdk 5.1.1 → 5.3.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,14 +707,31 @@ 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";
714
714
  const FAL_PRICING_CHECKED_AUG_2026 = "2026-08-23";
715
715
  const FAL_PRICING_CHECKED_SEP_2026 = "2026-09-16";
716
+ const FAL_PRICING_CHECKED_OCT_2026 = "2026-10-29";
716
717
  const MODELS = {
717
718
  flare: {
719
+ benchmark: {
720
+ artificialAnalysis: {
721
+ editing: {
722
+ elo: 1163,
723
+ rank: 2
724
+ },
725
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
726
+ sourceUrls: AA_IMAGE_SOURCES,
727
+ textToImage: {
728
+ elo: 1191,
729
+ rank: 2
730
+ }
731
+ },
732
+ useCase: "Frontier generation and editing, evaluated at max quality"
733
+ },
734
+ defaultQuality: "max",
718
735
  customImageSize: {
719
736
  maxEdge: 3840,
720
737
  maxPixels: 8294400,
@@ -751,6 +768,22 @@ const MODELS = {
751
768
  useQueue: true
752
769
  },
753
770
  sunburst: {
771
+ benchmark: {
772
+ artificialAnalysis: {
773
+ editing: {
774
+ elo: 1183,
775
+ rank: 1
776
+ },
777
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
778
+ sourceUrls: AA_IMAGE_SOURCES,
779
+ textToImage: {
780
+ elo: 1198,
781
+ rank: 1
782
+ }
783
+ },
784
+ useCase: "Frontier generation and editing, evaluated at max quality"
785
+ },
786
+ defaultQuality: "max",
754
787
  customImageSize: {
755
788
  maxEdge: 3840,
756
789
  maxPixels: 8294400,
@@ -790,14 +823,14 @@ const MODELS = {
790
823
  benchmark: {
791
824
  artificialAnalysis: {
792
825
  editing: {
793
- elo: 1256,
794
- rank: 3
826
+ elo: 1125,
827
+ rank: 5
795
828
  },
796
829
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
797
830
  sourceUrls: AA_IMAGE_SOURCES,
798
831
  textToImage: {
799
- elo: 1369,
800
- rank: 1
832
+ elo: 1172,
833
+ rank: 3
801
834
  }
802
835
  },
803
836
  speed: {
@@ -810,7 +843,7 @@ const MODELS = {
810
843
  quality: "frontier",
811
844
  speed: "very_slow"
812
845
  },
813
- useCase: "Highest-ranked text-to-image quality and transparent PNGs"
846
+ useCase: "Established frontier generation and transparent PNGs"
814
847
  },
815
848
  customImageSize: {
816
849
  maxEdge: 3840,
@@ -861,14 +894,14 @@ const MODELS = {
861
894
  benchmark: {
862
895
  artificialAnalysis: {
863
896
  editing: {
864
- elo: 1250,
865
- rank: 5
897
+ elo: 1103,
898
+ rank: 12
866
899
  },
867
900
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
868
901
  sourceUrls: AA_IMAGE_SOURCES,
869
902
  textToImage: {
870
- elo: 1310,
871
- rank: 4
903
+ elo: 1107,
904
+ rank: 8
872
905
  }
873
906
  },
874
907
  speed: {
@@ -881,7 +914,7 @@ const MODELS = {
881
914
  quality: "frontier",
882
915
  speed: "slow"
883
916
  },
884
- useCase: "Best OpenAI edit quality with transparent PNG support"
917
+ useCase: "Established OpenAI editor with transparent PNG support"
885
918
  },
886
919
  editEndpoint: "fal-ai/gpt-image-1.5/edit",
887
920
  endpoint: "fal-ai/gpt-image-1.5",
@@ -914,18 +947,103 @@ const MODELS = {
914
947
  supportsSyncMode: true,
915
948
  type: "generation"
916
949
  },
917
- banana2: {
950
+ banana21: {
951
+ benchmark: { useCase: "Efficient generation and reference editing; Arena #5 generation / #6 editing, preliminary 2026-10-06" },
952
+ editEndpoint: "google/nano-banana-2.1/edit",
953
+ endpoint: "google/nano-banana-2.1",
954
+ maxReferenceImages: 14,
955
+ name: "Nano Banana 2.1",
956
+ pricePerImageUsd: null,
957
+ 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",
958
+ sizeMode: "aspect_ratio",
959
+ supportedAspects: [
960
+ "auto",
961
+ "21:9",
962
+ "16:9",
963
+ "3:2",
964
+ "4:3",
965
+ "5:4",
966
+ "1:1",
967
+ "4:5",
968
+ "3:4",
969
+ "2:3",
970
+ "9:16",
971
+ "4:1",
972
+ "1:4",
973
+ "8:1",
974
+ "1:8"
975
+ ],
976
+ supportedResolutions: [
977
+ "1K",
978
+ "2K",
979
+ "4K"
980
+ ],
981
+ supportsAspect: true,
982
+ supportsEdit: true,
983
+ supportsLimitGenerations: true,
984
+ supportsNumImages: true,
985
+ supportsOutputFormat: true,
986
+ supportsResolution: true,
987
+ supportsSafetyTolerance: true,
988
+ supportsSeed: true,
989
+ supportsSyncMode: true,
990
+ supportsThinkingLevel: true,
991
+ supportsWebSearch: true,
992
+ type: "generation"
993
+ },
994
+ "mai-image-2.5": {
918
995
  benchmark: {
919
996
  artificialAnalysis: {
920
997
  editing: {
921
- elo: 1249,
998
+ elo: 1114,
922
999
  rank: 7
923
1000
  },
924
1001
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
925
1002
  sourceUrls: AA_IMAGE_SOURCES,
926
1003
  textToImage: {
927
- elo: 1320,
928
- rank: 3
1004
+ elo: 1104,
1005
+ rank: 10
1006
+ }
1007
+ },
1008
+ useCase: "Strong single-reference editing at a lower price than MAI 2.5 Pro"
1009
+ },
1010
+ editEndpoint: "microsoft/mai-image-2.5/edit",
1011
+ endpoint: "microsoft/mai-image-2.5",
1012
+ maxReferenceImages: 1,
1013
+ name: "MAI Image 2.5",
1014
+ pricePerImageUsd: null,
1015
+ pricing: "Token-based: text input $5/M, image input $8/M; ~$0.05 image output plus input",
1016
+ sizeMode: "aspect_ratio",
1017
+ supportedAspects: [
1018
+ "auto",
1019
+ "1:1",
1020
+ "4:3",
1021
+ "3:4",
1022
+ "16:9",
1023
+ "9:16",
1024
+ "3:2",
1025
+ "2:3"
1026
+ ],
1027
+ supportsAspect: true,
1028
+ supportsEdit: true,
1029
+ supportsNumImages: true,
1030
+ supportsOutputFormat: true,
1031
+ supportsResolution: false,
1032
+ supportsSyncMode: true,
1033
+ type: "generation"
1034
+ },
1035
+ banana2: {
1036
+ benchmark: {
1037
+ artificialAnalysis: {
1038
+ editing: {
1039
+ elo: 1110,
1040
+ rank: 9
1041
+ },
1042
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1043
+ sourceUrls: AA_IMAGE_SOURCES,
1044
+ textToImage: {
1045
+ elo: 1126,
1046
+ rank: 6
929
1047
  }
930
1048
  },
931
1049
  tiers: {
@@ -933,7 +1051,7 @@ const MODELS = {
933
1051
  quality: "frontier",
934
1052
  speed: "unknown"
935
1053
  },
936
- useCase: "Best balance of quality, edit support, web search, and cost"
1054
+ useCase: "Previous-generation Gemini workhorse; retains 0.5K output"
937
1055
  },
938
1056
  editEndpoint: "fal-ai/nano-banana-2/edit",
939
1057
  endpoint: "fal-ai/nano-banana-2",
@@ -969,14 +1087,14 @@ const MODELS = {
969
1087
  benchmark: {
970
1088
  artificialAnalysis: {
971
1089
  editing: {
972
- elo: 1245,
973
- rank: 9
1090
+ elo: 1101,
1091
+ rank: 13
974
1092
  },
975
1093
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
976
1094
  sourceUrls: AA_IMAGE_SOURCES,
977
1095
  textToImage: {
978
- elo: 1297,
979
- rank: 6
1096
+ elo: 1102,
1097
+ rank: 11
980
1098
  }
981
1099
  },
982
1100
  speed: {
@@ -1041,11 +1159,15 @@ const MODELS = {
1041
1159
  gemini: {
1042
1160
  benchmark: { artificialAnalysis: {
1043
1161
  editing: {
1044
- elo: 1180,
1045
- rank: 29
1162
+ elo: 987,
1163
+ rank: 50
1046
1164
  },
1047
1165
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1048
- sourceUrls: AA_IMAGE_SOURCES
1166
+ sourceUrls: AA_IMAGE_SOURCES,
1167
+ textToImage: {
1168
+ elo: 985,
1169
+ rank: 60
1170
+ }
1049
1171
  } },
1050
1172
  editEndpoint: "fal-ai/gemini-25-flash-image/edit",
1051
1173
  endpoint: "fal-ai/gemini-25-flash-image",
@@ -1086,18 +1208,6 @@ const MODELS = {
1086
1208
  type: "generation"
1087
1209
  },
1088
1210
  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
1211
  editEndpoint: "fal-ai/gemini-3-pro-image-preview/edit",
1102
1212
  endpoint: "fal-ai/gemini-3-pro-image-preview",
1103
1213
  falPricing: {
@@ -1147,14 +1257,14 @@ const MODELS = {
1147
1257
  benchmark: {
1148
1258
  artificialAnalysis: {
1149
1259
  editing: {
1150
- elo: 1185,
1151
- rank: 28
1260
+ elo: 1015,
1261
+ rank: 36
1152
1262
  },
1153
1263
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1154
1264
  sourceUrls: AA_IMAGE_SOURCES,
1155
1265
  textToImage: {
1156
- elo: 1226,
1157
- rank: 16
1266
+ elo: 1030,
1267
+ rank: 21
1158
1268
  }
1159
1269
  },
1160
1270
  speed: {
@@ -1167,7 +1277,7 @@ const MODELS = {
1167
1277
  quality: "best",
1168
1278
  speed: "balanced"
1169
1279
  },
1170
- useCase: "High-ranked budget generation and large multi-reference edits"
1280
+ useCase: "Legacy budget generation and large multi-reference edits"
1171
1281
  },
1172
1282
  customImageSize: {
1173
1283
  maxPixels: 16777216,
@@ -1201,14 +1311,14 @@ const MODELS = {
1201
1311
  benchmark: {
1202
1312
  artificialAnalysis: {
1203
1313
  editing: {
1204
- elo: 1186,
1205
- rank: 26
1314
+ elo: 1037,
1315
+ rank: 32
1206
1316
  },
1207
1317
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1208
1318
  sourceUrls: AA_IMAGE_SOURCES,
1209
1319
  textToImage: {
1210
- elo: 1203,
1211
- rank: 32
1320
+ elo: 1022,
1321
+ rank: 26
1212
1322
  }
1213
1323
  },
1214
1324
  speed: {
@@ -1254,14 +1364,14 @@ const MODELS = {
1254
1364
  seedream5: {
1255
1365
  benchmark: { artificialAnalysis: {
1256
1366
  editing: {
1257
- elo: 1248,
1258
- rank: 8
1367
+ elo: 1108,
1368
+ rank: 11
1259
1369
  },
1260
1370
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1261
1371
  sourceUrls: AA_IMAGE_SOURCES,
1262
1372
  textToImage: {
1263
- elo: 1279,
1264
- rank: 10
1373
+ elo: 1081,
1374
+ rank: 15
1265
1375
  }
1266
1376
  } },
1267
1377
  customImageSize: {
@@ -1296,11 +1406,15 @@ const MODELS = {
1296
1406
  "seedream5-lite": {
1297
1407
  benchmark: { artificialAnalysis: {
1298
1408
  editing: {
1299
- elo: 1169,
1300
- rank: 32
1409
+ elo: 1057,
1410
+ rank: 24
1301
1411
  },
1302
1412
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1303
- sourceUrls: AA_IMAGE_SOURCES
1413
+ sourceUrls: AA_IMAGE_SOURCES,
1414
+ textToImage: {
1415
+ elo: 1012,
1416
+ rank: 36
1417
+ }
1304
1418
  } },
1305
1419
  customImageSize: {
1306
1420
  maxPixels: 16777216,
@@ -1334,14 +1448,14 @@ const MODELS = {
1334
1448
  benchmark: {
1335
1449
  artificialAnalysis: {
1336
1450
  editing: {
1337
- elo: 1201,
1338
- rank: 19
1451
+ elo: 997,
1452
+ rank: 49
1339
1453
  },
1340
1454
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1341
1455
  sourceUrls: AA_IMAGE_SOURCES,
1342
1456
  textToImage: {
1343
- elo: 1225,
1344
- rank: 17
1457
+ elo: 1020,
1458
+ rank: 28
1345
1459
  }
1346
1460
  },
1347
1461
  speed: {
@@ -1393,14 +1507,14 @@ const MODELS = {
1393
1507
  benchmark: {
1394
1508
  artificialAnalysis: {
1395
1509
  editing: {
1396
- elo: 1170,
1397
- rank: 31
1510
+ elo: 1007,
1511
+ rank: 41
1398
1512
  },
1399
1513
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1400
1514
  sourceUrls: AA_IMAGE_SOURCES,
1401
1515
  textToImage: {
1402
- elo: 1207,
1403
- rank: 30
1516
+ elo: 1004,
1517
+ rank: 41
1404
1518
  }
1405
1519
  },
1406
1520
  speed: {
@@ -1451,11 +1565,15 @@ const MODELS = {
1451
1565
  "flux2-flex": {
1452
1566
  benchmark: {
1453
1567
  artificialAnalysis: {
1568
+ editing: {
1569
+ elo: 1007,
1570
+ rank: 42
1571
+ },
1454
1572
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1455
1573
  sourceUrls: AA_IMAGE_SOURCES,
1456
1574
  textToImage: {
1457
- elo: 1223,
1458
- rank: 18
1575
+ elo: 1027,
1576
+ rank: 22
1459
1577
  }
1460
1578
  },
1461
1579
  speed: {
@@ -1509,8 +1627,16 @@ const MODELS = {
1509
1627
  "flux2-dev": {
1510
1628
  benchmark: {
1511
1629
  artificialAnalysis: {
1630
+ editing: {
1631
+ elo: 1e3,
1632
+ rank: 45
1633
+ },
1512
1634
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1513
- sourceUrls: AA_IMAGE_SOURCES
1635
+ sourceUrls: AA_IMAGE_SOURCES,
1636
+ textToImage: {
1637
+ elo: 1e3,
1638
+ rank: 42
1639
+ }
1514
1640
  },
1515
1641
  speed: {
1516
1642
  medianSeconds: 4.6,
@@ -1673,24 +1799,12 @@ const MODELS = {
1673
1799
  },
1674
1800
  reve: {
1675
1801
  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
1802
  tiers: {
1689
1803
  price: "premium",
1690
1804
  quality: "frontier",
1691
1805
  speed: "unknown"
1692
1806
  },
1693
- useCase: "Highest-ranked editor reachable on fal; strong prompt adherence and text rendering"
1807
+ useCase: "Historical Reve route; not currently verified on fal"
1694
1808
  },
1695
1809
  editEndpoint: "fal-ai/reve/edit",
1696
1810
  endpoint: "fal-ai/reve/text-to-image",
@@ -1731,8 +1845,8 @@ const MODELS = {
1731
1845
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1732
1846
  sourceUrls: AA_IMAGE_SOURCES,
1733
1847
  textToImage: {
1734
- elo: 1215,
1735
- rank: 25
1848
+ elo: 984,
1849
+ rank: 62
1736
1850
  }
1737
1851
  } },
1738
1852
  customImageSize: {},
@@ -1790,8 +1904,8 @@ const MODELS = {
1790
1904
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1791
1905
  sourceUrls: AA_IMAGE_SOURCES,
1792
1906
  textToImage: {
1793
- elo: 1220,
1794
- rank: 19
1907
+ elo: 1004,
1908
+ rank: 40
1795
1909
  }
1796
1910
  } },
1797
1911
  customImageSize: {
@@ -1829,14 +1943,14 @@ const MODELS = {
1829
1943
  benchmark: {
1830
1944
  artificialAnalysis: {
1831
1945
  editing: {
1832
- elo: 1214,
1833
- rank: 16
1946
+ elo: 1073,
1947
+ rank: 19
1834
1948
  },
1835
1949
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1836
1950
  sourceUrls: AA_IMAGE_SOURCES,
1837
1951
  textToImage: {
1838
- elo: 1216,
1839
- rank: 23
1952
+ elo: 1019,
1953
+ rank: 30
1840
1954
  }
1841
1955
  },
1842
1956
  speed: {
@@ -1889,7 +2003,11 @@ const MODELS = {
1889
2003
  benchmark: {
1890
2004
  artificialAnalysis: {
1891
2005
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1892
- sourceUrls: AA_IMAGE_SOURCES
2006
+ sourceUrls: AA_IMAGE_SOURCES,
2007
+ textToImage: {
2008
+ elo: 890,
2009
+ rank: 106
2010
+ }
1893
2011
  },
1894
2012
  speed: {
1895
2013
  medianSeconds: 23.3,
@@ -1931,14 +2049,14 @@ const MODELS = {
1931
2049
  benchmark: {
1932
2050
  artificialAnalysis: {
1933
2051
  editing: {
1934
- elo: 1218,
1935
- rank: 15
2052
+ elo: 1056,
2053
+ rank: 25
1936
2054
  },
1937
2055
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1938
2056
  sourceUrls: AA_IMAGE_SOURCES,
1939
2057
  textToImage: {
1940
- elo: 1272,
1941
- rank: 11
2058
+ elo: 1075,
2059
+ rank: 16
1942
2060
  }
1943
2061
  },
1944
2062
  tiers: {
@@ -1946,12 +2064,13 @@ const MODELS = {
1946
2064
  quality: "better",
1947
2065
  speed: "unknown"
1948
2066
  },
1949
- useCase: "Strong quality per dollar - 11th on text-to-image at $30/1k"
2067
+ useCase: "Strong generation with negative-prompt and seed controls"
1950
2068
  },
1951
2069
  customImageSize: {
1952
2070
  maxPixels: 4194304,
1953
2071
  minPixels: 262144
1954
2072
  },
2073
+ editEndpoint: "alibaba/qwen-image-3/edit",
1955
2074
  endpoint: "alibaba/qwen-image-3/text-to-image",
1956
2075
  falPricing: {
1957
2076
  checkedAt: FAL_PRICING_CHECKED_SEP_2026,
@@ -1962,12 +2081,13 @@ const MODELS = {
1962
2081
  unit: "images",
1963
2082
  unitPrice: .04
1964
2083
  },
2084
+ maxReferenceImages: 3,
1965
2085
  name: "Qwen Image 3",
1966
2086
  pricePerImageUsd: .04,
1967
2087
  pricing: "$0.04 (1K) / $0.075 (2K)",
1968
2088
  sizeMode: "image_size_enum",
1969
2089
  supportsAspect: true,
1970
- supportsEdit: false,
2090
+ supportsEdit: true,
1971
2091
  supportsNegativePrompt: true,
1972
2092
  supportsNumImages: true,
1973
2093
  supportsOutputFormat: true,
@@ -1980,17 +2100,17 @@ const MODELS = {
1980
2100
  benchmark: {
1981
2101
  artificialAnalysis: {
1982
2102
  editing: {
1983
- elo: 1272,
1984
- rank: 1
2103
+ elo: 1110,
2104
+ rank: 10
1985
2105
  },
1986
2106
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1987
2107
  sourceUrls: AA_IMAGE_SOURCES,
1988
2108
  textToImage: {
1989
- elo: 1293,
1990
- rank: 7
2109
+ elo: 1100,
2110
+ rank: 12
1991
2111
  }
1992
2112
  },
1993
- useCase: "Highest-ranked image editor, single reference image"
2113
+ useCase: "Strong single-reference editor; MAI 2.5 ranks higher on the current editing board"
1994
2114
  },
1995
2115
  editEndpoint: "microsoft/mai-image-2.5-pro/edit",
1996
2116
  editImagesField: "image_url",
@@ -2029,20 +2149,26 @@ const MODELS = {
2029
2149
  },
2030
2150
  "banana2-lite": {
2031
2151
  benchmark: { artificialAnalysis: {
2152
+ editing: {
2153
+ elo: 1046,
2154
+ rank: 26
2155
+ },
2032
2156
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
2033
2157
  sourceUrls: AA_IMAGE_SOURCES,
2034
2158
  textToImage: {
2035
- elo: 1289,
2036
- rank: 8
2159
+ elo: 1095,
2160
+ rank: 13
2037
2161
  }
2038
2162
  } },
2163
+ editEndpoint: "google/nano-banana-2-lite/edit",
2164
+ maxReferenceImages: 14,
2039
2165
  endpoint: "google/nano-banana-2-lite",
2040
2166
  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,
2167
+ 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)",
2168
+ pricePerImageUsd: null,
2043
2169
  sizeMode: "aspect_ratio",
2044
2170
  supportsAspect: true,
2045
- supportsEdit: false,
2171
+ supportsEdit: true,
2046
2172
  supportsLimitGenerations: true,
2047
2173
  supportsNumImages: true,
2048
2174
  supportsOutputFormat: true,
@@ -2115,6 +2241,21 @@ const MODELS = {
2115
2241
  type: "generation"
2116
2242
  },
2117
2243
  "grok-image-2": {
2244
+ benchmark: {
2245
+ artificialAnalysis: {
2246
+ editing: {
2247
+ elo: 1110,
2248
+ rank: 8
2249
+ },
2250
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
2251
+ sourceUrls: AA_IMAGE_SOURCES,
2252
+ textToImage: {
2253
+ elo: 1156,
2254
+ rank: 4
2255
+ }
2256
+ },
2257
+ useCase: "Strong generation and editing with predictable per-image billing"
2258
+ },
2118
2259
  editEndpoint: "xai/grok-imagine-image/v2.0/edit",
2119
2260
  endpoint: "xai/grok-imagine-image/v2.0/text-to-image",
2120
2261
  falPricing: {
@@ -2149,6 +2290,120 @@ const MODELS = {
2149
2290
  supportsSyncMode: true,
2150
2291
  type: "generation"
2151
2292
  },
2293
+ "muse-image": {
2294
+ benchmark: { useCase: "Low-cost generation and multi-reference editing; Arena #8 generation / #10 editing, 2026-10-29" },
2295
+ editEndpoint: "meta/muse-image/edit",
2296
+ endpoint: "meta/muse-image/text-to-image",
2297
+ falPricing: {
2298
+ checkedAt: FAL_PRICING_CHECKED_OCT_2026,
2299
+ currency: "USD",
2300
+ endpointId: "meta/muse-image/text-to-image",
2301
+ estimatedCostPerImageUsd: .01,
2302
+ source: "fal-pricing-api",
2303
+ unit: "images",
2304
+ unitPrice: .01
2305
+ },
2306
+ maxReferenceImages: 10,
2307
+ name: "Meta Muse Image",
2308
+ pricePerImageUsd: .01,
2309
+ pricing: "$0.01",
2310
+ sizeMode: "aspect_ratio",
2311
+ supportedAspects: [
2312
+ "1:1",
2313
+ "4:3",
2314
+ "3:4",
2315
+ "16:9",
2316
+ "9:16",
2317
+ "3:2",
2318
+ "2:3",
2319
+ "4:5",
2320
+ "5:4",
2321
+ "21:9",
2322
+ "4:1",
2323
+ "1:4",
2324
+ "8:1",
2325
+ "1:8"
2326
+ ],
2327
+ supportsAspect: true,
2328
+ supportsEdit: true,
2329
+ supportsNumImages: true,
2330
+ supportsOutputFormat: true,
2331
+ supportsResolution: false,
2332
+ supportsSyncMode: true,
2333
+ type: "generation"
2334
+ },
2335
+ krea3: {
2336
+ benchmark: { useCase: "Reference editing with prompt planning. Motif sends fal's defaults (berry, medium reasoning), which Arena has not scored; Arena's 1411 editing score (2026-10-29) is for Ultra, available with --param reasoning_level=ultra" },
2337
+ customImageSize: {
2338
+ maxEdge: 3200,
2339
+ maxPixels: 4220160,
2340
+ minEdge: 256,
2341
+ multipleOf: 16
2342
+ },
2343
+ editEndpoint: "krea/v3/edit",
2344
+ endpoint: "krea/v3/text-to-image",
2345
+ falPricing: {
2346
+ checkedAt: FAL_PRICING_CHECKED_OCT_2026,
2347
+ currency: "USD",
2348
+ endpointId: "krea/v3/text-to-image",
2349
+ estimatedCostPerImageUsd: .025,
2350
+ source: "fal-pricing-api",
2351
+ unit: "megapixels",
2352
+ unitPrice: .025
2353
+ },
2354
+ maxReferenceImages: 8,
2355
+ name: "Krea 3",
2356
+ pricePerImageUsd: .025,
2357
+ pricing: "$0.025/MP (edits also bill each reference)",
2358
+ sizeMode: "image_size_enum",
2359
+ supportedOutputFormats: ["png", "jpeg"],
2360
+ supportsAspect: true,
2361
+ supportsEdit: true,
2362
+ supportsNegativePrompt: true,
2363
+ supportsNumImages: false,
2364
+ supportsOutputFormat: true,
2365
+ supportsResolution: false,
2366
+ supportsSafetyChecker: true,
2367
+ supportsSeed: true,
2368
+ supportsSyncMode: true,
2369
+ type: "generation"
2370
+ },
2371
+ "grok-image-quality": {
2372
+ benchmark: { useCase: "Detailed generation and editing with stronger text rendering; Arena #11 editing, 2026-10-29" },
2373
+ editEndpoint: "xai/grok-imagine-image/quality/edit",
2374
+ endpoint: "xai/grok-imagine-image/quality/text-to-image",
2375
+ falPricing: {
2376
+ checkedAt: FAL_PRICING_CHECKED_OCT_2026,
2377
+ currency: "USD",
2378
+ endpointId: "xai/grok-imagine-image/quality/text-to-image",
2379
+ estimatedCostPerImageUsd: .05,
2380
+ source: "fal-pricing-api",
2381
+ unit: "images",
2382
+ unitPrice: .05
2383
+ },
2384
+ maxReferenceImages: 3,
2385
+ name: "Grok Imagine Image Quality",
2386
+ pricePerImageUsd: .05,
2387
+ pricing: "$0.05 (1K) / $0.07 (2K)",
2388
+ sizeMode: "aspect_ratio",
2389
+ supportedAspects: [
2390
+ "16:9",
2391
+ "4:3",
2392
+ "3:2",
2393
+ "1:1",
2394
+ "2:3",
2395
+ "3:4",
2396
+ "9:16"
2397
+ ],
2398
+ supportedResolutions: ["1K", "2K"],
2399
+ supportsAspect: true,
2400
+ supportsEdit: true,
2401
+ supportsNumImages: true,
2402
+ supportsOutputFormat: true,
2403
+ supportsResolution: true,
2404
+ supportsSyncMode: true,
2405
+ type: "generation"
2406
+ },
2152
2407
  kling: {
2153
2408
  endpoint: "fal-ai/kling-video/v3/pro/image-to-video",
2154
2409
  name: "Kling v3 Pro",
@@ -2212,38 +2467,47 @@ const MODELS = {
2212
2467
  type: "utility"
2213
2468
  }
2214
2469
  };
2470
+ /** Curated generation choices; predecessor routes are explicit-only. */
2215
2471
  const GENERATION_MODELS = [
2216
- "flare",
2217
2472
  "sunburst",
2473
+ "flare",
2218
2474
  "gpt2",
2219
2475
  "gpt",
2476
+ "banana21",
2220
2477
  "banana2",
2221
2478
  "banana",
2479
+ "mai-image-2.5",
2480
+ "mai-image-2.5-pro",
2481
+ "seedream5",
2482
+ "qwen3",
2483
+ "banana2-lite",
2484
+ "grok-image-2",
2485
+ "grok-image-quality",
2486
+ "grok-image",
2487
+ "muse-image",
2488
+ "krea3",
2489
+ "flux2-flex",
2490
+ "flux2-pro",
2491
+ "flux2-turbo",
2492
+ "seedream5-lite",
2493
+ "ideogram4",
2494
+ "ideogram3-transparent",
2495
+ "recraft41"
2496
+ ];
2497
+ /** Retained for old pins, explicit overrides and tuned Looks, never auto-selected. */
2498
+ const LEGACY_GENERATION_MODELS = [
2222
2499
  "gemini",
2223
2500
  "gemini3",
2224
2501
  "seedream4",
2225
2502
  "seedream45",
2226
- "seedream5",
2227
- "seedream5-lite",
2228
2503
  "flux2-max",
2229
- "flux2-pro",
2230
- "flux2-flex",
2231
2504
  "flux2-dev",
2232
- "flux2-turbo",
2233
2505
  "flux",
2234
2506
  "flux-fast",
2235
2507
  "recraft",
2236
2508
  "recraft4",
2237
2509
  "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"
2510
+ "qwen"
2247
2511
  ];
2248
2512
  GENERATION_MODELS.filter((id) => MODELS[id]?.supportsEdit === true);
2249
2513
  const UTILITY_MODELS = [
@@ -2263,6 +2527,7 @@ function estimateCost(model, resolution, numImages = 1, editImages = 0) {
2263
2527
  if (configuredPrice === null) return null;
2264
2528
  if (model === "mai-image-2.5-pro" && editImages > 0) return .27 * numImages;
2265
2529
  if (model === "grok-image-2" && editImages > 0) return (resolution === "2K" || resolution === "4K" ? .08 : .06) * numImages + .01 * editImages;
2530
+ if (model === "grok-image-quality") return (resolution === "2K" || resolution === "4K" ? .07 : .05) * numImages + .01 * editImages;
2266
2531
  if (configuredPrice !== void 0) {
2267
2532
  if ((model === "banana" || model === "gemini3") && resolution === "4K") return configuredPrice * 2 * numImages;
2268
2533
  if (model === "seedream5" && (resolution === "2K" || resolution === "4K")) return configuredPrice * 2 * numImages;
@@ -2618,9 +2883,9 @@ function buildGenerateBody(options) {
2618
2883
  break;
2619
2884
  case "aspect_ratio":
2620
2885
  if (config.supportsAspect) body.aspect_ratio = aspect;
2621
- if (config.supportsResolution) body.resolution = model === "grok-image" || model === "grok-image-2" ? resolution.toLowerCase() : resolution;
2886
+ if (config.supportsResolution) body.resolution = model === "grok-image" || model === "grok-image-2" || model === "grok-image-quality" ? resolution.toLowerCase() : resolution;
2622
2887
  }
2623
- if (config.supportsQuality === true) body.quality = quality ?? "high";
2888
+ if (config.supportsQuality === true) body.quality = quality ?? config.defaultQuality ?? "high";
2624
2889
  if (config.supportsBackground === true && background) body.background = background;
2625
2890
  if (config.supportsBackground === true && transparent === true) body.background = "transparent";
2626
2891
  if (transparent === true && config.supportsOutputFormat === true) body.output_format = "png";
@@ -5048,134 +5313,7 @@ const TIERS = [
5048
5313
  ];
5049
5314
  const DEFAULT_TIER = "balanced";
5050
5315
  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
- ];
5316
+ const IMAGE_RANKED_AT = "2026-10-29";
5179
5317
  /** Every Task with a Model. A Task is absent here until it has at least one Model. */
5180
5318
  const TASKS = {
5181
5319
  animate: {
@@ -5346,10 +5484,109 @@ const TASKS = {
5346
5484
  summary: "Remove an object, person, text or clutter from an image and fill the gap."
5347
5485
  },
5348
5486
  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,
5487
+ basis: "Order follows Arena text-to-image (https://arena.ai/leaderboard/image/text-to-image), read 2026-10-29 (MOT-72). Sunburst and Flare lead quality at the benchmarked max setting. Balanced starts with Nano Banana 2.1 on preliminary Arena evidence, then Grok Image 2 and Muse Image. Models not yet on the board follow the ranked ones in their Tier, in their previous order. The Artificial Analysis v2 snapshot of 2026-10-07 stays as recorded benchmark data. 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.",
5488
+ models: [
5489
+ {
5490
+ model: "sunburst",
5491
+ tier: "quality"
5492
+ },
5493
+ {
5494
+ model: "flare",
5495
+ tier: "quality"
5496
+ },
5497
+ {
5498
+ model: "gpt2",
5499
+ tier: "quality"
5500
+ },
5501
+ {
5502
+ model: "seedream5",
5503
+ tier: "quality"
5504
+ },
5505
+ {
5506
+ model: "gpt",
5507
+ tier: "quality"
5508
+ },
5509
+ {
5510
+ model: "mai-image-2.5-pro",
5511
+ tier: "quality"
5512
+ },
5513
+ {
5514
+ model: "banana21",
5515
+ tier: "balanced"
5516
+ },
5517
+ {
5518
+ model: "grok-image-2",
5519
+ tier: "balanced"
5520
+ },
5521
+ {
5522
+ model: "muse-image",
5523
+ tier: "balanced"
5524
+ },
5525
+ {
5526
+ model: "banana2",
5527
+ tier: "balanced"
5528
+ },
5529
+ {
5530
+ model: "qwen3",
5531
+ tier: "balanced"
5532
+ },
5533
+ {
5534
+ model: "mai-image-2.5",
5535
+ tier: "balanced"
5536
+ },
5537
+ {
5538
+ model: "banana",
5539
+ tier: "balanced"
5540
+ },
5541
+ {
5542
+ model: "ideogram4",
5543
+ tier: "balanced"
5544
+ },
5545
+ {
5546
+ model: "flux2-flex",
5547
+ tier: "balanced"
5548
+ },
5549
+ {
5550
+ model: "recraft41",
5551
+ tier: "balanced"
5552
+ },
5553
+ {
5554
+ model: "flux2-pro",
5555
+ tier: "balanced"
5556
+ },
5557
+ {
5558
+ model: "krea3",
5559
+ tier: "balanced"
5560
+ },
5561
+ {
5562
+ model: "grok-image-quality",
5563
+ tier: "balanced"
5564
+ },
5565
+ {
5566
+ model: "ideogram3-transparent",
5567
+ requires: ["transparency"],
5568
+ supports: ["transparency"],
5569
+ tier: "balanced"
5570
+ },
5571
+ {
5572
+ model: "banana2-lite",
5573
+ tier: "fast"
5574
+ },
5575
+ {
5576
+ model: "grok-image",
5577
+ tier: "fast"
5578
+ },
5579
+ {
5580
+ model: "seedream5-lite",
5581
+ tier: "fast"
5582
+ },
5583
+ {
5584
+ model: "flux2-turbo",
5585
+ tier: "fast"
5586
+ }
5587
+ ],
5351
5588
  notFor: "Variations of an image you already have (vary), or a consistent set of images (series run).",
5352
- rankedAt: HAND_RANKED_AT,
5589
+ rankedAt: IMAGE_RANKED_AT,
5353
5590
  rankedFrom: "hand",
5354
5591
  summary: "Make an image from a prompt, or change an image you pass as a reference."
5355
5592
  },
@@ -5834,10 +6071,91 @@ const TASKS = {
5834
6071
  summary: "Trace a raster image to a clean SVG."
5835
6072
  },
5836
6073
  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),
6074
+ basis: "Order follows Arena image edit, single image (https://arena.ai/leaderboard/image/image-edit/single-image), read 2026-10-29 (MOT-72). Editing order differs from generation: Grok Image 2 leads balanced, ahead of Nano Banana 2.1, and Seedream 5 Pro outranks GPT Image 1.5. Arena scores Krea 3 only at its Ultra setting, which costs $0.27 to $0.35 an edit and ignores the requested size, so krea3, which runs fal's default setting, is ranked as unscored. Models not yet on the board follow the ranked ones in their Tier, in their previous order. The Artificial Analysis v2 snapshot of 2026-10-07 stays as recorded benchmark data. Sunburst and Flare use max quality. vary reuses a previously chosen Model when explicitly supplied, including retained legacy routes.",
6075
+ models: [
6076
+ {
6077
+ model: "sunburst",
6078
+ tier: "quality"
6079
+ },
6080
+ {
6081
+ model: "flare",
6082
+ tier: "quality"
6083
+ },
6084
+ {
6085
+ model: "gpt2",
6086
+ tier: "quality"
6087
+ },
6088
+ {
6089
+ model: "seedream5",
6090
+ tier: "quality"
6091
+ },
6092
+ {
6093
+ model: "gpt",
6094
+ tier: "quality"
6095
+ },
6096
+ {
6097
+ model: "mai-image-2.5-pro",
6098
+ tier: "quality"
6099
+ },
6100
+ {
6101
+ model: "grok-image-2",
6102
+ tier: "balanced"
6103
+ },
6104
+ {
6105
+ model: "banana21",
6106
+ tier: "balanced"
6107
+ },
6108
+ {
6109
+ model: "mai-image-2.5",
6110
+ tier: "balanced"
6111
+ },
6112
+ {
6113
+ model: "muse-image",
6114
+ tier: "balanced"
6115
+ },
6116
+ {
6117
+ model: "grok-image-quality",
6118
+ tier: "balanced"
6119
+ },
6120
+ {
6121
+ model: "banana",
6122
+ tier: "balanced"
6123
+ },
6124
+ {
6125
+ model: "banana2",
6126
+ tier: "balanced"
6127
+ },
6128
+ {
6129
+ model: "krea3",
6130
+ tier: "balanced"
6131
+ },
6132
+ {
6133
+ model: "qwen3",
6134
+ tier: "balanced"
6135
+ },
6136
+ {
6137
+ model: "flux2-pro",
6138
+ tier: "balanced"
6139
+ },
6140
+ {
6141
+ model: "flux2-flex",
6142
+ tier: "balanced"
6143
+ },
6144
+ {
6145
+ model: "grok-image",
6146
+ tier: "fast"
6147
+ },
6148
+ {
6149
+ model: "banana2-lite",
6150
+ tier: "fast"
6151
+ },
6152
+ {
6153
+ model: "seedream5-lite",
6154
+ tier: "fast"
6155
+ }
6156
+ ],
5839
6157
  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,
6158
+ rankedAt: IMAGE_RANKED_AT,
5841
6159
  rankedFrom: "hand",
5842
6160
  summary: "Make variations of an image you already have."
5843
6161
  }
@@ -8222,7 +8540,7 @@ function resolveFixed(task, fixed, request, needed, keys) {
8222
8540
  const { chosenBy, model } = fixed;
8223
8541
  const tier = request.tier ?? "balanced";
8224
8542
  const entries = TASKS[task].models;
8225
- const entry = entries.find((candidate) => candidate.model === model && candidate.mode === request.mode);
8543
+ const entry = entries.find((candidate) => candidate.model === model && candidate.mode === request.mode) ?? legacyEntry(task, model, request.mode, tier);
8226
8544
  const profile = modelProfile(model);
8227
8545
  if (entry === void 0 || profile === void 0) {
8228
8546
  const servesTask = entries.some((candidate) => candidate.model === model);
@@ -8235,6 +8553,14 @@ function resolveFixed(task, fixed, request, needed, keys) {
8235
8553
  unblockers.push(unblockerFor(result));
8236
8554
  return unresolved(task, result.blockedBy, unblockers, `${model} (${chosenBy}) ${describeBlock(result.blockedBy, result.missingKey, result.missingInput)}.`, result.missingKey);
8237
8555
  }
8556
+ /** Old pins and tuned Looks remain usable without recommending predecessors. */
8557
+ function legacyEntry(task, model, mode, tier) {
8558
+ if (mode !== void 0 || task !== "generate" && task !== "vary" || !LEGACY_GENERATION_MODELS.some((id) => id === model) || task === "vary" && MODELS[model]?.supportsEdit !== true) return;
8559
+ return {
8560
+ model,
8561
+ tier
8562
+ };
8563
+ }
8238
8564
  function unknownForMode(task, model, mode, entries) {
8239
8565
  const otherModes = entries.filter((candidate) => candidate.model === model).map((candidate) => candidate.mode ?? "no mode");
8240
8566
  const inMode = [...new Set(entries.filter((candidate) => candidate.mode === mode).map((candidate) => candidate.model))];
@@ -8251,7 +8577,7 @@ function resolveRanked(task, request, needed, keys) {
8251
8577
  const qualifying = /* @__PURE__ */ new Map();
8252
8578
  let firstBlock;
8253
8579
  let keyBlock;
8254
- const definition = TASKS[task];
8580
+ const definition = task === "generate" && (request.references ?? 0) > 0 ? TASKS.vary : TASKS[task];
8255
8581
  for (const entry of definition.models) {
8256
8582
  if (entry.mode !== request.mode) continue;
8257
8583
  const { model, tier: modelTier } = entry;
@@ -8400,6 +8726,8 @@ const FAL_IMAGE_PRICE_USD = {
8400
8726
  "ideogram/v4": MODELS.ideogram4?.pricePerImageUsd ?? .03,
8401
8727
  "xai/grok-imagine-image": MODELS["grok-image"]?.pricePerImageUsd ?? .02,
8402
8728
  "xai/grok-imagine-image/v2.0/text-to-image": MODELS["grok-image-2"]?.pricePerImageUsd ?? .06,
8729
+ "xai/grok-imagine-image/quality/text-to-image": MODELS["grok-image-quality"]?.pricePerImageUsd ?? .05,
8730
+ "meta/muse-image/text-to-image": MODELS["muse-image"]?.pricePerImageUsd ?? .01,
8403
8731
  "microsoft/mai-image-2.5-pro": MODELS["mai-image-2.5-pro"]?.pricePerImageUsd ?? .17,
8404
8732
  "fal-ai/ideogram/v3/generate-transparent": MODELS["ideogram3-transparent"]?.pricePerImageUsd ?? .06,
8405
8733
  "alibaba/qwen-image-3/text-to-image": MODELS.qwen3?.pricePerImageUsd ?? .04,