roadmodel 0.2.89__tar.gz → 0.2.91__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 (73) hide show
  1. {roadmodel-0.2.89 → roadmodel-0.2.91}/PKG-INFO +1 -1
  2. {roadmodel-0.2.89/roadmodel/data → roadmodel-0.2.91/docs/templates}/phase-roadmap-template.md +12 -5
  3. {roadmodel-0.2.89/roadmodel/data → roadmodel-0.2.91/docs/templates}/project-roadmap-template.md +3 -0
  4. {roadmodel-0.2.89 → roadmodel-0.2.91}/pyproject.toml +1 -1
  5. {roadmodel-0.2.89/docs/templates → roadmodel-0.2.91/roadmodel/data}/phase-roadmap-template.md +12 -5
  6. {roadmodel-0.2.89/docs/templates → roadmodel-0.2.91/roadmodel/data}/project-roadmap-template.md +3 -0
  7. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/__init__.py +1 -1
  8. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/anthropic.py +12 -1
  9. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/google.py +17 -8
  10. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/openai.py +12 -1
  11. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/scoring.py +22 -3
  12. {roadmodel-0.2.89 → roadmodel-0.2.91}/.github/README.md +0 -0
  13. {roadmodel-0.2.89 → roadmodel-0.2.91}/.gitignore +0 -0
  14. {roadmodel-0.2.89 → roadmodel-0.2.91}/LICENSE +0 -0
  15. {roadmodel-0.2.89 → roadmodel-0.2.91}/NOTICE +0 -0
  16. {roadmodel-0.2.89 → roadmodel-0.2.91}/README.md +0 -0
  17. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/benchmarks.json +0 -0
  18. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/catalog.json +0 -0
  19. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/claude-commands/roadmap-phase.md +0 -0
  20. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/claude-commands/roadmap-project.md +0 -0
  21. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/claude-commands/roadmap-refresh.md +0 -0
  22. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/claude-commands/roadmap-step.md +0 -0
  23. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/claude-commands/roadmodel-upgrade.md +0 -0
  24. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/context-windows.json +0 -0
  25. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/effort-tokens.json +0 -0
  26. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/model-selector.txt +0 -0
  27. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/model-tier-cost-scale.md +0 -0
  28. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/settings-display.md +0 -0
  29. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/templates/planning-kit-how-to-use.md +0 -0
  30. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/templates/prompt-phase-roadmap.md +0 -0
  31. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/templates/prompt-project-roadmap.md +0 -0
  32. {roadmodel-0.2.89 → roadmodel-0.2.91}/docs/user-context.example.md +0 -0
  33. {roadmodel-0.2.89 → roadmodel-0.2.91}/hatch_build.py +0 -0
  34. {roadmodel-0.2.89 → roadmodel-0.2.91}/infra/README.md +0 -0
  35. {roadmodel-0.2.89 → roadmodel-0.2.91}/infra/gcp-killswitch/README.md +0 -0
  36. {roadmodel-0.2.89 → roadmodel-0.2.91}/infra/supabase/README.md +0 -0
  37. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/benchmarks.json +0 -0
  38. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/catalog.json +0 -0
  39. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/context-windows.json +0 -0
  40. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/effort-tokens.json +0 -0
  41. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/model-selector.txt +0 -0
  42. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/model-tier-cost-scale.md +0 -0
  43. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/planning-kit-how-to-use.md +0 -0
  44. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/prompt-phase-roadmap.md +0 -0
  45. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/prompt-project-roadmap.md +0 -0
  46. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/roadmap-phase.md +0 -0
  47. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/roadmap-project.md +0 -0
  48. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/roadmap-refresh.md +0 -0
  49. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/roadmap-step.md +0 -0
  50. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/roadmodel-upgrade.md +0 -0
  51. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/settings-display.md +0 -0
  52. {roadmodel-0.2.89 → roadmodel-0.2.91}/roadmodel/data/user-context.example.md +0 -0
  53. {roadmodel-0.2.89 → roadmodel-0.2.91}/scripts/agent_context.py +0 -0
  54. {roadmodel-0.2.89 → roadmodel-0.2.91}/scripts/agent_rules.py +0 -0
  55. {roadmodel-0.2.89 → roadmodel-0.2.91}/scripts/update_projects.py +0 -0
  56. {roadmodel-0.2.89 → roadmodel-0.2.91}/scripts/updater_lock.py +0 -0
  57. {roadmodel-0.2.89 → roadmodel-0.2.91}/scripts/upgrade_fleet.py +0 -0
  58. {roadmodel-0.2.89 → roadmodel-0.2.91}/scripts/worktree_memory.py +0 -0
  59. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/__main__.py +0 -0
  60. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/cli.py +0 -0
  61. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/config.py +0 -0
  62. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/cost.py +0 -0
  63. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/errors.py +0 -0
  64. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/mcp_server.py +0 -0
  65. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/private_files.py +0 -0
  66. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/__init__.py +0 -0
  67. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/_safety.py +0 -0
  68. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/openai_compatible.py +0 -0
  69. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/providers/registry.py +0 -0
  70. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/recommend.py +0 -0
  71. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/series.py +0 -0
  72. {roadmodel-0.2.89 → roadmodel-0.2.91}/src/roadmodel/usage.py +0 -0
  73. {roadmodel-0.2.89 → roadmodel-0.2.91}/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.89
3
+ Version: 0.2.91
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
@@ -753,11 +753,15 @@ that owns it.}}
753
753
  **Runs:** line exactly as `roadmodel ladder --category
754
754
  <c> --complexity <x> [--novel]` prints them for the
755
755
  step's classification (MCP tool: `roadmap_settings`).
756
- Rows: Model / Backup / Platform / Effort / Thinking /
757
- Conversation. The Effort cell names each column's own
758
- dial (`Intelligence Medium` on Codex, `Effort High` on
759
- Claude Code); a column whose surface has no such
760
- control reads `—` there. Every model is the latest
756
+ Rows: Model / Backup / Platform / Effort / AA Index /
757
+ Thinking / Conversation. The Effort cell names each
758
+ column's own dial (`Intelligence Medium` on Codex,
759
+ `Effort High` on Claude Code); a column whose surface
760
+ has no such control reads `—` there. The AA Index cell
761
+ is that column's model's Artificial Analysis
762
+ Intelligence Index at that column's effort, the figure
763
+ the pick was read from; it reads `not measured` where
764
+ AA has no row for the model at that effort. Every model is the latest
761
765
  version of its series, never an older one (GPT-6 Sol
762
766
  where GPT-6.1 Sol runs, Opus 5 where Opus 5.5 does).
763
767
  Set Conversation to **Continue** in every column only
@@ -869,6 +873,7 @@ reached}}):
869
873
  | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
870
874
  | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
871
875
  | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
876
+ | AA Index | {{AA Index at that effort}} | {{AA Index at that effort}} | {{AA Index at that effort}} |
872
877
  | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
873
878
  | Conversation | **{{New or Continue}}** | **{{New or Continue}}** | **{{New or Continue}}** |
874
879
 
@@ -1290,6 +1295,7 @@ carrying ONLY the rows that platform's panel exposes.}}
1290
1295
  | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
1291
1296
  | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
1292
1297
  | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
1298
+ | AA Index | {{AA Index at that effort}} | {{AA Index at that effort}} | {{AA Index at that effort}} |
1293
1299
  | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
1294
1300
  | Conversation | **{{New or Continue}}** | **{{New or Continue}}** | **{{New or Continue}}** |
1295
1301
 
@@ -1426,6 +1432,7 @@ single-column variant that matches PLATFORM.}}
1426
1432
  | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
1427
1433
  | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
1428
1434
  | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
1435
+ | AA Index | {{AA Index at that effort}} | {{AA Index at that effort}} | {{AA Index at that effort}} |
1429
1436
  | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
1430
1437
  | Conversation | **New** | **New** | **New** |
1431
1438
 
@@ -254,6 +254,7 @@ dependency graph in §5 is honoured.
254
254
  | Backup | <Backup — its platform · its dial> | <Backup — its platform · its dial> | <Backup — its platform · its dial> |
255
255
  | Platform | <Access method> | <Access method> | <Claude Code, or the access method that pays> |
256
256
  | Effort | <Its dial and level> | <Its dial and level> | <Deepest rung there — Effort Max in Claude Code> |
257
+ | AA Index | <AA Index at that effort> | <AA Index at that effort> | <AA Index at that effort> |
257
258
  | Thinking | <On, or — with no toggle> | <On, or — with no toggle> | <On, or — with no toggle> |
258
259
  | Conversation | **New** | **New** | **New** |
259
260
 
@@ -314,6 +315,7 @@ key pays for the platform.>
314
315
  | Backup | … | … | … |
315
316
  | Platform | … | … | … |
316
317
  | Effort | … | … | … |
318
+ | AA Index | … | … | … |
317
319
  | Thinking | … | … | … |
318
320
  | Conversation | **New** | **New** | **New** |
319
321
 
@@ -351,6 +353,7 @@ key pays for the platform.>
351
353
  | Backup | … | … | … |
352
354
  | Platform | … | … | … |
353
355
  | Effort | … | … | … |
356
+ | AA Index | … | … | … |
354
357
  | Thinking | … | … | … |
355
358
  | Conversation | **New** | **New** | **New** |
356
359
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "roadmodel"
7
- version = "0.2.89"
7
+ version = "0.2.91"
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"
@@ -753,11 +753,15 @@ that owns it.}}
753
753
  **Runs:** line exactly as `roadmodel ladder --category
754
754
  <c> --complexity <x> [--novel]` prints them for the
755
755
  step's classification (MCP tool: `roadmap_settings`).
756
- Rows: Model / Backup / Platform / Effort / Thinking /
757
- Conversation. The Effort cell names each column's own
758
- dial (`Intelligence Medium` on Codex, `Effort High` on
759
- Claude Code); a column whose surface has no such
760
- control reads `—` there. Every model is the latest
756
+ Rows: Model / Backup / Platform / Effort / AA Index /
757
+ Thinking / Conversation. The Effort cell names each
758
+ column's own dial (`Intelligence Medium` on Codex,
759
+ `Effort High` on Claude Code); a column whose surface
760
+ has no such control reads `—` there. The AA Index cell
761
+ is that column's model's Artificial Analysis
762
+ Intelligence Index at that column's effort, the figure
763
+ the pick was read from; it reads `not measured` where
764
+ AA has no row for the model at that effort. Every model is the latest
761
765
  version of its series, never an older one (GPT-6 Sol
762
766
  where GPT-6.1 Sol runs, Opus 5 where Opus 5.5 does).
763
767
  Set Conversation to **Continue** in every column only
@@ -869,6 +873,7 @@ reached}}):
869
873
  | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
870
874
  | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
871
875
  | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
876
+ | AA Index | {{AA Index at that effort}} | {{AA Index at that effort}} | {{AA Index at that effort}} |
872
877
  | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
873
878
  | Conversation | **{{New or Continue}}** | **{{New or Continue}}** | **{{New or Continue}}** |
874
879
 
@@ -1290,6 +1295,7 @@ carrying ONLY the rows that platform's panel exposes.}}
1290
1295
  | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
1291
1296
  | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
1292
1297
  | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
1298
+ | AA Index | {{AA Index at that effort}} | {{AA Index at that effort}} | {{AA Index at that effort}} |
1293
1299
  | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
1294
1300
  | Conversation | **{{New or Continue}}** | **{{New or Continue}}** | **{{New or Continue}}** |
1295
1301
 
@@ -1426,6 +1432,7 @@ single-column variant that matches PLATFORM.}}
1426
1432
  | Backup | {{Backup — platform · dial}} | {{Backup — platform · dial}} | {{Backup — platform · dial}} |
1427
1433
  | Platform | {{Access method}} | {{Access method}} | {{Access method}} |
1428
1434
  | Effort | {{Its dial and level}} | {{Its dial and level}} | {{Its dial and level}} |
1435
+ | AA Index | {{AA Index at that effort}} | {{AA Index at that effort}} | {{AA Index at that effort}} |
1429
1436
  | Thinking | {{On, or — with no toggle}} | {{On, or — with no toggle}} | {{On, or — with no toggle}} |
1430
1437
  | Conversation | **New** | **New** | **New** |
1431
1438
 
@@ -254,6 +254,7 @@ dependency graph in §5 is honoured.
254
254
  | Backup | <Backup — its platform · its dial> | <Backup — its platform · its dial> | <Backup — its platform · its dial> |
255
255
  | Platform | <Access method> | <Access method> | <Claude Code, or the access method that pays> |
256
256
  | Effort | <Its dial and level> | <Its dial and level> | <Deepest rung there — Effort Max in Claude Code> |
257
+ | AA Index | <AA Index at that effort> | <AA Index at that effort> | <AA Index at that effort> |
257
258
  | Thinking | <On, or — with no toggle> | <On, or — with no toggle> | <On, or — with no toggle> |
258
259
  | Conversation | **New** | **New** | **New** |
259
260
 
@@ -314,6 +315,7 @@ key pays for the platform.>
314
315
  | Backup | … | … | … |
315
316
  | Platform | … | … | … |
316
317
  | Effort | … | … | … |
318
+ | AA Index | … | … | … |
317
319
  | Thinking | … | … | … |
318
320
  | Conversation | **New** | **New** | **New** |
319
321
 
@@ -351,6 +353,7 @@ key pays for the platform.>
351
353
  | Backup | … | … | … |
352
354
  | Platform | … | … | … |
353
355
  | Effort | … | … | … |
356
+ | AA Index | … | … | … |
354
357
  | Thinking | … | … | … |
355
358
  | Conversation | **New** | **New** | **New** |
356
359
 
@@ -1,2 +1,2 @@
1
1
  # src/roadmodel/__init__.py
2
- __version__ = "0.2.89"
2
+ __version__ = "0.2.91"
@@ -8,7 +8,15 @@ from roadmodel import usage
8
8
  from roadmodel.errors import ProviderCallError
9
9
  from roadmodel.providers._safety import hosted_timeout, private_transport, safe_error
10
10
 
11
- DEFAULT_MODEL = "claude-sonnet-4-6"
11
+ # The package's own engine when no model is named (`roadmodel recommend`, the MCP
12
+ # server, an SDK caller): one of service/app/engines.json's evaluated engines,
13
+ # with the settings docs/engine-eval.json measured it at. The settings apply only
14
+ # to that default; a named model runs with whatever the caller passes.
15
+ # tests/test_engine_eval_mirror.py holds all three to the registry.
16
+ # Sonnet 4.6 until 0.2.91; Sonnet 5.5 is that series' latest version.
17
+ DEFAULT_MODEL = "claude-sonnet-5-5"
18
+ DEFAULT_THINKING_BUDGET: int | None = 0
19
+ DEFAULT_TEMPERATURE: float | None = None
12
20
 
13
21
  # claude-<family>-<major>[-<minor>][-<yyyymmdd>]: claude-haiku-4-5-20251001,
14
22
  # claude-sonnet-5, claude-opus-5-5, claude-fable-5-1.
@@ -81,6 +89,9 @@ def recommend(
81
89
  if missing_sdk is not None:
82
90
  raise missing_sdk
83
91
 
92
+ if model is None:
93
+ thinking_budget = DEFAULT_THINKING_BUDGET if thinking_budget is None else thinking_budget
94
+ temperature = DEFAULT_TEMPERATURE if temperature is None else temperature
84
95
  model_id = model or DEFAULT_MODEL
85
96
  # `kwargs` is typed `Any` for the same reason as providers/openai.py: the
86
97
  # SDK's overloaded `create` signature rejects a mixed-value dict literal.
@@ -8,14 +8,20 @@ from roadmodel import usage
8
8
  from roadmodel.errors import ProviderCallError
9
9
  from roadmodel.providers._safety import hosted_timeout, private_transport, safe_error
10
10
 
11
- # Default engine model for direct Google API calls when no model is passed.
12
- # Must be a model that is actually callable on the public Google Generative
13
- # Language API (v1beta generateContent). `gemini-3.1-pro` is catalog-only
14
- # (Cursor) and returns 404 NOT_FOUND on the direct API, so a bare
15
- # `roadmodel recommend` / the MCP server / any SDK caller with only a Google
16
- # key would fail; `gemini-2.5-pro` is the highest-quality callable Gemini.
17
- # Prod (the hosted service) forces an explicit model and never relies on this.
18
- DEFAULT_MODEL = "gemini-2.5-pro"
11
+ # The package's own engine when no model is named (`roadmodel recommend`, the MCP
12
+ # server, an SDK caller): one of service/app/engines.json's evaluated engines,
13
+ # with the settings docs/engine-eval.json measured it at. The settings apply only
14
+ # to that default; a named model runs with whatever the caller passes.
15
+ # tests/test_engine_eval_mirror.py holds all three to the registry.
16
+ # It must be callable by a NEW key: Google answers 404 NOT_FOUND to a project
17
+ # that never used an older model, so `gemini-2.5-pro` (the default until
18
+ # 0.2.90) and `gemini-3.1-pro` fail there while still working for keys that
19
+ # used them before. Thinking level low and temperature 0 (#176) are how the
20
+ # eval ran it (p50 2.5 s); left unset, the model thought at its default level
21
+ # and a recommendation took about 30 s.
22
+ DEFAULT_MODEL = "gemini-3.8-flash"
23
+ DEFAULT_THINKING_BUDGET: int | None = 0
24
+ DEFAULT_TEMPERATURE: float | None = 0.0
19
25
 
20
26
  # The 2.x generation takes a numeric thinking_budget; from Gemini 3 on, the API
21
27
  # documents discrete thinking LEVELS instead (update/gemini-thinking.json), so a
@@ -79,6 +85,9 @@ def recommend(
79
85
  if missing_sdk is not None:
80
86
  raise missing_sdk
81
87
 
88
+ if model is None:
89
+ thinking_budget = DEFAULT_THINKING_BUDGET if thinking_budget is None else thinking_budget
90
+ temperature = DEFAULT_TEMPERATURE if temperature is None else temperature
82
91
  try:
83
92
  client = genai.Client(
84
93
  api_key=api_key,
@@ -8,7 +8,15 @@ from roadmodel import usage
8
8
  from roadmodel.errors import ProviderCallError
9
9
  from roadmodel.providers._safety import hosted_timeout, private_transport, safe_error
10
10
 
11
- DEFAULT_MODEL = "gpt-5.4"
11
+ # The package's own engine when no model is named (`roadmodel recommend`, the MCP
12
+ # server, an SDK caller): one of service/app/engines.json's evaluated engines,
13
+ # with the settings docs/engine-eval.json measured it at. The settings apply only
14
+ # to that default; a named model runs with whatever the caller passes.
15
+ # tests/test_engine_eval_mirror.py holds all three to the registry.
16
+ # gpt-5.4 until 0.2.91.
17
+ DEFAULT_MODEL = "gpt-6-luna"
18
+ DEFAULT_THINKING_BUDGET: int | None = 0
19
+ DEFAULT_TEMPERATURE: float | None = None
12
20
 
13
21
 
14
22
  # The reasoning generations: gpt-5 and everything after it (gpt-6, gpt-6.1,
@@ -74,6 +82,9 @@ def recommend(
74
82
  # 32s, empty output). The recommender is a structured-classification task
75
83
  # where the pick is easy (T1), so a low effort is fast + cheap + sufficient;
76
84
  # 0 -> minimal for the highest-volume anon path.
85
+ if model is None:
86
+ thinking_budget = DEFAULT_THINKING_BUDGET if thinking_budget is None else thinking_budget
87
+ temperature = DEFAULT_TEMPERATURE if temperature is None else temperature
77
88
  _ = temperature
78
89
  missing_sdk: ProviderCallError | None = None
79
90
  try:
@@ -2319,6 +2319,20 @@ def _thinking_cell(c: Candidate, catalog: dict[str, Any]) -> str:
2319
2319
  return "—" if model.get("always_thinks") else "On"
2320
2320
 
2321
2321
 
2322
+ def ladder_aa_index(bench: dict[str, Any], model_id: str, level: str) -> float | None:
2323
+ """The AA Intelligence Index of ``model_id`` run at ``level``: AA's row at
2324
+ that effort, or the headline row when AA names no level for the model (it
2325
+ then stands for the model at whatever effort it runs). None when AA has
2326
+ measured the model at other efforts only, or not at all."""
2327
+ if measured_levels(bench, model_id):
2328
+ return _evidence(bench, model_id, FRONTIER_INDEX, normalize_level(level))
2329
+ return _evidence(bench, model_id, FRONTIER_INDEX)
2330
+
2331
+
2332
+ def _aa_cell(value: float | None) -> str:
2333
+ return "not measured" if value is None else f"{value:g}"
2334
+
2335
+
2322
2336
  def _deepest_level(c: Candidate, catalog: dict[str, Any]) -> str:
2323
2337
  """The top rung of ``c``'s dial a roadmap may pin (``max``)."""
2324
2338
  levels = native_levels(c.platform_id, c.model_id, catalog=catalog) or list(EFFORT_LADDER)
@@ -2342,15 +2356,18 @@ def settings_ladder(
2342
2356
  so the table outlives today's pool states: the step's runner applies
2343
2357
  :data:`RUN_RULE` to the pools on the day instead of the roadmap being
2344
2358
  refreshed. ``phase`` is a phase-roadmap session: it runs Quality, at
2345
- the deepest rung its dial allows. Returns the columns and the Markdown
2346
- table; None when no pool model carries an AA Index."""
2359
+ the deepest rung its dial allows. Each column carries its model's AA
2360
+ Intelligence Index at the column's effort (:func:`ladder_aa_index`).
2361
+ Returns the columns and the Markdown table; None when no pool model
2362
+ carries an AA Index."""
2347
2363
  cat = catalog if catalog is not None else _cost._load_catalog()
2364
+ bench = benchmarks if benchmarks is not None else _load_benchmarks()
2348
2365
  lad = ladder(
2349
2366
  task,
2350
2367
  user_context_text,
2351
2368
  unavailable_models=unavailable_models,
2352
2369
  catalog=cat,
2353
- benchmarks=benchmarks,
2370
+ benchmarks=bench,
2354
2371
  neutral_pools=True,
2355
2372
  )
2356
2373
  if lad is None:
@@ -2369,6 +2386,7 @@ def settings_ladder(
2369
2386
  "platform": c.platform_name,
2370
2387
  "effort": normalize_level(level),
2371
2388
  "effort_cell": _effort_cell(c, level),
2389
+ "aa_index": ladder_aa_index(bench, c.model_id, level),
2372
2390
  "thinking_cell": _thinking_cell(c, cat),
2373
2391
  "backup": None if rung.backup is None else backup_cell(rung.backup),
2374
2392
  }
@@ -2378,6 +2396,7 @@ def settings_ladder(
2378
2396
  ("Backup", [columns[t]["backup"] or "None" for t in LADDER_TIERS]),
2379
2397
  ("Platform", [columns[t]["platform"] for t in LADDER_TIERS]),
2380
2398
  ("Effort", [columns[t]["effort_cell"] for t in LADDER_TIERS]),
2399
+ ("AA Index", [_aa_cell(columns[t]["aa_index"]) for t in LADDER_TIERS]),
2381
2400
  ("Thinking", [columns[t]["thinking_cell"] for t in LADDER_TIERS]),
2382
2401
  ("Conversation", ["**New**"] * len(LADDER_TIERS)),
2383
2402
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes