CrispStrobe commited on
Commit
ee20373
·
1 Parent(s): ffba252

add bfl, etc

Browse files
data/providers.json CHANGED
@@ -14,7 +14,10 @@
14
  "input_price_per_1m": 0.17,
15
  "output_price_per_1m": 0.17,
16
  "currency": "USD",
17
- "size_b": 8
 
 
 
18
  },
19
  {
20
  "name": "Teuken-7B Instruct",
@@ -29,7 +32,10 @@
29
  "type": "chat",
30
  "input_price_per_1m": 0.17,
31
  "output_price_per_1m": 0.17,
32
- "currency": "USD"
 
 
 
33
  },
34
  {
35
  "name": "Code Llama 13b Instruct HF",
@@ -45,7 +51,10 @@
45
  "input_price_per_1m": 0.11,
46
  "output_price_per_1m": 0.33,
47
  "currency": "USD",
48
- "size_b": 24
 
 
 
49
  },
50
  {
51
  "name": "gpt-oss-120b",
@@ -53,7 +62,11 @@
53
  "input_price_per_1m": 0.17,
54
  "output_price_per_1m": 0.71,
55
  "currency": "USD",
56
- "size_b": 120
 
 
 
 
57
  },
58
  {
59
  "name": "Llama 3.3 70B Instruct",
@@ -61,7 +74,10 @@
61
  "input_price_per_1m": 0.71,
62
  "output_price_per_1m": 0.71,
63
  "currency": "USD",
64
- "size_b": 70
 
 
 
65
  },
66
  {
67
  "name": "Llama 3.1 405B Instruct",
@@ -69,7 +85,10 @@
69
  "input_price_per_1m": 1.93,
70
  "output_price_per_1m": 1.93,
71
  "currency": "USD",
72
- "size_b": 405
 
 
 
73
  },
74
  {
75
  "name": "LightOnOCR 2",
@@ -87,7 +106,10 @@
87
  "type": "image",
88
  "input_price_per_1m": 0.032,
89
  "output_price_per_1m": 0,
90
- "currency": "USD"
 
 
 
91
  },
92
  {
93
  "name": "paraphrase-multilingual-mpnet-base-v2",
@@ -139,26 +161,38 @@
139
  },
140
  {
141
  "name": "Mistral-Small-3.2-24B-Instruct-2506",
142
- "type": "chat",
143
  "input_price_per_1m": 0.1,
144
  "output_price_per_1m": 0.3,
145
  "currency": "CHF",
146
- "size_b": 24
 
 
 
 
147
  },
148
  {
149
  "name": "Qwen3-VL-235B-A22B-Instruct",
150
- "type": "chat",
151
  "input_price_per_1m": 0.7,
152
  "output_price_per_1m": 2,
153
  "currency": "CHF",
154
- "size_b": 235
 
 
 
 
155
  },
156
  {
157
  "name": "Llama 3.3",
158
  "type": "chat",
159
  "input_price_per_1m": 1,
160
  "output_price_per_1m": 3,
161
- "currency": "CHF"
 
 
 
 
162
  },
163
  {
164
  "name": "Apertus-70B-Instruct-2509",
@@ -174,14 +208,23 @@
174
  "input_price_per_1m": 0.3,
175
  "output_price_per_1m": 0.9,
176
  "currency": "CHF",
177
- "size_b": 120
 
 
 
 
178
  },
179
  {
180
  "name": "Kimi-K2.5",
181
- "type": "chat",
182
  "input_price_per_1m": 0.6,
183
  "output_price_per_1m": 3,
184
- "currency": "CHF"
 
 
 
 
 
185
  },
186
  {
187
  "name": "Bge Multilingual Gemma2",
@@ -217,14 +260,20 @@
217
  "type": "image",
218
  "input_price_per_1m": 0.3,
219
  "output_price_per_1m": 0,
220
- "currency": "CHF"
 
 
 
221
  },
222
  {
223
  "name": "Flux schnell",
224
  "type": "image",
225
  "input_price_per_1m": 0.3,
226
  "output_price_per_1m": 0,
227
- "currency": "CHF"
 
 
 
228
  }
229
  ],
230
  "lastUpdated": "2026-03-02T04:54:47.632Z"
@@ -255,11 +304,17 @@
255
  },
256
  {
257
  "name": "GPT-5.2 Pro",
258
- "type": "chat",
259
  "input_price_per_1m": 19.48,
260
  "output_price_per_1m": 155.85,
261
  "currency": "EUR",
262
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
263
  },
264
  {
265
  "name": "Opus 4.6 Reasoning",
@@ -283,15 +338,23 @@
283
  "input_price_per_1m": 0.92,
284
  "output_price_per_1m": 3.67,
285
  "currency": "EUR",
286
- "provider_upstream": "DeepSeek"
 
 
 
 
287
  },
288
  {
289
  "name": "Mistral Medium",
290
- "type": "chat",
291
  "input_price_per_1m": 0.37,
292
  "output_price_per_1m": 1.86,
293
  "currency": "EUR",
294
- "provider_upstream": "Mistral"
 
 
 
 
295
  },
296
  {
297
  "name": "Mistral Large 2411",
@@ -299,15 +362,22 @@
299
  "input_price_per_1m": 1.86,
300
  "output_price_per_1m": 5.59,
301
  "currency": "EUR",
302
- "provider_upstream": "Mistral"
 
 
 
303
  },
304
  {
305
  "name": "Llama 4 Maverick",
306
- "type": "chat",
307
  "input_price_per_1m": 0.2,
308
  "output_price_per_1m": 0.8,
309
  "currency": "EUR",
310
- "provider_upstream": "Meta"
 
 
 
 
311
  },
312
  {
313
  "name": "Sonnet 4.5 Reasoning",
@@ -324,7 +394,10 @@
324
  "output_price_per_1m": 0.66,
325
  "currency": "EUR",
326
  "size_b": 70,
327
- "provider_upstream": "Meta"
 
 
 
328
  },
329
  {
330
  "name": "Sonnet 4.5",
@@ -416,19 +489,31 @@
416
  },
417
  {
418
  "name": "o3 Pro",
419
- "type": "chat",
420
  "input_price_per_1m": 18.63,
421
  "output_price_per_1m": 74.54,
422
  "currency": "EUR",
423
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
424
  },
425
  {
426
  "name": "o4 Mini",
427
- "type": "chat",
428
  "input_price_per_1m": 1.02,
429
  "output_price_per_1m": 4.1,
430
  "currency": "EUR",
431
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
432
  },
433
  {
434
  "name": "o3 Mini high",
@@ -436,15 +521,25 @@
436
  "input_price_per_1m": 1.13,
437
  "output_price_per_1m": 4.51,
438
  "currency": "EUR",
439
- "provider_upstream": "OpenAI"
 
 
 
 
440
  },
441
  {
442
  "name": "o3",
443
- "type": "chat",
444
  "input_price_per_1m": 1.86,
445
  "output_price_per_1m": 7.45,
446
  "currency": "EUR",
447
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
448
  },
449
  {
450
  "name": "o3 Mini",
@@ -452,167 +547,287 @@
452
  "input_price_per_1m": 1.13,
453
  "output_price_per_1m": 4.51,
454
  "currency": "EUR",
455
- "provider_upstream": "OpenAI"
 
 
 
 
456
  },
457
  {
458
  "name": "o1",
459
- "type": "chat",
460
  "input_price_per_1m": 15.37,
461
  "output_price_per_1m": 61.49,
462
  "currency": "EUR",
463
- "provider_upstream": "OpenAI"
 
 
 
 
 
464
  },
465
  {
466
  "name": "GPT-5.2 Thinking",
467
- "type": "chat",
468
  "input_price_per_1m": 1.63,
469
  "output_price_per_1m": 13.04,
470
  "currency": "EUR",
471
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
472
  },
473
  {
474
  "name": "GPT-5.2",
475
- "type": "chat",
476
  "input_price_per_1m": 1.63,
477
  "output_price_per_1m": 13.04,
478
  "currency": "EUR",
479
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
480
  },
481
  {
482
  "name": "GPT-5.1 Thinking",
483
- "type": "chat",
484
  "input_price_per_1m": 1.16,
485
  "output_price_per_1m": 9.32,
486
  "currency": "EUR",
487
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
488
  },
489
  {
490
  "name": "GPT-5.1 Thinking Fast",
491
- "type": "chat",
492
  "input_price_per_1m": 1.16,
493
  "output_price_per_1m": 9.32,
494
  "currency": "EUR",
495
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
496
  },
497
  {
498
  "name": "GPT-5.1",
499
- "type": "chat",
500
  "input_price_per_1m": 1.16,
501
  "output_price_per_1m": 9.32,
502
  "currency": "EUR",
503
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
504
  },
505
  {
506
  "name": "GPT-5 Thinking",
507
- "type": "chat",
508
  "input_price_per_1m": 1.16,
509
  "output_price_per_1m": 9.32,
510
  "currency": "EUR",
511
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
512
  },
513
  {
514
  "name": "GPT-5 Thinking Fast",
515
- "type": "chat",
516
  "input_price_per_1m": 1.16,
517
  "output_price_per_1m": 9.32,
518
  "currency": "EUR",
519
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
520
  },
521
  {
522
  "name": "GPT-5 Pro",
523
- "type": "chat",
524
  "input_price_per_1m": 13.98,
525
  "output_price_per_1m": 111.8,
526
  "currency": "EUR",
527
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
528
  },
529
  {
530
  "name": "GPT-5 Nano",
531
- "type": "chat",
532
  "input_price_per_1m": 0.05,
533
  "output_price_per_1m": 0.37,
534
  "currency": "EUR",
535
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
536
  },
537
  {
538
  "name": "GPT-5 Mini",
539
- "type": "chat",
540
  "input_price_per_1m": 0.23,
541
  "output_price_per_1m": 1.86,
542
  "currency": "EUR",
543
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
544
  },
545
  {
546
  "name": "GPT-5 Chat",
547
- "type": "chat",
548
  "input_price_per_1m": 1.16,
549
  "output_price_per_1m": 9.32,
550
  "currency": "EUR",
551
- "provider_upstream": "OpenAI"
 
 
 
 
552
  },
553
  {
554
  "name": "GPT-5",
555
- "type": "chat",
556
  "input_price_per_1m": 1.16,
557
  "output_price_per_1m": 9.32,
558
  "currency": "EUR",
559
- "provider_upstream": "OpenAI"
 
 
 
 
 
 
560
  },
561
  {
562
  "name": "GPT-4o Mini",
563
- "type": "chat",
564
  "input_price_per_1m": 0.14,
565
  "output_price_per_1m": 0.56,
566
  "currency": "EUR",
567
- "provider_upstream": "OpenAI"
 
 
 
 
 
568
  },
569
  {
570
  "name": "GPT-4.1 nano",
571
- "type": "chat",
572
  "input_price_per_1m": 0.09,
573
  "output_price_per_1m": 0.37,
574
  "currency": "EUR",
575
- "provider_upstream": "OpenAI"
 
 
 
 
 
576
  },
577
  {
578
  "name": "GPT-4o",
579
- "type": "chat",
580
  "input_price_per_1m": 2.56,
581
  "output_price_per_1m": 10.25,
582
  "currency": "EUR",
583
- "provider_upstream": "OpenAI"
 
 
 
 
 
584
  },
585
  {
586
  "name": "GPT-4.1",
587
- "type": "chat",
588
  "input_price_per_1m": 1.86,
589
  "output_price_per_1m": 7.45,
590
  "currency": "EUR",
591
- "provider_upstream": "OpenAI"
 
 
 
 
 
592
  },
593
  {
594
  "name": "GPT-4.1 mini",
595
- "type": "chat",
596
  "input_price_per_1m": 0.37,
597
  "output_price_per_1m": 1.49,
598
  "currency": "EUR",
599
- "provider_upstream": "OpenAI"
 
 
 
 
 
600
  },
601
  {
602
  "name": "Gemini 3 Pro Preview",
603
- "type": "chat",
604
  "input_price_per_1m": 2.33,
605
  "output_price_per_1m": 13.98,
606
  "currency": "EUR",
607
- "provider_upstream": "Google"
 
 
 
 
 
 
 
 
608
  },
609
  {
610
  "name": "Gemini 3 Flash Preview",
611
- "type": "chat",
612
  "input_price_per_1m": 0.47,
613
  "output_price_per_1m": 2.8,
614
  "currency": "EUR",
615
- "provider_upstream": "Google"
 
 
 
 
 
 
 
 
616
  },
617
  {
618
  "name": "GPT oss (120b)",
@@ -621,31 +836,59 @@
621
  "output_price_per_1m": 2.33,
622
  "currency": "EUR",
623
  "size_b": 120,
624
- "provider_upstream": "OpenAI"
 
 
 
 
625
  },
626
  {
627
  "name": "Gemini 2.5 Flash",
628
- "type": "chat",
629
  "input_price_per_1m": 0.28,
630
  "output_price_per_1m": 2.33,
631
  "currency": "EUR",
632
- "provider_upstream": "Google"
 
 
 
 
 
 
 
 
633
  },
634
  {
635
  "name": "Gemini 2.5 Pro Reasoning",
636
- "type": "chat",
637
  "input_price_per_1m": 2.33,
638
  "output_price_per_1m": 13.98,
639
  "currency": "EUR",
640
- "provider_upstream": "Google"
 
 
 
 
 
 
 
 
641
  },
642
  {
643
  "name": "Gemini 2.5 Pro",
644
- "type": "chat",
645
  "input_price_per_1m": 2.33,
646
  "output_price_per_1m": 13.98,
647
  "currency": "EUR",
648
- "provider_upstream": "Google"
 
 
 
 
 
 
 
 
649
  }
650
  ]
651
  },
@@ -703,7 +946,10 @@
703
  "output_price_per_1m": 0.04,
704
  "currency": "USD",
705
  "context_window": 8192,
706
- "size_b": 8
 
 
 
707
  },
708
  {
709
  "name": "openai-responses/gpt-5-nano",
@@ -779,7 +1025,10 @@
779
  "input_price_per_1m": 0.05,
780
  "output_price_per_1m": 0.2,
781
  "currency": "USD",
782
- "context_window": 1000000
 
 
 
783
  },
784
  {
785
  "name": "novita/meta-llama/llama-3.1-8b-instruct",
@@ -788,7 +1037,10 @@
788
  "output_price_per_1m": 0.05,
789
  "currency": "USD",
790
  "context_window": 16384,
791
- "size_b": 8
 
 
 
792
  },
793
  {
794
  "name": "novita/sao10k/l3-8b-lunaris",
@@ -850,7 +1102,11 @@
850
  "output_price_per_1m": 0.3,
851
  "currency": "USD",
852
  "context_window": 40000,
853
- "size_b": 32
 
 
 
 
854
  },
855
  {
856
  "name": "openai-responses/gpt-4.1-nano",
@@ -1010,7 +1266,10 @@
1010
  "input_price_per_1m": 0.1,
1011
  "output_price_per_1m": 0.3,
1012
  "currency": "USD",
1013
- "context_window": 131072
 
 
 
1014
  },
1015
  {
1016
  "name": "mistral/devstral-small-2507",
@@ -1018,7 +1277,10 @@
1018
  "input_price_per_1m": 0.1,
1019
  "output_price_per_1m": 0.3,
1020
  "currency": "USD",
1021
- "context_window": 131072
 
 
 
1022
  },
1023
  {
1024
  "name": "mistral/mistral-small-latest",
@@ -1035,7 +1297,11 @@
1035
  "output_price_per_1m": 0.5,
1036
  "currency": "USD",
1037
  "context_window": 131072,
1038
- "size_b": 20
 
 
 
 
1039
  },
1040
  {
1041
  "name": "google/gemini-2.0-flash-001",
@@ -1199,7 +1465,10 @@
1199
  "output_price_per_1m": 0.3,
1200
  "currency": "USD",
1201
  "context_window": 131072,
1202
- "size_b": 70
 
 
 
1203
  },
1204
  {
1205
  "name": "openai/gpt-5-mini:flex",
@@ -1220,7 +1489,10 @@
1220
  "output_price_per_1m": 0.4,
1221
  "currency": "USD",
1222
  "context_window": 128000,
1223
- "size_b": 70
 
 
 
1224
  },
1225
  {
1226
  "name": "novita/nousresearch/hermes-2-pro-llama-3-8b",
@@ -1258,7 +1530,11 @@
1258
  "output_price_per_1m": 0.75,
1259
  "currency": "USD",
1260
  "context_window": 131072,
1261
- "size_b": 120
 
 
 
 
1262
  },
1263
  {
1264
  "name": "novita/deepseek/deepseek-r1-distill-qwen-14b",
@@ -1267,7 +1543,11 @@
1267
  "output_price_per_1m": 0.15,
1268
  "currency": "USD",
1269
  "context_window": 128000,
1270
- "size_b": 14
 
 
 
 
1271
  },
1272
  {
1273
  "name": "novita/mistralai/mistral-nemo",
@@ -1275,7 +1555,10 @@
1275
  "input_price_per_1m": 0.17,
1276
  "output_price_per_1m": 0.17,
1277
  "currency": "USD",
1278
- "context_window": 131072
 
 
 
1279
  },
1280
  {
1281
  "name": "together/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
@@ -1293,7 +1576,11 @@
1293
  "output_price_per_1m": 0.6,
1294
  "currency": "USD",
1295
  "context_window": 40000,
1296
- "size_b": 235
 
 
 
 
1297
  },
1298
  {
1299
  "name": "deepinfra/zai-org/GLM-4.5-Air",
@@ -1301,7 +1588,11 @@
1301
  "input_price_per_1m": 0.2,
1302
  "output_price_per_1m": 1.1,
1303
  "currency": "USD",
1304
- "context_window": 131072
 
 
 
 
1305
  },
1306
  {
1307
  "name": "together/meta-llama/LlamaGuard-2-8b",
@@ -1314,19 +1605,29 @@
1314
  },
1315
  {
1316
  "name": "xai/grok-4-fast",
1317
- "type": "chat",
1318
  "input_price_per_1m": 0.2,
1319
  "output_price_per_1m": 0.5,
1320
  "currency": "USD",
1321
- "context_window": 2000000
 
 
 
 
 
1322
  },
1323
  {
1324
  "name": "xai/grok-4-fast-non-reasoning",
1325
- "type": "chat",
1326
  "input_price_per_1m": 0.2,
1327
  "output_price_per_1m": 0.5,
1328
  "currency": "USD",
1329
- "context_window": 2000000
 
 
 
 
 
1330
  },
1331
  {
1332
  "name": "xai/grok-4-1-fast-non-reasoning",
@@ -1380,16 +1681,24 @@
1380
  "output_price_per_1m": 0.8,
1381
  "currency": "USD",
1382
  "context_window": 128000,
1383
- "size_b": 235
 
 
 
 
1384
  },
1385
  {
1386
  "name": "novita/meta-llama/llama-4-maverick-17b-128e-instruct-fp8",
1387
- "type": "chat",
1388
  "input_price_per_1m": 0.2,
1389
  "output_price_per_1m": 0.85,
1390
  "currency": "USD",
1391
  "context_window": 1048576,
1392
- "size_b": 17
 
 
 
 
1393
  },
1394
  {
1395
  "name": "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct",
@@ -1407,7 +1716,10 @@
1407
  "output_price_per_1m": 0.69,
1408
  "currency": "USD",
1409
  "context_window": 64000,
1410
- "size_b": 70
 
 
 
1411
  },
1412
  {
1413
  "name": "deepinfra/Qwen/Qwen2.5-72B-Instruct",
@@ -1425,7 +1737,10 @@
1425
  "output_price_per_1m": 0.4,
1426
  "currency": "USD",
1427
  "context_window": 131072,
1428
- "size_b": 70
 
 
 
1429
  },
1430
  {
1431
  "name": "openai-responses/gpt-5-mini",
@@ -1532,7 +1847,10 @@
1532
  "input_price_per_1m": 0.28,
1533
  "output_price_per_1m": 0.42,
1534
  "currency": "USD",
1535
- "context_window": 128000
 
 
 
1536
  },
1537
  {
1538
  "name": "deepseek/deepseek-reasoner",
@@ -1579,7 +1897,11 @@
1579
  "input_price_per_1m": 0.3,
1580
  "output_price_per_1m": 1,
1581
  "currency": "USD",
1582
- "context_window": 163840
 
 
 
 
1583
  },
1584
  {
1585
  "name": "together/Qwen/Qwen2.5-7B-Instruct-Turbo",
@@ -1649,7 +1971,11 @@
1649
  "input_price_per_1m": 0.3,
1650
  "output_price_per_1m": 1.2,
1651
  "currency": "USD",
1652
- "context_window": 200000
 
 
 
 
1653
  },
1654
  {
1655
  "name": "alibaba/qwen3-coder-flash",
@@ -1825,7 +2151,10 @@
1825
  "output_price_per_1m": 0.3,
1826
  "currency": "USD",
1827
  "context_window": 12800,
1828
- "size_b": 32
 
 
 
1829
  },
1830
  {
1831
  "name": "coding/gemini-2.5-flash@us-south1",
@@ -1975,7 +2304,10 @@
1975
  "output_price_per_1m": 0.4,
1976
  "currency": "USD",
1977
  "context_window": 32000,
1978
- "size_b": 72
 
 
 
1979
  },
1980
  {
1981
  "name": "novita/meta-llama/llama-3.3-70b-instruct",
@@ -1984,7 +2316,10 @@
1984
  "output_price_per_1m": 0.39,
1985
  "currency": "USD",
1986
  "context_window": 131072,
1987
- "size_b": 70
 
 
 
1988
  },
1989
  {
1990
  "name": "nebius/zai-org/GLM-4.7",
@@ -2004,7 +2339,10 @@
2004
  "output_price_per_1m": 1.8,
2005
  "currency": "USD",
2006
  "context_window": 262000,
2007
- "size_b": 480
 
 
 
2008
  },
2009
  {
2010
  "name": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct",
@@ -2013,7 +2351,10 @@
2013
  "output_price_per_1m": 1.6,
2014
  "currency": "USD",
2015
  "context_window": 262144,
2016
- "size_b": 480
 
 
 
2017
  },
2018
  {
2019
  "name": "openai-responses/gpt-4.1-mini",
@@ -2164,7 +2505,10 @@
2164
  "input_price_per_1m": 0.4,
2165
  "output_price_per_1m": 2,
2166
  "currency": "USD",
2167
- "context_window": 131072
 
 
 
2168
  },
2169
  {
2170
  "name": "mistral/mistral-medium-latest",
@@ -2180,7 +2524,10 @@
2180
  "input_price_per_1m": 0.4,
2181
  "output_price_per_1m": 1.2,
2182
  "currency": "USD",
2183
- "context_window": 131072
 
 
 
2184
  },
2185
  {
2186
  "name": "novita/deepseek/deepseek-v3-0324",
@@ -2216,7 +2563,10 @@
2216
  "input_price_per_1m": 0.5,
2217
  "output_price_per_1m": 2.4,
2218
  "currency": "USD",
2219
- "context_window": 131000
 
 
 
2220
  },
2221
  {
2222
  "name": "nebius/moonshotai/kimi-k2.5",
@@ -2244,7 +2594,10 @@
2244
  "input_price_per_1m": 0.5,
2245
  "output_price_per_1m": 1.5,
2246
  "currency": "USD",
2247
- "context_window": 131072
 
 
 
2248
  },
2249
  {
2250
  "name": "google/gemini-3.1-flash-image-preview@us-east5",
@@ -2560,7 +2913,10 @@
2560
  "input_price_per_1m": 0.57,
2561
  "output_price_per_1m": 2.3,
2562
  "currency": "USD",
2563
- "context_window": 131072
 
 
 
2564
  },
2565
  {
2566
  "name": "nebius/zai-org/GLM-4.5",
@@ -2568,7 +2924,11 @@
2568
  "input_price_per_1m": 0.6,
2569
  "output_price_per_1m": 2.2,
2570
  "currency": "USD",
2571
- "context_window": 128000
 
 
 
 
2572
  },
2573
  {
2574
  "name": "moonshot/kimi-k2-0711-preview",
@@ -2576,7 +2936,10 @@
2576
  "input_price_per_1m": 0.6,
2577
  "output_price_per_1m": 2.5,
2578
  "currency": "USD",
2579
- "context_window": 131072
 
 
 
2580
  },
2581
  {
2582
  "name": "moonshot/kimi-k2.5",
@@ -2596,7 +2959,11 @@
2596
  "input_price_per_1m": 0.6,
2597
  "output_price_per_1m": 2.5,
2598
  "currency": "USD",
2599
- "context_window": 131072
 
 
 
 
2600
  },
2601
  {
2602
  "name": "moonshot/kimi-k2-0905-preview",
@@ -2604,7 +2971,10 @@
2604
  "input_price_per_1m": 0.6,
2605
  "output_price_per_1m": 2.5,
2606
  "currency": "USD",
2607
- "context_window": 131072
 
 
 
2608
  },
2609
  {
2610
  "name": "moonshot/kimi-k2-thinking",
@@ -2612,7 +2982,11 @@
2612
  "input_price_per_1m": 0.6,
2613
  "output_price_per_1m": 2.5,
2614
  "currency": "USD",
2615
- "context_window": 131072
 
 
 
 
2616
  },
2617
  {
2618
  "name": "deepinfra/zai-org/GLM-4.5",
@@ -2620,7 +2994,11 @@
2620
  "input_price_per_1m": 0.6,
2621
  "output_price_per_1m": 2.2,
2622
  "currency": "USD",
2623
- "context_window": 131072
 
 
 
 
2624
  },
2625
  {
2626
  "name": "zai/GLM-4.5",
@@ -2685,7 +3063,11 @@
2685
  "input_price_per_1m": 0.6,
2686
  "output_price_per_1m": 2.2,
2687
  "currency": "USD",
2688
- "context_window": 204800
 
 
 
 
2689
  },
2690
  {
2691
  "name": "novita/zai-org/glm-4.5",
@@ -2693,7 +3075,11 @@
2693
  "input_price_per_1m": 0.6,
2694
  "output_price_per_1m": 2.2,
2695
  "currency": "USD",
2696
- "context_window": 131072
 
 
 
 
2697
  },
2698
  {
2699
  "name": "novita/microsoft/wizardlm-2-8x22b",
@@ -2734,7 +3120,11 @@
2734
  "input_price_per_1m": 0.7,
2735
  "output_price_per_1m": 2.5,
2736
  "currency": "USD",
2737
- "context_window": 64000
 
 
 
 
2738
  },
2739
  {
2740
  "name": "novita/deepseek/deepseek-prover-v2-671b",
@@ -2751,7 +3141,11 @@
2751
  "input_price_per_1m": 0.8,
2752
  "output_price_per_1m": 2.4,
2753
  "currency": "USD",
2754
- "context_window": 164000
 
 
 
 
2755
  },
2756
  {
2757
  "name": "deepinfra/meta-llama/Meta-Llama-3.1-405B-Instruct",
@@ -2769,16 +3163,22 @@
2769
  "output_price_per_1m": 0.8,
2770
  "currency": "USD",
2771
  "context_window": 32000,
2772
- "size_b": 70
 
 
 
2773
  },
2774
  {
2775
  "name": "novita/qwen/qwen2.5-vl-72b-instruct",
2776
- "type": "chat",
2777
  "input_price_per_1m": 0.8,
2778
  "output_price_per_1m": 0.8,
2779
  "currency": "USD",
2780
  "context_window": 96000,
2781
- "size_b": 72
 
 
 
2782
  },
2783
  {
2784
  "name": "deepinfra/deepseek-ai/DeepSeek-V3",
@@ -2786,7 +3186,11 @@
2786
  "input_price_per_1m": 0.85,
2787
  "output_price_per_1m": 0.9,
2788
  "currency": "USD",
2789
- "context_window": 128000
 
 
 
 
2790
  },
2791
  {
2792
  "name": "deepinfra/deepseek-ai/DeepSeek-R1",
@@ -2794,7 +3198,11 @@
2794
  "input_price_per_1m": 0.85,
2795
  "output_price_per_1m": 2.5,
2796
  "currency": "USD",
2797
- "context_window": 64000
 
 
 
 
2798
  },
2799
  {
2800
  "name": "alibaba/qwen3-max",
@@ -2814,7 +3222,10 @@
2814
  "output_price_per_1m": 0.88,
2815
  "currency": "USD",
2816
  "context_window": 131072,
2817
- "size_b": 70
 
 
 
2818
  },
2819
  {
2820
  "name": "together/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
@@ -2831,7 +3242,11 @@
2831
  "input_price_per_1m": 0.89,
2832
  "output_price_per_1m": 0.89,
2833
  "currency": "USD",
2834
- "context_window": 64000
 
 
 
 
2835
  },
2836
  {
2837
  "name": "parasail/parasail-kimi-k2-instruct",
@@ -2854,11 +3269,14 @@
2854
  },
2855
  {
2856
  "name": "perplexity/sonar",
2857
- "type": "chat",
2858
  "input_price_per_1m": 1,
2859
  "output_price_per_1m": 1,
2860
  "currency": "USD",
2861
- "context_window": 131072
 
 
 
2862
  },
2863
  {
2864
  "name": "openai/o3:flex",
@@ -2912,7 +3330,10 @@
2912
  "input_price_per_1m": 1,
2913
  "output_price_per_1m": 3,
2914
  "currency": "USD",
2915
- "context_window": 131072
 
 
 
2916
  },
2917
  {
2918
  "name": "groq/moonshotai/Kimi-K2-Instruct-0905",
@@ -2920,7 +3341,10 @@
2920
  "input_price_per_1m": 1,
2921
  "output_price_per_1m": 3,
2922
  "currency": "USD",
2923
- "context_window": 256000
 
 
 
2924
  },
2925
  {
2926
  "name": "vertex/claude-haiku-4-5",
@@ -3214,7 +3638,10 @@
3214
  "input_price_per_1m": 1.2,
3215
  "output_price_per_1m": 5,
3216
  "currency": "USD",
3217
- "context_window": 131072
 
 
 
3218
  },
3219
  {
3220
  "name": "together/Qwen/Qwen2.5-72B-Instruct-Turbo",
@@ -3426,7 +3853,11 @@
3426
  "input_price_per_1m": 1.25,
3427
  "output_price_per_1m": 1.25,
3428
  "currency": "USD",
3429
- "context_window": 131072
 
 
 
 
3430
  },
3431
  {
3432
  "name": "google/gemini-2.5-pro",
@@ -3728,7 +4159,10 @@
3728
  "input_price_per_1m": 1.6,
3729
  "output_price_per_1m": 6.4,
3730
  "currency": "USD",
3731
- "context_window": 32768
 
 
 
3732
  },
3733
  {
3734
  "name": "openai-responses/gpt-5.3-codex",
@@ -3846,11 +4280,15 @@
3846
  },
3847
  {
3848
  "name": "perplexity/sonar-reasoning-pro",
3849
- "type": "chat",
3850
  "input_price_per_1m": 2,
3851
  "output_price_per_1m": 8,
3852
  "currency": "USD",
3853
- "context_window": 131072
 
 
 
 
3854
  },
3855
  {
3856
  "name": "openai-responses/gpt-4.1",
@@ -4369,11 +4807,14 @@
4369
  },
4370
  {
4371
  "name": "perplexity/sonar-pro",
4372
- "type": "chat",
4373
  "input_price_per_1m": 3,
4374
  "output_price_per_1m": 15,
4375
  "currency": "USD",
4376
- "context_window": 204800
 
 
 
4377
  },
4378
  {
4379
  "name": "together/deepseek-ai/DeepSeek-R1",
@@ -4381,7 +4822,11 @@
4381
  "input_price_per_1m": 3,
4382
  "output_price_per_1m": 7,
4383
  "currency": "USD",
4384
- "context_window": 64000
 
 
 
 
4385
  },
4386
  {
4387
  "name": "anthropic/claude-sonnet-4-5",
@@ -4865,7 +5310,11 @@
4865
  "input_price_per_1m": 4,
4866
  "output_price_per_1m": 4,
4867
  "currency": "USD",
4868
- "context_window": 64000
 
 
 
 
4869
  },
4870
  {
4871
  "name": "bedrock/claude-opus-4-6",
@@ -4932,7 +5381,10 @@
4932
  "input_price_per_1m": 5,
4933
  "output_price_per_1m": 25,
4934
  "currency": "USD",
4935
- "context_window": 131072
 
 
 
4936
  },
4937
  {
4938
  "name": "vertex/claude-opus-4-5",
@@ -5360,7 +5812,11 @@
5360
  "output_price_per_1m": 0.6,
5361
  "currency": "USD",
5362
  "size_b": 120,
5363
- "flavor": "base"
 
 
 
 
5364
  },
5365
  {
5366
  "name": "gpt-oss-20b (base)",
@@ -5369,7 +5825,11 @@
5369
  "output_price_per_1m": 0.2,
5370
  "currency": "USD",
5371
  "size_b": 20,
5372
- "flavor": "base"
 
 
 
 
5373
  },
5374
  {
5375
  "name": "Kimi-K2-Instruct (base)",
@@ -5377,7 +5837,10 @@
5377
  "input_price_per_1m": 0.5,
5378
  "output_price_per_1m": 2.4,
5379
  "currency": "USD",
5380
- "flavor": "base"
 
 
 
5381
  },
5382
  {
5383
  "name": "Qwen3-Coder-480B-A35B-Instruct (base)",
@@ -5386,7 +5849,10 @@
5386
  "output_price_per_1m": 1.8,
5387
  "currency": "USD",
5388
  "size_b": 480,
5389
- "flavor": "base"
 
 
 
5390
  },
5391
  {
5392
  "name": "Qwen3-235B-A22B-Thinking-2507 (base)",
@@ -5395,7 +5861,11 @@
5395
  "output_price_per_1m": 0.8,
5396
  "currency": "USD",
5397
  "size_b": 235,
5398
- "flavor": "base"
 
 
 
 
5399
  },
5400
  {
5401
  "name": "Qwen3-235B-A22B-Instruct-2507 (base)",
@@ -5404,7 +5874,11 @@
5404
  "output_price_per_1m": 0.6,
5405
  "currency": "USD",
5406
  "size_b": 235,
5407
- "flavor": "base"
 
 
 
 
5408
  },
5409
  {
5410
  "name": "Qwen3-30B-A3B-Thinking-2507 (base)",
@@ -5413,7 +5887,11 @@
5413
  "output_price_per_1m": 0.3,
5414
  "currency": "USD",
5415
  "size_b": 30,
5416
- "flavor": "base"
 
 
 
 
5417
  },
5418
  {
5419
  "name": "Qwen3-30B-A3B-Instruct-2507 (base)",
@@ -5422,7 +5900,10 @@
5422
  "output_price_per_1m": 0.3,
5423
  "currency": "USD",
5424
  "size_b": 30,
5425
- "flavor": "base"
 
 
 
5426
  },
5427
  {
5428
  "name": "Qwen3-Coder-30B-A3B-Instruct (base)",
@@ -5431,7 +5912,10 @@
5431
  "output_price_per_1m": 0.3,
5432
  "currency": "USD",
5433
  "size_b": 30,
5434
- "flavor": "base"
 
 
 
5435
  },
5436
  {
5437
  "name": "Qwen3-30B-A3B (base)",
@@ -5440,7 +5924,11 @@
5440
  "output_price_per_1m": 0.3,
5441
  "currency": "USD",
5442
  "size_b": 30,
5443
- "flavor": "base"
 
 
 
 
5444
  },
5445
  {
5446
  "name": "Qwen3-32B (fast)",
@@ -5449,7 +5937,11 @@
5449
  "output_price_per_1m": 0.6,
5450
  "currency": "USD",
5451
  "size_b": 32,
5452
- "flavor": "fast"
 
 
 
 
5453
  },
5454
  {
5455
  "name": "Qwen3-32B (base)",
@@ -5458,7 +5950,11 @@
5458
  "output_price_per_1m": 0.3,
5459
  "currency": "USD",
5460
  "size_b": 32,
5461
- "flavor": "base"
 
 
 
 
5462
  },
5463
  {
5464
  "name": "Qwen3-14B (base)",
@@ -5467,7 +5963,11 @@
5467
  "output_price_per_1m": 0.24,
5468
  "currency": "USD",
5469
  "size_b": 14,
5470
- "flavor": "base"
 
 
 
 
5471
  },
5472
  {
5473
  "name": "Qwen2.5-Coder-7B (base)",
@@ -5494,7 +5994,11 @@
5494
  "output_price_per_1m": 1.5,
5495
  "currency": "USD",
5496
  "size_b": 32,
5497
- "flavor": "fast"
 
 
 
 
5498
  },
5499
  {
5500
  "name": "QwQ-32B (base)",
@@ -5503,7 +6007,11 @@
5503
  "output_price_per_1m": 0.45,
5504
  "currency": "USD",
5505
  "size_b": 32,
5506
- "flavor": "base"
 
 
 
 
5507
  },
5508
  {
5509
  "name": "GLM-4.5 (base)",
@@ -5511,7 +6019,11 @@
5511
  "input_price_per_1m": 0.6,
5512
  "output_price_per_1m": 2.2,
5513
  "currency": "USD",
5514
- "flavor": "base"
 
 
 
 
5515
  },
5516
  {
5517
  "name": "GLM-4.5-Air (base)",
@@ -5519,7 +6031,11 @@
5519
  "input_price_per_1m": 0.2,
5520
  "output_price_per_1m": 1.2,
5521
  "currency": "USD",
5522
- "flavor": "base"
 
 
 
 
5523
  },
5524
  {
5525
  "name": "DeepSeek-R1-0528 (fast)",
@@ -5527,7 +6043,11 @@
5527
  "input_price_per_1m": 2,
5528
  "output_price_per_1m": 6,
5529
  "currency": "USD",
5530
- "flavor": "fast"
 
 
 
 
5531
  },
5532
  {
5533
  "name": "DeepSeek-R1-0528 (base)",
@@ -5535,7 +6055,11 @@
5535
  "input_price_per_1m": 0.8,
5536
  "output_price_per_1m": 2.4,
5537
  "currency": "USD",
5538
- "flavor": "base"
 
 
 
 
5539
  },
5540
  {
5541
  "name": "DeepSeek-V3-0324 (fast)",
@@ -5568,7 +6092,10 @@
5568
  "output_price_per_1m": 0.75,
5569
  "currency": "USD",
5570
  "size_b": 70,
5571
- "flavor": "fast"
 
 
 
5572
  },
5573
  {
5574
  "name": "Llama-3.3-70B-Instruct (base)",
@@ -5577,7 +6104,10 @@
5577
  "output_price_per_1m": 0.4,
5578
  "currency": "USD",
5579
  "size_b": 70,
5580
- "flavor": "base"
 
 
 
5581
  },
5582
  {
5583
  "name": "Llama-3.1-8B-Instruct (fast)",
@@ -5586,7 +6116,10 @@
5586
  "output_price_per_1m": 0.09,
5587
  "currency": "USD",
5588
  "size_b": 8,
5589
- "flavor": "fast"
 
 
 
5590
  },
5591
  {
5592
  "name": "Llama-3.1-8B-Instruct (base)",
@@ -5595,7 +6128,10 @@
5595
  "output_price_per_1m": 0.06,
5596
  "currency": "USD",
5597
  "size_b": 8,
5598
- "flavor": "base"
 
 
 
5599
  },
5600
  {
5601
  "name": "Llama-3.1-405B-Instruct (base)",
@@ -5604,7 +6140,10 @@
5604
  "output_price_per_1m": 3,
5605
  "currency": "USD",
5606
  "size_b": 405,
5607
- "flavor": "base"
 
 
 
5608
  },
5609
  {
5610
  "name": "Llama-3_1-Nemotron-Ultra-253B-v1 (base)",
@@ -5639,7 +6178,10 @@
5639
  "input_price_per_1m": 0.08,
5640
  "output_price_per_1m": 0.24,
5641
  "currency": "USD",
5642
- "flavor": "base"
 
 
 
5643
  },
5644
  {
5645
  "name": "Hermes-4-405B (base)",
@@ -5648,7 +6190,10 @@
5648
  "output_price_per_1m": 3,
5649
  "currency": "USD",
5650
  "size_b": 405,
5651
- "flavor": "base"
 
 
 
5652
  },
5653
  {
5654
  "name": "Hermes-4-70B (base)",
@@ -5657,7 +6202,10 @@
5657
  "output_price_per_1m": 0.4,
5658
  "currency": "USD",
5659
  "size_b": 70,
5660
- "flavor": "base"
 
 
 
5661
  },
5662
  {
5663
  "name": "Hermes-3-Llama-3.1-405B (base)",
@@ -5739,21 +6287,30 @@
5739
  "type": "image",
5740
  "input_price_per_1m": 0.0013,
5741
  "output_price_per_1m": 0,
5742
- "currency": "USD"
 
 
 
5743
  },
5744
  {
5745
  "name": "flux-dev",
5746
  "type": "image",
5747
  "input_price_per_1m": 0.007,
5748
  "output_price_per_1m": 0,
5749
- "currency": "USD"
 
 
 
5750
  },
5751
  {
5752
  "name": "sdxl",
5753
  "type": "image",
5754
  "input_price_per_1m": 0.003,
5755
  "output_price_per_1m": 0,
5756
- "currency": "USD"
 
 
 
5757
  },
5758
  {
5759
  "name": "bge-multilingual-gemma2",
@@ -5802,7 +6359,11 @@
5802
  "input_price_per_1m": 0.75,
5803
  "output_price_per_1m": 2.25,
5804
  "currency": "EUR",
5805
- "size_b": 235
 
 
 
 
5806
  },
5807
  {
5808
  "name": "gpt-oss-120b",
@@ -5810,15 +6371,23 @@
5810
  "input_price_per_1m": 0.15,
5811
  "output_price_per_1m": 0.6,
5812
  "currency": "EUR",
5813
- "size_b": 120
 
 
 
 
5814
  },
5815
  {
5816
  "name": "mistral-small-3.2-24b-instruct-2506",
5817
- "type": "chat",
5818
  "input_price_per_1m": 0.15,
5819
  "output_price_per_1m": 0.35,
5820
  "currency": "EUR",
5821
- "size_b": 24
 
 
 
 
5822
  },
5823
  {
5824
  "name": "devstral-2-123b-instruct-2512",
@@ -5849,7 +6418,10 @@
5849
  "input_price_per_1m": 0.9,
5850
  "output_price_per_1m": 0.9,
5851
  "currency": "EUR",
5852
- "size_b": 70
 
 
 
5853
  },
5854
  {
5855
  "name": "qwen3-coder-30b-a3b-instruct",
@@ -5857,7 +6429,10 @@
5857
  "input_price_per_1m": 0.2,
5858
  "output_price_per_1m": 0.8,
5859
  "currency": "EUR",
5860
- "size_b": 30
 
 
 
5861
  },
5862
  {
5863
  "name": "qwen3-embedding-8b",
@@ -5881,15 +6456,23 @@
5881
  "input_price_per_1m": 0.15,
5882
  "output_price_per_1m": 0.35,
5883
  "currency": "EUR",
5884
- "size_b": 24
 
 
 
 
5885
  },
5886
  {
5887
  "name": "gemma-3-27b-it",
5888
- "type": "chat",
5889
  "input_price_per_1m": 0.25,
5890
  "output_price_per_1m": 0.5,
5891
  "currency": "EUR",
5892
- "size_b": 27
 
 
 
 
5893
  },
5894
  {
5895
  "name": "bge-multilingual-gemma2",
@@ -5904,14 +6487,20 @@
5904
  "input_price_per_1m": 0.2,
5905
  "output_price_per_1m": 0.2,
5906
  "currency": "EUR",
5907
- "size_b": 8
 
 
 
5908
  },
5909
  {
5910
  "name": "mistral-nemo-instruct-2407",
5911
  "type": "chat",
5912
  "input_price_per_1m": 0.2,
5913
  "output_price_per_1m": 0.2,
5914
- "currency": "EUR"
 
 
 
5915
  },
5916
  {
5917
  "name": "deepseek-r1-distill-llama-70b",
@@ -5919,7 +6508,10 @@
5919
  "input_price_per_1m": 0.9,
5920
  "output_price_per_1m": 0.9,
5921
  "currency": "EUR",
5922
- "size_b": 70
 
 
 
5923
  }
5924
  ]
5925
  },
@@ -5937,15 +6529,22 @@
5937
  "input_price_per_1m": 0.5,
5938
  "output_price_per_1m": 1.5,
5939
  "currency": "USD",
5940
- "api_endpoint": "mistral-large-latest"
 
 
 
5941
  },
5942
  {
5943
  "name": "Mistral Medium 3",
5944
- "type": "chat",
5945
  "input_price_per_1m": 0.4,
5946
  "output_price_per_1m": 2,
5947
  "currency": "USD",
5948
- "api_endpoint": "mistral-medium-latest"
 
 
 
 
5949
  },
5950
  {
5951
  "name": "Devstral 2",
@@ -5961,7 +6560,10 @@
5961
  "input_price_per_1m": 0.1,
5962
  "output_price_per_1m": 0.3,
5963
  "currency": "USD",
5964
- "api_endpoint": "devstral-small-latest"
 
 
 
5965
  },
5966
  {
5967
  "name": "Codestral",
@@ -5969,15 +6571,22 @@
5969
  "input_price_per_1m": 0.3,
5970
  "output_price_per_1m": 0.9,
5971
  "currency": "USD",
5972
- "api_endpoint": "codestral-latest"
 
 
 
5973
  },
5974
  {
5975
  "name": "Mistral Small 3.2",
5976
- "type": "chat",
5977
  "input_price_per_1m": 0.1,
5978
  "output_price_per_1m": 0.3,
5979
  "currency": "USD",
5980
- "api_endpoint": "mistral-small-latest"
 
 
 
 
5981
  },
5982
  {
5983
  "name": "Mistral Small Creative",
@@ -5985,7 +6594,10 @@
5985
  "input_price_per_1m": 0.1,
5986
  "output_price_per_1m": 0.3,
5987
  "currency": "USD",
5988
- "api_endpoint": "labs-mistral-small-creative"
 
 
 
5989
  },
5990
  {
5991
  "name": "Magistral Medium",
@@ -6048,11 +6660,15 @@
6048
  },
6049
  {
6050
  "name": "Voxtral Small",
6051
- "type": "chat",
6052
  "input_price_per_1m": 0.004,
6053
  "output_price_per_1m": 0.3,
6054
  "currency": "USD",
6055
- "api_endpoint": "voxtral-small-latest"
 
 
 
 
6056
  },
6057
  {
6058
  "name": "Voxtral Mini",
@@ -6104,11 +6720,15 @@
6104
  },
6105
  {
6106
  "name": "Pixtral Large",
6107
- "type": "chat",
6108
  "input_price_per_1m": 2,
6109
  "output_price_per_1m": 6,
6110
  "currency": "USD",
6111
- "api_endpoint": "pixtral-large-latest"
 
 
 
 
6112
  },
6113
  {
6114
  "name": "Pixtral 12B",
@@ -6125,7 +6745,10 @@
6125
  "input_price_per_1m": 0.15,
6126
  "output_price_per_1m": 0.15,
6127
  "currency": "USD",
6128
- "api_endpoint": "open-mistral-nemo"
 
 
 
6129
  },
6130
  {
6131
  "name": "Mistral 7B",
@@ -6143,7 +6766,10 @@
6143
  "output_price_per_1m": 0.7,
6144
  "currency": "USD",
6145
  "size_b": 7,
6146
- "api_endpoint": "open-mixtral-8x7b"
 
 
 
6147
  },
6148
  {
6149
  "name": "Mixtral 8x22B",
@@ -6152,7 +6778,10 @@
6152
  "output_price_per_1m": 6,
6153
  "currency": "USD",
6154
  "size_b": 22,
6155
- "api_endpoint": "open-mixtral-8x22b"
 
 
 
6156
  }
6157
  ]
6158
  },
@@ -9613,32 +10242,6 @@
9613
  ],
9614
  "size_b": 12
9615
  },
9616
- {
9617
- "name": "qwen/qwen3-vl-30b-a3b-thinking",
9618
- "type": "vision",
9619
- "input_price_per_1m": 0,
9620
- "output_price_per_1m": 0,
9621
- "currency": "USD",
9622
- "capabilities": [
9623
- "vision",
9624
- "tools",
9625
- "reasoning"
9626
- ],
9627
- "size_b": 30
9628
- },
9629
- {
9630
- "name": "qwen/qwen3-vl-235b-a22b-thinking",
9631
- "type": "vision",
9632
- "input_price_per_1m": 0,
9633
- "output_price_per_1m": 0,
9634
- "currency": "USD",
9635
- "capabilities": [
9636
- "vision",
9637
- "tools",
9638
- "reasoning"
9639
- ],
9640
- "size_b": 235
9641
- },
9642
  {
9643
  "name": "qwen/qwen3-next-80b-a3b-instruct:free",
9644
  "type": "chat",
@@ -9697,18 +10300,6 @@
9697
  "reasoning"
9698
  ]
9699
  },
9700
- {
9701
- "name": "qwen/qwen3-235b-a22b-thinking-2507",
9702
- "type": "chat",
9703
- "input_price_per_1m": 0,
9704
- "output_price_per_1m": 0,
9705
- "currency": "USD",
9706
- "capabilities": [
9707
- "tools",
9708
- "reasoning"
9709
- ],
9710
- "size_b": 235
9711
- },
9712
  {
9713
  "name": "qwen/qwen3-coder:free",
9714
  "type": "chat",
@@ -9844,7 +10435,11 @@
9844
  "input_price_per_1m": 0.075,
9845
  "output_price_per_1m": 0.3,
9846
  "currency": "USD",
9847
- "size_b": 20
 
 
 
 
9848
  },
9849
  {
9850
  "name": "GPT OSS Safeguard 20B",
@@ -9852,7 +10447,11 @@
9852
  "input_price_per_1m": 0.075,
9853
  "output_price_per_1m": 0.3,
9854
  "currency": "USD",
9855
- "size_b": 20
 
 
 
 
9856
  },
9857
  {
9858
  "name": "GPT OSS 120B 128k",
@@ -9860,30 +10459,45 @@
9860
  "input_price_per_1m": 0.15,
9861
  "output_price_per_1m": 0.6,
9862
  "currency": "USD",
9863
- "size_b": 120
 
 
 
 
9864
  },
9865
  {
9866
  "name": "Kimi K2-0905 1T 256k",
9867
  "type": "chat",
9868
  "input_price_per_1m": 1,
9869
  "output_price_per_1m": 3,
9870
- "currency": "USD"
 
 
 
9871
  },
9872
  {
9873
  "name": "Llama 4 Scout (17Bx16E) 128k",
9874
- "type": "chat",
9875
  "input_price_per_1m": 0.11,
9876
  "output_price_per_1m": 0.34,
9877
  "currency": "USD",
9878
- "size_b": 17
 
 
 
 
9879
  },
9880
  {
9881
  "name": "Llama 4 Maverick (17Bx128E) 128k",
9882
- "type": "chat",
9883
  "input_price_per_1m": 0.2,
9884
  "output_price_per_1m": 0.6,
9885
  "currency": "USD",
9886
- "size_b": 17
 
 
 
 
9887
  },
9888
  {
9889
  "name": "Qwen3 32B 131k",
@@ -9891,7 +10505,11 @@
9891
  "input_price_per_1m": 0.29,
9892
  "output_price_per_1m": 0.59,
9893
  "currency": "USD",
9894
- "size_b": 32
 
 
 
 
9895
  },
9896
  {
9897
  "name": "Llama 3.3 70B Versatile 128k",
@@ -9938,6 +10556,172 @@
9938
  "currency": "USD"
9939
  }
9940
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9941
  }
9942
  ]
9943
  }
 
14
  "input_price_per_1m": 0.17,
15
  "output_price_per_1m": 0.17,
16
  "currency": "USD",
17
+ "size_b": 8,
18
+ "capabilities": [
19
+ "tools"
20
+ ]
21
  },
22
  {
23
  "name": "Teuken-7B Instruct",
 
32
  "type": "chat",
33
  "input_price_per_1m": 0.17,
34
  "output_price_per_1m": 0.17,
35
+ "currency": "USD",
36
+ "capabilities": [
37
+ "tools"
38
+ ]
39
  },
40
  {
41
  "name": "Code Llama 13b Instruct HF",
 
51
  "input_price_per_1m": 0.11,
52
  "output_price_per_1m": 0.33,
53
  "currency": "USD",
54
+ "size_b": 24,
55
+ "capabilities": [
56
+ "tools"
57
+ ]
58
  },
59
  {
60
  "name": "gpt-oss-120b",
 
62
  "input_price_per_1m": 0.17,
63
  "output_price_per_1m": 0.71,
64
  "currency": "USD",
65
+ "size_b": 120,
66
+ "capabilities": [
67
+ "tools",
68
+ "reasoning"
69
+ ]
70
  },
71
  {
72
  "name": "Llama 3.3 70B Instruct",
 
74
  "input_price_per_1m": 0.71,
75
  "output_price_per_1m": 0.71,
76
  "currency": "USD",
77
+ "size_b": 70,
78
+ "capabilities": [
79
+ "tools"
80
+ ]
81
  },
82
  {
83
  "name": "Llama 3.1 405B Instruct",
 
85
  "input_price_per_1m": 1.93,
86
  "output_price_per_1m": 1.93,
87
  "currency": "USD",
88
+ "size_b": 405,
89
+ "capabilities": [
90
+ "tools"
91
+ ]
92
  },
93
  {
94
  "name": "LightOnOCR 2",
 
106
  "type": "image",
107
  "input_price_per_1m": 0.032,
108
  "output_price_per_1m": 0,
109
+ "currency": "USD",
110
+ "capabilities": [
111
+ "image-gen"
112
+ ]
113
  },
114
  {
115
  "name": "paraphrase-multilingual-mpnet-base-v2",
 
161
  },
162
  {
163
  "name": "Mistral-Small-3.2-24B-Instruct-2506",
164
+ "type": "vision",
165
  "input_price_per_1m": 0.1,
166
  "output_price_per_1m": 0.3,
167
  "currency": "CHF",
168
+ "size_b": 24,
169
+ "capabilities": [
170
+ "vision",
171
+ "tools"
172
+ ]
173
  },
174
  {
175
  "name": "Qwen3-VL-235B-A22B-Instruct",
176
+ "type": "vision",
177
  "input_price_per_1m": 0.7,
178
  "output_price_per_1m": 2,
179
  "currency": "CHF",
180
+ "size_b": 235,
181
+ "capabilities": [
182
+ "vision",
183
+ "tools"
184
+ ]
185
  },
186
  {
187
  "name": "Llama 3.3",
188
  "type": "chat",
189
  "input_price_per_1m": 1,
190
  "output_price_per_1m": 3,
191
+ "currency": "CHF",
192
+ "capabilities": [
193
+ "tools",
194
+ "reasoning"
195
+ ]
196
  },
197
  {
198
  "name": "Apertus-70B-Instruct-2509",
 
208
  "input_price_per_1m": 0.3,
209
  "output_price_per_1m": 0.9,
210
  "currency": "CHF",
211
+ "size_b": 120,
212
+ "capabilities": [
213
+ "tools",
214
+ "reasoning"
215
+ ]
216
  },
217
  {
218
  "name": "Kimi-K2.5",
219
+ "type": "vision",
220
  "input_price_per_1m": 0.6,
221
  "output_price_per_1m": 3,
222
+ "currency": "CHF",
223
+ "capabilities": [
224
+ "vision",
225
+ "tools",
226
+ "reasoning"
227
+ ]
228
  },
229
  {
230
  "name": "Bge Multilingual Gemma2",
 
260
  "type": "image",
261
  "input_price_per_1m": 0.3,
262
  "output_price_per_1m": 0,
263
+ "currency": "CHF",
264
+ "capabilities": [
265
+ "image-gen"
266
+ ]
267
  },
268
  {
269
  "name": "Flux schnell",
270
  "type": "image",
271
  "input_price_per_1m": 0.3,
272
  "output_price_per_1m": 0,
273
+ "currency": "CHF",
274
+ "capabilities": [
275
+ "image-gen"
276
+ ]
277
  }
278
  ],
279
  "lastUpdated": "2026-03-02T04:54:47.632Z"
 
304
  },
305
  {
306
  "name": "GPT-5.2 Pro",
307
+ "type": "vision",
308
  "input_price_per_1m": 19.48,
309
  "output_price_per_1m": 155.85,
310
  "currency": "EUR",
311
+ "provider_upstream": "OpenAI",
312
+ "capabilities": [
313
+ "vision",
314
+ "files",
315
+ "tools",
316
+ "reasoning"
317
+ ]
318
  },
319
  {
320
  "name": "Opus 4.6 Reasoning",
 
338
  "input_price_per_1m": 0.92,
339
  "output_price_per_1m": 3.67,
340
  "currency": "EUR",
341
+ "provider_upstream": "DeepSeek",
342
+ "capabilities": [
343
+ "tools",
344
+ "reasoning"
345
+ ]
346
  },
347
  {
348
  "name": "Mistral Medium",
349
+ "type": "vision",
350
  "input_price_per_1m": 0.37,
351
  "output_price_per_1m": 1.86,
352
  "currency": "EUR",
353
+ "provider_upstream": "Mistral",
354
+ "capabilities": [
355
+ "vision",
356
+ "tools"
357
+ ]
358
  },
359
  {
360
  "name": "Mistral Large 2411",
 
362
  "input_price_per_1m": 1.86,
363
  "output_price_per_1m": 5.59,
364
  "currency": "EUR",
365
+ "provider_upstream": "Mistral",
366
+ "capabilities": [
367
+ "tools"
368
+ ]
369
  },
370
  {
371
  "name": "Llama 4 Maverick",
372
+ "type": "vision",
373
  "input_price_per_1m": 0.2,
374
  "output_price_per_1m": 0.8,
375
  "currency": "EUR",
376
+ "provider_upstream": "Meta",
377
+ "capabilities": [
378
+ "vision",
379
+ "tools"
380
+ ]
381
  },
382
  {
383
  "name": "Sonnet 4.5 Reasoning",
 
394
  "output_price_per_1m": 0.66,
395
  "currency": "EUR",
396
  "size_b": 70,
397
+ "provider_upstream": "Meta",
398
+ "capabilities": [
399
+ "tools"
400
+ ]
401
  },
402
  {
403
  "name": "Sonnet 4.5",
 
489
  },
490
  {
491
  "name": "o3 Pro",
492
+ "type": "vision",
493
  "input_price_per_1m": 18.63,
494
  "output_price_per_1m": 74.54,
495
  "currency": "EUR",
496
+ "provider_upstream": "OpenAI",
497
+ "capabilities": [
498
+ "vision",
499
+ "files",
500
+ "tools",
501
+ "reasoning"
502
+ ]
503
  },
504
  {
505
  "name": "o4 Mini",
506
+ "type": "vision",
507
  "input_price_per_1m": 1.02,
508
  "output_price_per_1m": 4.1,
509
  "currency": "EUR",
510
+ "provider_upstream": "OpenAI",
511
+ "capabilities": [
512
+ "vision",
513
+ "files",
514
+ "tools",
515
+ "reasoning"
516
+ ]
517
  },
518
  {
519
  "name": "o3 Mini high",
 
521
  "input_price_per_1m": 1.13,
522
  "output_price_per_1m": 4.51,
523
  "currency": "EUR",
524
+ "provider_upstream": "OpenAI",
525
+ "capabilities": [
526
+ "files",
527
+ "tools"
528
+ ]
529
  },
530
  {
531
  "name": "o3",
532
+ "type": "vision",
533
  "input_price_per_1m": 1.86,
534
  "output_price_per_1m": 7.45,
535
  "currency": "EUR",
536
+ "provider_upstream": "OpenAI",
537
+ "capabilities": [
538
+ "vision",
539
+ "files",
540
+ "tools",
541
+ "reasoning"
542
+ ]
543
  },
544
  {
545
  "name": "o3 Mini",
 
547
  "input_price_per_1m": 1.13,
548
  "output_price_per_1m": 4.51,
549
  "currency": "EUR",
550
+ "provider_upstream": "OpenAI",
551
+ "capabilities": [
552
+ "files",
553
+ "tools"
554
+ ]
555
  },
556
  {
557
  "name": "o1",
558
+ "type": "vision",
559
  "input_price_per_1m": 15.37,
560
  "output_price_per_1m": 61.49,
561
  "currency": "EUR",
562
+ "provider_upstream": "OpenAI",
563
+ "capabilities": [
564
+ "vision",
565
+ "files",
566
+ "tools"
567
+ ]
568
  },
569
  {
570
  "name": "GPT-5.2 Thinking",
571
+ "type": "vision",
572
  "input_price_per_1m": 1.63,
573
  "output_price_per_1m": 13.04,
574
  "currency": "EUR",
575
+ "provider_upstream": "OpenAI",
576
+ "capabilities": [
577
+ "vision",
578
+ "files",
579
+ "tools",
580
+ "reasoning"
581
+ ]
582
  },
583
  {
584
  "name": "GPT-5.2",
585
+ "type": "vision",
586
  "input_price_per_1m": 1.63,
587
  "output_price_per_1m": 13.04,
588
  "currency": "EUR",
589
+ "provider_upstream": "OpenAI",
590
+ "capabilities": [
591
+ "vision",
592
+ "files",
593
+ "tools",
594
+ "reasoning"
595
+ ]
596
  },
597
  {
598
  "name": "GPT-5.1 Thinking",
599
+ "type": "vision",
600
  "input_price_per_1m": 1.16,
601
  "output_price_per_1m": 9.32,
602
  "currency": "EUR",
603
+ "provider_upstream": "OpenAI",
604
+ "capabilities": [
605
+ "vision",
606
+ "files",
607
+ "tools",
608
+ "reasoning"
609
+ ]
610
  },
611
  {
612
  "name": "GPT-5.1 Thinking Fast",
613
+ "type": "vision",
614
  "input_price_per_1m": 1.16,
615
  "output_price_per_1m": 9.32,
616
  "currency": "EUR",
617
+ "provider_upstream": "OpenAI",
618
+ "capabilities": [
619
+ "vision",
620
+ "files",
621
+ "tools",
622
+ "reasoning"
623
+ ]
624
  },
625
  {
626
  "name": "GPT-5.1",
627
+ "type": "vision",
628
  "input_price_per_1m": 1.16,
629
  "output_price_per_1m": 9.32,
630
  "currency": "EUR",
631
+ "provider_upstream": "OpenAI",
632
+ "capabilities": [
633
+ "vision",
634
+ "files",
635
+ "tools",
636
+ "reasoning"
637
+ ]
638
  },
639
  {
640
  "name": "GPT-5 Thinking",
641
+ "type": "vision",
642
  "input_price_per_1m": 1.16,
643
  "output_price_per_1m": 9.32,
644
  "currency": "EUR",
645
+ "provider_upstream": "OpenAI",
646
+ "capabilities": [
647
+ "vision",
648
+ "files",
649
+ "tools",
650
+ "reasoning"
651
+ ]
652
  },
653
  {
654
  "name": "GPT-5 Thinking Fast",
655
+ "type": "vision",
656
  "input_price_per_1m": 1.16,
657
  "output_price_per_1m": 9.32,
658
  "currency": "EUR",
659
+ "provider_upstream": "OpenAI",
660
+ "capabilities": [
661
+ "vision",
662
+ "files",
663
+ "tools",
664
+ "reasoning"
665
+ ]
666
  },
667
  {
668
  "name": "GPT-5 Pro",
669
+ "type": "vision",
670
  "input_price_per_1m": 13.98,
671
  "output_price_per_1m": 111.8,
672
  "currency": "EUR",
673
+ "provider_upstream": "OpenAI",
674
+ "capabilities": [
675
+ "vision",
676
+ "files",
677
+ "tools",
678
+ "reasoning"
679
+ ]
680
  },
681
  {
682
  "name": "GPT-5 Nano",
683
+ "type": "vision",
684
  "input_price_per_1m": 0.05,
685
  "output_price_per_1m": 0.37,
686
  "currency": "EUR",
687
+ "provider_upstream": "OpenAI",
688
+ "capabilities": [
689
+ "vision",
690
+ "files",
691
+ "tools",
692
+ "reasoning"
693
+ ]
694
  },
695
  {
696
  "name": "GPT-5 Mini",
697
+ "type": "vision",
698
  "input_price_per_1m": 0.23,
699
  "output_price_per_1m": 1.86,
700
  "currency": "EUR",
701
+ "provider_upstream": "OpenAI",
702
+ "capabilities": [
703
+ "vision",
704
+ "files",
705
+ "tools",
706
+ "reasoning"
707
+ ]
708
  },
709
  {
710
  "name": "GPT-5 Chat",
711
+ "type": "vision",
712
  "input_price_per_1m": 1.16,
713
  "output_price_per_1m": 9.32,
714
  "currency": "EUR",
715
+ "provider_upstream": "OpenAI",
716
+ "capabilities": [
717
+ "vision",
718
+ "files"
719
+ ]
720
  },
721
  {
722
  "name": "GPT-5",
723
+ "type": "vision",
724
  "input_price_per_1m": 1.16,
725
  "output_price_per_1m": 9.32,
726
  "currency": "EUR",
727
+ "provider_upstream": "OpenAI",
728
+ "capabilities": [
729
+ "vision",
730
+ "files",
731
+ "tools",
732
+ "reasoning"
733
+ ]
734
  },
735
  {
736
  "name": "GPT-4o Mini",
737
+ "type": "vision",
738
  "input_price_per_1m": 0.14,
739
  "output_price_per_1m": 0.56,
740
  "currency": "EUR",
741
+ "provider_upstream": "OpenAI",
742
+ "capabilities": [
743
+ "vision",
744
+ "files",
745
+ "tools"
746
+ ]
747
  },
748
  {
749
  "name": "GPT-4.1 nano",
750
+ "type": "vision",
751
  "input_price_per_1m": 0.09,
752
  "output_price_per_1m": 0.37,
753
  "currency": "EUR",
754
+ "provider_upstream": "OpenAI",
755
+ "capabilities": [
756
+ "vision",
757
+ "files",
758
+ "tools"
759
+ ]
760
  },
761
  {
762
  "name": "GPT-4o",
763
+ "type": "vision",
764
  "input_price_per_1m": 2.56,
765
  "output_price_per_1m": 10.25,
766
  "currency": "EUR",
767
+ "provider_upstream": "OpenAI",
768
+ "capabilities": [
769
+ "vision",
770
+ "files",
771
+ "tools"
772
+ ]
773
  },
774
  {
775
  "name": "GPT-4.1",
776
+ "type": "vision",
777
  "input_price_per_1m": 1.86,
778
  "output_price_per_1m": 7.45,
779
  "currency": "EUR",
780
+ "provider_upstream": "OpenAI",
781
+ "capabilities": [
782
+ "vision",
783
+ "files",
784
+ "tools"
785
+ ]
786
  },
787
  {
788
  "name": "GPT-4.1 mini",
789
+ "type": "vision",
790
  "input_price_per_1m": 0.37,
791
  "output_price_per_1m": 1.49,
792
  "currency": "EUR",
793
+ "provider_upstream": "OpenAI",
794
+ "capabilities": [
795
+ "vision",
796
+ "files",
797
+ "tools"
798
+ ]
799
  },
800
  {
801
  "name": "Gemini 3 Pro Preview",
802
+ "type": "vision",
803
  "input_price_per_1m": 2.33,
804
  "output_price_per_1m": 13.98,
805
  "currency": "EUR",
806
+ "provider_upstream": "Google",
807
+ "capabilities": [
808
+ "vision",
809
+ "video",
810
+ "audio",
811
+ "files",
812
+ "tools",
813
+ "reasoning"
814
+ ]
815
  },
816
  {
817
  "name": "Gemini 3 Flash Preview",
818
+ "type": "vision",
819
  "input_price_per_1m": 0.47,
820
  "output_price_per_1m": 2.8,
821
  "currency": "EUR",
822
+ "provider_upstream": "Google",
823
+ "capabilities": [
824
+ "vision",
825
+ "video",
826
+ "audio",
827
+ "files",
828
+ "tools",
829
+ "reasoning"
830
+ ]
831
  },
832
  {
833
  "name": "GPT oss (120b)",
 
836
  "output_price_per_1m": 2.33,
837
  "currency": "EUR",
838
  "size_b": 120,
839
+ "provider_upstream": "OpenAI",
840
+ "capabilities": [
841
+ "tools",
842
+ "reasoning"
843
+ ]
844
  },
845
  {
846
  "name": "Gemini 2.5 Flash",
847
+ "type": "vision",
848
  "input_price_per_1m": 0.28,
849
  "output_price_per_1m": 2.33,
850
  "currency": "EUR",
851
+ "provider_upstream": "Google",
852
+ "capabilities": [
853
+ "vision",
854
+ "video",
855
+ "audio",
856
+ "files",
857
+ "tools",
858
+ "reasoning"
859
+ ]
860
  },
861
  {
862
  "name": "Gemini 2.5 Pro Reasoning",
863
+ "type": "vision",
864
  "input_price_per_1m": 2.33,
865
  "output_price_per_1m": 13.98,
866
  "currency": "EUR",
867
+ "provider_upstream": "Google",
868
+ "capabilities": [
869
+ "vision",
870
+ "video",
871
+ "audio",
872
+ "files",
873
+ "tools",
874
+ "reasoning"
875
+ ]
876
  },
877
  {
878
  "name": "Gemini 2.5 Pro",
879
+ "type": "vision",
880
  "input_price_per_1m": 2.33,
881
  "output_price_per_1m": 13.98,
882
  "currency": "EUR",
883
+ "provider_upstream": "Google",
884
+ "capabilities": [
885
+ "vision",
886
+ "video",
887
+ "audio",
888
+ "files",
889
+ "tools",
890
+ "reasoning"
891
+ ]
892
  }
893
  ]
894
  },
 
946
  "output_price_per_1m": 0.04,
947
  "currency": "USD",
948
  "context_window": 8192,
949
+ "size_b": 8,
950
+ "capabilities": [
951
+ "tools"
952
+ ]
953
  },
954
  {
955
  "name": "openai-responses/gpt-5-nano",
 
1025
  "input_price_per_1m": 0.05,
1026
  "output_price_per_1m": 0.2,
1027
  "currency": "USD",
1028
+ "context_window": 1000000,
1029
+ "capabilities": [
1030
+ "tools"
1031
+ ]
1032
  },
1033
  {
1034
  "name": "novita/meta-llama/llama-3.1-8b-instruct",
 
1037
  "output_price_per_1m": 0.05,
1038
  "currency": "USD",
1039
  "context_window": 16384,
1040
+ "size_b": 8,
1041
+ "capabilities": [
1042
+ "tools"
1043
+ ]
1044
  },
1045
  {
1046
  "name": "novita/sao10k/l3-8b-lunaris",
 
1102
  "output_price_per_1m": 0.3,
1103
  "currency": "USD",
1104
  "context_window": 40000,
1105
+ "size_b": 32,
1106
+ "capabilities": [
1107
+ "tools",
1108
+ "reasoning"
1109
+ ]
1110
  },
1111
  {
1112
  "name": "openai-responses/gpt-4.1-nano",
 
1266
  "input_price_per_1m": 0.1,
1267
  "output_price_per_1m": 0.3,
1268
  "currency": "USD",
1269
+ "context_window": 131072,
1270
+ "capabilities": [
1271
+ "tools"
1272
+ ]
1273
  },
1274
  {
1275
  "name": "mistral/devstral-small-2507",
 
1277
  "input_price_per_1m": 0.1,
1278
  "output_price_per_1m": 0.3,
1279
  "currency": "USD",
1280
+ "context_window": 131072,
1281
+ "capabilities": [
1282
+ "tools"
1283
+ ]
1284
  },
1285
  {
1286
  "name": "mistral/mistral-small-latest",
 
1297
  "output_price_per_1m": 0.5,
1298
  "currency": "USD",
1299
  "context_window": 131072,
1300
+ "size_b": 20,
1301
+ "capabilities": [
1302
+ "tools",
1303
+ "reasoning"
1304
+ ]
1305
  },
1306
  {
1307
  "name": "google/gemini-2.0-flash-001",
 
1465
  "output_price_per_1m": 0.3,
1466
  "currency": "USD",
1467
  "context_window": 131072,
1468
+ "size_b": 70,
1469
+ "capabilities": [
1470
+ "tools"
1471
+ ]
1472
  },
1473
  {
1474
  "name": "openai/gpt-5-mini:flex",
 
1489
  "output_price_per_1m": 0.4,
1490
  "currency": "USD",
1491
  "context_window": 128000,
1492
+ "size_b": 70,
1493
+ "capabilities": [
1494
+ "tools"
1495
+ ]
1496
  },
1497
  {
1498
  "name": "novita/nousresearch/hermes-2-pro-llama-3-8b",
 
1530
  "output_price_per_1m": 0.75,
1531
  "currency": "USD",
1532
  "context_window": 131072,
1533
+ "size_b": 120,
1534
+ "capabilities": [
1535
+ "tools",
1536
+ "reasoning"
1537
+ ]
1538
  },
1539
  {
1540
  "name": "novita/deepseek/deepseek-r1-distill-qwen-14b",
 
1543
  "output_price_per_1m": 0.15,
1544
  "currency": "USD",
1545
  "context_window": 128000,
1546
+ "size_b": 14,
1547
+ "capabilities": [
1548
+ "tools",
1549
+ "reasoning"
1550
+ ]
1551
  },
1552
  {
1553
  "name": "novita/mistralai/mistral-nemo",
 
1555
  "input_price_per_1m": 0.17,
1556
  "output_price_per_1m": 0.17,
1557
  "currency": "USD",
1558
+ "context_window": 131072,
1559
+ "capabilities": [
1560
+ "tools"
1561
+ ]
1562
  },
1563
  {
1564
  "name": "together/meta-llama/Meta-Llama-3.1-8B-Instruct-Turbo",
 
1576
  "output_price_per_1m": 0.6,
1577
  "currency": "USD",
1578
  "context_window": 40000,
1579
+ "size_b": 235,
1580
+ "capabilities": [
1581
+ "tools",
1582
+ "reasoning"
1583
+ ]
1584
  },
1585
  {
1586
  "name": "deepinfra/zai-org/GLM-4.5-Air",
 
1588
  "input_price_per_1m": 0.2,
1589
  "output_price_per_1m": 1.1,
1590
  "currency": "USD",
1591
+ "context_window": 131072,
1592
+ "capabilities": [
1593
+ "tools",
1594
+ "reasoning"
1595
+ ]
1596
  },
1597
  {
1598
  "name": "together/meta-llama/LlamaGuard-2-8b",
 
1605
  },
1606
  {
1607
  "name": "xai/grok-4-fast",
1608
+ "type": "vision",
1609
  "input_price_per_1m": 0.2,
1610
  "output_price_per_1m": 0.5,
1611
  "currency": "USD",
1612
+ "context_window": 2000000,
1613
+ "capabilities": [
1614
+ "vision",
1615
+ "tools",
1616
+ "reasoning"
1617
+ ]
1618
  },
1619
  {
1620
  "name": "xai/grok-4-fast-non-reasoning",
1621
+ "type": "vision",
1622
  "input_price_per_1m": 0.2,
1623
  "output_price_per_1m": 0.5,
1624
  "currency": "USD",
1625
+ "context_window": 2000000,
1626
+ "capabilities": [
1627
+ "vision",
1628
+ "tools",
1629
+ "reasoning"
1630
+ ]
1631
  },
1632
  {
1633
  "name": "xai/grok-4-1-fast-non-reasoning",
 
1681
  "output_price_per_1m": 0.8,
1682
  "currency": "USD",
1683
  "context_window": 128000,
1684
+ "size_b": 235,
1685
+ "capabilities": [
1686
+ "tools",
1687
+ "reasoning"
1688
+ ]
1689
  },
1690
  {
1691
  "name": "novita/meta-llama/llama-4-maverick-17b-128e-instruct-fp8",
1692
+ "type": "vision",
1693
  "input_price_per_1m": 0.2,
1694
  "output_price_per_1m": 0.85,
1695
  "currency": "USD",
1696
  "context_window": 1048576,
1697
+ "size_b": 17,
1698
+ "capabilities": [
1699
+ "vision",
1700
+ "tools"
1701
+ ]
1702
  },
1703
  {
1704
  "name": "deepinfra/meta-llama/Meta-Llama-3.1-70B-Instruct",
 
1716
  "output_price_per_1m": 0.69,
1717
  "currency": "USD",
1718
  "context_window": 64000,
1719
+ "size_b": 70,
1720
+ "capabilities": [
1721
+ "reasoning"
1722
+ ]
1723
  },
1724
  {
1725
  "name": "deepinfra/Qwen/Qwen2.5-72B-Instruct",
 
1737
  "output_price_per_1m": 0.4,
1738
  "currency": "USD",
1739
  "context_window": 131072,
1740
+ "size_b": 70,
1741
+ "capabilities": [
1742
+ "tools"
1743
+ ]
1744
  },
1745
  {
1746
  "name": "openai-responses/gpt-5-mini",
 
1847
  "input_price_per_1m": 0.28,
1848
  "output_price_per_1m": 0.42,
1849
  "currency": "USD",
1850
+ "context_window": 128000,
1851
+ "capabilities": [
1852
+ "tools"
1853
+ ]
1854
  },
1855
  {
1856
  "name": "deepseek/deepseek-reasoner",
 
1897
  "input_price_per_1m": 0.3,
1898
  "output_price_per_1m": 1,
1899
  "currency": "USD",
1900
+ "context_window": 163840,
1901
+ "capabilities": [
1902
+ "tools",
1903
+ "reasoning"
1904
+ ]
1905
  },
1906
  {
1907
  "name": "together/Qwen/Qwen2.5-7B-Instruct-Turbo",
 
1971
  "input_price_per_1m": 0.3,
1972
  "output_price_per_1m": 1.2,
1973
  "currency": "USD",
1974
+ "context_window": 200000,
1975
+ "capabilities": [
1976
+ "tools",
1977
+ "reasoning"
1978
+ ]
1979
  },
1980
  {
1981
  "name": "alibaba/qwen3-coder-flash",
 
2151
  "output_price_per_1m": 0.3,
2152
  "currency": "USD",
2153
  "context_window": 12800,
2154
+ "size_b": 32,
2155
+ "capabilities": [
2156
+ "reasoning"
2157
+ ]
2158
  },
2159
  {
2160
  "name": "coding/gemini-2.5-flash@us-south1",
 
2304
  "output_price_per_1m": 0.4,
2305
  "currency": "USD",
2306
  "context_window": 32000,
2307
+ "size_b": 72,
2308
+ "capabilities": [
2309
+ "tools"
2310
+ ]
2311
  },
2312
  {
2313
  "name": "novita/meta-llama/llama-3.3-70b-instruct",
 
2316
  "output_price_per_1m": 0.39,
2317
  "currency": "USD",
2318
  "context_window": 131072,
2319
+ "size_b": 70,
2320
+ "capabilities": [
2321
+ "tools"
2322
+ ]
2323
  },
2324
  {
2325
  "name": "nebius/zai-org/GLM-4.7",
 
2339
  "output_price_per_1m": 1.8,
2340
  "currency": "USD",
2341
  "context_window": 262000,
2342
+ "size_b": 480,
2343
+ "capabilities": [
2344
+ "tools"
2345
+ ]
2346
  },
2347
  {
2348
  "name": "deepinfra/Qwen/Qwen3-Coder-480B-A35B-Instruct",
 
2351
  "output_price_per_1m": 1.6,
2352
  "currency": "USD",
2353
  "context_window": 262144,
2354
+ "size_b": 480,
2355
+ "capabilities": [
2356
+ "tools"
2357
+ ]
2358
  },
2359
  {
2360
  "name": "openai-responses/gpt-4.1-mini",
 
2505
  "input_price_per_1m": 0.4,
2506
  "output_price_per_1m": 2,
2507
  "currency": "USD",
2508
+ "context_window": 131072,
2509
+ "capabilities": [
2510
+ "tools"
2511
+ ]
2512
  },
2513
  {
2514
  "name": "mistral/mistral-medium-latest",
 
2524
  "input_price_per_1m": 0.4,
2525
  "output_price_per_1m": 1.2,
2526
  "currency": "USD",
2527
+ "context_window": 131072,
2528
+ "capabilities": [
2529
+ "tools"
2530
+ ]
2531
  },
2532
  {
2533
  "name": "novita/deepseek/deepseek-v3-0324",
 
2563
  "input_price_per_1m": 0.5,
2564
  "output_price_per_1m": 2.4,
2565
  "currency": "USD",
2566
+ "context_window": 131000,
2567
+ "capabilities": [
2568
+ "tools"
2569
+ ]
2570
  },
2571
  {
2572
  "name": "nebius/moonshotai/kimi-k2.5",
 
2594
  "input_price_per_1m": 0.5,
2595
  "output_price_per_1m": 1.5,
2596
  "currency": "USD",
2597
+ "context_window": 131072,
2598
+ "capabilities": [
2599
+ "tools"
2600
+ ]
2601
  },
2602
  {
2603
  "name": "google/gemini-3.1-flash-image-preview@us-east5",
 
2913
  "input_price_per_1m": 0.57,
2914
  "output_price_per_1m": 2.3,
2915
  "currency": "USD",
2916
+ "context_window": 131072,
2917
+ "capabilities": [
2918
+ "tools"
2919
+ ]
2920
  },
2921
  {
2922
  "name": "nebius/zai-org/GLM-4.5",
 
2924
  "input_price_per_1m": 0.6,
2925
  "output_price_per_1m": 2.2,
2926
  "currency": "USD",
2927
+ "context_window": 128000,
2928
+ "capabilities": [
2929
+ "tools",
2930
+ "reasoning"
2931
+ ]
2932
  },
2933
  {
2934
  "name": "moonshot/kimi-k2-0711-preview",
 
2936
  "input_price_per_1m": 0.6,
2937
  "output_price_per_1m": 2.5,
2938
  "currency": "USD",
2939
+ "context_window": 131072,
2940
+ "capabilities": [
2941
+ "tools"
2942
+ ]
2943
  },
2944
  {
2945
  "name": "moonshot/kimi-k2.5",
 
2959
  "input_price_per_1m": 0.6,
2960
  "output_price_per_1m": 2.5,
2961
  "currency": "USD",
2962
+ "context_window": 131072,
2963
+ "capabilities": [
2964
+ "tools",
2965
+ "reasoning"
2966
+ ]
2967
  },
2968
  {
2969
  "name": "moonshot/kimi-k2-0905-preview",
 
2971
  "input_price_per_1m": 0.6,
2972
  "output_price_per_1m": 2.5,
2973
  "currency": "USD",
2974
+ "context_window": 131072,
2975
+ "capabilities": [
2976
+ "tools"
2977
+ ]
2978
  },
2979
  {
2980
  "name": "moonshot/kimi-k2-thinking",
 
2982
  "input_price_per_1m": 0.6,
2983
  "output_price_per_1m": 2.5,
2984
  "currency": "USD",
2985
+ "context_window": 131072,
2986
+ "capabilities": [
2987
+ "tools",
2988
+ "reasoning"
2989
+ ]
2990
  },
2991
  {
2992
  "name": "deepinfra/zai-org/GLM-4.5",
 
2994
  "input_price_per_1m": 0.6,
2995
  "output_price_per_1m": 2.2,
2996
  "currency": "USD",
2997
+ "context_window": 131072,
2998
+ "capabilities": [
2999
+ "tools",
3000
+ "reasoning"
3001
+ ]
3002
  },
3003
  {
3004
  "name": "zai/GLM-4.5",
 
3063
  "input_price_per_1m": 0.6,
3064
  "output_price_per_1m": 2.2,
3065
  "currency": "USD",
3066
+ "context_window": 204800,
3067
+ "capabilities": [
3068
+ "tools",
3069
+ "reasoning"
3070
+ ]
3071
  },
3072
  {
3073
  "name": "novita/zai-org/glm-4.5",
 
3075
  "input_price_per_1m": 0.6,
3076
  "output_price_per_1m": 2.2,
3077
  "currency": "USD",
3078
+ "context_window": 131072,
3079
+ "capabilities": [
3080
+ "tools",
3081
+ "reasoning"
3082
+ ]
3083
  },
3084
  {
3085
  "name": "novita/microsoft/wizardlm-2-8x22b",
 
3120
  "input_price_per_1m": 0.7,
3121
  "output_price_per_1m": 2.5,
3122
  "currency": "USD",
3123
+ "context_window": 64000,
3124
+ "capabilities": [
3125
+ "tools",
3126
+ "reasoning"
3127
+ ]
3128
  },
3129
  {
3130
  "name": "novita/deepseek/deepseek-prover-v2-671b",
 
3141
  "input_price_per_1m": 0.8,
3142
  "output_price_per_1m": 2.4,
3143
  "currency": "USD",
3144
+ "context_window": 164000,
3145
+ "capabilities": [
3146
+ "tools",
3147
+ "reasoning"
3148
+ ]
3149
  },
3150
  {
3151
  "name": "deepinfra/meta-llama/Meta-Llama-3.1-405B-Instruct",
 
3163
  "output_price_per_1m": 0.8,
3164
  "currency": "USD",
3165
  "context_window": 32000,
3166
+ "size_b": 70,
3167
+ "capabilities": [
3168
+ "reasoning"
3169
+ ]
3170
  },
3171
  {
3172
  "name": "novita/qwen/qwen2.5-vl-72b-instruct",
3173
+ "type": "vision",
3174
  "input_price_per_1m": 0.8,
3175
  "output_price_per_1m": 0.8,
3176
  "currency": "USD",
3177
  "context_window": 96000,
3178
+ "size_b": 72,
3179
+ "capabilities": [
3180
+ "vision"
3181
+ ]
3182
  },
3183
  {
3184
  "name": "deepinfra/deepseek-ai/DeepSeek-V3",
 
3186
  "input_price_per_1m": 0.85,
3187
  "output_price_per_1m": 0.9,
3188
  "currency": "USD",
3189
+ "context_window": 128000,
3190
+ "capabilities": [
3191
+ "tools",
3192
+ "reasoning"
3193
+ ]
3194
  },
3195
  {
3196
  "name": "deepinfra/deepseek-ai/DeepSeek-R1",
 
3198
  "input_price_per_1m": 0.85,
3199
  "output_price_per_1m": 2.5,
3200
  "currency": "USD",
3201
+ "context_window": 64000,
3202
+ "capabilities": [
3203
+ "tools",
3204
+ "reasoning"
3205
+ ]
3206
  },
3207
  {
3208
  "name": "alibaba/qwen3-max",
 
3222
  "output_price_per_1m": 0.88,
3223
  "currency": "USD",
3224
  "context_window": 131072,
3225
+ "size_b": 70,
3226
+ "capabilities": [
3227
+ "tools"
3228
+ ]
3229
  },
3230
  {
3231
  "name": "together/meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo",
 
3242
  "input_price_per_1m": 0.89,
3243
  "output_price_per_1m": 0.89,
3244
  "currency": "USD",
3245
+ "context_window": 64000,
3246
+ "capabilities": [
3247
+ "tools",
3248
+ "reasoning"
3249
+ ]
3250
  },
3251
  {
3252
  "name": "parasail/parasail-kimi-k2-instruct",
 
3269
  },
3270
  {
3271
  "name": "perplexity/sonar",
3272
+ "type": "vision",
3273
  "input_price_per_1m": 1,
3274
  "output_price_per_1m": 1,
3275
  "currency": "USD",
3276
+ "context_window": 131072,
3277
+ "capabilities": [
3278
+ "vision"
3279
+ ]
3280
  },
3281
  {
3282
  "name": "openai/o3:flex",
 
3330
  "input_price_per_1m": 1,
3331
  "output_price_per_1m": 3,
3332
  "currency": "USD",
3333
+ "context_window": 131072,
3334
+ "capabilities": [
3335
+ "tools"
3336
+ ]
3337
  },
3338
  {
3339
  "name": "groq/moonshotai/Kimi-K2-Instruct-0905",
 
3341
  "input_price_per_1m": 1,
3342
  "output_price_per_1m": 3,
3343
  "currency": "USD",
3344
+ "context_window": 256000,
3345
+ "capabilities": [
3346
+ "tools"
3347
+ ]
3348
  },
3349
  {
3350
  "name": "vertex/claude-haiku-4-5",
 
3638
  "input_price_per_1m": 1.2,
3639
  "output_price_per_1m": 5,
3640
  "currency": "USD",
3641
+ "context_window": 131072,
3642
+ "capabilities": [
3643
+ "tools"
3644
+ ]
3645
  },
3646
  {
3647
  "name": "together/Qwen/Qwen2.5-72B-Instruct-Turbo",
 
3853
  "input_price_per_1m": 1.25,
3854
  "output_price_per_1m": 1.25,
3855
  "currency": "USD",
3856
+ "context_window": 131072,
3857
+ "capabilities": [
3858
+ "tools",
3859
+ "reasoning"
3860
+ ]
3861
  },
3862
  {
3863
  "name": "google/gemini-2.5-pro",
 
4159
  "input_price_per_1m": 1.6,
4160
  "output_price_per_1m": 6.4,
4161
  "currency": "USD",
4162
+ "context_window": 32768,
4163
+ "capabilities": [
4164
+ "tools"
4165
+ ]
4166
  },
4167
  {
4168
  "name": "openai-responses/gpt-5.3-codex",
 
4280
  },
4281
  {
4282
  "name": "perplexity/sonar-reasoning-pro",
4283
+ "type": "vision",
4284
  "input_price_per_1m": 2,
4285
  "output_price_per_1m": 8,
4286
  "currency": "USD",
4287
+ "context_window": 131072,
4288
+ "capabilities": [
4289
+ "vision",
4290
+ "reasoning"
4291
+ ]
4292
  },
4293
  {
4294
  "name": "openai-responses/gpt-4.1",
 
4807
  },
4808
  {
4809
  "name": "perplexity/sonar-pro",
4810
+ "type": "vision",
4811
  "input_price_per_1m": 3,
4812
  "output_price_per_1m": 15,
4813
  "currency": "USD",
4814
+ "context_window": 204800,
4815
+ "capabilities": [
4816
+ "vision"
4817
+ ]
4818
  },
4819
  {
4820
  "name": "together/deepseek-ai/DeepSeek-R1",
 
4822
  "input_price_per_1m": 3,
4823
  "output_price_per_1m": 7,
4824
  "currency": "USD",
4825
+ "context_window": 64000,
4826
+ "capabilities": [
4827
+ "tools",
4828
+ "reasoning"
4829
+ ]
4830
  },
4831
  {
4832
  "name": "anthropic/claude-sonnet-4-5",
 
5310
  "input_price_per_1m": 4,
5311
  "output_price_per_1m": 4,
5312
  "currency": "USD",
5313
+ "context_window": 64000,
5314
+ "capabilities": [
5315
+ "tools",
5316
+ "reasoning"
5317
+ ]
5318
  },
5319
  {
5320
  "name": "bedrock/claude-opus-4-6",
 
5381
  "input_price_per_1m": 5,
5382
  "output_price_per_1m": 25,
5383
  "currency": "USD",
5384
+ "context_window": 131072,
5385
+ "capabilities": [
5386
+ "tools"
5387
+ ]
5388
  },
5389
  {
5390
  "name": "vertex/claude-opus-4-5",
 
5812
  "output_price_per_1m": 0.6,
5813
  "currency": "USD",
5814
  "size_b": 120,
5815
+ "flavor": "base",
5816
+ "capabilities": [
5817
+ "tools",
5818
+ "reasoning"
5819
+ ]
5820
  },
5821
  {
5822
  "name": "gpt-oss-20b (base)",
 
5825
  "output_price_per_1m": 0.2,
5826
  "currency": "USD",
5827
  "size_b": 20,
5828
+ "flavor": "base",
5829
+ "capabilities": [
5830
+ "tools",
5831
+ "reasoning"
5832
+ ]
5833
  },
5834
  {
5835
  "name": "Kimi-K2-Instruct (base)",
 
5837
  "input_price_per_1m": 0.5,
5838
  "output_price_per_1m": 2.4,
5839
  "currency": "USD",
5840
+ "flavor": "base",
5841
+ "capabilities": [
5842
+ "tools"
5843
+ ]
5844
  },
5845
  {
5846
  "name": "Qwen3-Coder-480B-A35B-Instruct (base)",
 
5849
  "output_price_per_1m": 1.8,
5850
  "currency": "USD",
5851
  "size_b": 480,
5852
+ "flavor": "base",
5853
+ "capabilities": [
5854
+ "tools"
5855
+ ]
5856
  },
5857
  {
5858
  "name": "Qwen3-235B-A22B-Thinking-2507 (base)",
 
5861
  "output_price_per_1m": 0.8,
5862
  "currency": "USD",
5863
  "size_b": 235,
5864
+ "flavor": "base",
5865
+ "capabilities": [
5866
+ "tools",
5867
+ "reasoning"
5868
+ ]
5869
  },
5870
  {
5871
  "name": "Qwen3-235B-A22B-Instruct-2507 (base)",
 
5874
  "output_price_per_1m": 0.6,
5875
  "currency": "USD",
5876
  "size_b": 235,
5877
+ "flavor": "base",
5878
+ "capabilities": [
5879
+ "tools",
5880
+ "reasoning"
5881
+ ]
5882
  },
5883
  {
5884
  "name": "Qwen3-30B-A3B-Thinking-2507 (base)",
 
5887
  "output_price_per_1m": 0.3,
5888
  "currency": "USD",
5889
  "size_b": 30,
5890
+ "flavor": "base",
5891
+ "capabilities": [
5892
+ "tools",
5893
+ "reasoning"
5894
+ ]
5895
  },
5896
  {
5897
  "name": "Qwen3-30B-A3B-Instruct-2507 (base)",
 
5900
  "output_price_per_1m": 0.3,
5901
  "currency": "USD",
5902
  "size_b": 30,
5903
+ "flavor": "base",
5904
+ "capabilities": [
5905
+ "tools"
5906
+ ]
5907
  },
5908
  {
5909
  "name": "Qwen3-Coder-30B-A3B-Instruct (base)",
 
5912
  "output_price_per_1m": 0.3,
5913
  "currency": "USD",
5914
  "size_b": 30,
5915
+ "flavor": "base",
5916
+ "capabilities": [
5917
+ "tools"
5918
+ ]
5919
  },
5920
  {
5921
  "name": "Qwen3-30B-A3B (base)",
 
5924
  "output_price_per_1m": 0.3,
5925
  "currency": "USD",
5926
  "size_b": 30,
5927
+ "flavor": "base",
5928
+ "capabilities": [
5929
+ "tools",
5930
+ "reasoning"
5931
+ ]
5932
  },
5933
  {
5934
  "name": "Qwen3-32B (fast)",
 
5937
  "output_price_per_1m": 0.6,
5938
  "currency": "USD",
5939
  "size_b": 32,
5940
+ "flavor": "fast",
5941
+ "capabilities": [
5942
+ "tools",
5943
+ "reasoning"
5944
+ ]
5945
  },
5946
  {
5947
  "name": "Qwen3-32B (base)",
 
5950
  "output_price_per_1m": 0.3,
5951
  "currency": "USD",
5952
  "size_b": 32,
5953
+ "flavor": "base",
5954
+ "capabilities": [
5955
+ "tools",
5956
+ "reasoning"
5957
+ ]
5958
  },
5959
  {
5960
  "name": "Qwen3-14B (base)",
 
5963
  "output_price_per_1m": 0.24,
5964
  "currency": "USD",
5965
  "size_b": 14,
5966
+ "flavor": "base",
5967
+ "capabilities": [
5968
+ "tools",
5969
+ "reasoning"
5970
+ ]
5971
  },
5972
  {
5973
  "name": "Qwen2.5-Coder-7B (base)",
 
5994
  "output_price_per_1m": 1.5,
5995
  "currency": "USD",
5996
  "size_b": 32,
5997
+ "flavor": "fast",
5998
+ "capabilities": [
5999
+ "tools",
6000
+ "reasoning"
6001
+ ]
6002
  },
6003
  {
6004
  "name": "QwQ-32B (base)",
 
6007
  "output_price_per_1m": 0.45,
6008
  "currency": "USD",
6009
  "size_b": 32,
6010
+ "flavor": "base",
6011
+ "capabilities": [
6012
+ "tools",
6013
+ "reasoning"
6014
+ ]
6015
  },
6016
  {
6017
  "name": "GLM-4.5 (base)",
 
6019
  "input_price_per_1m": 0.6,
6020
  "output_price_per_1m": 2.2,
6021
  "currency": "USD",
6022
+ "flavor": "base",
6023
+ "capabilities": [
6024
+ "tools",
6025
+ "reasoning"
6026
+ ]
6027
  },
6028
  {
6029
  "name": "GLM-4.5-Air (base)",
 
6031
  "input_price_per_1m": 0.2,
6032
  "output_price_per_1m": 1.2,
6033
  "currency": "USD",
6034
+ "flavor": "base",
6035
+ "capabilities": [
6036
+ "tools",
6037
+ "reasoning"
6038
+ ]
6039
  },
6040
  {
6041
  "name": "DeepSeek-R1-0528 (fast)",
 
6043
  "input_price_per_1m": 2,
6044
  "output_price_per_1m": 6,
6045
  "currency": "USD",
6046
+ "flavor": "fast",
6047
+ "capabilities": [
6048
+ "tools",
6049
+ "reasoning"
6050
+ ]
6051
  },
6052
  {
6053
  "name": "DeepSeek-R1-0528 (base)",
 
6055
  "input_price_per_1m": 0.8,
6056
  "output_price_per_1m": 2.4,
6057
  "currency": "USD",
6058
+ "flavor": "base",
6059
+ "capabilities": [
6060
+ "tools",
6061
+ "reasoning"
6062
+ ]
6063
  },
6064
  {
6065
  "name": "DeepSeek-V3-0324 (fast)",
 
6092
  "output_price_per_1m": 0.75,
6093
  "currency": "USD",
6094
  "size_b": 70,
6095
+ "flavor": "fast",
6096
+ "capabilities": [
6097
+ "tools"
6098
+ ]
6099
  },
6100
  {
6101
  "name": "Llama-3.3-70B-Instruct (base)",
 
6104
  "output_price_per_1m": 0.4,
6105
  "currency": "USD",
6106
  "size_b": 70,
6107
+ "flavor": "base",
6108
+ "capabilities": [
6109
+ "tools"
6110
+ ]
6111
  },
6112
  {
6113
  "name": "Llama-3.1-8B-Instruct (fast)",
 
6116
  "output_price_per_1m": 0.09,
6117
  "currency": "USD",
6118
  "size_b": 8,
6119
+ "flavor": "fast",
6120
+ "capabilities": [
6121
+ "tools"
6122
+ ]
6123
  },
6124
  {
6125
  "name": "Llama-3.1-8B-Instruct (base)",
 
6128
  "output_price_per_1m": 0.06,
6129
  "currency": "USD",
6130
  "size_b": 8,
6131
+ "flavor": "base",
6132
+ "capabilities": [
6133
+ "tools"
6134
+ ]
6135
  },
6136
  {
6137
  "name": "Llama-3.1-405B-Instruct (base)",
 
6140
  "output_price_per_1m": 3,
6141
  "currency": "USD",
6142
  "size_b": 405,
6143
+ "flavor": "base",
6144
+ "capabilities": [
6145
+ "tools"
6146
+ ]
6147
  },
6148
  {
6149
  "name": "Llama-3_1-Nemotron-Ultra-253B-v1 (base)",
 
6178
  "input_price_per_1m": 0.08,
6179
  "output_price_per_1m": 0.24,
6180
  "currency": "USD",
6181
+ "flavor": "base",
6182
+ "capabilities": [
6183
+ "tools"
6184
+ ]
6185
  },
6186
  {
6187
  "name": "Hermes-4-405B (base)",
 
6190
  "output_price_per_1m": 3,
6191
  "currency": "USD",
6192
  "size_b": 405,
6193
+ "flavor": "base",
6194
+ "capabilities": [
6195
+ "reasoning"
6196
+ ]
6197
  },
6198
  {
6199
  "name": "Hermes-4-70B (base)",
 
6202
  "output_price_per_1m": 0.4,
6203
  "currency": "USD",
6204
  "size_b": 70,
6205
+ "flavor": "base",
6206
+ "capabilities": [
6207
+ "reasoning"
6208
+ ]
6209
  },
6210
  {
6211
  "name": "Hermes-3-Llama-3.1-405B (base)",
 
6287
  "type": "image",
6288
  "input_price_per_1m": 0.0013,
6289
  "output_price_per_1m": 0,
6290
+ "currency": "USD",
6291
+ "capabilities": [
6292
+ "image-gen"
6293
+ ]
6294
  },
6295
  {
6296
  "name": "flux-dev",
6297
  "type": "image",
6298
  "input_price_per_1m": 0.007,
6299
  "output_price_per_1m": 0,
6300
+ "currency": "USD",
6301
+ "capabilities": [
6302
+ "image-gen"
6303
+ ]
6304
  },
6305
  {
6306
  "name": "sdxl",
6307
  "type": "image",
6308
  "input_price_per_1m": 0.003,
6309
  "output_price_per_1m": 0,
6310
+ "currency": "USD",
6311
+ "capabilities": [
6312
+ "image-gen"
6313
+ ]
6314
  },
6315
  {
6316
  "name": "bge-multilingual-gemma2",
 
6359
  "input_price_per_1m": 0.75,
6360
  "output_price_per_1m": 2.25,
6361
  "currency": "EUR",
6362
+ "size_b": 235,
6363
+ "capabilities": [
6364
+ "tools",
6365
+ "reasoning"
6366
+ ]
6367
  },
6368
  {
6369
  "name": "gpt-oss-120b",
 
6371
  "input_price_per_1m": 0.15,
6372
  "output_price_per_1m": 0.6,
6373
  "currency": "EUR",
6374
+ "size_b": 120,
6375
+ "capabilities": [
6376
+ "tools",
6377
+ "reasoning"
6378
+ ]
6379
  },
6380
  {
6381
  "name": "mistral-small-3.2-24b-instruct-2506",
6382
+ "type": "vision",
6383
  "input_price_per_1m": 0.15,
6384
  "output_price_per_1m": 0.35,
6385
  "currency": "EUR",
6386
+ "size_b": 24,
6387
+ "capabilities": [
6388
+ "vision",
6389
+ "tools"
6390
+ ]
6391
  },
6392
  {
6393
  "name": "devstral-2-123b-instruct-2512",
 
6418
  "input_price_per_1m": 0.9,
6419
  "output_price_per_1m": 0.9,
6420
  "currency": "EUR",
6421
+ "size_b": 70,
6422
+ "capabilities": [
6423
+ "tools"
6424
+ ]
6425
  },
6426
  {
6427
  "name": "qwen3-coder-30b-a3b-instruct",
 
6429
  "input_price_per_1m": 0.2,
6430
  "output_price_per_1m": 0.8,
6431
  "currency": "EUR",
6432
+ "size_b": 30,
6433
+ "capabilities": [
6434
+ "tools"
6435
+ ]
6436
  },
6437
  {
6438
  "name": "qwen3-embedding-8b",
 
6456
  "input_price_per_1m": 0.15,
6457
  "output_price_per_1m": 0.35,
6458
  "currency": "EUR",
6459
+ "size_b": 24,
6460
+ "capabilities": [
6461
+ "audio",
6462
+ "tools"
6463
+ ]
6464
  },
6465
  {
6466
  "name": "gemma-3-27b-it",
6467
+ "type": "vision",
6468
  "input_price_per_1m": 0.25,
6469
  "output_price_per_1m": 0.5,
6470
  "currency": "EUR",
6471
+ "size_b": 27,
6472
+ "capabilities": [
6473
+ "vision",
6474
+ "tools"
6475
+ ]
6476
  },
6477
  {
6478
  "name": "bge-multilingual-gemma2",
 
6487
  "input_price_per_1m": 0.2,
6488
  "output_price_per_1m": 0.2,
6489
  "currency": "EUR",
6490
+ "size_b": 8,
6491
+ "capabilities": [
6492
+ "tools"
6493
+ ]
6494
  },
6495
  {
6496
  "name": "mistral-nemo-instruct-2407",
6497
  "type": "chat",
6498
  "input_price_per_1m": 0.2,
6499
  "output_price_per_1m": 0.2,
6500
+ "currency": "EUR",
6501
+ "capabilities": [
6502
+ "tools"
6503
+ ]
6504
  },
6505
  {
6506
  "name": "deepseek-r1-distill-llama-70b",
 
6508
  "input_price_per_1m": 0.9,
6509
  "output_price_per_1m": 0.9,
6510
  "currency": "EUR",
6511
+ "size_b": 70,
6512
+ "capabilities": [
6513
+ "reasoning"
6514
+ ]
6515
  }
6516
  ]
6517
  },
 
6529
  "input_price_per_1m": 0.5,
6530
  "output_price_per_1m": 1.5,
6531
  "currency": "USD",
6532
+ "api_endpoint": "mistral-large-latest",
6533
+ "capabilities": [
6534
+ "tools"
6535
+ ]
6536
  },
6537
  {
6538
  "name": "Mistral Medium 3",
6539
+ "type": "vision",
6540
  "input_price_per_1m": 0.4,
6541
  "output_price_per_1m": 2,
6542
  "currency": "USD",
6543
+ "api_endpoint": "mistral-medium-latest",
6544
+ "capabilities": [
6545
+ "vision",
6546
+ "tools"
6547
+ ]
6548
  },
6549
  {
6550
  "name": "Devstral 2",
 
6560
  "input_price_per_1m": 0.1,
6561
  "output_price_per_1m": 0.3,
6562
  "currency": "USD",
6563
+ "api_endpoint": "devstral-small-latest",
6564
+ "capabilities": [
6565
+ "tools"
6566
+ ]
6567
  },
6568
  {
6569
  "name": "Codestral",
 
6571
  "input_price_per_1m": 0.3,
6572
  "output_price_per_1m": 0.9,
6573
  "currency": "USD",
6574
+ "api_endpoint": "codestral-latest",
6575
+ "capabilities": [
6576
+ "tools"
6577
+ ]
6578
  },
6579
  {
6580
  "name": "Mistral Small 3.2",
6581
+ "type": "vision",
6582
  "input_price_per_1m": 0.1,
6583
  "output_price_per_1m": 0.3,
6584
  "currency": "USD",
6585
+ "api_endpoint": "mistral-small-latest",
6586
+ "capabilities": [
6587
+ "vision",
6588
+ "tools"
6589
+ ]
6590
  },
6591
  {
6592
  "name": "Mistral Small Creative",
 
6594
  "input_price_per_1m": 0.1,
6595
  "output_price_per_1m": 0.3,
6596
  "currency": "USD",
6597
+ "api_endpoint": "labs-mistral-small-creative",
6598
+ "capabilities": [
6599
+ "tools"
6600
+ ]
6601
  },
6602
  {
6603
  "name": "Magistral Medium",
 
6660
  },
6661
  {
6662
  "name": "Voxtral Small",
6663
+ "type": "audio",
6664
  "input_price_per_1m": 0.004,
6665
  "output_price_per_1m": 0.3,
6666
  "currency": "USD",
6667
+ "api_endpoint": "voxtral-small-latest",
6668
+ "capabilities": [
6669
+ "audio",
6670
+ "tools"
6671
+ ]
6672
  },
6673
  {
6674
  "name": "Voxtral Mini",
 
6720
  },
6721
  {
6722
  "name": "Pixtral Large",
6723
+ "type": "vision",
6724
  "input_price_per_1m": 2,
6725
  "output_price_per_1m": 6,
6726
  "currency": "USD",
6727
+ "api_endpoint": "pixtral-large-latest",
6728
+ "capabilities": [
6729
+ "vision",
6730
+ "tools"
6731
+ ]
6732
  },
6733
  {
6734
  "name": "Pixtral 12B",
 
6745
  "input_price_per_1m": 0.15,
6746
  "output_price_per_1m": 0.15,
6747
  "currency": "USD",
6748
+ "api_endpoint": "open-mistral-nemo",
6749
+ "capabilities": [
6750
+ "tools"
6751
+ ]
6752
  },
6753
  {
6754
  "name": "Mistral 7B",
 
6766
  "output_price_per_1m": 0.7,
6767
  "currency": "USD",
6768
  "size_b": 7,
6769
+ "api_endpoint": "open-mixtral-8x7b",
6770
+ "capabilities": [
6771
+ "tools"
6772
+ ]
6773
  },
6774
  {
6775
  "name": "Mixtral 8x22B",
 
6778
  "output_price_per_1m": 6,
6779
  "currency": "USD",
6780
  "size_b": 22,
6781
+ "api_endpoint": "open-mixtral-8x22b",
6782
+ "capabilities": [
6783
+ "tools"
6784
+ ]
6785
  }
6786
  ]
6787
  },
 
10242
  ],
10243
  "size_b": 12
10244
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10245
  {
10246
  "name": "qwen/qwen3-next-80b-a3b-instruct:free",
10247
  "type": "chat",
 
10300
  "reasoning"
10301
  ]
10302
  },
 
 
 
 
 
 
 
 
 
 
 
 
10303
  {
10304
  "name": "qwen/qwen3-coder:free",
10305
  "type": "chat",
 
10435
  "input_price_per_1m": 0.075,
10436
  "output_price_per_1m": 0.3,
10437
  "currency": "USD",
10438
+ "size_b": 20,
10439
+ "capabilities": [
10440
+ "tools",
10441
+ "reasoning"
10442
+ ]
10443
  },
10444
  {
10445
  "name": "GPT OSS Safeguard 20B",
 
10447
  "input_price_per_1m": 0.075,
10448
  "output_price_per_1m": 0.3,
10449
  "currency": "USD",
10450
+ "size_b": 20,
10451
+ "capabilities": [
10452
+ "tools",
10453
+ "reasoning"
10454
+ ]
10455
  },
10456
  {
10457
  "name": "GPT OSS 120B 128k",
 
10459
  "input_price_per_1m": 0.15,
10460
  "output_price_per_1m": 0.6,
10461
  "currency": "USD",
10462
+ "size_b": 120,
10463
+ "capabilities": [
10464
+ "tools",
10465
+ "reasoning"
10466
+ ]
10467
  },
10468
  {
10469
  "name": "Kimi K2-0905 1T 256k",
10470
  "type": "chat",
10471
  "input_price_per_1m": 1,
10472
  "output_price_per_1m": 3,
10473
+ "currency": "USD",
10474
+ "capabilities": [
10475
+ "tools"
10476
+ ]
10477
  },
10478
  {
10479
  "name": "Llama 4 Scout (17Bx16E) 128k",
10480
+ "type": "vision",
10481
  "input_price_per_1m": 0.11,
10482
  "output_price_per_1m": 0.34,
10483
  "currency": "USD",
10484
+ "size_b": 17,
10485
+ "capabilities": [
10486
+ "vision",
10487
+ "tools"
10488
+ ]
10489
  },
10490
  {
10491
  "name": "Llama 4 Maverick (17Bx128E) 128k",
10492
+ "type": "vision",
10493
  "input_price_per_1m": 0.2,
10494
  "output_price_per_1m": 0.6,
10495
  "currency": "USD",
10496
+ "size_b": 17,
10497
+ "capabilities": [
10498
+ "vision",
10499
+ "tools"
10500
+ ]
10501
  },
10502
  {
10503
  "name": "Qwen3 32B 131k",
 
10505
  "input_price_per_1m": 0.29,
10506
  "output_price_per_1m": 0.59,
10507
  "currency": "USD",
10508
+ "size_b": 32,
10509
+ "capabilities": [
10510
+ "tools",
10511
+ "reasoning"
10512
+ ]
10513
  },
10514
  {
10515
  "name": "Llama 3.3 70B Versatile 128k",
 
10556
  "currency": "USD"
10557
  }
10558
  ]
10559
+ },
10560
+ {
10561
+ "name": "Black Forest Labs",
10562
+ "url": "https://bfl.ai",
10563
+ "headquarters": "Germany",
10564
+ "region": "EU",
10565
+ "gdpr_compliant": true,
10566
+ "eu_endpoints": true,
10567
+ "models": [
10568
+ {
10569
+ "name": "flux-2-klein-4b",
10570
+ "display_name": "FLUX.2 [klein] 4B",
10571
+ "type": "image",
10572
+ "capabilities": [
10573
+ "image-gen"
10574
+ ],
10575
+ "price_per_image": 0.014,
10576
+ "input_price_per_1m": 0,
10577
+ "output_price_per_1m": 0,
10578
+ "currency": "USD",
10579
+ "category": "FLUX.2"
10580
+ },
10581
+ {
10582
+ "name": "flux-2-klein-9b",
10583
+ "display_name": "FLUX.2 [klein] 9B",
10584
+ "type": "image",
10585
+ "capabilities": [
10586
+ "image-gen"
10587
+ ],
10588
+ "price_per_image": 0.015,
10589
+ "input_price_per_1m": 0,
10590
+ "output_price_per_1m": 0,
10591
+ "currency": "USD",
10592
+ "category": "FLUX.2"
10593
+ },
10594
+ {
10595
+ "name": "flux-dev",
10596
+ "display_name": "FLUX.1 [dev]",
10597
+ "type": "image",
10598
+ "capabilities": [
10599
+ "image-gen"
10600
+ ],
10601
+ "price_per_image": 0.025,
10602
+ "input_price_per_1m": 0,
10603
+ "output_price_per_1m": 0,
10604
+ "currency": "USD",
10605
+ "category": "FLUX.1"
10606
+ },
10607
+ {
10608
+ "name": "flux-2-pro",
10609
+ "display_name": "FLUX.2 [pro]",
10610
+ "type": "image",
10611
+ "capabilities": [
10612
+ "image-gen"
10613
+ ],
10614
+ "price_per_image": 0.03,
10615
+ "input_price_per_1m": 0,
10616
+ "output_price_per_1m": 0,
10617
+ "currency": "USD",
10618
+ "category": "FLUX.2"
10619
+ },
10620
+ {
10621
+ "name": "flux-kontext-pro",
10622
+ "display_name": "FLUX.1 Kontext [pro]",
10623
+ "type": "image",
10624
+ "capabilities": [
10625
+ "image-gen"
10626
+ ],
10627
+ "price_per_image": 0.04,
10628
+ "input_price_per_1m": 0,
10629
+ "output_price_per_1m": 0,
10630
+ "currency": "USD",
10631
+ "category": "FLUX.1"
10632
+ },
10633
+ {
10634
+ "name": "flux-pro-1.1",
10635
+ "display_name": "FLUX 1.1 [pro]",
10636
+ "type": "image",
10637
+ "capabilities": [
10638
+ "image-gen"
10639
+ ],
10640
+ "price_per_image": 0.04,
10641
+ "input_price_per_1m": 0,
10642
+ "output_price_per_1m": 0,
10643
+ "currency": "USD",
10644
+ "category": "FLUX.1"
10645
+ },
10646
+ {
10647
+ "name": "flux-2-flex",
10648
+ "display_name": "FLUX.2 [flex]",
10649
+ "type": "image",
10650
+ "capabilities": [
10651
+ "image-gen"
10652
+ ],
10653
+ "price_per_image": 0.05,
10654
+ "input_price_per_1m": 0,
10655
+ "output_price_per_1m": 0,
10656
+ "currency": "USD",
10657
+ "category": "FLUX.2"
10658
+ },
10659
+ {
10660
+ "name": "flux-pro",
10661
+ "display_name": "FLUX.1 [pro]",
10662
+ "type": "image",
10663
+ "capabilities": [
10664
+ "image-gen"
10665
+ ],
10666
+ "price_per_image": 0.05,
10667
+ "input_price_per_1m": 0,
10668
+ "output_price_per_1m": 0,
10669
+ "currency": "USD",
10670
+ "category": "FLUX.1"
10671
+ },
10672
+ {
10673
+ "name": "flux-pro-1.0-fill",
10674
+ "display_name": "FLUX.1 Fill [pro]",
10675
+ "type": "image",
10676
+ "capabilities": [
10677
+ "image-gen"
10678
+ ],
10679
+ "price_per_image": 0.05,
10680
+ "input_price_per_1m": 0,
10681
+ "output_price_per_1m": 0,
10682
+ "currency": "USD",
10683
+ "category": "FLUX.1 Tools"
10684
+ },
10685
+ {
10686
+ "name": "flux-pro-1.1-ultra",
10687
+ "display_name": "FLUX 1.1 [pro] Ultra",
10688
+ "type": "image",
10689
+ "capabilities": [
10690
+ "image-gen"
10691
+ ],
10692
+ "price_per_image": 0.06,
10693
+ "input_price_per_1m": 0,
10694
+ "output_price_per_1m": 0,
10695
+ "currency": "USD",
10696
+ "category": "FLUX.1"
10697
+ },
10698
+ {
10699
+ "name": "flux-2-max",
10700
+ "display_name": "FLUX.2 [max]",
10701
+ "type": "image",
10702
+ "capabilities": [
10703
+ "image-gen"
10704
+ ],
10705
+ "price_per_image": 0.07,
10706
+ "input_price_per_1m": 0,
10707
+ "output_price_per_1m": 0,
10708
+ "currency": "USD",
10709
+ "category": "FLUX.2"
10710
+ },
10711
+ {
10712
+ "name": "flux-kontext-max",
10713
+ "display_name": "FLUX.1 Kontext [max]",
10714
+ "type": "image",
10715
+ "capabilities": [
10716
+ "image-gen"
10717
+ ],
10718
+ "price_per_image": 0.08,
10719
+ "input_price_per_1m": 0,
10720
+ "output_price_per_1m": 0,
10721
+ "currency": "USD",
10722
+ "category": "FLUX.1"
10723
+ }
10724
+ ]
10725
  }
10726
  ]
10727
  }
package.json CHANGED
@@ -18,6 +18,7 @@
18
  "fetch:groq": "node scripts/providers/groq.js",
19
  "fetch:infomaniak": "node scripts/providers/infomaniak.js",
20
  "fetch:ionos": "node scripts/providers/ionos.js",
 
21
  "fetch:benchmarks": "node scripts/fetch-benchmarks.js",
22
  "server": "node server.js",
23
  "dev:api": "node server.js"
 
18
  "fetch:groq": "node scripts/providers/groq.js",
19
  "fetch:infomaniak": "node scripts/providers/infomaniak.js",
20
  "fetch:ionos": "node scripts/providers/ionos.js",
21
+ "fetch:bfl": "node scripts/providers/black-forest-labs.js",
22
  "fetch:benchmarks": "node scripts/fetch-benchmarks.js",
23
  "server": "node server.js",
24
  "dev:api": "node server.js"
scripts/fetch-benchmarks.js CHANGED
@@ -22,7 +22,13 @@
22
  * Where both sources have data for the same benchmark (gpqa, mmlu_pro, ifeval, bbh),
23
  * LLMStats takes priority (it stores self-reported model-card values).
24
  *
25
- * Usage: node scripts/fetch-benchmarks.js
 
 
 
 
 
 
26
  */
27
 
28
  const fs = require('fs');
@@ -520,9 +526,162 @@ function mergeAider(entries, aiderEntries) {
520
  return [...entries, ...newEntries];
521
  }
522
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
523
  // ─── Main ────────────────────────────────────────────────────────────────────
524
 
525
  async function main() {
 
 
 
 
 
 
 
 
 
526
  const [llmstats, hfEntries, lbEntries, arenaEntries, aiderEntries] = await Promise.all([
527
  fetchLLMStats(),
528
  fetchHFLeaderboard(),
 
22
  * Where both sources have data for the same benchmark (gpqa, mmlu_pro, ifeval, bbh),
23
  * LLMStats takes priority (it stores self-reported model-card values).
24
  *
25
+ * Usage:
26
+ * node scripts/fetch-benchmarks.js # fetch all sources
27
+ * node scripts/fetch-benchmarks.js livebench # refresh LiveBench only
28
+ * node scripts/fetch-benchmarks.js arena # refresh Chatbot Arena only
29
+ * node scripts/fetch-benchmarks.js aider # refresh Aider only
30
+ * node scripts/fetch-benchmarks.js hf # refresh HF Leaderboard only
31
+ * node scripts/fetch-benchmarks.js llmstats # refresh LLMStats only
32
  */
33
 
34
  const fs = require('fs');
 
526
  return [...entries, ...newEntries];
527
  }
528
 
529
+ // ─── Per-source partial refresh ──────────────────────────────────────────────
530
+
531
+ // Fields owned by each source. Stripping these fields + removing source-only
532
+ // entries allows re-running just one source without losing other sources' data.
533
+ const SOURCE_FIELDS = {
534
+ llmstats: ['slug', 'mmlu', 'mmlu_pro', 'gpqa', 'human_eval', 'math', 'gsm8k', 'mmmu', 'hellaswag', 'ifeval', 'arc', 'drop', 'mbpp', 'mgsm', 'bbh'],
535
+ hf: ['hf_id', 'params_b', 'hf_math_lvl5', 'hf_musr', 'hf_avg'],
536
+ livebench: ['lb_name', 'lb_global', 'lb_reasoning', 'lb_coding', 'lb_math', 'lb_language', 'lb_if', 'lb_data_analysis'],
537
+ arena: ['arena_name', 'arena_org', 'arena_elo', 'arena_rank', 'arena_votes'],
538
+ aider: ['aider_model', 'aider_pass_rate'],
539
+ };
540
+
541
+ // A unique field that only this source contributes (used to detect source-only entries).
542
+ const SOURCE_ID_FIELD = {
543
+ llmstats: 'slug',
544
+ hf: 'hf_id',
545
+ livebench: 'lb_name',
546
+ arena: 'arena_elo',
547
+ aider: 'aider_pass_rate',
548
+ };
549
+
550
+ const ALL_ID_FIELDS = Object.values(SOURCE_ID_FIELD);
551
+
552
+ function stripSourceFields(entries, source) {
553
+ const fields = SOURCE_FIELDS[source];
554
+ const ownId = SOURCE_ID_FIELD[source];
555
+ const otherId = ALL_ID_FIELDS.filter((id) => id !== ownId);
556
+ return entries
557
+ // Drop entries that only belong to this source (no other source data)
558
+ .filter((e) => otherId.some((id) => e[id] !== undefined))
559
+ .map((e) => {
560
+ const stripped = { ...e };
561
+ for (const f of fields) delete stripped[f];
562
+ return stripped;
563
+ });
564
+ }
565
+
566
+ // Merge freshly-fetched LLMStats data into an existing array of entries.
567
+ function mergeLLMStatsInto(entries, llmstats) {
568
+ const LS_FIELDS = SOURCE_FIELDS.llmstats;
569
+ const nameMap = new Map();
570
+ entries.forEach((e, i) => {
571
+ if (e.name) nameMap.set(normName(e.name), i);
572
+ const slugModel = (e.slug || '').split('/').pop();
573
+ if (slugModel) nameMap.set(normName(slugModel), i);
574
+ });
575
+
576
+ let matched = 0;
577
+ const usedIdx = new Set();
578
+ const newEntries = [];
579
+
580
+ for (const ls of llmstats) {
581
+ const candidates = [normName(ls.name || ''), normName((ls.slug || '').split('/').pop())].filter(Boolean);
582
+ const idx = candidates.map((c) => nameMap.get(c)).find((n) => n !== undefined);
583
+ if (idx !== undefined && !usedIdx.has(idx)) {
584
+ const target = entries[idx];
585
+ for (const f of LS_FIELDS) { if (ls[f] !== undefined) target[f] = ls[f]; }
586
+ usedIdx.add(idx);
587
+ matched++;
588
+ } else {
589
+ newEntries.push({ ...ls });
590
+ }
591
+ }
592
+
593
+ console.log(` LLMStats: ${matched} matched, ${newEntries.length} new entries`);
594
+ return [...entries, ...newEntries];
595
+ }
596
+
597
+ // Merge freshly-fetched HF data into an existing array of entries.
598
+ function mergeHFInto(entries, hfEntries) {
599
+ const nameMap = new Map();
600
+ entries.forEach((e, i) => {
601
+ if (e.name) nameMap.set(normName(e.name), i);
602
+ const slugModel = (e.slug || '').split('/').pop();
603
+ if (slugModel) nameMap.set(normName(slugModel), i);
604
+ });
605
+
606
+ let matched = 0;
607
+ const usedIdx = new Set();
608
+ const newEntries = [];
609
+
610
+ for (const hf of hfEntries) {
611
+ const modelPart = normName(hf.name);
612
+ const modelWords = modelPart.split(' ');
613
+ const noPrefix = modelWords.length > 1 ? modelWords.slice(1).join(' ') : modelPart;
614
+ const candidates = [modelPart, noPrefix].filter(Boolean);
615
+ const idx = candidates.map((c) => nameMap.get(c)).find((n) => n !== undefined);
616
+
617
+ if (idx !== undefined && !usedIdx.has(idx)) {
618
+ const target = entries[idx];
619
+ if (!target.hf_id) target.hf_id = hf.hf_id;
620
+ if (!target.params_b) target.params_b = hf.params_b;
621
+ // LLMStats takes priority for shared benchmarks
622
+ if (!target.ifeval) target.ifeval = hf.ifeval;
623
+ if (!target.bbh) target.bbh = hf.bbh;
624
+ if (!target.gpqa) target.gpqa = hf.gpqa;
625
+ if (!target.mmlu_pro) target.mmlu_pro = hf.mmlu_pro;
626
+ // HF-exclusive fields always updated
627
+ target.hf_math_lvl5 = hf.hf_math_lvl5;
628
+ target.hf_musr = hf.hf_musr;
629
+ target.hf_avg = hf.hf_avg;
630
+ usedIdx.add(idx);
631
+ matched++;
632
+ } else {
633
+ newEntries.push({ ...hf });
634
+ }
635
+ }
636
+
637
+ console.log(` HF: ${matched} matched, ${newEntries.length} new entries`);
638
+ return [...entries, ...newEntries];
639
+ }
640
+
641
+ async function refreshSource(source) {
642
+ if (!SOURCE_FIELDS[source]) {
643
+ console.error(`Unknown source "${source}". Valid: ${Object.keys(SOURCE_FIELDS).join(', ')}`);
644
+ process.exit(1);
645
+ }
646
+
647
+ console.log(`Refreshing benchmark source: ${source}\n`);
648
+ const existing = JSON.parse(fs.readFileSync(OUT_FILE, 'utf8'));
649
+ const stripped = stripSourceFields(existing, source);
650
+
651
+ let result;
652
+ if (source === 'llmstats') {
653
+ const data = await fetchLLMStats();
654
+ result = mergeLLMStatsInto(stripped, data);
655
+ } else if (source === 'hf') {
656
+ const data = await fetchHFLeaderboard();
657
+ result = mergeHFInto(stripped, data);
658
+ } else if (source === 'livebench') {
659
+ const data = await fetchLiveBench();
660
+ result = mergeLiveBench(stripped, data);
661
+ } else if (source === 'arena') {
662
+ const data = await fetchChatbotArena();
663
+ result = mergeArena(stripped, data);
664
+ } else if (source === 'aider') {
665
+ const data = await fetchAider();
666
+ result = mergeAider(stripped, data);
667
+ }
668
+
669
+ fs.writeFileSync(OUT_FILE, JSON.stringify(result, null, 2));
670
+ console.log(`\nSaved ${result.length} entries to data/benchmarks.json`);
671
+ }
672
+
673
  // ─── Main ────────────────────────────────────────────────────────────────────
674
 
675
  async function main() {
676
+ const source = process.argv[2]?.toLowerCase();
677
+
678
+ // Per-source refresh mode
679
+ if (source) {
680
+ await refreshSource(source);
681
+ return;
682
+ }
683
+
684
+ // Full rebuild — all sources
685
  const [llmstats, hfEntries, lbEntries, arenaEntries, aiderEntries] = await Promise.all([
686
  fetchLLMStats(),
687
  fetchHFLeaderboard(),
scripts/fetch-providers.js CHANGED
@@ -27,6 +27,7 @@ const FETCHER_MODULES = {
27
  groq: require('./providers/groq'),
28
  infomaniak: require('./providers/infomaniak'),
29
  ionos: require('./providers/ionos'),
 
30
  };
31
 
32
  const FETCHERS = Object.entries(FETCHER_MODULES).map(([key, mod]) => {
@@ -109,9 +110,16 @@ function propagateCapabilities(data) {
109
  if (orIndex.length === 0) return;
110
 
111
  let propagated = 0;
 
112
  for (const provider of data.providers) {
113
- if (provider.name === 'OpenRouter') continue;
114
  for (const model of provider.models || []) {
 
 
 
 
 
 
 
115
  if (model.capabilities && model.capabilities.length > 0) continue; // already set
116
  const match = findOrMatch(model.name, orIndex);
117
  if (!match) continue;
@@ -121,7 +129,8 @@ function propagateCapabilities(data) {
121
  propagated++;
122
  }
123
  }
124
- if (propagated > 0) console.log(`\nPropagated capabilities to ${propagated} models from OpenRouter.`);
 
125
  }
126
 
127
  async function runFetcher(fetcher, data) {
 
27
  groq: require('./providers/groq'),
28
  infomaniak: require('./providers/infomaniak'),
29
  ionos: require('./providers/ionos'),
30
+ 'black-forest-labs': require('./providers/black-forest-labs'),
31
  };
32
 
33
  const FETCHERS = Object.entries(FETCHER_MODULES).map(([key, mod]) => {
 
110
  if (orIndex.length === 0) return;
111
 
112
  let propagated = 0;
113
+ let autoTagged = 0;
114
  for (const provider of data.providers) {
 
115
  for (const model of provider.models || []) {
116
+ // Auto-tag image-gen models regardless of OR match
117
+ if (model.type === 'image' && (!model.capabilities || !model.capabilities.length)) {
118
+ model.capabilities = ['image-gen'];
119
+ autoTagged++;
120
+ continue;
121
+ }
122
+ if (provider.name === 'OpenRouter') continue;
123
  if (model.capabilities && model.capabilities.length > 0) continue; // already set
124
  const match = findOrMatch(model.name, orIndex);
125
  if (!match) continue;
 
129
  propagated++;
130
  }
131
  }
132
+ if (autoTagged > 0) console.log(`Auto-tagged ${autoTagged} image-gen models.`);
133
+ if (propagated > 0) console.log(`Propagated capabilities to ${propagated} models from OpenRouter.`);
134
  }
135
 
136
  async function runFetcher(fetcher, data) {
scripts/load-env.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ /**
4
+ * Shared environment loader.
5
+ * Checks local project .env first, then ../AIToolkit/.env as a fallback.
6
+ * Only sets variables that are not already present in process.env.
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+
12
+ function loadEnv() {
13
+ const candidates = [
14
+ path.join(__dirname, '..', '.env'),
15
+ path.join(__dirname, '..', '..', 'AIToolkit', '.env'),
16
+ ];
17
+ const envPath = candidates.find((p) => fs.existsSync(p));
18
+ if (!envPath) return;
19
+
20
+ const content = fs.readFileSync(envPath, 'utf8');
21
+ for (const line of content.split('\n')) {
22
+ const m = line.match(/^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/);
23
+ if (m && process.env[m[1]] === undefined) {
24
+ // Strip optional surrounding quotes
25
+ process.env[m[1]] = m[2].trim().replace(/^(['"])(.*)\1$/, '$2');
26
+ }
27
+ }
28
+ }
29
+
30
+ module.exports = { loadEnv };
scripts/providers/black-forest-labs.js ADDED
@@ -0,0 +1,124 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 'use strict';
2
+
3
+ /**
4
+ * Black Forest Labs (bfl.ai) pricing fetcher.
5
+ *
6
+ * bfl.ai/pricing uses Next.js App Router RSC streaming.
7
+ * Pricing data is embedded in self.__next_f.push([1,"..."]) script tags,
8
+ * delivered as Sanity CMS portable text via a `pricingCards` array.
9
+ *
10
+ * Each card has:
11
+ * title – portable text array → plain model name
12
+ * priceUnit – USD price per first generated megapixel (1MP = 1024×1024)
13
+ * apiEndpoint – REST endpoint slug (e.g. /v1/flux-2-max)
14
+ * category – { name } for model family (FLUX.2, FLUX.1, FLUX.1 Tools, …)
15
+ *
16
+ * We store priceUnit as price_per_image (cost for a standard 1MP / 1024×1024 image).
17
+ */
18
+
19
+ const URL = 'https://bfl.ai/pricing';
20
+
21
+ // Extract plain text from Sanity portable text blocks.
22
+ function portableTextToString(blocks) {
23
+ if (!Array.isArray(blocks)) return '';
24
+ return blocks
25
+ .flatMap((b) => (b.children || []).map((s) => s.text || ''))
26
+ .join('')
27
+ .trim();
28
+ }
29
+
30
+ // Bracket-count extract a JSON array starting after `marker` in `str`.
31
+ function extractJsonArray(str, marker) {
32
+ const markerIdx = str.indexOf(marker);
33
+ if (markerIdx < 0) return null;
34
+ let i = markerIdx + marker.length;
35
+ while (i < str.length && str[i] !== '[') i++;
36
+ i++; // past opening '['
37
+ let depth = 0;
38
+ let end = -1;
39
+ for (let j = i; j < str.length; j++) {
40
+ if (str[j] === '[' || str[j] === '{') depth++;
41
+ else if (str[j] === ']' || str[j] === '}') {
42
+ if (depth === 0) { end = j; break; }
43
+ depth--;
44
+ }
45
+ }
46
+ if (end < 0) return null;
47
+ try {
48
+ return JSON.parse('[' + str.slice(i, end) + ']');
49
+ } catch {
50
+ return null;
51
+ }
52
+ }
53
+
54
+ async function fetchBfl() {
55
+ const response = await fetch(URL, {
56
+ headers: {
57
+ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
58
+ Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
59
+ 'Accept-Language': 'en-US,en;q=0.9',
60
+ },
61
+ });
62
+
63
+ if (!response.ok) throw new Error(`HTTP ${response.status} from ${URL}`);
64
+ const html = await response.text();
65
+
66
+ // Decode all RSC payload chunks
67
+ let combined = '';
68
+ const pushRe = /self\.__next_f\.push\(\[1,"([\s\S]*?)"\]\)/g;
69
+ let m;
70
+ while ((m = pushRe.exec(html)) !== null) {
71
+ try { combined += JSON.parse('"' + m[1] + '"'); } catch { /* skip malformed */ }
72
+ }
73
+
74
+ if (!combined) throw new Error('No RSC payload found in page');
75
+
76
+ const cards = extractJsonArray(combined, '"pricingCards":');
77
+ if (!cards) throw new Error('Could not find pricingCards in RSC payload');
78
+
79
+ const models = [];
80
+ for (const card of cards) {
81
+ const name = portableTextToString(card.title);
82
+ const priceUnit = parseFloat(card.priceUnit || '0');
83
+ const endpoint = (card.apiEndpoint || '').replace(/^\/v1\//, '');
84
+ const family = card.category?.name || 'BFL';
85
+
86
+ if (!name || priceUnit <= 0) continue;
87
+
88
+ models.push({
89
+ // Use the API endpoint slug as the model ID for stability
90
+ name: endpoint || name,
91
+ display_name: name,
92
+ type: 'image',
93
+ capabilities: ['image-gen'],
94
+ // priceUnit = USD per first generated megapixel (1024×1024)
95
+ price_per_image: priceUnit,
96
+ input_price_per_1m: 0,
97
+ output_price_per_1m: 0,
98
+ currency: 'USD',
99
+ category: family,
100
+ });
101
+ }
102
+
103
+ // Sort by price ascending
104
+ models.sort((a, b) => a.price_per_image - b.price_per_image);
105
+
106
+ return models;
107
+ }
108
+
109
+ module.exports = { fetchBfl, providerName: 'Black Forest Labs' };
110
+
111
+ // Run standalone: node scripts/providers/bfl.js
112
+ if (require.main === module) {
113
+ fetchBfl()
114
+ .then((models) => {
115
+ console.log(`Fetched ${models.length} models from Black Forest Labs:\n`);
116
+ models.forEach((m) =>
117
+ console.log(` ${m.name.padEnd(35)} [${m.category}] $${m.price_per_image}/MP (${m.display_name})`)
118
+ );
119
+ })
120
+ .catch((err) => {
121
+ console.error('Error:', err.message);
122
+ process.exit(1);
123
+ });
124
+ }
scripts/providers/openrouter.js CHANGED
@@ -2,11 +2,23 @@
2
 
3
  // OpenRouter exposes a public JSON API – no scraping needed.
4
  // Docs: https://openrouter.ai/docs/models
 
 
 
 
 
 
 
 
5
  const API_URL = 'https://openrouter.ai/api/v1/models';
6
 
7
  // OpenRouter stores per-token prices; multiply by 1e6 to get per-1M price.
8
  const toPerMillion = (val) => (val ? parseFloat(val) * 1_000_000 : 0);
9
 
 
 
 
 
10
  const getSizeB = (id) => {
11
  const match = (id || '').match(/[^.\d](\d+)b/i) || (id || '').match(/^(\d+)b/i);
12
  return match ? parseInt(match[1]) : undefined;
@@ -42,12 +54,14 @@ function getCapabilities(architecture, supportedParams) {
42
  }
43
 
44
  async function fetchOpenRouter() {
45
- const response = await fetch(API_URL, {
46
- headers: {
47
- Accept: 'application/json',
48
- 'HTTP-Referer': 'https://github.com/providers-comparison',
49
- },
50
- });
 
 
51
 
52
  if (!response.ok) {
53
  throw new Error(`HTTP ${response.status} from OpenRouter API`);
@@ -60,11 +74,17 @@ async function fetchOpenRouter() {
60
  const pricing = model.pricing || {};
61
  const inputPrice = toPerMillion(pricing.prompt);
62
  const outputPrice = toPerMillion(pricing.completion);
 
 
 
63
 
64
- // Skip meta-route with negative prices (e.g. openrouter/auto sentinel values)
65
  if (inputPrice < 0 || outputPrice < 0) continue;
66
- // Skip the free-router meta-model (it's not a real model, just routes to free models)
67
  if (model.id === 'openrouter/free') continue;
 
 
 
68
 
69
  const type = getModelType(model.architecture);
70
  const capabilities = getCapabilities(model.architecture, model.supported_parameters);
@@ -77,6 +97,11 @@ async function fetchOpenRouter() {
77
  currency: 'USD',
78
  };
79
 
 
 
 
 
 
80
  if (capabilities.length) modelEntry.capabilities = capabilities;
81
  const size_b = getSizeB(model.id);
82
  if (size_b) modelEntry.size_b = size_b;
@@ -101,10 +126,12 @@ module.exports = { fetchOpenRouter, providerName: 'OpenRouter' };
101
  if (require.main === module) {
102
  fetchOpenRouter()
103
  .then((models) => {
104
- const free = models.filter(m => m.input_price_per_1m === 0);
 
105
  const vision = models.filter(m => m.type === 'vision');
106
- console.log(`Fetched ${models.length} models from OpenRouter API`);
107
- console.log(` Free: ${free.length}, Vision: ${vision.length}`);
 
108
  console.log('\nFirst 5 paid:');
109
  models.filter(m => m.input_price_per_1m > 0).slice(0, 5).forEach((m) =>
110
  console.log(` ${m.name.padEnd(55)} $${m.input_price_per_1m} / $${m.output_price_per_1m} [${m.type}] ${(m.capabilities||[]).join(',')}`)
 
2
 
3
  // OpenRouter exposes a public JSON API – no scraping needed.
4
  // Docs: https://openrouter.ai/docs/models
5
+ //
6
+ // Without an API key: ~342 models (public subset).
7
+ // With an API key: ~600+ models including image-gen (FLUX, etc.) and subscriber-only models.
8
+ // Set OPENROUTER_API_KEY in env or ../AIToolkit/.env to unlock all models.
9
+
10
+ const { loadEnv } = require('../load-env');
11
+ loadEnv();
12
+
13
  const API_URL = 'https://openrouter.ai/api/v1/models';
14
 
15
  // OpenRouter stores per-token prices; multiply by 1e6 to get per-1M price.
16
  const toPerMillion = (val) => (val ? parseFloat(val) * 1_000_000 : 0);
17
 
18
+ function loadApiKey() {
19
+ return process.env.OPENROUTER_API_KEY || null;
20
+ }
21
+
22
  const getSizeB = (id) => {
23
  const match = (id || '').match(/[^.\d](\d+)b/i) || (id || '').match(/^(\d+)b/i);
24
  return match ? parseInt(match[1]) : undefined;
 
54
  }
55
 
56
  async function fetchOpenRouter() {
57
+ const apiKey = loadApiKey();
58
+ const headers = {
59
+ Accept: 'application/json',
60
+ 'HTTP-Referer': 'https://github.com/providers-comparison',
61
+ };
62
+ if (apiKey) headers['Authorization'] = `Bearer ${apiKey}`;
63
+
64
+ const response = await fetch(API_URL, { headers });
65
 
66
  if (!response.ok) {
67
  throw new Error(`HTTP ${response.status} from OpenRouter API`);
 
74
  const pricing = model.pricing || {};
75
  const inputPrice = toPerMillion(pricing.prompt);
76
  const outputPrice = toPerMillion(pricing.completion);
77
+ // pricing.image: per-image cost for image-gen models (e.g. FLUX) — in USD per image
78
+ // (NOT the same as per-pixel input cost on vision models like Gemini, which also have prompt price set)
79
+ const imagePrice = parseFloat(pricing.image || '0');
80
 
81
+ // Skip meta-routes with sentinel negative prices (e.g. openrouter/auto)
82
  if (inputPrice < 0 || outputPrice < 0) continue;
83
+ // Skip the free-router meta-model
84
  if (model.id === 'openrouter/free') continue;
85
+ // Skip models with genuinely zero pricing across all fields (unpriced/placeholder entries).
86
+ // Exception: models with a :free suffix are real free models and should be kept.
87
+ if (inputPrice === 0 && outputPrice === 0 && imagePrice === 0 && !model.id.endsWith(':free')) continue;
88
 
89
  const type = getModelType(model.architecture);
90
  const capabilities = getCapabilities(model.architecture, model.supported_parameters);
 
97
  currency: 'USD',
98
  };
99
 
100
+ // For pure image-gen models (no per-token pricing), store the per-image price
101
+ if (imagePrice > 0 && inputPrice === 0 && outputPrice === 0) {
102
+ modelEntry.price_per_image = Math.round(imagePrice * 100000) / 100000;
103
+ }
104
+
105
  if (capabilities.length) modelEntry.capabilities = capabilities;
106
  const size_b = getSizeB(model.id);
107
  if (size_b) modelEntry.size_b = size_b;
 
126
  if (require.main === module) {
127
  fetchOpenRouter()
128
  .then((models) => {
129
+ const apiKey = loadApiKey();
130
+ const free = models.filter(m => m.input_price_per_1m === 0 && !m.price_per_image);
131
  const vision = models.filter(m => m.type === 'vision');
132
+ const imageGen = models.filter(m => m.type === 'image');
133
+ console.log(`Fetched ${models.length} models from OpenRouter API ${apiKey ? '(authenticated)' : '(public – set OPENROUTER_API_KEY for more models)'}`);
134
+ console.log(` Free: ${free.length}, Vision: ${vision.length}, Image-gen: ${imageGen.length}`);
135
  console.log('\nFirst 5 paid:');
136
  models.filter(m => m.input_price_per_1m > 0).slice(0, 5).forEach((m) =>
137
  console.log(` ${m.name.padEnd(55)} $${m.input_price_per_1m} / $${m.output_price_per_1m} [${m.type}] ${(m.capabilities||[]).join(',')}`)
scripts/providers/requesty.js CHANGED
@@ -1,17 +1,12 @@
1
  'use strict';
2
 
3
- const fs = require('fs');
4
- const path = require('path');
5
 
6
  const API_URL = 'https://router.requesty.ai/v1/models';
7
 
8
- // Load API key from ../AIToolkit/.env relative to the project root
9
  function loadApiKey() {
10
- const envPath = path.join(__dirname, '..', '..', '..', 'AIToolkit', '.env');
11
- if (!fs.existsSync(envPath)) return null;
12
- const content = fs.readFileSync(envPath, 'utf8');
13
- const match = content.match(/^REQUESTY_API_KEY=(.+)$/m);
14
- return match ? match[1].trim() : null;
15
  }
16
 
17
  const toPerMillion = (val) => (val ? Math.round(parseFloat(val) * 1_000_000 * 10000) / 10000 : 0);
@@ -74,10 +69,30 @@ async function fetchRequesty() {
74
  models.push(modelEntry);
75
  }
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  // Sort by input price
78
- models.sort((a, b) => a.input_price_per_1m - b.input_price_per_1m);
79
 
80
- return models;
81
  }
82
 
83
  module.exports = { fetchRequesty, providerName: 'Requesty' };
 
1
  'use strict';
2
 
3
+ const { loadEnv } = require('../load-env');
4
+ loadEnv();
5
 
6
  const API_URL = 'https://router.requesty.ai/v1/models';
7
 
 
8
  function loadApiKey() {
9
+ return process.env.REQUESTY_API_KEY || null;
 
 
 
 
10
  }
11
 
12
  const toPerMillion = (val) => (val ? Math.round(parseFloat(val) * 1_000_000 * 10000) / 10000 : 0);
 
69
  models.push(modelEntry);
70
  }
71
 
72
+ // Deduplicate @region and :effort variants — keep one entry per canonical base ID.
73
+ // e.g. "anthropic/claude-3-7-sonnet@us-east-2" and "anthropic/claude-3-7-sonnet:high"
74
+ // both collapse to "anthropic/claude-3-7-sonnet".
75
+ const canonicalId = (id) => id.replace(/@[^/]+$/, '').replace(/:[^/]+$/, '');
76
+ const seen = new Map();
77
+ for (const model of models) {
78
+ const base = canonicalId(model.name);
79
+ if (!seen.has(base)) {
80
+ // Store with canonical name
81
+ seen.set(base, { ...model, name: base });
82
+ } else {
83
+ // Prefer lower input price if already present
84
+ const existing = seen.get(base);
85
+ if (model.input_price_per_1m < existing.input_price_per_1m) {
86
+ seen.set(base, { ...model, name: base });
87
+ }
88
+ }
89
+ }
90
+ const deduped = [...seen.values()];
91
+
92
  // Sort by input price
93
+ deduped.sort((a, b) => a.input_price_per_1m - b.input_price_per_1m);
94
 
95
+ return deduped;
96
  }
97
 
98
  module.exports = { fetchRequesty, providerName: 'Requesty' };
server.js CHANGED
@@ -22,9 +22,12 @@ const BENCHMARKS_FILE = path.join(__dirname, 'data', 'benchmarks.json');
22
  const SCRIPTS_DIR = path.join(__dirname, 'scripts', 'providers');
23
  const BENCHMARKS_SCRIPT = path.join(__dirname, 'scripts', 'fetch-benchmarks.js');
24
 
25
- // In-memory state: which providers are currently being refreshed
26
  const refreshing = new Set();
27
 
 
 
 
28
  // Allow cross-origin requests from the Vite dev server
29
  app.use((req, res, next) => {
30
  res.setHeader('Access-Control-Allow-Origin', '*');
@@ -69,15 +72,20 @@ app.get('/api/status', (req, res) => {
69
  };
70
  });
71
 
72
- // Include benchmark dataset info
73
  let benchmarks = null;
74
  if (fs.existsSync(BENCHMARKS_FILE)) {
75
  try {
76
  const bm = JSON.parse(fs.readFileSync(BENCHMARKS_FILE, 'utf8'));
 
77
  benchmarks = {
78
  entryCount: Array.isArray(bm) ? bm.length : (bm.entries?.length ?? 0),
79
- lastUpdated: bm.lastUpdated ?? null,
80
  refreshing: refreshing.has('__benchmarks__'),
 
 
 
 
81
  };
82
  } catch { /* ignore */ }
83
  }
@@ -131,8 +139,31 @@ function runFetcher(providerName, scriptKey) {
131
  }
132
 
133
  // ------------------------------------------------------------------
134
- // POST /api/fetch/benchmarks (runs scripts/fetch-benchmarks.js)
 
135
  // ------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
136
  app.post('/api/fetch/benchmarks', async (req, res) => {
137
  if (refreshing.has('__benchmarks__')) {
138
  return res.json({ success: false, error: 'Already refreshing' });
@@ -141,19 +172,10 @@ app.post('/api/fetch/benchmarks', async (req, res) => {
141
  execFile(
142
  process.execPath,
143
  [BENCHMARKS_SCRIPT],
144
- { cwd: __dirname, timeout: 120000 },
145
  (err, stdout, stderr) => {
146
  refreshing.delete('__benchmarks__');
147
- // Stamp lastUpdated into benchmarks.json
148
- try {
149
- const bm = JSON.parse(fs.readFileSync(BENCHMARKS_FILE, 'utf8'));
150
- const arr = Array.isArray(bm) ? bm : (bm.entries ?? bm);
151
- fs.writeFileSync(BENCHMARKS_FILE, JSON.stringify(
152
- Array.isArray(bm) ? arr : Object.assign(bm, { lastUpdated: new Date().toISOString() }),
153
- null, 2
154
- ));
155
- } catch { /* best effort */ }
156
- if (err) res.json({ success: false, error: err.message });
157
  else res.json({ success: true });
158
  }
159
  );
 
22
  const SCRIPTS_DIR = path.join(__dirname, 'scripts', 'providers');
23
  const BENCHMARKS_SCRIPT = path.join(__dirname, 'scripts', 'fetch-benchmarks.js');
24
 
25
+ // In-memory state: which providers/benchmark sources are currently being refreshed
26
  const refreshing = new Set();
27
 
28
+ // Valid benchmark source keys (must match fetch-benchmarks.js SOURCE_FIELDS keys)
29
+ const BENCHMARK_SOURCES = ['llmstats', 'hf', 'livebench', 'arena', 'aider'];
30
+
31
  // Allow cross-origin requests from the Vite dev server
32
  app.use((req, res, next) => {
33
  res.setHeader('Access-Control-Allow-Origin', '*');
 
72
  };
73
  });
74
 
75
+ // Include benchmark dataset info (benchmarks.json is a plain array; use file mtime for lastUpdated)
76
  let benchmarks = null;
77
  if (fs.existsSync(BENCHMARKS_FILE)) {
78
  try {
79
  const bm = JSON.parse(fs.readFileSync(BENCHMARKS_FILE, 'utf8'));
80
+ const mtime = fs.statSync(BENCHMARKS_FILE).mtime.toISOString();
81
  benchmarks = {
82
  entryCount: Array.isArray(bm) ? bm.length : (bm.entries?.length ?? 0),
83
+ lastUpdated: mtime,
84
  refreshing: refreshing.has('__benchmarks__'),
85
+ sources: BENCHMARK_SOURCES.map((key) => ({
86
+ key,
87
+ refreshing: refreshing.has(`__benchmarks__:${key}`),
88
+ })),
89
  };
90
  } catch { /* ignore */ }
91
  }
 
139
  }
140
 
141
  // ------------------------------------------------------------------
142
+ // POST /api/fetch/benchmarks/:source (refresh one benchmark source)
143
+ // POST /api/fetch/benchmarks (refresh all benchmark sources)
144
  // ------------------------------------------------------------------
145
+ app.post('/api/fetch/benchmarks/:source', async (req, res) => {
146
+ const { source } = req.params;
147
+ if (!BENCHMARK_SOURCES.includes(source)) {
148
+ return res.json({ success: false, error: `Unknown source: ${source}` });
149
+ }
150
+ const key = `__benchmarks__:${source}`;
151
+ if (refreshing.has(key)) {
152
+ return res.json({ success: false, error: 'Already refreshing' });
153
+ }
154
+ refreshing.add(key);
155
+ execFile(
156
+ process.execPath,
157
+ [BENCHMARKS_SCRIPT, source],
158
+ { cwd: __dirname, timeout: 300000 },
159
+ (err, stdout, stderr) => {
160
+ refreshing.delete(key);
161
+ if (err) res.json({ success: false, error: err.message, stderr });
162
+ else res.json({ success: true });
163
+ }
164
+ );
165
+ });
166
+
167
  app.post('/api/fetch/benchmarks', async (req, res) => {
168
  if (refreshing.has('__benchmarks__')) {
169
  return res.json({ success: false, error: 'Already refreshing' });
 
172
  execFile(
173
  process.execPath,
174
  [BENCHMARKS_SCRIPT],
175
+ { cwd: __dirname, timeout: 600000 },
176
  (err, stdout, stderr) => {
177
  refreshing.delete('__benchmarks__');
178
+ if (err) res.json({ success: false, error: err.message, stderr });
 
 
 
 
 
 
 
 
 
179
  else res.json({ success: true });
180
  }
181
  );
src/App.css CHANGED
@@ -341,6 +341,7 @@ footer {
341
  margin: 1.5rem 0 0.5rem;
342
  }
343
  .mgmt-provider { font-weight: 600; }
 
344
  .mgmt-count { color: #475569; font-variant-numeric: tabular-nums; }
345
  .mgmt-age { color: #94a3b8; font-size: 0.8rem; }
346
  .btn-refresh {
 
341
  margin: 1.5rem 0 0.5rem;
342
  }
343
  .mgmt-provider { font-weight: 600; }
344
+ .mgmt-source-indent { font-weight: 400; padding-left: 1.5rem; color: #64748b; }
345
  .mgmt-count { color: #475569; font-variant-numeric: tabular-nums; }
346
  .mgmt-age { color: #94a3b8; font-size: 0.8rem; }
347
  .btn-refresh {
src/App.tsx CHANGED
@@ -15,6 +15,7 @@ interface Model {
15
  price_per_1m_tokens_30d?: number
16
  currency: string
17
  capabilities?: string[]
 
18
  }
19
 
20
  interface Provider {
@@ -248,7 +249,7 @@ function App() {
248
  }, [searchTerm, selectedType, selectedRegion, allModels])
249
 
250
  const getNormalizedPriceUSD = (model: Model) => {
251
- const price = model.input_price_per_1m ?? model.price_per_image ?? model.price_per_minute ?? 0
252
  return model.currency === 'EUR' ? price * EXCHANGE_RATE_EUR_TO_USD : price
253
  }
254
 
@@ -464,15 +465,23 @@ function App() {
464
  {model.complianceStatus}
465
  </span>
466
  </td>
467
- <td className="model-name">{model.name}</td>
468
  <td className="caps-cell">
469
  {(model.capabilities || []).map(cap => (
470
  <span key={cap} className={`cap-badge cap-${cap}`} title={cap}>{CAP_ICON[cap] ?? cap}</span>
471
  ))}
472
  </td>
473
  <td className="size-cell">{model.size_b ? `${model.size_b}B` : '-'}</td>
474
- <td>{formatPrice(model.input_price_per_1m, model.currency)}</td>
475
- <td>{formatPrice(model.output_price_per_1m, model.currency)}</td>
 
 
 
 
 
 
 
 
476
  {showBenchmarks && (() => {
477
  const bm = findBenchmark(model.name);
478
  const fmt = (v?: number) => Number.isFinite(v) ? `${(v! * 100).toFixed(0)}%` : '–';
 
15
  price_per_1m_tokens_30d?: number
16
  currency: string
17
  capabilities?: string[]
18
+ display_name?: string
19
  }
20
 
21
  interface Provider {
 
249
  }, [searchTerm, selectedType, selectedRegion, allModels])
250
 
251
  const getNormalizedPriceUSD = (model: Model) => {
252
+ const price = model.input_price_per_1m || model.price_per_image || model.price_per_minute || 0
253
  return model.currency === 'EUR' ? price * EXCHANGE_RATE_EUR_TO_USD : price
254
  }
255
 
 
465
  {model.complianceStatus}
466
  </span>
467
  </td>
468
+ <td className="model-name">{model.display_name ?? model.name}</td>
469
  <td className="caps-cell">
470
  {(model.capabilities || []).map(cap => (
471
  <span key={cap} className={`cap-badge cap-${cap}`} title={cap}>{CAP_ICON[cap] ?? cap}</span>
472
  ))}
473
  </td>
474
  <td className="size-cell">{model.size_b ? `${model.size_b}B` : '-'}</td>
475
+ <td>
476
+ {model.price_per_image !== undefined && !model.input_price_per_1m
477
+ ? `$${model.price_per_image}/MP`
478
+ : formatPrice(model.input_price_per_1m, model.currency)}
479
+ </td>
480
+ <td>
481
+ {model.price_per_image !== undefined && !model.output_price_per_1m
482
+ ? '–'
483
+ : formatPrice(model.output_price_per_1m, model.currency)}
484
+ </td>
485
  {showBenchmarks && (() => {
486
  const bm = findBenchmark(model.name);
487
  const fmt = (v?: number) => Number.isFinite(v) ? `${(v! * 100).toFixed(0)}%` : '–';
src/components/ManagementPanel.tsx CHANGED
@@ -9,10 +9,24 @@ interface ProviderStatus {
9
  refreshing: boolean
10
  }
11
 
 
 
 
 
 
12
  interface BenchmarkStatus {
13
  entryCount: number
14
  lastUpdated: string | null
15
  refreshing: boolean
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
  interface FetchResult {
@@ -45,6 +59,8 @@ export function ManagementPanel({ onClose, onDataUpdated }: Props) {
45
  const [error, setError] = useState<string | null>(null)
46
  const [results, setResults] = useState<Record<string, { success: boolean; error?: string }>>({})
47
  const [bmResult, setBmResult] = useState<{ success: boolean; error?: string } | null>(null)
 
 
48
  const [refreshingAll, setRefreshingAll] = useState(false)
49
  const [serverAvailable, setServerAvailable] = useState(true)
50
 
@@ -101,6 +117,21 @@ export function ManagementPanel({ onClose, onDataUpdated }: Props) {
101
  await fetchStatus()
102
  }
103
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  const refreshAll = async () => {
105
  setRefreshingAll(true)
106
  setResults({})
@@ -205,7 +236,7 @@ export function ManagementPanel({ onClose, onDataUpdated }: Props) {
205
  <table className="management-table">
206
  <thead>
207
  <tr>
208
- <th>Dataset</th>
209
  <th>Entries</th>
210
  <th>Last updated</th>
211
  <th>Status</th>
@@ -213,8 +244,9 @@ export function ManagementPanel({ onClose, onDataUpdated }: Props) {
213
  </tr>
214
  </thead>
215
  <tbody>
 
216
  <tr>
217
- <td className="mgmt-provider">Benchmarks</td>
218
  <td className="mgmt-count">{benchmarks.entryCount.toLocaleString()}</td>
219
  <td className="mgmt-age">{formatAge(benchmarks.lastUpdated)}</td>
220
  <td className="mgmt-status">
@@ -238,6 +270,38 @@ export function ManagementPanel({ onClose, onDataUpdated }: Props) {
238
  </button>
239
  </td>
240
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
241
  </tbody>
242
  </table>
243
  </>
 
9
  refreshing: boolean
10
  }
11
 
12
+ interface BenchmarkSourceStatus {
13
+ key: string
14
+ refreshing: boolean
15
+ }
16
+
17
  interface BenchmarkStatus {
18
  entryCount: number
19
  lastUpdated: string | null
20
  refreshing: boolean
21
+ sources?: BenchmarkSourceStatus[]
22
+ }
23
+
24
+ const BENCHMARK_SOURCE_NAMES: Record<string, string> = {
25
+ llmstats: 'LLMStats',
26
+ hf: 'HF Leaderboard',
27
+ livebench: 'LiveBench',
28
+ arena: 'Chatbot Arena',
29
+ aider: 'Aider',
30
  }
31
 
32
  interface FetchResult {
 
59
  const [error, setError] = useState<string | null>(null)
60
  const [results, setResults] = useState<Record<string, { success: boolean; error?: string }>>({})
61
  const [bmResult, setBmResult] = useState<{ success: boolean; error?: string } | null>(null)
62
+ const [bmSourceResults, setBmSourceResults] = useState<Record<string, { success: boolean; error?: string }>>({})
63
+ const [refreshingBmSource, setRefreshingBmSource] = useState<Record<string, boolean>>({})
64
  const [refreshingAll, setRefreshingAll] = useState(false)
65
  const [serverAvailable, setServerAvailable] = useState(true)
66
 
 
117
  await fetchStatus()
118
  }
119
 
120
+ const refreshBenchmarkSource = async (source: string) => {
121
+ setRefreshingBmSource((s) => ({ ...s, [source]: true }))
122
+ setBmSourceResults((r) => ({ ...r, [source]: { success: false } }))
123
+ try {
124
+ const res = await fetch(`/api/fetch/benchmarks/${source}`, { method: 'POST' })
125
+ const data = await res.json()
126
+ setBmSourceResults((r) => ({ ...r, [source]: { success: data.success, error: data.error } }))
127
+ if (data.success) onDataUpdated()
128
+ } catch {
129
+ setBmSourceResults((r) => ({ ...r, [source]: { success: false, error: 'Request failed' } }))
130
+ }
131
+ setRefreshingBmSource((s) => ({ ...s, [source]: false }))
132
+ await fetchStatus()
133
+ }
134
+
135
  const refreshAll = async () => {
136
  setRefreshingAll(true)
137
  setResults({})
 
236
  <table className="management-table">
237
  <thead>
238
  <tr>
239
+ <th>Source</th>
240
  <th>Entries</th>
241
  <th>Last updated</th>
242
  <th>Status</th>
 
244
  </tr>
245
  </thead>
246
  <tbody>
247
+ {/* All-sources row */}
248
  <tr>
249
+ <td className="mgmt-provider">All sources</td>
250
  <td className="mgmt-count">{benchmarks.entryCount.toLocaleString()}</td>
251
  <td className="mgmt-age">{formatAge(benchmarks.lastUpdated)}</td>
252
  <td className="mgmt-status">
 
270
  </button>
271
  </td>
272
  </tr>
273
+ {/* Per-source rows */}
274
+ {(benchmarks.sources ?? []).map((src) => {
275
+ const result = bmSourceResults[src.key]
276
+ const isRefreshing = src.refreshing || refreshingBmSource[src.key]
277
+ return (
278
+ <tr key={src.key}>
279
+ <td className="mgmt-provider mgmt-source-indent">
280
+ {BENCHMARK_SOURCE_NAMES[src.key] ?? src.key}
281
+ </td>
282
+ <td className="mgmt-count"></td>
283
+ <td className="mgmt-age"></td>
284
+ <td className="mgmt-status">
285
+ {result ? (
286
+ result.success ? (
287
+ <span className="badge-ok">✓ updated</span>
288
+ ) : (
289
+ <span className="badge-err" title={result.error}>✗ failed</span>
290
+ )
291
+ ) : null}
292
+ </td>
293
+ <td>
294
+ <button
295
+ className="btn-refresh"
296
+ onClick={() => refreshBenchmarkSource(src.key)}
297
+ disabled={isRefreshing}
298
+ >
299
+ {isRefreshing ? '⟳' : '↻'}
300
+ </button>
301
+ </td>
302
+ </tr>
303
+ )
304
+ })}
305
  </tbody>
306
  </table>
307
  </>
vercel.json CHANGED
@@ -4,6 +4,6 @@
4
  "installCommand": "npm install",
5
  "framework": "vite",
6
  "rewrites": [
7
- { "source": "/(.*)", "destination": "/index.html" }
8
  ]
9
  }
 
4
  "installCommand": "npm install",
5
  "framework": "vite",
6
  "rewrites": [
7
+ { "source": "/((?!api/).*)", "destination": "/index.html" }
8
  ]
9
  }