@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.js CHANGED
@@ -706,14 +706,31 @@ function getOpenAiKeyFromEnv(input = process.env) {
706
706
  }
707
707
  //#endregion
708
708
  //#region src/models.ts
709
- const AA_IMAGE_LEADERBOARD_SNAPSHOT = "2026-08-23";
709
+ const AA_IMAGE_LEADERBOARD_SNAPSHOT = "2026-10-07";
710
710
  const AA_IMAGE_SOURCES = ["https://artificialanalysis.ai/image/leaderboard/text-to-image", "https://artificialanalysis.ai/image/leaderboard/editing"];
711
711
  const FAL_PRICING_CHECKED_AT = "2026-05-12";
712
712
  const FAL_PRICING_CHECKED_JUL_2026 = "2026-07-11";
713
713
  const FAL_PRICING_CHECKED_AUG_2026 = "2026-08-23";
714
714
  const FAL_PRICING_CHECKED_SEP_2026 = "2026-09-16";
715
+ const FAL_PRICING_CHECKED_OCT_2026 = "2026-10-29";
715
716
  const MODELS = {
716
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",
717
734
  customImageSize: {
718
735
  maxEdge: 3840,
719
736
  maxPixels: 8294400,
@@ -750,6 +767,22 @@ const MODELS = {
750
767
  useQueue: true
751
768
  },
752
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",
753
786
  customImageSize: {
754
787
  maxEdge: 3840,
755
788
  maxPixels: 8294400,
@@ -789,14 +822,14 @@ const MODELS = {
789
822
  benchmark: {
790
823
  artificialAnalysis: {
791
824
  editing: {
792
- elo: 1256,
793
- rank: 3
825
+ elo: 1125,
826
+ rank: 5
794
827
  },
795
828
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
796
829
  sourceUrls: AA_IMAGE_SOURCES,
797
830
  textToImage: {
798
- elo: 1369,
799
- rank: 1
831
+ elo: 1172,
832
+ rank: 3
800
833
  }
801
834
  },
802
835
  speed: {
@@ -809,7 +842,7 @@ const MODELS = {
809
842
  quality: "frontier",
810
843
  speed: "very_slow"
811
844
  },
812
- useCase: "Highest-ranked text-to-image quality and transparent PNGs"
845
+ useCase: "Established frontier generation and transparent PNGs"
813
846
  },
814
847
  customImageSize: {
815
848
  maxEdge: 3840,
@@ -860,14 +893,14 @@ const MODELS = {
860
893
  benchmark: {
861
894
  artificialAnalysis: {
862
895
  editing: {
863
- elo: 1250,
864
- rank: 5
896
+ elo: 1103,
897
+ rank: 12
865
898
  },
866
899
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
867
900
  sourceUrls: AA_IMAGE_SOURCES,
868
901
  textToImage: {
869
- elo: 1310,
870
- rank: 4
902
+ elo: 1107,
903
+ rank: 8
871
904
  }
872
905
  },
873
906
  speed: {
@@ -880,7 +913,7 @@ const MODELS = {
880
913
  quality: "frontier",
881
914
  speed: "slow"
882
915
  },
883
- useCase: "Best OpenAI edit quality with transparent PNG support"
916
+ useCase: "Established OpenAI editor with transparent PNG support"
884
917
  },
885
918
  editEndpoint: "fal-ai/gpt-image-1.5/edit",
886
919
  endpoint: "fal-ai/gpt-image-1.5",
@@ -913,18 +946,103 @@ const MODELS = {
913
946
  supportsSyncMode: true,
914
947
  type: "generation"
915
948
  },
916
- 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": {
917
994
  benchmark: {
918
995
  artificialAnalysis: {
919
996
  editing: {
920
- elo: 1249,
997
+ elo: 1114,
921
998
  rank: 7
922
999
  },
923
1000
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
924
1001
  sourceUrls: AA_IMAGE_SOURCES,
925
1002
  textToImage: {
926
- elo: 1320,
927
- 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
928
1046
  }
929
1047
  },
930
1048
  tiers: {
@@ -932,7 +1050,7 @@ const MODELS = {
932
1050
  quality: "frontier",
933
1051
  speed: "unknown"
934
1052
  },
935
- useCase: "Best balance of quality, edit support, web search, and cost"
1053
+ useCase: "Previous-generation Gemini workhorse; retains 0.5K output"
936
1054
  },
937
1055
  editEndpoint: "fal-ai/nano-banana-2/edit",
938
1056
  endpoint: "fal-ai/nano-banana-2",
@@ -968,14 +1086,14 @@ const MODELS = {
968
1086
  benchmark: {
969
1087
  artificialAnalysis: {
970
1088
  editing: {
971
- elo: 1245,
972
- rank: 9
1089
+ elo: 1101,
1090
+ rank: 13
973
1091
  },
974
1092
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
975
1093
  sourceUrls: AA_IMAGE_SOURCES,
976
1094
  textToImage: {
977
- elo: 1297,
978
- rank: 6
1095
+ elo: 1102,
1096
+ rank: 11
979
1097
  }
980
1098
  },
981
1099
  speed: {
@@ -1040,11 +1158,15 @@ const MODELS = {
1040
1158
  gemini: {
1041
1159
  benchmark: { artificialAnalysis: {
1042
1160
  editing: {
1043
- elo: 1180,
1044
- rank: 29
1161
+ elo: 987,
1162
+ rank: 50
1045
1163
  },
1046
1164
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1047
- sourceUrls: AA_IMAGE_SOURCES
1165
+ sourceUrls: AA_IMAGE_SOURCES,
1166
+ textToImage: {
1167
+ elo: 985,
1168
+ rank: 60
1169
+ }
1048
1170
  } },
1049
1171
  editEndpoint: "fal-ai/gemini-25-flash-image/edit",
1050
1172
  endpoint: "fal-ai/gemini-25-flash-image",
@@ -1085,18 +1207,6 @@ const MODELS = {
1085
1207
  type: "generation"
1086
1208
  },
1087
1209
  gemini3: {
1088
- benchmark: { artificialAnalysis: {
1089
- editing: {
1090
- elo: 1245,
1091
- rank: 9
1092
- },
1093
- snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1094
- sourceUrls: AA_IMAGE_SOURCES,
1095
- textToImage: {
1096
- elo: 1297,
1097
- rank: 6
1098
- }
1099
- } },
1100
1210
  editEndpoint: "fal-ai/gemini-3-pro-image-preview/edit",
1101
1211
  endpoint: "fal-ai/gemini-3-pro-image-preview",
1102
1212
  falPricing: {
@@ -1146,14 +1256,14 @@ const MODELS = {
1146
1256
  benchmark: {
1147
1257
  artificialAnalysis: {
1148
1258
  editing: {
1149
- elo: 1185,
1150
- rank: 28
1259
+ elo: 1015,
1260
+ rank: 36
1151
1261
  },
1152
1262
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1153
1263
  sourceUrls: AA_IMAGE_SOURCES,
1154
1264
  textToImage: {
1155
- elo: 1226,
1156
- rank: 16
1265
+ elo: 1030,
1266
+ rank: 21
1157
1267
  }
1158
1268
  },
1159
1269
  speed: {
@@ -1166,7 +1276,7 @@ const MODELS = {
1166
1276
  quality: "best",
1167
1277
  speed: "balanced"
1168
1278
  },
1169
- useCase: "High-ranked budget generation and large multi-reference edits"
1279
+ useCase: "Legacy budget generation and large multi-reference edits"
1170
1280
  },
1171
1281
  customImageSize: {
1172
1282
  maxPixels: 16777216,
@@ -1200,14 +1310,14 @@ const MODELS = {
1200
1310
  benchmark: {
1201
1311
  artificialAnalysis: {
1202
1312
  editing: {
1203
- elo: 1186,
1204
- rank: 26
1313
+ elo: 1037,
1314
+ rank: 32
1205
1315
  },
1206
1316
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1207
1317
  sourceUrls: AA_IMAGE_SOURCES,
1208
1318
  textToImage: {
1209
- elo: 1203,
1210
- rank: 32
1319
+ elo: 1022,
1320
+ rank: 26
1211
1321
  }
1212
1322
  },
1213
1323
  speed: {
@@ -1253,14 +1363,14 @@ const MODELS = {
1253
1363
  seedream5: {
1254
1364
  benchmark: { artificialAnalysis: {
1255
1365
  editing: {
1256
- elo: 1248,
1257
- rank: 8
1366
+ elo: 1108,
1367
+ rank: 11
1258
1368
  },
1259
1369
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1260
1370
  sourceUrls: AA_IMAGE_SOURCES,
1261
1371
  textToImage: {
1262
- elo: 1279,
1263
- rank: 10
1372
+ elo: 1081,
1373
+ rank: 15
1264
1374
  }
1265
1375
  } },
1266
1376
  customImageSize: {
@@ -1295,11 +1405,15 @@ const MODELS = {
1295
1405
  "seedream5-lite": {
1296
1406
  benchmark: { artificialAnalysis: {
1297
1407
  editing: {
1298
- elo: 1169,
1299
- rank: 32
1408
+ elo: 1057,
1409
+ rank: 24
1300
1410
  },
1301
1411
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1302
- sourceUrls: AA_IMAGE_SOURCES
1412
+ sourceUrls: AA_IMAGE_SOURCES,
1413
+ textToImage: {
1414
+ elo: 1012,
1415
+ rank: 36
1416
+ }
1303
1417
  } },
1304
1418
  customImageSize: {
1305
1419
  maxPixels: 16777216,
@@ -1333,14 +1447,14 @@ const MODELS = {
1333
1447
  benchmark: {
1334
1448
  artificialAnalysis: {
1335
1449
  editing: {
1336
- elo: 1201,
1337
- rank: 19
1450
+ elo: 997,
1451
+ rank: 49
1338
1452
  },
1339
1453
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1340
1454
  sourceUrls: AA_IMAGE_SOURCES,
1341
1455
  textToImage: {
1342
- elo: 1225,
1343
- rank: 17
1456
+ elo: 1020,
1457
+ rank: 28
1344
1458
  }
1345
1459
  },
1346
1460
  speed: {
@@ -1392,14 +1506,14 @@ const MODELS = {
1392
1506
  benchmark: {
1393
1507
  artificialAnalysis: {
1394
1508
  editing: {
1395
- elo: 1170,
1396
- rank: 31
1509
+ elo: 1007,
1510
+ rank: 41
1397
1511
  },
1398
1512
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1399
1513
  sourceUrls: AA_IMAGE_SOURCES,
1400
1514
  textToImage: {
1401
- elo: 1207,
1402
- rank: 30
1515
+ elo: 1004,
1516
+ rank: 41
1403
1517
  }
1404
1518
  },
1405
1519
  speed: {
@@ -1450,11 +1564,15 @@ const MODELS = {
1450
1564
  "flux2-flex": {
1451
1565
  benchmark: {
1452
1566
  artificialAnalysis: {
1567
+ editing: {
1568
+ elo: 1007,
1569
+ rank: 42
1570
+ },
1453
1571
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1454
1572
  sourceUrls: AA_IMAGE_SOURCES,
1455
1573
  textToImage: {
1456
- elo: 1223,
1457
- rank: 18
1574
+ elo: 1027,
1575
+ rank: 22
1458
1576
  }
1459
1577
  },
1460
1578
  speed: {
@@ -1508,8 +1626,16 @@ const MODELS = {
1508
1626
  "flux2-dev": {
1509
1627
  benchmark: {
1510
1628
  artificialAnalysis: {
1629
+ editing: {
1630
+ elo: 1e3,
1631
+ rank: 45
1632
+ },
1511
1633
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1512
- sourceUrls: AA_IMAGE_SOURCES
1634
+ sourceUrls: AA_IMAGE_SOURCES,
1635
+ textToImage: {
1636
+ elo: 1e3,
1637
+ rank: 42
1638
+ }
1513
1639
  },
1514
1640
  speed: {
1515
1641
  medianSeconds: 4.6,
@@ -1672,24 +1798,12 @@ const MODELS = {
1672
1798
  },
1673
1799
  reve: {
1674
1800
  benchmark: {
1675
- artificialAnalysis: {
1676
- editing: {
1677
- elo: 1263,
1678
- rank: 2
1679
- },
1680
- snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1681
- sourceUrls: AA_IMAGE_SOURCES,
1682
- textToImage: {
1683
- elo: 1322,
1684
- rank: 2
1685
- }
1686
- },
1687
1801
  tiers: {
1688
1802
  price: "premium",
1689
1803
  quality: "frontier",
1690
1804
  speed: "unknown"
1691
1805
  },
1692
- useCase: "Highest-ranked editor reachable on fal; strong prompt adherence and text rendering"
1806
+ useCase: "Historical Reve route; not currently verified on fal"
1693
1807
  },
1694
1808
  editEndpoint: "fal-ai/reve/edit",
1695
1809
  endpoint: "fal-ai/reve/text-to-image",
@@ -1730,8 +1844,8 @@ const MODELS = {
1730
1844
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1731
1845
  sourceUrls: AA_IMAGE_SOURCES,
1732
1846
  textToImage: {
1733
- elo: 1215,
1734
- rank: 25
1847
+ elo: 984,
1848
+ rank: 62
1735
1849
  }
1736
1850
  } },
1737
1851
  customImageSize: {},
@@ -1789,8 +1903,8 @@ const MODELS = {
1789
1903
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1790
1904
  sourceUrls: AA_IMAGE_SOURCES,
1791
1905
  textToImage: {
1792
- elo: 1220,
1793
- rank: 19
1906
+ elo: 1004,
1907
+ rank: 40
1794
1908
  }
1795
1909
  } },
1796
1910
  customImageSize: {
@@ -1828,14 +1942,14 @@ const MODELS = {
1828
1942
  benchmark: {
1829
1943
  artificialAnalysis: {
1830
1944
  editing: {
1831
- elo: 1214,
1832
- rank: 16
1945
+ elo: 1073,
1946
+ rank: 19
1833
1947
  },
1834
1948
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1835
1949
  sourceUrls: AA_IMAGE_SOURCES,
1836
1950
  textToImage: {
1837
- elo: 1216,
1838
- rank: 23
1951
+ elo: 1019,
1952
+ rank: 30
1839
1953
  }
1840
1954
  },
1841
1955
  speed: {
@@ -1888,7 +2002,11 @@ const MODELS = {
1888
2002
  benchmark: {
1889
2003
  artificialAnalysis: {
1890
2004
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1891
- sourceUrls: AA_IMAGE_SOURCES
2005
+ sourceUrls: AA_IMAGE_SOURCES,
2006
+ textToImage: {
2007
+ elo: 890,
2008
+ rank: 106
2009
+ }
1892
2010
  },
1893
2011
  speed: {
1894
2012
  medianSeconds: 23.3,
@@ -1930,14 +2048,14 @@ const MODELS = {
1930
2048
  benchmark: {
1931
2049
  artificialAnalysis: {
1932
2050
  editing: {
1933
- elo: 1218,
1934
- rank: 15
2051
+ elo: 1056,
2052
+ rank: 25
1935
2053
  },
1936
2054
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1937
2055
  sourceUrls: AA_IMAGE_SOURCES,
1938
2056
  textToImage: {
1939
- elo: 1272,
1940
- rank: 11
2057
+ elo: 1075,
2058
+ rank: 16
1941
2059
  }
1942
2060
  },
1943
2061
  tiers: {
@@ -1945,12 +2063,13 @@ const MODELS = {
1945
2063
  quality: "better",
1946
2064
  speed: "unknown"
1947
2065
  },
1948
- useCase: "Strong quality per dollar - 11th on text-to-image at $30/1k"
2066
+ useCase: "Strong generation with negative-prompt and seed controls"
1949
2067
  },
1950
2068
  customImageSize: {
1951
2069
  maxPixels: 4194304,
1952
2070
  minPixels: 262144
1953
2071
  },
2072
+ editEndpoint: "alibaba/qwen-image-3/edit",
1954
2073
  endpoint: "alibaba/qwen-image-3/text-to-image",
1955
2074
  falPricing: {
1956
2075
  checkedAt: FAL_PRICING_CHECKED_SEP_2026,
@@ -1961,12 +2080,13 @@ const MODELS = {
1961
2080
  unit: "images",
1962
2081
  unitPrice: .04
1963
2082
  },
2083
+ maxReferenceImages: 3,
1964
2084
  name: "Qwen Image 3",
1965
2085
  pricePerImageUsd: .04,
1966
2086
  pricing: "$0.04 (1K) / $0.075 (2K)",
1967
2087
  sizeMode: "image_size_enum",
1968
2088
  supportsAspect: true,
1969
- supportsEdit: false,
2089
+ supportsEdit: true,
1970
2090
  supportsNegativePrompt: true,
1971
2091
  supportsNumImages: true,
1972
2092
  supportsOutputFormat: true,
@@ -1979,17 +2099,17 @@ const MODELS = {
1979
2099
  benchmark: {
1980
2100
  artificialAnalysis: {
1981
2101
  editing: {
1982
- elo: 1272,
1983
- rank: 1
2102
+ elo: 1110,
2103
+ rank: 10
1984
2104
  },
1985
2105
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
1986
2106
  sourceUrls: AA_IMAGE_SOURCES,
1987
2107
  textToImage: {
1988
- elo: 1293,
1989
- rank: 7
2108
+ elo: 1100,
2109
+ rank: 12
1990
2110
  }
1991
2111
  },
1992
- useCase: "Highest-ranked image editor, single reference image"
2112
+ useCase: "Strong single-reference editor; MAI 2.5 ranks higher on the current editing board"
1993
2113
  },
1994
2114
  editEndpoint: "microsoft/mai-image-2.5-pro/edit",
1995
2115
  editImagesField: "image_url",
@@ -2028,20 +2148,26 @@ const MODELS = {
2028
2148
  },
2029
2149
  "banana2-lite": {
2030
2150
  benchmark: { artificialAnalysis: {
2151
+ editing: {
2152
+ elo: 1046,
2153
+ rank: 26
2154
+ },
2031
2155
  snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
2032
2156
  sourceUrls: AA_IMAGE_SOURCES,
2033
2157
  textToImage: {
2034
- elo: 1289,
2035
- rank: 8
2158
+ elo: 1095,
2159
+ rank: 13
2036
2160
  }
2037
2161
  } },
2162
+ editEndpoint: "google/nano-banana-2-lite/edit",
2163
+ maxReferenceImages: 14,
2038
2164
  endpoint: "google/nano-banana-2-lite",
2039
2165
  name: "Nano Banana 2 Lite",
2040
- 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)",
2041
- pricePerImageUsd: .048,
2166
+ 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)",
2167
+ pricePerImageUsd: null,
2042
2168
  sizeMode: "aspect_ratio",
2043
2169
  supportsAspect: true,
2044
- supportsEdit: false,
2170
+ supportsEdit: true,
2045
2171
  supportsLimitGenerations: true,
2046
2172
  supportsNumImages: true,
2047
2173
  supportsOutputFormat: true,
@@ -2114,6 +2240,21 @@ const MODELS = {
2114
2240
  type: "generation"
2115
2241
  },
2116
2242
  "grok-image-2": {
2243
+ benchmark: {
2244
+ artificialAnalysis: {
2245
+ editing: {
2246
+ elo: 1110,
2247
+ rank: 8
2248
+ },
2249
+ snapshotDate: AA_IMAGE_LEADERBOARD_SNAPSHOT,
2250
+ sourceUrls: AA_IMAGE_SOURCES,
2251
+ textToImage: {
2252
+ elo: 1156,
2253
+ rank: 4
2254
+ }
2255
+ },
2256
+ useCase: "Strong generation and editing with predictable per-image billing"
2257
+ },
2117
2258
  editEndpoint: "xai/grok-imagine-image/v2.0/edit",
2118
2259
  endpoint: "xai/grok-imagine-image/v2.0/text-to-image",
2119
2260
  falPricing: {
@@ -2148,6 +2289,120 @@ const MODELS = {
2148
2289
  supportsSyncMode: true,
2149
2290
  type: "generation"
2150
2291
  },
2292
+ "muse-image": {
2293
+ benchmark: { useCase: "Low-cost generation and multi-reference editing; Arena #8 generation / #10 editing, 2026-10-29" },
2294
+ editEndpoint: "meta/muse-image/edit",
2295
+ endpoint: "meta/muse-image/text-to-image",
2296
+ falPricing: {
2297
+ checkedAt: FAL_PRICING_CHECKED_OCT_2026,
2298
+ currency: "USD",
2299
+ endpointId: "meta/muse-image/text-to-image",
2300
+ estimatedCostPerImageUsd: .01,
2301
+ source: "fal-pricing-api",
2302
+ unit: "images",
2303
+ unitPrice: .01
2304
+ },
2305
+ maxReferenceImages: 10,
2306
+ name: "Meta Muse Image",
2307
+ pricePerImageUsd: .01,
2308
+ pricing: "$0.01",
2309
+ sizeMode: "aspect_ratio",
2310
+ supportedAspects: [
2311
+ "1:1",
2312
+ "4:3",
2313
+ "3:4",
2314
+ "16:9",
2315
+ "9:16",
2316
+ "3:2",
2317
+ "2:3",
2318
+ "4:5",
2319
+ "5:4",
2320
+ "21:9",
2321
+ "4:1",
2322
+ "1:4",
2323
+ "8:1",
2324
+ "1:8"
2325
+ ],
2326
+ supportsAspect: true,
2327
+ supportsEdit: true,
2328
+ supportsNumImages: true,
2329
+ supportsOutputFormat: true,
2330
+ supportsResolution: false,
2331
+ supportsSyncMode: true,
2332
+ type: "generation"
2333
+ },
2334
+ krea3: {
2335
+ 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" },
2336
+ customImageSize: {
2337
+ maxEdge: 3200,
2338
+ maxPixels: 4220160,
2339
+ minEdge: 256,
2340
+ multipleOf: 16
2341
+ },
2342
+ editEndpoint: "krea/v3/edit",
2343
+ endpoint: "krea/v3/text-to-image",
2344
+ falPricing: {
2345
+ checkedAt: FAL_PRICING_CHECKED_OCT_2026,
2346
+ currency: "USD",
2347
+ endpointId: "krea/v3/text-to-image",
2348
+ estimatedCostPerImageUsd: .025,
2349
+ source: "fal-pricing-api",
2350
+ unit: "megapixels",
2351
+ unitPrice: .025
2352
+ },
2353
+ maxReferenceImages: 8,
2354
+ name: "Krea 3",
2355
+ pricePerImageUsd: .025,
2356
+ pricing: "$0.025/MP (edits also bill each reference)",
2357
+ sizeMode: "image_size_enum",
2358
+ supportedOutputFormats: ["png", "jpeg"],
2359
+ supportsAspect: true,
2360
+ supportsEdit: true,
2361
+ supportsNegativePrompt: true,
2362
+ supportsNumImages: false,
2363
+ supportsOutputFormat: true,
2364
+ supportsResolution: false,
2365
+ supportsSafetyChecker: true,
2366
+ supportsSeed: true,
2367
+ supportsSyncMode: true,
2368
+ type: "generation"
2369
+ },
2370
+ "grok-image-quality": {
2371
+ benchmark: { useCase: "Detailed generation and editing with stronger text rendering; Arena #11 editing, 2026-10-29" },
2372
+ editEndpoint: "xai/grok-imagine-image/quality/edit",
2373
+ endpoint: "xai/grok-imagine-image/quality/text-to-image",
2374
+ falPricing: {
2375
+ checkedAt: FAL_PRICING_CHECKED_OCT_2026,
2376
+ currency: "USD",
2377
+ endpointId: "xai/grok-imagine-image/quality/text-to-image",
2378
+ estimatedCostPerImageUsd: .05,
2379
+ source: "fal-pricing-api",
2380
+ unit: "images",
2381
+ unitPrice: .05
2382
+ },
2383
+ maxReferenceImages: 3,
2384
+ name: "Grok Imagine Image Quality",
2385
+ pricePerImageUsd: .05,
2386
+ pricing: "$0.05 (1K) / $0.07 (2K)",
2387
+ sizeMode: "aspect_ratio",
2388
+ supportedAspects: [
2389
+ "16:9",
2390
+ "4:3",
2391
+ "3:2",
2392
+ "1:1",
2393
+ "2:3",
2394
+ "3:4",
2395
+ "9:16"
2396
+ ],
2397
+ supportedResolutions: ["1K", "2K"],
2398
+ supportsAspect: true,
2399
+ supportsEdit: true,
2400
+ supportsNumImages: true,
2401
+ supportsOutputFormat: true,
2402
+ supportsResolution: true,
2403
+ supportsSyncMode: true,
2404
+ type: "generation"
2405
+ },
2151
2406
  kling: {
2152
2407
  endpoint: "fal-ai/kling-video/v3/pro/image-to-video",
2153
2408
  name: "Kling v3 Pro",
@@ -2211,38 +2466,47 @@ const MODELS = {
2211
2466
  type: "utility"
2212
2467
  }
2213
2468
  };
2469
+ /** Curated generation choices; predecessor routes are explicit-only. */
2214
2470
  const GENERATION_MODELS = [
2215
- "flare",
2216
2471
  "sunburst",
2472
+ "flare",
2217
2473
  "gpt2",
2218
2474
  "gpt",
2475
+ "banana21",
2219
2476
  "banana2",
2220
2477
  "banana",
2478
+ "mai-image-2.5",
2479
+ "mai-image-2.5-pro",
2480
+ "seedream5",
2481
+ "qwen3",
2482
+ "banana2-lite",
2483
+ "grok-image-2",
2484
+ "grok-image-quality",
2485
+ "grok-image",
2486
+ "muse-image",
2487
+ "krea3",
2488
+ "flux2-flex",
2489
+ "flux2-pro",
2490
+ "flux2-turbo",
2491
+ "seedream5-lite",
2492
+ "ideogram4",
2493
+ "ideogram3-transparent",
2494
+ "recraft41"
2495
+ ];
2496
+ /** Retained for old pins, explicit overrides and tuned Looks, never auto-selected. */
2497
+ const LEGACY_GENERATION_MODELS = [
2221
2498
  "gemini",
2222
2499
  "gemini3",
2223
2500
  "seedream4",
2224
2501
  "seedream45",
2225
- "seedream5",
2226
- "seedream5-lite",
2227
2502
  "flux2-max",
2228
- "flux2-pro",
2229
- "flux2-flex",
2230
2503
  "flux2-dev",
2231
- "flux2-turbo",
2232
2504
  "flux",
2233
2505
  "flux-fast",
2234
2506
  "recraft",
2235
2507
  "recraft4",
2236
2508
  "ideogram",
2237
- "ideogram4",
2238
- "grok-image",
2239
- "grok-image-2",
2240
- "qwen",
2241
- "qwen3",
2242
- "mai-image-2.5-pro",
2243
- "banana2-lite",
2244
- "ideogram3-transparent",
2245
- "recraft41"
2509
+ "qwen"
2246
2510
  ];
2247
2511
  GENERATION_MODELS.filter((id) => MODELS[id]?.supportsEdit === true);
2248
2512
  const UTILITY_MODELS = [
@@ -2262,6 +2526,7 @@ function estimateCost(model, resolution, numImages = 1, editImages = 0) {
2262
2526
  if (configuredPrice === null) return null;
2263
2527
  if (model === "mai-image-2.5-pro" && editImages > 0) return .27 * numImages;
2264
2528
  if (model === "grok-image-2" && editImages > 0) return (resolution === "2K" || resolution === "4K" ? .08 : .06) * numImages + .01 * editImages;
2529
+ if (model === "grok-image-quality") return (resolution === "2K" || resolution === "4K" ? .07 : .05) * numImages + .01 * editImages;
2265
2530
  if (configuredPrice !== void 0) {
2266
2531
  if ((model === "banana" || model === "gemini3") && resolution === "4K") return configuredPrice * 2 * numImages;
2267
2532
  if (model === "seedream5" && (resolution === "2K" || resolution === "4K")) return configuredPrice * 2 * numImages;
@@ -2617,9 +2882,9 @@ function buildGenerateBody(options) {
2617
2882
  break;
2618
2883
  case "aspect_ratio":
2619
2884
  if (config.supportsAspect) body.aspect_ratio = aspect;
2620
- if (config.supportsResolution) body.resolution = model === "grok-image" || model === "grok-image-2" ? resolution.toLowerCase() : resolution;
2885
+ if (config.supportsResolution) body.resolution = model === "grok-image" || model === "grok-image-2" || model === "grok-image-quality" ? resolution.toLowerCase() : resolution;
2621
2886
  }
2622
- if (config.supportsQuality === true) body.quality = quality ?? "high";
2887
+ if (config.supportsQuality === true) body.quality = quality ?? config.defaultQuality ?? "high";
2623
2888
  if (config.supportsBackground === true && background) body.background = background;
2624
2889
  if (config.supportsBackground === true && transparent === true) body.background = "transparent";
2625
2890
  if (transparent === true && config.supportsOutputFormat === true) body.output_format = "png";
@@ -5047,134 +5312,7 @@ const TIERS = [
5047
5312
  ];
5048
5313
  const DEFAULT_TIER = "balanced";
5049
5314
  const HAND_RANKED_AT = "2026-09-16";
5050
- const GENERATION_MODELS_RANKED = [
5051
- {
5052
- model: "gpt2",
5053
- tier: "quality"
5054
- },
5055
- {
5056
- model: "banana2",
5057
- tier: "quality"
5058
- },
5059
- {
5060
- model: "gpt",
5061
- tier: "quality"
5062
- },
5063
- {
5064
- model: "sunburst",
5065
- tier: "quality"
5066
- },
5067
- {
5068
- model: "gemini3",
5069
- tier: "quality"
5070
- },
5071
- {
5072
- model: "mai-image-2.5-pro",
5073
- tier: "quality"
5074
- },
5075
- {
5076
- model: "seedream5",
5077
- tier: "quality"
5078
- },
5079
- {
5080
- model: "flux2-max",
5081
- tier: "quality"
5082
- },
5083
- {
5084
- model: "banana",
5085
- tier: "balanced"
5086
- },
5087
- {
5088
- model: "ideogram3-transparent",
5089
- requires: ["transparency"],
5090
- supports: ["transparency"],
5091
- tier: "balanced"
5092
- },
5093
- {
5094
- model: "flare",
5095
- tier: "balanced"
5096
- },
5097
- {
5098
- model: "banana2-lite",
5099
- tier: "balanced"
5100
- },
5101
- {
5102
- model: "qwen3",
5103
- tier: "balanced"
5104
- },
5105
- {
5106
- model: "seedream4",
5107
- tier: "balanced"
5108
- },
5109
- {
5110
- model: "flux2-flex",
5111
- tier: "balanced"
5112
- },
5113
- {
5114
- model: "ideogram4",
5115
- tier: "balanced"
5116
- },
5117
- {
5118
- model: "grok-image",
5119
- tier: "balanced"
5120
- },
5121
- {
5122
- model: "recraft4",
5123
- tier: "balanced"
5124
- },
5125
- {
5126
- model: "flux2-pro",
5127
- tier: "balanced"
5128
- },
5129
- {
5130
- model: "seedream45",
5131
- tier: "balanced"
5132
- },
5133
- {
5134
- model: "grok-image-2",
5135
- tier: "balanced"
5136
- },
5137
- {
5138
- model: "recraft41",
5139
- tier: "balanced"
5140
- },
5141
- {
5142
- model: "flux2-turbo",
5143
- tier: "fast"
5144
- },
5145
- {
5146
- model: "flux2-dev",
5147
- tier: "fast"
5148
- },
5149
- {
5150
- model: "flux-fast",
5151
- tier: "fast"
5152
- },
5153
- {
5154
- model: "seedream5-lite",
5155
- tier: "fast"
5156
- },
5157
- {
5158
- model: "gemini",
5159
- tier: "fast"
5160
- },
5161
- {
5162
- model: "qwen",
5163
- tier: "fast"
5164
- },
5165
- {
5166
- model: "ideogram",
5167
- tier: "fast"
5168
- },
5169
- {
5170
- model: "recraft",
5171
- tier: "fast"
5172
- },
5173
- {
5174
- model: "flux",
5175
- tier: "fast"
5176
- }
5177
- ];
5315
+ const IMAGE_RANKED_AT = "2026-10-29";
5178
5316
  /** Every Task with a Model. A Task is absent here until it has at least one Model. */
5179
5317
  const TASKS = {
5180
5318
  animate: {
@@ -5345,10 +5483,109 @@ const TASKS = {
5345
5483
  summary: "Remove an object, person, text or clutter from an image and fill the gap."
5346
5484
  },
5347
5485
  generate: {
5348
- 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.",
5349
- models: GENERATION_MODELS_RANKED,
5486
+ 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.",
5487
+ models: [
5488
+ {
5489
+ model: "sunburst",
5490
+ tier: "quality"
5491
+ },
5492
+ {
5493
+ model: "flare",
5494
+ tier: "quality"
5495
+ },
5496
+ {
5497
+ model: "gpt2",
5498
+ tier: "quality"
5499
+ },
5500
+ {
5501
+ model: "seedream5",
5502
+ tier: "quality"
5503
+ },
5504
+ {
5505
+ model: "gpt",
5506
+ tier: "quality"
5507
+ },
5508
+ {
5509
+ model: "mai-image-2.5-pro",
5510
+ tier: "quality"
5511
+ },
5512
+ {
5513
+ model: "banana21",
5514
+ tier: "balanced"
5515
+ },
5516
+ {
5517
+ model: "grok-image-2",
5518
+ tier: "balanced"
5519
+ },
5520
+ {
5521
+ model: "muse-image",
5522
+ tier: "balanced"
5523
+ },
5524
+ {
5525
+ model: "banana2",
5526
+ tier: "balanced"
5527
+ },
5528
+ {
5529
+ model: "qwen3",
5530
+ tier: "balanced"
5531
+ },
5532
+ {
5533
+ model: "mai-image-2.5",
5534
+ tier: "balanced"
5535
+ },
5536
+ {
5537
+ model: "banana",
5538
+ tier: "balanced"
5539
+ },
5540
+ {
5541
+ model: "ideogram4",
5542
+ tier: "balanced"
5543
+ },
5544
+ {
5545
+ model: "flux2-flex",
5546
+ tier: "balanced"
5547
+ },
5548
+ {
5549
+ model: "recraft41",
5550
+ tier: "balanced"
5551
+ },
5552
+ {
5553
+ model: "flux2-pro",
5554
+ tier: "balanced"
5555
+ },
5556
+ {
5557
+ model: "krea3",
5558
+ tier: "balanced"
5559
+ },
5560
+ {
5561
+ model: "grok-image-quality",
5562
+ tier: "balanced"
5563
+ },
5564
+ {
5565
+ model: "ideogram3-transparent",
5566
+ requires: ["transparency"],
5567
+ supports: ["transparency"],
5568
+ tier: "balanced"
5569
+ },
5570
+ {
5571
+ model: "banana2-lite",
5572
+ tier: "fast"
5573
+ },
5574
+ {
5575
+ model: "grok-image",
5576
+ tier: "fast"
5577
+ },
5578
+ {
5579
+ model: "seedream5-lite",
5580
+ tier: "fast"
5581
+ },
5582
+ {
5583
+ model: "flux2-turbo",
5584
+ tier: "fast"
5585
+ }
5586
+ ],
5350
5587
  notFor: "Variations of an image you already have (vary), or a consistent set of images (series run).",
5351
- rankedAt: HAND_RANKED_AT,
5588
+ rankedAt: IMAGE_RANKED_AT,
5352
5589
  rankedFrom: "hand",
5353
5590
  summary: "Make an image from a prompt, or change an image you pass as a reference."
5354
5591
  },
@@ -5833,10 +6070,91 @@ const TASKS = {
5833
6070
  summary: "Trace a raster image to a clean SVG."
5834
6071
  },
5835
6072
  vary: {
5836
- basis: "The generate ranking, filtered to Models that can edit. vary reuses the Model of the image it varies while Motif still offers it.",
5837
- models: GENERATION_MODELS_RANKED.filter(({ model }) => MODELS[model]?.supportsEdit === true),
6073
+ 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.",
6074
+ models: [
6075
+ {
6076
+ model: "sunburst",
6077
+ tier: "quality"
6078
+ },
6079
+ {
6080
+ model: "flare",
6081
+ tier: "quality"
6082
+ },
6083
+ {
6084
+ model: "gpt2",
6085
+ tier: "quality"
6086
+ },
6087
+ {
6088
+ model: "seedream5",
6089
+ tier: "quality"
6090
+ },
6091
+ {
6092
+ model: "gpt",
6093
+ tier: "quality"
6094
+ },
6095
+ {
6096
+ model: "mai-image-2.5-pro",
6097
+ tier: "quality"
6098
+ },
6099
+ {
6100
+ model: "grok-image-2",
6101
+ tier: "balanced"
6102
+ },
6103
+ {
6104
+ model: "banana21",
6105
+ tier: "balanced"
6106
+ },
6107
+ {
6108
+ model: "mai-image-2.5",
6109
+ tier: "balanced"
6110
+ },
6111
+ {
6112
+ model: "muse-image",
6113
+ tier: "balanced"
6114
+ },
6115
+ {
6116
+ model: "grok-image-quality",
6117
+ tier: "balanced"
6118
+ },
6119
+ {
6120
+ model: "banana",
6121
+ tier: "balanced"
6122
+ },
6123
+ {
6124
+ model: "banana2",
6125
+ tier: "balanced"
6126
+ },
6127
+ {
6128
+ model: "krea3",
6129
+ tier: "balanced"
6130
+ },
6131
+ {
6132
+ model: "qwen3",
6133
+ tier: "balanced"
6134
+ },
6135
+ {
6136
+ model: "flux2-pro",
6137
+ tier: "balanced"
6138
+ },
6139
+ {
6140
+ model: "flux2-flex",
6141
+ tier: "balanced"
6142
+ },
6143
+ {
6144
+ model: "grok-image",
6145
+ tier: "fast"
6146
+ },
6147
+ {
6148
+ model: "banana2-lite",
6149
+ tier: "fast"
6150
+ },
6151
+ {
6152
+ model: "seedream5-lite",
6153
+ tier: "fast"
6154
+ }
6155
+ ],
5838
6156
  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).",
5839
- rankedAt: HAND_RANKED_AT,
6157
+ rankedAt: IMAGE_RANKED_AT,
5840
6158
  rankedFrom: "hand",
5841
6159
  summary: "Make variations of an image you already have."
5842
6160
  }
@@ -8221,7 +8539,7 @@ function resolveFixed(task, fixed, request, needed, keys) {
8221
8539
  const { chosenBy, model } = fixed;
8222
8540
  const tier = request.tier ?? "balanced";
8223
8541
  const entries = TASKS[task].models;
8224
- const entry = entries.find((candidate) => candidate.model === model && candidate.mode === request.mode);
8542
+ const entry = entries.find((candidate) => candidate.model === model && candidate.mode === request.mode) ?? legacyEntry(task, model, request.mode, tier);
8225
8543
  const profile = modelProfile(model);
8226
8544
  if (entry === void 0 || profile === void 0) {
8227
8545
  const servesTask = entries.some((candidate) => candidate.model === model);
@@ -8234,6 +8552,14 @@ function resolveFixed(task, fixed, request, needed, keys) {
8234
8552
  unblockers.push(unblockerFor(result));
8235
8553
  return unresolved(task, result.blockedBy, unblockers, `${model} (${chosenBy}) ${describeBlock(result.blockedBy, result.missingKey, result.missingInput)}.`, result.missingKey);
8236
8554
  }
8555
+ /** Old pins and tuned Looks remain usable without recommending predecessors. */
8556
+ function legacyEntry(task, model, mode, tier) {
8557
+ if (mode !== void 0 || task !== "generate" && task !== "vary" || !LEGACY_GENERATION_MODELS.some((id) => id === model) || task === "vary" && MODELS[model]?.supportsEdit !== true) return;
8558
+ return {
8559
+ model,
8560
+ tier
8561
+ };
8562
+ }
8237
8563
  function unknownForMode(task, model, mode, entries) {
8238
8564
  const otherModes = entries.filter((candidate) => candidate.model === model).map((candidate) => candidate.mode ?? "no mode");
8239
8565
  const inMode = [...new Set(entries.filter((candidate) => candidate.mode === mode).map((candidate) => candidate.model))];
@@ -8250,7 +8576,7 @@ function resolveRanked(task, request, needed, keys) {
8250
8576
  const qualifying = /* @__PURE__ */ new Map();
8251
8577
  let firstBlock;
8252
8578
  let keyBlock;
8253
- const definition = TASKS[task];
8579
+ const definition = task === "generate" && (request.references ?? 0) > 0 ? TASKS.vary : TASKS[task];
8254
8580
  for (const entry of definition.models) {
8255
8581
  if (entry.mode !== request.mode) continue;
8256
8582
  const { model, tier: modelTier } = entry;
@@ -8399,6 +8725,8 @@ const FAL_IMAGE_PRICE_USD = {
8399
8725
  "ideogram/v4": MODELS.ideogram4?.pricePerImageUsd ?? .03,
8400
8726
  "xai/grok-imagine-image": MODELS["grok-image"]?.pricePerImageUsd ?? .02,
8401
8727
  "xai/grok-imagine-image/v2.0/text-to-image": MODELS["grok-image-2"]?.pricePerImageUsd ?? .06,
8728
+ "xai/grok-imagine-image/quality/text-to-image": MODELS["grok-image-quality"]?.pricePerImageUsd ?? .05,
8729
+ "meta/muse-image/text-to-image": MODELS["muse-image"]?.pricePerImageUsd ?? .01,
8402
8730
  "microsoft/mai-image-2.5-pro": MODELS["mai-image-2.5-pro"]?.pricePerImageUsd ?? .17,
8403
8731
  "fal-ai/ideogram/v3/generate-transparent": MODELS["ideogram3-transparent"]?.pricePerImageUsd ?? .06,
8404
8732
  "alibaba/qwen-image-3/text-to-image": MODELS.qwen3?.pricePerImageUsd ?? .04,