roadmodel 0.2.64__tar.gz → 0.2.65__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. {roadmodel-0.2.64 → roadmodel-0.2.65}/PKG-INFO +1 -1
  2. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/benchmarks.json +61 -61
  3. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/catalog.json +4 -4
  4. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/model-selector.txt +2 -2
  5. {roadmodel-0.2.64 → roadmodel-0.2.65}/pyproject.toml +1 -1
  6. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/benchmarks.json +61 -61
  7. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/catalog.json +4 -4
  8. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/model-selector.txt +2 -2
  9. {roadmodel-0.2.64 → roadmodel-0.2.65}/scripts/update_projects.py +103 -5
  10. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/__init__.py +1 -1
  11. {roadmodel-0.2.64 → roadmodel-0.2.65}/.gitignore +0 -0
  12. {roadmodel-0.2.64 → roadmodel-0.2.65}/LICENSE +0 -0
  13. {roadmodel-0.2.64 → roadmodel-0.2.65}/NOTICE +0 -0
  14. {roadmodel-0.2.64 → roadmodel-0.2.65}/README.md +0 -0
  15. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/model-tier-cost-scale.md +0 -0
  16. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/settings-display.md +0 -0
  17. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/templates/phase-roadmap-template.md +0 -0
  18. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/templates/planning-kit-how-to-use.md +0 -0
  19. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/templates/project-roadmap-template.md +0 -0
  20. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/templates/prompt-phase-roadmap.md +0 -0
  21. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/templates/prompt-project-roadmap.md +0 -0
  22. {roadmodel-0.2.64 → roadmodel-0.2.65}/docs/user-context.example.md +0 -0
  23. {roadmodel-0.2.64 → roadmodel-0.2.65}/hatch_build.py +0 -0
  24. {roadmodel-0.2.64 → roadmodel-0.2.65}/infra/README.md +0 -0
  25. {roadmodel-0.2.64 → roadmodel-0.2.65}/infra/gcp-killswitch/README.md +0 -0
  26. {roadmodel-0.2.64 → roadmodel-0.2.65}/infra/supabase/README.md +0 -0
  27. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/model-tier-cost-scale.md +0 -0
  28. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/phase-roadmap-template.md +0 -0
  29. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/planning-kit-how-to-use.md +0 -0
  30. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/project-roadmap-template.md +0 -0
  31. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/prompt-phase-roadmap.md +0 -0
  32. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/prompt-project-roadmap.md +0 -0
  33. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/settings-display.md +0 -0
  34. {roadmodel-0.2.64 → roadmodel-0.2.65}/roadmodel/data/user-context.example.md +0 -0
  35. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/__main__.py +0 -0
  36. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/cli.py +0 -0
  37. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/config.py +0 -0
  38. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/cost.py +0 -0
  39. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/errors.py +0 -0
  40. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/mcp_server.py +0 -0
  41. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/providers/__init__.py +0 -0
  42. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/providers/anthropic.py +0 -0
  43. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/providers/google.py +0 -0
  44. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/providers/openai.py +0 -0
  45. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/providers/openai_compatible.py +0 -0
  46. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/providers/registry.py +0 -0
  47. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/recommend.py +0 -0
  48. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/scoring.py +0 -0
  49. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/usage.py +0 -0
  50. {roadmodel-0.2.64 → roadmodel-0.2.65}/src/roadmodel/user_context.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: roadmodel
3
- Version: 0.2.64
3
+ Version: 0.2.65
4
4
  Summary: BYO-key CLI that recommends the right AI model, platform, and settings for a prompt.
5
5
  Project-URL: Homepage, https://roadmodel.ai
6
6
  Project-URL: Repository, https://github.com/nathanramoscfa/roadmodel
@@ -6,7 +6,7 @@
6
6
  "endpoint": "https://artificialanalysis.ai/api/v2/data/llms/models",
7
7
  "attribution": "Benchmark data © Artificial Analysis, used under its API terms with attribution."
8
8
  },
9
- "generated_at_utc": "2026-10-01T22:10:29Z",
9
+ "generated_at_utc": "2026-10-02T22:10:28Z",
10
10
  "model_count": 54,
11
11
  "unmapped": [],
12
12
  "missing_slugs": [],
@@ -38,13 +38,13 @@
38
38
  "tau2": 0.546783625730994,
39
39
  "tau_banking": 0.0927835051546392
40
40
  },
41
- "median_output_tokens_per_second": 125.146,
42
- "median_time_to_first_token_seconds": 13.494
41
+ "median_output_tokens_per_second": 116.991,
42
+ "median_time_to_first_token_seconds": 13.947
43
43
  },
44
44
  "claude-fable-5": {
45
45
  "aa_id": "cd55210d-358e-4df1-ba9c-9acb5f186cc9",
46
46
  "aa_slug": "claude-fable-5",
47
- "aa_name": "Claude Fable 5 (Adaptive Reasoning, Max Effort, Opus 4.8 Fallback)",
47
+ "aa_name": "Claude Fable 5 (Max, Opus 4.8 Fallback)",
48
48
  "aa_creator": "Anthropic",
49
49
  "release_date": "2026-06-09",
50
50
  "evaluations": {
@@ -73,7 +73,7 @@
73
73
  "claude-fable-5.1": {
74
74
  "aa_id": "3e87c73e-a257-495e-9730-367a66229811",
75
75
  "aa_slug": "claude-fable-5-1",
76
- "aa_name": "Claude Fable 5.1 (Adaptive Reasoning, Max Effort, Default Fallback)",
76
+ "aa_name": "Claude Fable 5.1 (Max, Default Fallback)",
77
77
  "aa_creator": "Anthropic",
78
78
  "release_date": "2026-09-01",
79
79
  "evaluations": {
@@ -96,13 +96,13 @@
96
96
  "tau2": null,
97
97
  "tau_banking": 0.472164948453608
98
98
  },
99
- "median_output_tokens_per_second": 68.681,
100
- "median_time_to_first_token_seconds": 127.394
99
+ "median_output_tokens_per_second": 70.155,
100
+ "median_time_to_first_token_seconds": 137.867
101
101
  },
102
102
  "claude-opus-5": {
103
103
  "aa_id": "b8fc61f7-5e9a-49e6-8547-6ac56db24627",
104
104
  "aa_slug": "claude-opus-5",
105
- "aa_name": "Claude Opus 5 (Adaptive Reasoning, Max Effort)",
105
+ "aa_name": "Claude Opus 5 (Max)",
106
106
  "aa_creator": "Anthropic",
107
107
  "release_date": "2026-07-24",
108
108
  "evaluations": {
@@ -131,7 +131,7 @@
131
131
  "claude-opus-5-5": {
132
132
  "aa_id": "2f3c4dc9-a450-4303-8697-0237257cf08f",
133
133
  "aa_slug": "claude-opus-5-5",
134
- "aa_name": "Claude Opus 5.5 (Adaptive Reasoning, Max Effort, Default Fallback)",
134
+ "aa_name": "Claude Opus 5.5 (Max, Default Fallback)",
135
135
  "aa_creator": "Anthropic",
136
136
  "release_date": "2026-09-22",
137
137
  "evaluations": {
@@ -154,13 +154,13 @@
154
154
  "tau2": null,
155
155
  "tau_banking": null
156
156
  },
157
- "median_output_tokens_per_second": 96.458,
158
- "median_time_to_first_token_seconds": 477.23
157
+ "median_output_tokens_per_second": 97.574,
158
+ "median_time_to_first_token_seconds": 449.114
159
159
  },
160
160
  "claude-sonnet-5": {
161
161
  "aa_id": "23c86e4a-c769-43c0-a056-79e3cd15834f",
162
162
  "aa_slug": "claude-sonnet-5",
163
- "aa_name": "Claude Sonnet 5 (Adaptive Reasoning, Max Effort)",
163
+ "aa_name": "Claude Sonnet 5 (Max)",
164
164
  "aa_creator": "Anthropic",
165
165
  "release_date": "2026-06-30",
166
166
  "evaluations": {
@@ -183,13 +183,13 @@
183
183
  "tau2": null,
184
184
  "tau_banking": 0.37319587628866
185
185
  },
186
- "median_output_tokens_per_second": 94.143,
187
- "median_time_to_first_token_seconds": 162.437
186
+ "median_output_tokens_per_second": 92.634,
187
+ "median_time_to_first_token_seconds": 198.594
188
188
  },
189
189
  "claude-sonnet-5-5": {
190
190
  "aa_id": "b171d979-5ec1-45de-b8b9-db1ee65e77ec",
191
191
  "aa_slug": "claude-sonnet-5-5",
192
- "aa_name": "Claude Sonnet 5.5 (Adaptive Reasoning, Max Effort, Default Fallback)",
192
+ "aa_name": "Claude Sonnet 5.5 (Max, Default Fallback)",
193
193
  "aa_creator": "Anthropic",
194
194
  "release_date": "2026-09-28",
195
195
  "evaluations": {
@@ -212,8 +212,8 @@
212
212
  "tau2": null,
213
213
  "tau_banking": null
214
214
  },
215
- "median_output_tokens_per_second": 145.124,
216
- "median_time_to_first_token_seconds": 276.058
215
+ "median_output_tokens_per_second": 140.474,
216
+ "median_time_to_first_token_seconds": 261.115
217
217
  },
218
218
  "deepseek-flash": {
219
219
  "aa_id": "dbe7c625-3100-4463-b479-a228c41f75dd",
@@ -241,8 +241,8 @@
241
241
  "tau2": null,
242
242
  "tau_banking": null
243
243
  },
244
- "median_output_tokens_per_second": 226.5,
245
- "median_time_to_first_token_seconds": 0.844
244
+ "median_output_tokens_per_second": 214.866,
245
+ "median_time_to_first_token_seconds": 0.836
246
246
  },
247
247
  "deepseek-v4-pro": {
248
248
  "aa_id": "83173329-c09a-41f1-a028-a282a5f908d7",
@@ -270,8 +270,8 @@
270
270
  "tau2": null,
271
271
  "tau_banking": 0.395876288659794
272
272
  },
273
- "median_output_tokens_per_second": 101.435,
274
- "median_time_to_first_token_seconds": 1.156
273
+ "median_output_tokens_per_second": 108.409,
274
+ "median_time_to_first_token_seconds": 1.137
275
275
  },
276
276
  "gemini-2.5-flash": {
277
277
  "aa_id": "219ed587-60c5-4a48-9517-8480e08d0ca1",
@@ -386,8 +386,8 @@
386
386
  "tau2": 0.956140350877193,
387
387
  "tau_banking": 0.214432989690722
388
388
  },
389
- "median_output_tokens_per_second": 127.145,
390
- "median_time_to_first_token_seconds": 26.91
389
+ "median_output_tokens_per_second": 123.648,
390
+ "median_time_to_first_token_seconds": 26.15
391
391
  },
392
392
  "gemini-3.5-flash": {
393
393
  "aa_id": "0097ebf5-124f-42f6-9463-33b00e711f03",
@@ -502,8 +502,8 @@
502
502
  "tau2": null,
503
503
  "tau_banking": 0.449484536082474
504
504
  },
505
- "median_output_tokens_per_second": 244.009,
506
- "median_time_to_first_token_seconds": 13.552
505
+ "median_output_tokens_per_second": 255.648,
506
+ "median_time_to_first_token_seconds": 11.765
507
507
  },
508
508
  "glm-4.5-air": {
509
509
  "aa_id": "5d303dc9-c027-401f-9803-4e9aa3331007",
@@ -618,8 +618,8 @@
618
618
  "tau2": null,
619
619
  "tau_banking": 0.503092783505155
620
620
  },
621
- "median_output_tokens_per_second": 69.965,
622
- "median_time_to_first_token_seconds": 2.71
621
+ "median_output_tokens_per_second": 73.964,
622
+ "median_time_to_first_token_seconds": 2.655
623
623
  },
624
624
  "glm-5.3-flash": {
625
625
  "aa_id": "19496b81-9f41-4214-a77a-1df803b3c5ae",
@@ -647,8 +647,8 @@
647
647
  "tau2": null,
648
648
  "tau_banking": 0.472164948453608
649
649
  },
650
- "median_output_tokens_per_second": 49.583,
651
- "median_time_to_first_token_seconds": 3.195
650
+ "median_output_tokens_per_second": 52.907,
651
+ "median_time_to_first_token_seconds": 3.043
652
652
  },
653
653
  "gpt-5": {
654
654
  "aa_id": "48e50f00-1fd1-4acc-b337-61078aa341e6",
@@ -850,8 +850,8 @@
850
850
  "tau2": 0.859649122807018,
851
851
  "tau_banking": null
852
852
  },
853
- "median_output_tokens_per_second": 96.414,
854
- "median_time_to_first_token_seconds": 54.486
853
+ "median_output_tokens_per_second": 98.35,
854
+ "median_time_to_first_token_seconds": 46.046
855
855
  },
856
856
  "gpt-5.4": {
857
857
  "aa_id": "a89c4b28-2d8c-456e-88ea-255fb51fd2b6",
@@ -1053,8 +1053,8 @@
1053
1053
  "tau2": 0.862573099415205,
1054
1054
  "tau_banking": 0.402061855670103
1055
1055
  },
1056
- "median_output_tokens_per_second": 109.104,
1057
- "median_time_to_first_token_seconds": 115.347
1056
+ "median_output_tokens_per_second": 109.955,
1057
+ "median_time_to_first_token_seconds": 94.607
1058
1058
  },
1059
1059
  "gpt-6-astra": {
1060
1060
  "aa_id": "2f339a97-9a0d-499a-9cb5-e0db665bfa25",
@@ -1083,7 +1083,7 @@
1083
1083
  "tau_banking": 0.414432989690722
1084
1084
  },
1085
1085
  "median_output_tokens_per_second": 55.68,
1086
- "median_time_to_first_token_seconds": 192.954
1086
+ "median_time_to_first_token_seconds": 197.034
1087
1087
  },
1088
1088
  "gpt-6-luna": {
1089
1089
  "aa_id": "6fb13851-40ce-4bda-ad3f-6b38e0c5daa7",
@@ -1111,8 +1111,8 @@
1111
1111
  "tau2": null,
1112
1112
  "tau_banking": null
1113
1113
  },
1114
- "median_output_tokens_per_second": 139.721,
1115
- "median_time_to_first_token_seconds": 84.615
1114
+ "median_output_tokens_per_second": 138.11,
1115
+ "median_time_to_first_token_seconds": 83.735
1116
1116
  },
1117
1117
  "gpt-6-sol": {
1118
1118
  "aa_id": "c50ea08c-88c0-4eb7-85b8-27f2bbf6d527",
@@ -1140,8 +1140,8 @@
1140
1140
  "tau2": null,
1141
1141
  "tau_banking": null
1142
1142
  },
1143
- "median_output_tokens_per_second": 90.088,
1144
- "median_time_to_first_token_seconds": 107.871
1143
+ "median_output_tokens_per_second": 105.847,
1144
+ "median_time_to_first_token_seconds": 105.231
1145
1145
  },
1146
1146
  "gpt-6.1-sol": {
1147
1147
  "aa_id": "b25ac058-1e33-4c31-bbc9-a20c3ad0717a",
@@ -1169,8 +1169,8 @@
1169
1169
  "tau2": null,
1170
1170
  "tau_banking": null
1171
1171
  },
1172
- "median_output_tokens_per_second": 63.279,
1173
- "median_time_to_first_token_seconds": 139.092
1172
+ "median_output_tokens_per_second": 59.099,
1173
+ "median_time_to_first_token_seconds": 170.489
1174
1174
  },
1175
1175
  "gpt-oss-120b": {
1176
1176
  "aa_id": "f0083258-8646-45b8-8082-7aaf6c2ea82a",
@@ -1198,8 +1198,8 @@
1198
1198
  "tau2": 0.657894736842105,
1199
1199
  "tau_banking": 0.127835051546392
1200
1200
  },
1201
- "median_output_tokens_per_second": 154.167,
1202
- "median_time_to_first_token_seconds": 0.54
1201
+ "median_output_tokens_per_second": 156.511,
1202
+ "median_time_to_first_token_seconds": 0.525
1203
1203
  },
1204
1204
  "gpt-oss-20b": {
1205
1205
  "aa_id": "36f73aaf-d38a-4b56-a2b3-d04d17186910",
@@ -1227,8 +1227,8 @@
1227
1227
  "tau2": 0.60233918128655,
1228
1228
  "tau_banking": 0.0701030927835052
1229
1229
  },
1230
- "median_output_tokens_per_second": 192.538,
1231
- "median_time_to_first_token_seconds": 0.415
1230
+ "median_output_tokens_per_second": 200.593,
1231
+ "median_time_to_first_token_seconds": 0.409
1232
1232
  },
1233
1233
  "grok-4.3": {
1234
1234
  "aa_id": "948892b5-db03-4118-a4a8-ccd51ed871ea",
@@ -1314,8 +1314,8 @@
1314
1314
  "tau2": null,
1315
1315
  "tau_banking": null
1316
1316
  },
1317
- "median_output_tokens_per_second": 84.78,
1318
- "median_time_to_first_token_seconds": 19.787
1317
+ "median_output_tokens_per_second": 80.156,
1318
+ "median_time_to_first_token_seconds": 19.497
1319
1319
  },
1320
1320
  "kimi-k2.7-code": {
1321
1321
  "aa_id": "8d0cb231-7303-452c-9923-a9620b948475",
@@ -1343,8 +1343,8 @@
1343
1343
  "tau2": 0.900584795321637,
1344
1344
  "tau_banking": 0.202061855670103
1345
1345
  },
1346
- "median_output_tokens_per_second": 77.467,
1347
- "median_time_to_first_token_seconds": 1.204
1346
+ "median_output_tokens_per_second": 84.582,
1347
+ "median_time_to_first_token_seconds": 1.233
1348
1348
  },
1349
1349
  "kimi-k3": {
1350
1350
  "aa_id": "f7d2fc3e-1f7b-405f-818c-07952a4af78f",
@@ -1372,8 +1372,8 @@
1372
1372
  "tau2": null,
1373
1373
  "tau_banking": 0.45979381443299
1374
1374
  },
1375
- "median_output_tokens_per_second": 37.907,
1376
- "median_time_to_first_token_seconds": 3.013
1375
+ "median_output_tokens_per_second": 35.161,
1376
+ "median_time_to_first_token_seconds": 2.906
1377
1377
  },
1378
1378
  "mistral-large-3": {
1379
1379
  "aa_id": "4928e950-7f37-4475-b0dc-c5bad781a321",
@@ -1401,8 +1401,8 @@
1401
1401
  "tau2": 0.245614035087719,
1402
1402
  "tau_banking": 0.0577319587628866
1403
1403
  },
1404
- "median_output_tokens_per_second": 75.045,
1405
- "median_time_to_first_token_seconds": 0.721
1404
+ "median_output_tokens_per_second": 79.16,
1405
+ "median_time_to_first_token_seconds": 0.723
1406
1406
  },
1407
1407
  "mistral-medium-3.5": {
1408
1408
  "aa_id": "dd059b25-d82a-4ead-82a4-4adceaaec48b",
@@ -1430,8 +1430,8 @@
1430
1430
  "tau2": 0.941520467836257,
1431
1431
  "tau_banking": 0.150515463917526
1432
1432
  },
1433
- "median_output_tokens_per_second": 167.324,
1434
- "median_time_to_first_token_seconds": 0.625
1433
+ "median_output_tokens_per_second": 168.676,
1434
+ "median_time_to_first_token_seconds": 0.564
1435
1435
  },
1436
1436
  "mistral-small-4": {
1437
1437
  "aa_id": "3fd96175-4ef1-434c-8795-f873aec2abc1",
@@ -1459,8 +1459,8 @@
1459
1459
  "tau2": 0.412280701754386,
1460
1460
  "tau_banking": 0.0494845360824742
1461
1461
  },
1462
- "median_output_tokens_per_second": 173.192,
1463
- "median_time_to_first_token_seconds": 0.626
1462
+ "median_output_tokens_per_second": 173.831,
1463
+ "median_time_to_first_token_seconds": 0.643
1464
1464
  },
1465
1465
  "muse-spark-1.3": {
1466
1466
  "aa_id": "9999672c-b687-4026-9c15-5cef02ff53bb",
@@ -1488,13 +1488,13 @@
1488
1488
  "tau2": null,
1489
1489
  "tau_banking": 0.505154639175258
1490
1490
  },
1491
- "median_output_tokens_per_second": 171.012,
1492
- "median_time_to_first_token_seconds": 37.827
1491
+ "median_output_tokens_per_second": 163.786,
1492
+ "median_time_to_first_token_seconds": 43.349
1493
1493
  },
1494
1494
  "opus-4.7": {
1495
1495
  "aa_id": "e9a09db3-8fd6-41dd-ba2f-20e0a2bff7f2",
1496
1496
  "aa_slug": "claude-opus-4-7",
1497
- "aa_name": "Claude Opus 4.7 (Adaptive Reasoning, Max Effort)",
1497
+ "aa_name": "Claude Opus 4.7 (Max)",
1498
1498
  "aa_creator": "Anthropic",
1499
1499
  "release_date": "2026-04-16",
1500
1500
  "evaluations": {
@@ -1523,7 +1523,7 @@
1523
1523
  "opus-4.8": {
1524
1524
  "aa_id": "992b7b84-5069-4c6a-9295-834252553d50",
1525
1525
  "aa_slug": "claude-opus-4-8",
1526
- "aa_name": "Claude Opus 4.8 (Adaptive Reasoning, Max Effort)",
1526
+ "aa_name": "Claude Opus 4.8 (Max)",
1527
1527
  "aa_creator": "Anthropic",
1528
1528
  "release_date": "2026-05-28",
1529
1529
  "evaluations": {
@@ -1552,7 +1552,7 @@
1552
1552
  "sonnet-4.6": {
1553
1553
  "aa_id": "df8d14e0-3997-4e4d-b4ad-9c047acc9c69",
1554
1554
  "aa_slug": "claude-sonnet-4-6-adaptive",
1555
- "aa_name": "Claude Sonnet 4.6 (Adaptive Reasoning, Max Effort)",
1555
+ "aa_name": "Claude Sonnet 4.6 (Max)",
1556
1556
  "aa_creator": "Anthropic",
1557
1557
  "release_date": "2026-02-17",
1558
1558
  "evaluations": {
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema_version": "4",
3
3
  "output_contract_version": 2,
4
- "generated_at_utc": "2026-10-02T18:08:21Z",
4
+ "generated_at_utc": "2026-10-02T22:10:28Z",
5
5
  "source_doc_sha256": {
6
- "model-selector.txt": "81c5530a28521df18ebe14810e56cd72e65f1e30ad93d0522d31dbf362516e93",
6
+ "model-selector.txt": "3a1897163e23e66afb77cf2f76ae84aa9354f85b07a235c27fb6bc55e7b657f8",
7
7
  "model-tier-cost-scale.md": "2b3b0eb82237eb5cb5bf468a3fe971bcaf0160ad7d0bc700698d2c16640bc41d"
8
8
  },
9
9
  "models": [
@@ -1424,7 +1424,7 @@
1424
1424
  "speed": "B"
1425
1425
  },
1426
1426
  "jurisdiction": "us",
1427
- "headline_benchmarks": "AA Intelligence Index 30.1 (adaptive reasoning, max effort); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4",
1427
+ "headline_benchmarks": "AA Intelligence Index 30.1 (max); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4",
1428
1428
  "pricing_notes": "Hidden by default; Requires Max Mode on legacy request-based plans; Up to 1M tokens with extended context at the same per-token rates (no long-context surcharge)",
1429
1429
  "best_for": "Strong multimodal input and long context at a high price. Its AA Intelligence Index of 30.1 ranks 33rd of 54 measured models.",
1430
1430
  "superseded_by": null,
@@ -2048,7 +2048,7 @@
2048
2048
  "exposes_max_mode": "no",
2049
2049
  "exposes_thinking": "yes",
2050
2050
  "exposes_orchestration": "no",
2051
- "best_for": "Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) \u2014 like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is a POINT-IN-TIME snapshot of openrouter.ai/models at authoring (refreshed 2026-10-02; absent: composer-2.5 which is Cursor-only, gemini-3-pro which OpenRouter serves only as an image endpoint, mistral-large-3 which it serves only as a batch endpoint) that the operator should trust LESS than a provider-direct method \u2014 prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor."
2051
+ "best_for": "Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) \u2014 like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is synced daily from openrouter.ai/models (OpenRouter's public model list): each catalogued model it lists as a text chat route, matched by name (absent today: composer-2.5, which is Cursor-only, and gemini-3-pro, which OpenRouter serves only as an image model). The operator should trust it LESS than a provider-direct method \u2014 prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor."
2052
2052
  },
2053
2053
  {
2054
2054
  "id": "xai-api",
@@ -1040,7 +1040,7 @@
1040
1040
  tier-coding="B" tier-planning="B" tier-agentic="B"
1041
1041
  tier-multimodal="A" tier-long-context="A" tier-knowledge="B"
1042
1042
  tier-speed="B"
1043
- headline-benchmarks="AA Intelligence Index 30.1 (adaptive reasoning, max effort); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4"
1043
+ headline-benchmarks="AA Intelligence Index 30.1 (max); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4"
1044
1044
  pricing-notes="Hidden by default; Requires Max Mode on legacy request-based plans; Up to 1M tokens with extended context at the same per-token rates (no long-context surcharge)"
1045
1045
  prose-generated="best-for headline-benchmarks"
1046
1046
  best-for="Strong multimodal input and long context at a high price. Its AA Intelligence Index of 30.1 ranks 33rd of 54 measured models."/>
@@ -1693,7 +1693,7 @@
1693
1693
  supports-models="claude-sonnet-5-5,claude-opus-5-5,claude-opus-5,opus-4.8,claude-fable-5.1,claude-fable-5,opus-4.7,claude-sonnet-5,sonnet-4.6,claude-4.5-haiku,gpt-6-astra,gpt-6.1-sol,gpt-6-sol,gpt-6-luna,gpt-5.6-sol,gpt-5.5,gpt-5.6-terra,gpt-5.4,gpt-5.3-codex,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex,gpt-5.1-codex-mini,gpt-5,gpt-5.6-luna,gpt-5.4-mini,gpt-5.4-nano,gpt-5-mini,gemini-3.1-pro,gemini-3.8-flash,gemini-3.7-flash,gemini-3.6-flash,gemini-3.5-flash,gemini-3-flash,gemini-2.5-flash,grok-4.7,grok-4.6,grok-4.3,deepseek-v4-pro,deepseek-flash,mistral-medium-3.5,mistral-small-4,codestral,glm-5.3,glm-5.3-flash,glm-5.2,glm-4.6,glm-4.5-air,gpt-oss-120b,gpt-oss-20b,kimi-k3,kimi-k2.7-code,muse-spark-1.3"
1694
1694
  exposes-max-mode="no" exposes-thinking="yes"
1695
1695
  exposes-orchestration="no"
1696
- best-for="Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) — like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is a POINT-IN-TIME snapshot of openrouter.ai/models at authoring (refreshed 2026-10-02; absent: composer-2.5 which is Cursor-only, gemini-3-pro which OpenRouter serves only as an image endpoint, mistral-large-3 which it serves only as a batch endpoint) that the operator should trust LESS than a provider-direct method — prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor." />
1696
+ best-for="Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) — like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is synced daily from openrouter.ai/models (OpenRouter's public model list): each catalogued model it lists as a text chat route, matched by name (absent today: composer-2.5, which is Cursor-only, and gemini-3-pro, which OpenRouter serves only as an image model). The operator should trust it LESS than a provider-direct method — prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor." />
1697
1697
  </access-methods>
1698
1698
 
1699
1699
  <selection-algorithm>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "roadmodel"
7
- version = "0.2.64"
7
+ version = "0.2.65"
8
8
  description = "BYO-key CLI that recommends the right AI model, platform, and settings for a prompt."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -6,7 +6,7 @@
6
6
  "endpoint": "https://artificialanalysis.ai/api/v2/data/llms/models",
7
7
  "attribution": "Benchmark data © Artificial Analysis, used under its API terms with attribution."
8
8
  },
9
- "generated_at_utc": "2026-10-01T22:10:29Z",
9
+ "generated_at_utc": "2026-10-02T22:10:28Z",
10
10
  "model_count": 54,
11
11
  "unmapped": [],
12
12
  "missing_slugs": [],
@@ -38,13 +38,13 @@
38
38
  "tau2": 0.546783625730994,
39
39
  "tau_banking": 0.0927835051546392
40
40
  },
41
- "median_output_tokens_per_second": 125.146,
42
- "median_time_to_first_token_seconds": 13.494
41
+ "median_output_tokens_per_second": 116.991,
42
+ "median_time_to_first_token_seconds": 13.947
43
43
  },
44
44
  "claude-fable-5": {
45
45
  "aa_id": "cd55210d-358e-4df1-ba9c-9acb5f186cc9",
46
46
  "aa_slug": "claude-fable-5",
47
- "aa_name": "Claude Fable 5 (Adaptive Reasoning, Max Effort, Opus 4.8 Fallback)",
47
+ "aa_name": "Claude Fable 5 (Max, Opus 4.8 Fallback)",
48
48
  "aa_creator": "Anthropic",
49
49
  "release_date": "2026-06-09",
50
50
  "evaluations": {
@@ -73,7 +73,7 @@
73
73
  "claude-fable-5.1": {
74
74
  "aa_id": "3e87c73e-a257-495e-9730-367a66229811",
75
75
  "aa_slug": "claude-fable-5-1",
76
- "aa_name": "Claude Fable 5.1 (Adaptive Reasoning, Max Effort, Default Fallback)",
76
+ "aa_name": "Claude Fable 5.1 (Max, Default Fallback)",
77
77
  "aa_creator": "Anthropic",
78
78
  "release_date": "2026-09-01",
79
79
  "evaluations": {
@@ -96,13 +96,13 @@
96
96
  "tau2": null,
97
97
  "tau_banking": 0.472164948453608
98
98
  },
99
- "median_output_tokens_per_second": 68.681,
100
- "median_time_to_first_token_seconds": 127.394
99
+ "median_output_tokens_per_second": 70.155,
100
+ "median_time_to_first_token_seconds": 137.867
101
101
  },
102
102
  "claude-opus-5": {
103
103
  "aa_id": "b8fc61f7-5e9a-49e6-8547-6ac56db24627",
104
104
  "aa_slug": "claude-opus-5",
105
- "aa_name": "Claude Opus 5 (Adaptive Reasoning, Max Effort)",
105
+ "aa_name": "Claude Opus 5 (Max)",
106
106
  "aa_creator": "Anthropic",
107
107
  "release_date": "2026-07-24",
108
108
  "evaluations": {
@@ -131,7 +131,7 @@
131
131
  "claude-opus-5-5": {
132
132
  "aa_id": "2f3c4dc9-a450-4303-8697-0237257cf08f",
133
133
  "aa_slug": "claude-opus-5-5",
134
- "aa_name": "Claude Opus 5.5 (Adaptive Reasoning, Max Effort, Default Fallback)",
134
+ "aa_name": "Claude Opus 5.5 (Max, Default Fallback)",
135
135
  "aa_creator": "Anthropic",
136
136
  "release_date": "2026-09-22",
137
137
  "evaluations": {
@@ -154,13 +154,13 @@
154
154
  "tau2": null,
155
155
  "tau_banking": null
156
156
  },
157
- "median_output_tokens_per_second": 96.458,
158
- "median_time_to_first_token_seconds": 477.23
157
+ "median_output_tokens_per_second": 97.574,
158
+ "median_time_to_first_token_seconds": 449.114
159
159
  },
160
160
  "claude-sonnet-5": {
161
161
  "aa_id": "23c86e4a-c769-43c0-a056-79e3cd15834f",
162
162
  "aa_slug": "claude-sonnet-5",
163
- "aa_name": "Claude Sonnet 5 (Adaptive Reasoning, Max Effort)",
163
+ "aa_name": "Claude Sonnet 5 (Max)",
164
164
  "aa_creator": "Anthropic",
165
165
  "release_date": "2026-06-30",
166
166
  "evaluations": {
@@ -183,13 +183,13 @@
183
183
  "tau2": null,
184
184
  "tau_banking": 0.37319587628866
185
185
  },
186
- "median_output_tokens_per_second": 94.143,
187
- "median_time_to_first_token_seconds": 162.437
186
+ "median_output_tokens_per_second": 92.634,
187
+ "median_time_to_first_token_seconds": 198.594
188
188
  },
189
189
  "claude-sonnet-5-5": {
190
190
  "aa_id": "b171d979-5ec1-45de-b8b9-db1ee65e77ec",
191
191
  "aa_slug": "claude-sonnet-5-5",
192
- "aa_name": "Claude Sonnet 5.5 (Adaptive Reasoning, Max Effort, Default Fallback)",
192
+ "aa_name": "Claude Sonnet 5.5 (Max, Default Fallback)",
193
193
  "aa_creator": "Anthropic",
194
194
  "release_date": "2026-09-28",
195
195
  "evaluations": {
@@ -212,8 +212,8 @@
212
212
  "tau2": null,
213
213
  "tau_banking": null
214
214
  },
215
- "median_output_tokens_per_second": 145.124,
216
- "median_time_to_first_token_seconds": 276.058
215
+ "median_output_tokens_per_second": 140.474,
216
+ "median_time_to_first_token_seconds": 261.115
217
217
  },
218
218
  "deepseek-flash": {
219
219
  "aa_id": "dbe7c625-3100-4463-b479-a228c41f75dd",
@@ -241,8 +241,8 @@
241
241
  "tau2": null,
242
242
  "tau_banking": null
243
243
  },
244
- "median_output_tokens_per_second": 226.5,
245
- "median_time_to_first_token_seconds": 0.844
244
+ "median_output_tokens_per_second": 214.866,
245
+ "median_time_to_first_token_seconds": 0.836
246
246
  },
247
247
  "deepseek-v4-pro": {
248
248
  "aa_id": "83173329-c09a-41f1-a028-a282a5f908d7",
@@ -270,8 +270,8 @@
270
270
  "tau2": null,
271
271
  "tau_banking": 0.395876288659794
272
272
  },
273
- "median_output_tokens_per_second": 101.435,
274
- "median_time_to_first_token_seconds": 1.156
273
+ "median_output_tokens_per_second": 108.409,
274
+ "median_time_to_first_token_seconds": 1.137
275
275
  },
276
276
  "gemini-2.5-flash": {
277
277
  "aa_id": "219ed587-60c5-4a48-9517-8480e08d0ca1",
@@ -386,8 +386,8 @@
386
386
  "tau2": 0.956140350877193,
387
387
  "tau_banking": 0.214432989690722
388
388
  },
389
- "median_output_tokens_per_second": 127.145,
390
- "median_time_to_first_token_seconds": 26.91
389
+ "median_output_tokens_per_second": 123.648,
390
+ "median_time_to_first_token_seconds": 26.15
391
391
  },
392
392
  "gemini-3.5-flash": {
393
393
  "aa_id": "0097ebf5-124f-42f6-9463-33b00e711f03",
@@ -502,8 +502,8 @@
502
502
  "tau2": null,
503
503
  "tau_banking": 0.449484536082474
504
504
  },
505
- "median_output_tokens_per_second": 244.009,
506
- "median_time_to_first_token_seconds": 13.552
505
+ "median_output_tokens_per_second": 255.648,
506
+ "median_time_to_first_token_seconds": 11.765
507
507
  },
508
508
  "glm-4.5-air": {
509
509
  "aa_id": "5d303dc9-c027-401f-9803-4e9aa3331007",
@@ -618,8 +618,8 @@
618
618
  "tau2": null,
619
619
  "tau_banking": 0.503092783505155
620
620
  },
621
- "median_output_tokens_per_second": 69.965,
622
- "median_time_to_first_token_seconds": 2.71
621
+ "median_output_tokens_per_second": 73.964,
622
+ "median_time_to_first_token_seconds": 2.655
623
623
  },
624
624
  "glm-5.3-flash": {
625
625
  "aa_id": "19496b81-9f41-4214-a77a-1df803b3c5ae",
@@ -647,8 +647,8 @@
647
647
  "tau2": null,
648
648
  "tau_banking": 0.472164948453608
649
649
  },
650
- "median_output_tokens_per_second": 49.583,
651
- "median_time_to_first_token_seconds": 3.195
650
+ "median_output_tokens_per_second": 52.907,
651
+ "median_time_to_first_token_seconds": 3.043
652
652
  },
653
653
  "gpt-5": {
654
654
  "aa_id": "48e50f00-1fd1-4acc-b337-61078aa341e6",
@@ -850,8 +850,8 @@
850
850
  "tau2": 0.859649122807018,
851
851
  "tau_banking": null
852
852
  },
853
- "median_output_tokens_per_second": 96.414,
854
- "median_time_to_first_token_seconds": 54.486
853
+ "median_output_tokens_per_second": 98.35,
854
+ "median_time_to_first_token_seconds": 46.046
855
855
  },
856
856
  "gpt-5.4": {
857
857
  "aa_id": "a89c4b28-2d8c-456e-88ea-255fb51fd2b6",
@@ -1053,8 +1053,8 @@
1053
1053
  "tau2": 0.862573099415205,
1054
1054
  "tau_banking": 0.402061855670103
1055
1055
  },
1056
- "median_output_tokens_per_second": 109.104,
1057
- "median_time_to_first_token_seconds": 115.347
1056
+ "median_output_tokens_per_second": 109.955,
1057
+ "median_time_to_first_token_seconds": 94.607
1058
1058
  },
1059
1059
  "gpt-6-astra": {
1060
1060
  "aa_id": "2f339a97-9a0d-499a-9cb5-e0db665bfa25",
@@ -1083,7 +1083,7 @@
1083
1083
  "tau_banking": 0.414432989690722
1084
1084
  },
1085
1085
  "median_output_tokens_per_second": 55.68,
1086
- "median_time_to_first_token_seconds": 192.954
1086
+ "median_time_to_first_token_seconds": 197.034
1087
1087
  },
1088
1088
  "gpt-6-luna": {
1089
1089
  "aa_id": "6fb13851-40ce-4bda-ad3f-6b38e0c5daa7",
@@ -1111,8 +1111,8 @@
1111
1111
  "tau2": null,
1112
1112
  "tau_banking": null
1113
1113
  },
1114
- "median_output_tokens_per_second": 139.721,
1115
- "median_time_to_first_token_seconds": 84.615
1114
+ "median_output_tokens_per_second": 138.11,
1115
+ "median_time_to_first_token_seconds": 83.735
1116
1116
  },
1117
1117
  "gpt-6-sol": {
1118
1118
  "aa_id": "c50ea08c-88c0-4eb7-85b8-27f2bbf6d527",
@@ -1140,8 +1140,8 @@
1140
1140
  "tau2": null,
1141
1141
  "tau_banking": null
1142
1142
  },
1143
- "median_output_tokens_per_second": 90.088,
1144
- "median_time_to_first_token_seconds": 107.871
1143
+ "median_output_tokens_per_second": 105.847,
1144
+ "median_time_to_first_token_seconds": 105.231
1145
1145
  },
1146
1146
  "gpt-6.1-sol": {
1147
1147
  "aa_id": "b25ac058-1e33-4c31-bbc9-a20c3ad0717a",
@@ -1169,8 +1169,8 @@
1169
1169
  "tau2": null,
1170
1170
  "tau_banking": null
1171
1171
  },
1172
- "median_output_tokens_per_second": 63.279,
1173
- "median_time_to_first_token_seconds": 139.092
1172
+ "median_output_tokens_per_second": 59.099,
1173
+ "median_time_to_first_token_seconds": 170.489
1174
1174
  },
1175
1175
  "gpt-oss-120b": {
1176
1176
  "aa_id": "f0083258-8646-45b8-8082-7aaf6c2ea82a",
@@ -1198,8 +1198,8 @@
1198
1198
  "tau2": 0.657894736842105,
1199
1199
  "tau_banking": 0.127835051546392
1200
1200
  },
1201
- "median_output_tokens_per_second": 154.167,
1202
- "median_time_to_first_token_seconds": 0.54
1201
+ "median_output_tokens_per_second": 156.511,
1202
+ "median_time_to_first_token_seconds": 0.525
1203
1203
  },
1204
1204
  "gpt-oss-20b": {
1205
1205
  "aa_id": "36f73aaf-d38a-4b56-a2b3-d04d17186910",
@@ -1227,8 +1227,8 @@
1227
1227
  "tau2": 0.60233918128655,
1228
1228
  "tau_banking": 0.0701030927835052
1229
1229
  },
1230
- "median_output_tokens_per_second": 192.538,
1231
- "median_time_to_first_token_seconds": 0.415
1230
+ "median_output_tokens_per_second": 200.593,
1231
+ "median_time_to_first_token_seconds": 0.409
1232
1232
  },
1233
1233
  "grok-4.3": {
1234
1234
  "aa_id": "948892b5-db03-4118-a4a8-ccd51ed871ea",
@@ -1314,8 +1314,8 @@
1314
1314
  "tau2": null,
1315
1315
  "tau_banking": null
1316
1316
  },
1317
- "median_output_tokens_per_second": 84.78,
1318
- "median_time_to_first_token_seconds": 19.787
1317
+ "median_output_tokens_per_second": 80.156,
1318
+ "median_time_to_first_token_seconds": 19.497
1319
1319
  },
1320
1320
  "kimi-k2.7-code": {
1321
1321
  "aa_id": "8d0cb231-7303-452c-9923-a9620b948475",
@@ -1343,8 +1343,8 @@
1343
1343
  "tau2": 0.900584795321637,
1344
1344
  "tau_banking": 0.202061855670103
1345
1345
  },
1346
- "median_output_tokens_per_second": 77.467,
1347
- "median_time_to_first_token_seconds": 1.204
1346
+ "median_output_tokens_per_second": 84.582,
1347
+ "median_time_to_first_token_seconds": 1.233
1348
1348
  },
1349
1349
  "kimi-k3": {
1350
1350
  "aa_id": "f7d2fc3e-1f7b-405f-818c-07952a4af78f",
@@ -1372,8 +1372,8 @@
1372
1372
  "tau2": null,
1373
1373
  "tau_banking": 0.45979381443299
1374
1374
  },
1375
- "median_output_tokens_per_second": 37.907,
1376
- "median_time_to_first_token_seconds": 3.013
1375
+ "median_output_tokens_per_second": 35.161,
1376
+ "median_time_to_first_token_seconds": 2.906
1377
1377
  },
1378
1378
  "mistral-large-3": {
1379
1379
  "aa_id": "4928e950-7f37-4475-b0dc-c5bad781a321",
@@ -1401,8 +1401,8 @@
1401
1401
  "tau2": 0.245614035087719,
1402
1402
  "tau_banking": 0.0577319587628866
1403
1403
  },
1404
- "median_output_tokens_per_second": 75.045,
1405
- "median_time_to_first_token_seconds": 0.721
1404
+ "median_output_tokens_per_second": 79.16,
1405
+ "median_time_to_first_token_seconds": 0.723
1406
1406
  },
1407
1407
  "mistral-medium-3.5": {
1408
1408
  "aa_id": "dd059b25-d82a-4ead-82a4-4adceaaec48b",
@@ -1430,8 +1430,8 @@
1430
1430
  "tau2": 0.941520467836257,
1431
1431
  "tau_banking": 0.150515463917526
1432
1432
  },
1433
- "median_output_tokens_per_second": 167.324,
1434
- "median_time_to_first_token_seconds": 0.625
1433
+ "median_output_tokens_per_second": 168.676,
1434
+ "median_time_to_first_token_seconds": 0.564
1435
1435
  },
1436
1436
  "mistral-small-4": {
1437
1437
  "aa_id": "3fd96175-4ef1-434c-8795-f873aec2abc1",
@@ -1459,8 +1459,8 @@
1459
1459
  "tau2": 0.412280701754386,
1460
1460
  "tau_banking": 0.0494845360824742
1461
1461
  },
1462
- "median_output_tokens_per_second": 173.192,
1463
- "median_time_to_first_token_seconds": 0.626
1462
+ "median_output_tokens_per_second": 173.831,
1463
+ "median_time_to_first_token_seconds": 0.643
1464
1464
  },
1465
1465
  "muse-spark-1.3": {
1466
1466
  "aa_id": "9999672c-b687-4026-9c15-5cef02ff53bb",
@@ -1488,13 +1488,13 @@
1488
1488
  "tau2": null,
1489
1489
  "tau_banking": 0.505154639175258
1490
1490
  },
1491
- "median_output_tokens_per_second": 171.012,
1492
- "median_time_to_first_token_seconds": 37.827
1491
+ "median_output_tokens_per_second": 163.786,
1492
+ "median_time_to_first_token_seconds": 43.349
1493
1493
  },
1494
1494
  "opus-4.7": {
1495
1495
  "aa_id": "e9a09db3-8fd6-41dd-ba2f-20e0a2bff7f2",
1496
1496
  "aa_slug": "claude-opus-4-7",
1497
- "aa_name": "Claude Opus 4.7 (Adaptive Reasoning, Max Effort)",
1497
+ "aa_name": "Claude Opus 4.7 (Max)",
1498
1498
  "aa_creator": "Anthropic",
1499
1499
  "release_date": "2026-04-16",
1500
1500
  "evaluations": {
@@ -1523,7 +1523,7 @@
1523
1523
  "opus-4.8": {
1524
1524
  "aa_id": "992b7b84-5069-4c6a-9295-834252553d50",
1525
1525
  "aa_slug": "claude-opus-4-8",
1526
- "aa_name": "Claude Opus 4.8 (Adaptive Reasoning, Max Effort)",
1526
+ "aa_name": "Claude Opus 4.8 (Max)",
1527
1527
  "aa_creator": "Anthropic",
1528
1528
  "release_date": "2026-05-28",
1529
1529
  "evaluations": {
@@ -1552,7 +1552,7 @@
1552
1552
  "sonnet-4.6": {
1553
1553
  "aa_id": "df8d14e0-3997-4e4d-b4ad-9c047acc9c69",
1554
1554
  "aa_slug": "claude-sonnet-4-6-adaptive",
1555
- "aa_name": "Claude Sonnet 4.6 (Adaptive Reasoning, Max Effort)",
1555
+ "aa_name": "Claude Sonnet 4.6 (Max)",
1556
1556
  "aa_creator": "Anthropic",
1557
1557
  "release_date": "2026-02-17",
1558
1558
  "evaluations": {
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "schema_version": "4",
3
3
  "output_contract_version": 2,
4
- "generated_at_utc": "2026-10-02T18:08:21Z",
4
+ "generated_at_utc": "2026-10-02T22:10:28Z",
5
5
  "source_doc_sha256": {
6
- "model-selector.txt": "81c5530a28521df18ebe14810e56cd72e65f1e30ad93d0522d31dbf362516e93",
6
+ "model-selector.txt": "3a1897163e23e66afb77cf2f76ae84aa9354f85b07a235c27fb6bc55e7b657f8",
7
7
  "model-tier-cost-scale.md": "2b3b0eb82237eb5cb5bf468a3fe971bcaf0160ad7d0bc700698d2c16640bc41d"
8
8
  },
9
9
  "models": [
@@ -1424,7 +1424,7 @@
1424
1424
  "speed": "B"
1425
1425
  },
1426
1426
  "jurisdiction": "us",
1427
- "headline_benchmarks": "AA Intelligence Index 30.1 (adaptive reasoning, max effort); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4",
1427
+ "headline_benchmarks": "AA Intelligence Index 30.1 (max); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4",
1428
1428
  "pricing_notes": "Hidden by default; Requires Max Mode on legacy request-based plans; Up to 1M tokens with extended context at the same per-token rates (no long-context surcharge)",
1429
1429
  "best_for": "Strong multimodal input and long context at a high price. Its AA Intelligence Index of 30.1 ranks 33rd of 54 measured models.",
1430
1430
  "superseded_by": null,
@@ -2048,7 +2048,7 @@
2048
2048
  "exposes_max_mode": "no",
2049
2049
  "exposes_thinking": "yes",
2050
2050
  "exposes_orchestration": "no",
2051
- "best_for": "Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) \u2014 like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is a POINT-IN-TIME snapshot of openrouter.ai/models at authoring (refreshed 2026-10-02; absent: composer-2.5 which is Cursor-only, gemini-3-pro which OpenRouter serves only as an image endpoint, mistral-large-3 which it serves only as a batch endpoint) that the operator should trust LESS than a provider-direct method \u2014 prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor."
2051
+ "best_for": "Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) \u2014 like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is synced daily from openrouter.ai/models (OpenRouter's public model list): each catalogued model it lists as a text chat route, matched by name (absent today: composer-2.5, which is Cursor-only, and gemini-3-pro, which OpenRouter serves only as an image model). The operator should trust it LESS than a provider-direct method \u2014 prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor."
2052
2052
  },
2053
2053
  {
2054
2054
  "id": "xai-api",
@@ -1040,7 +1040,7 @@
1040
1040
  tier-coding="B" tier-planning="B" tier-agentic="B"
1041
1041
  tier-multimodal="A" tier-long-context="A" tier-knowledge="B"
1042
1042
  tier-speed="B"
1043
- headline-benchmarks="AA Intelligence Index 30.1 (adaptive reasoning, max effort); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4"
1043
+ headline-benchmarks="AA Intelligence Index 30.1 (max); HLE 33.6%; SciCode 50.1; Terminal-Bench 4.0 3.0; AA-LCR 0.800; LMArena Text Elo 1457.7 (#41); AA-Omniscience 12.4"
1044
1044
  pricing-notes="Hidden by default; Requires Max Mode on legacy request-based plans; Up to 1M tokens with extended context at the same per-token rates (no long-context surcharge)"
1045
1045
  prose-generated="best-for headline-benchmarks"
1046
1046
  best-for="Strong multimodal input and long context at a high price. Its AA Intelligence Index of 30.1 ranks 33rd of 54 measured models."/>
@@ -1693,7 +1693,7 @@
1693
1693
  supports-models="claude-sonnet-5-5,claude-opus-5-5,claude-opus-5,opus-4.8,claude-fable-5.1,claude-fable-5,opus-4.7,claude-sonnet-5,sonnet-4.6,claude-4.5-haiku,gpt-6-astra,gpt-6.1-sol,gpt-6-sol,gpt-6-luna,gpt-5.6-sol,gpt-5.5,gpt-5.6-terra,gpt-5.4,gpt-5.3-codex,gpt-5.2,gpt-5.2-codex,gpt-5.1-codex-max,gpt-5.1-codex,gpt-5.1-codex-mini,gpt-5,gpt-5.6-luna,gpt-5.4-mini,gpt-5.4-nano,gpt-5-mini,gemini-3.1-pro,gemini-3.8-flash,gemini-3.7-flash,gemini-3.6-flash,gemini-3.5-flash,gemini-3-flash,gemini-2.5-flash,grok-4.7,grok-4.6,grok-4.3,deepseek-v4-pro,deepseek-flash,mistral-medium-3.5,mistral-small-4,codestral,glm-5.3,glm-5.3-flash,glm-5.2,glm-4.6,glm-4.5-air,gpt-oss-120b,gpt-oss-20b,kimi-k3,kimi-k2.7-code,muse-spark-1.3"
1694
1694
  exposes-max-mode="no" exposes-thinking="yes"
1695
1695
  exposes-orchestration="no"
1696
- best-for="Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) — like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is a POINT-IN-TIME snapshot of openrouter.ai/models at authoring (refreshed 2026-10-02; absent: composer-2.5 which is Cursor-only, gemini-3-pro which OpenRouter serves only as an image endpoint, mistral-large-3 which it serves only as a batch endpoint) that the operator should trust LESS than a provider-direct method — prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor." />
1696
+ best-for="Per-token AGGREGATOR that resells other makers' models behind one OpenAI-format endpoint and one key (openrouter.ai) — like Cursor's pool but paid per call, not a subscription. Reaches most of the catalog: supports-models is synced daily from openrouter.ai/models (OpenRouter's public model list): each catalogued model it lists as a text chat route, matched by name (absent today: composer-2.5, which is Cursor-only, and gemini-3-pro, which OpenRouter serves only as an image model). The operator should trust it LESS than a provider-direct method — prefer the maker's own method when the operator holds that key. BILLING: OpenRouter charges the maker's list price plus its platform fee (~5% on credit purchases at authoring), so the catalog price is a FLOOR for this method, never an exact estimate. ROUTING: a request may be served by any of OpenRouter's upstream hosts for that model; the MODEL-level jurisdiction filter (Step 0b) still governs which models are eligible, and this method's `us` code is OpenRouter's own (the operator's counterparty), NOT the upstream host's. Exposes the maker's reasoning dial where the routed model documents one (`reasoning_effort` on OpenAI / gpt-oss / GLM / DeepSeek families). Never the maker of any model it resells: the cross-provider BACKUP guard resolves makers through provider-direct methods, exactly as it does for Cursor." />
1697
1697
  </access-methods>
1698
1698
 
1699
1699
  <selection-algorithm>
@@ -4,9 +4,10 @@
4
4
 
5
5
  One machine, many projects, each with its own conda env or venv. This
6
6
  script reads the project list, works out each project's environment,
7
- upgrades ``roadmodel`` in all of them concurrently, refreshes each
8
- project's ``planning/`` kit where one exists, and re-downloads the
9
- user-scope Claude Code commands — one run, one table.
7
+ upgrades ``roadmodel`` in all of them concurrently, upgrades
8
+ ``roadmodel[mcp]`` in the env that serves the user-scope MCP server,
9
+ refreshes each project's ``planning/`` kit where one exists, and
10
+ re-downloads the user-scope Claude Code commands — one run, one table.
10
11
 
11
12
  python update_projects.py # every registered project
12
13
  python update_projects.py --add C:\\dev\\app1 ... # register, then run
@@ -378,7 +379,7 @@ def _tail(text: str, n: int = 6) -> str:
378
379
  return "\n".join(lines[-n:])
379
380
 
380
381
 
381
- def _pip_upgrade(python: Path) -> list[str]:
382
+ def _pip_upgrade(python: Path, spec: str = "roadmodel") -> list[str]:
382
383
  # --no-cache-dir: pip's HTTP cache can serve an index page fetched before
383
384
  # a release existed, so a run minutes after publishing reported
384
385
  # "0.2.37 -> 0.2.37 ok" (2026-09-23) and the new version waited a day.
@@ -390,7 +391,7 @@ def _pip_upgrade(python: Path) -> list[str]:
390
391
  "--upgrade",
391
392
  "--no-cache-dir",
392
393
  "--quiet",
393
- "roadmodel",
394
+ spec,
394
395
  ]
395
396
 
396
397
 
@@ -447,6 +448,95 @@ def update_project(entry: Entry, *, kit: bool, init_kit: bool, dry_run: bool) ->
447
448
  return res
448
449
 
449
450
 
451
+ # --------------------------------------------------------------------------
452
+ # The MCP server's own environment
453
+ #
454
+ # `roadmodel setup-mcp` registers the server from whichever env it ran in, and
455
+ # one user-scope server serves every project, so that env is usually none of
456
+ # the registered projects'. Nothing upgraded it: the Mac's sat on 0.2.36 for
457
+ # 28 releases (found 2026-10-02) and served a stale catalog to every session.
458
+ # Each run now finds the interpreter behind Claude Code's registration and
459
+ # upgrades roadmodel[mcp] there too.
460
+ # --------------------------------------------------------------------------
461
+
462
+ MCP_SPEC = "roadmodel[mcp]"
463
+ _MCP_SCRIPT_NAMES = {"roadmodel-mcp", "roadmodel-mcp.exe"}
464
+ _PYTHON_NAME = re.compile(r"python(\d+(\.\d+)?)?(\.exe)?", re.IGNORECASE)
465
+ # A console-script path inside a launcher (`exec "$HOME/.venvs/x/bin/roadmodel-mcp"`).
466
+ _LAUNCHER_TARGET = re.compile(r"""[^\s"'`;|&()]*roadmodel-mcp(?:\.exe)?(?![\w.-])""")
467
+
468
+
469
+ def _expand_home(token: str) -> Path:
470
+ home = str(Path.home())
471
+ for prefix in ("${HOME}", "$HOME", "%USERPROFILE%", "~"):
472
+ if token.startswith(prefix):
473
+ return Path(home + token[len(prefix) :])
474
+ return Path(token)
475
+
476
+
477
+ def mcp_server_python(argv: Optional[list[str]]) -> Optional[Path]:
478
+ """The interpreter whose roadmodel serves the MCP registration ``argv``.
479
+
480
+ Three shapes are recognised: the ``roadmodel-mcp`` console script itself
481
+ (what ``setup-mcp`` registers), an interpreter running the module, and a
482
+ launcher script that execs the console script (to inject provider keys
483
+ first). None when the interpreter cannot be placed — nothing is guessed.
484
+ """
485
+ if not argv:
486
+ return None
487
+ found = shutil.which(argv[0]) if not Path(argv[0]).expanduser().is_absolute() else None
488
+ command = Path(found) if found else Path(argv[0]).expanduser()
489
+ if not command.is_file():
490
+ return None
491
+ if _PYTHON_NAME.fullmatch(command.name):
492
+ return command
493
+ if command.name.lower() in _MCP_SCRIPT_NAMES:
494
+ script: Optional[Path] = command
495
+ else:
496
+ try:
497
+ text = command.read_text(encoding="utf-8", errors="replace")
498
+ except OSError:
499
+ return None
500
+ targets = (_expand_home(m.group(0)) for m in _LAUNCHER_TARGET.finditer(text))
501
+ script = next((p for p in targets if p.is_absolute() and p.is_file()), None)
502
+ if script is None:
503
+ return None
504
+ return _python_path(script.parent.parent)
505
+
506
+
507
+ def update_mcp_env(argv: Optional[list[str]], *, dry_run: bool) -> tuple[str, bool]:
508
+ """Upgrade roadmodel[mcp] in the env behind the MCP registration ``argv``.
509
+
510
+ Returns the line to print and whether the env is current (False means the
511
+ run needs attention).
512
+ """
513
+ if argv is None:
514
+ return "no roadmodel MCP registration in Claude Code; nothing to upgrade", True
515
+ python = mcp_server_python(argv)
516
+ if python is None:
517
+ return (
518
+ f"could not find the interpreter behind {argv[0]}; upgrade {MCP_SPEC} "
519
+ "in the env that serves it by hand",
520
+ False,
521
+ )
522
+ if dry_run:
523
+ return f"plan: upgrade {MCP_SPEC} with {python}", True
524
+ before = installed_version(python)
525
+ try:
526
+ cp = _run(_pip_upgrade(python, MCP_SPEC), timeout=PIP_TIMEOUT)
527
+ except subprocess.TimeoutExpired:
528
+ return f"pip install timed out after {PIP_TIMEOUT}s ({python})", False
529
+ except OSError as exc:
530
+ return f"could not run {python}: {exc}", False
531
+ if cp.returncode != 0:
532
+ return f"pip install failed ({python}):\n" + _tail(cp.stderr or cp.stdout), False
533
+ after = installed_version(python)
534
+ if after == "-":
535
+ return f"pip reported success but `import roadmodel` fails ({python})", False
536
+ note = " (restart agent sessions to load it)" if after != before else ""
537
+ return f"{before} -> {after} with {python}{note}", True
538
+
539
+
450
540
  # --------------------------------------------------------------------------
451
541
  # Claude Code commands (user scope, per machine)
452
542
  # --------------------------------------------------------------------------
@@ -2545,6 +2635,11 @@ def main(argv: Optional[list[str]] = None) -> int:
2545
2635
 
2546
2636
  print("\n" + _table(results))
2547
2637
 
2638
+ # After the projects, never alongside them: the MCP env may be one of
2639
+ # theirs, and two pips must not write one env at once.
2640
+ mcp_line, mcp_ok = update_mcp_env(_roadmodel_mcp_command(), dry_run=args.dry_run)
2641
+ print(f"\nMCP server env: {mcp_line}")
2642
+
2548
2643
  if not args.no_parity:
2549
2644
  print("\nProject parity (AGENTS.md + memory for non-Claude agents):")
2550
2645
  for entry in entries:
@@ -2595,6 +2690,9 @@ def main(argv: Optional[list[str]] = None) -> int:
2595
2690
  for r in failed:
2596
2691
  print(f" {r.entry.path}: {r.error}")
2597
2692
  return 1
2693
+ if not mcp_ok:
2694
+ print(f"\nThe MCP server env needs attention: {mcp_line}")
2695
+ return 1
2598
2696
  return 1 if refresh_attention else 0
2599
2697
 
2600
2698
 
@@ -1,2 +1,2 @@
1
1
  # src/roadmodel/__init__.py
2
- __version__ = "0.2.64"
2
+ __version__ = "0.2.65"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes