roadmodel 0.2.72__tar.gz → 0.2.73__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 (57) hide show
  1. {roadmodel-0.2.72 → roadmodel-0.2.73}/PKG-INFO +1 -1
  2. {roadmodel-0.2.72/roadmodel/data → roadmodel-0.2.73/docs}/catalog.json +1 -1
  3. {roadmodel-0.2.72 → roadmodel-0.2.73}/pyproject.toml +1 -1
  4. {roadmodel-0.2.72/docs → roadmodel-0.2.73/roadmodel/data}/catalog.json +1 -1
  5. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/__init__.py +1 -1
  6. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/recommend.py +8 -2
  7. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/scoring.py +8 -0
  8. {roadmodel-0.2.72 → roadmodel-0.2.73}/.gitignore +0 -0
  9. {roadmodel-0.2.72 → roadmodel-0.2.73}/LICENSE +0 -0
  10. {roadmodel-0.2.72 → roadmodel-0.2.73}/NOTICE +0 -0
  11. {roadmodel-0.2.72 → roadmodel-0.2.73}/README.md +0 -0
  12. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/benchmarks.json +0 -0
  13. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/context-windows.json +0 -0
  14. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/model-selector.txt +0 -0
  15. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/model-tier-cost-scale.md +0 -0
  16. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/settings-display.md +0 -0
  17. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/templates/phase-roadmap-template.md +0 -0
  18. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/templates/planning-kit-how-to-use.md +0 -0
  19. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/templates/project-roadmap-template.md +0 -0
  20. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/templates/prompt-phase-roadmap.md +0 -0
  21. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/templates/prompt-project-roadmap.md +0 -0
  22. {roadmodel-0.2.72 → roadmodel-0.2.73}/docs/user-context.example.md +0 -0
  23. {roadmodel-0.2.72 → roadmodel-0.2.73}/hatch_build.py +0 -0
  24. {roadmodel-0.2.72 → roadmodel-0.2.73}/infra/README.md +0 -0
  25. {roadmodel-0.2.72 → roadmodel-0.2.73}/infra/gcp-killswitch/README.md +0 -0
  26. {roadmodel-0.2.72 → roadmodel-0.2.73}/infra/supabase/README.md +0 -0
  27. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/benchmarks.json +0 -0
  28. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/context-windows.json +0 -0
  29. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/model-selector.txt +0 -0
  30. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/model-tier-cost-scale.md +0 -0
  31. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/phase-roadmap-template.md +0 -0
  32. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/planning-kit-how-to-use.md +0 -0
  33. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/project-roadmap-template.md +0 -0
  34. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/prompt-phase-roadmap.md +0 -0
  35. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/prompt-project-roadmap.md +0 -0
  36. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/settings-display.md +0 -0
  37. {roadmodel-0.2.72 → roadmodel-0.2.73}/roadmodel/data/user-context.example.md +0 -0
  38. {roadmodel-0.2.72 → roadmodel-0.2.73}/scripts/agent_context.py +0 -0
  39. {roadmodel-0.2.72 → roadmodel-0.2.73}/scripts/agent_rules.py +0 -0
  40. {roadmodel-0.2.72 → roadmodel-0.2.73}/scripts/update_projects.py +0 -0
  41. {roadmodel-0.2.72 → roadmodel-0.2.73}/scripts/updater_lock.py +0 -0
  42. {roadmodel-0.2.72 → roadmodel-0.2.73}/scripts/upgrade_fleet.py +0 -0
  43. {roadmodel-0.2.72 → roadmodel-0.2.73}/scripts/worktree_memory.py +0 -0
  44. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/__main__.py +0 -0
  45. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/cli.py +0 -0
  46. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/config.py +0 -0
  47. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/cost.py +0 -0
  48. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/errors.py +0 -0
  49. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/mcp_server.py +0 -0
  50. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/providers/__init__.py +0 -0
  51. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/providers/anthropic.py +0 -0
  52. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/providers/google.py +0 -0
  53. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/providers/openai.py +0 -0
  54. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/providers/openai_compatible.py +0 -0
  55. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/providers/registry.py +0 -0
  56. {roadmodel-0.2.72 → roadmodel-0.2.73}/src/roadmodel/usage.py +0 -0
  57. {roadmodel-0.2.72 → roadmodel-0.2.73}/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.72
3
+ Version: 0.2.73
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "4",
3
3
  "output_contract_version": 2,
4
- "generated_at_utc": "2026-10-07T18:08:11Z",
4
+ "generated_at_utc": "2026-10-07T19:13:30Z",
5
5
  "source_doc_sha256": {
6
6
  "model-selector.txt": "6a75e2265459fa7302cb80d0faf5ec2aad575034fc29866238cd1579c001cc2d",
7
7
  "model-tier-cost-scale.md": "2b3b0eb82237eb5cb5bf468a3fe971bcaf0160ad7d0bc700698d2c16640bc41d"
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "roadmodel"
7
- version = "0.2.72"
7
+ version = "0.2.73"
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"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schema_version": "4",
3
3
  "output_contract_version": 2,
4
- "generated_at_utc": "2026-10-07T18:08:11Z",
4
+ "generated_at_utc": "2026-10-07T19:13:30Z",
5
5
  "source_doc_sha256": {
6
6
  "model-selector.txt": "6a75e2265459fa7302cb80d0faf5ec2aad575034fc29866238cd1579c001cc2d",
7
7
  "model-tier-cost-scale.md": "2b3b0eb82237eb5cb5bf468a3fe971bcaf0160ad7d0bc700698d2c16640bc41d"
@@ -1,2 +1,2 @@
1
1
  # src/roadmodel/__init__.py
2
- __version__ = "0.2.72"
2
+ __version__ = "0.2.73"
@@ -1487,12 +1487,18 @@ def _fit_row_to_input(
1487
1487
  """The row with every model whose context window cannot hold the task's
1488
1488
  material left out (scoring.too_small_for), and what the check found. The
1489
1489
  table is computed before the engine reads the task, so the row is
1490
- recomputed here when a model its frontier draws on is too small; with
1491
- none left that fits, the row stands and ``fits`` says so."""
1490
+ recomputed here when a model its frontier draws on is too small. When the
1491
+ material is larger than every known window, or none left fits, the row
1492
+ stands and ``fits`` says so."""
1492
1493
  small = set(scoring.too_small_for(input_tokens))
1493
1494
  drawn = {p.candidate.model_id for p in [*row.frontier, *row.points]}
1494
1495
  excluded = sorted(small & drawn)
1495
1496
  report: dict[str, Any] = {"input_tokens": input_tokens, "excluded": excluded, "fits": True}
1497
+ if scoring.nothing_fits(input_tokens):
1498
+ # Larger than every known window: no pick holds it, and one whose
1499
+ # window is unknown would stand only by default.
1500
+ report["fits"] = False
1501
+ return row, report
1496
1502
  if not excluded:
1497
1503
  return row, report
1498
1504
  refit = scoring.ladder(
@@ -330,6 +330,14 @@ def context_windows() -> dict[str, int]:
330
330
  return {str(k): v for k, v in models.items() if isinstance(v, int) and v > 0}
331
331
 
332
332
 
333
+ def nothing_fits(input_tokens: int, windows: dict[str, int] | None = None) -> bool:
334
+ """True when no model with a known context window can hold
335
+ ``input_tokens`` of material: the material is larger than any model
336
+ takes, and a model whose window is unknown is no answer."""
337
+ known = windows if windows is not None else context_windows()
338
+ return bool(known) and len(too_small_for(input_tokens, known)) == len(known)
339
+
340
+
333
341
  def too_small_for(input_tokens: int, windows: dict[str, int] | None = None) -> list[str]:
334
342
  """The catalog ids whose context window cannot hold ``input_tokens`` of
335
343
  material with CONTEXT_HEADROOM to spare. A model with no known window is
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes