freesolo-flash 0.2.1__tar.gz → 0.2.2__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 (151) hide show
  1. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/PKG-INFO +1 -1
  2. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/__init__.py +1 -1
  3. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/pricing.py +11 -2
  4. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/pyproject.toml +1 -1
  5. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.dockerignore +0 -0
  6. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.env.example +0 -0
  7. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.github/workflows/ci.yml +0 -0
  8. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.github/workflows/main-source-guard.yml +0 -0
  9. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.github/workflows/publish-image.yml +0 -0
  10. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.github/workflows/publish.yml +0 -0
  11. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.github/workflows/worker-image.yml +0 -0
  12. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/.gitignore +0 -0
  13. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/Dockerfile +0 -0
  14. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/Dockerfile.worker +0 -0
  15. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/LICENSE +0 -0
  16. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/README.md +0 -0
  17. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/docker/make_rp_handler.py +0 -0
  18. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/_fileio.py +0 -0
  19. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/_logging.py +0 -0
  20. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/catalog.py +0 -0
  21. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/cli/__init__.py +0 -0
  22. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/cli/main/__init__.py +0 -0
  23. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/cli/main/__main__.py +0 -0
  24. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/cli/main/commands.py +0 -0
  25. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/cli/main/envpush.py +0 -0
  26. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/client/__init__.py +0 -0
  27. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/client/config.py +0 -0
  28. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/client/http.py +0 -0
  29. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/client/specs.py +0 -0
  30. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/__init__.py +0 -0
  31. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/accounting.py +0 -0
  32. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/chalk_kernels.py +0 -0
  33. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/multiturn_rollout.py +0 -0
  34. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/recipe.py +0 -0
  35. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/vram.py +0 -0
  36. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/worker/__init__.py +0 -0
  37. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/worker/__main__.py +0 -0
  38. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/worker/lora.py +0 -0
  39. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/engine/worker/perf.py +0 -0
  40. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/envs/__init__.py +0 -0
  41. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/envs/adapter/__init__.py +0 -0
  42. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/envs/adapter/rubric.py +0 -0
  43. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/envs/base.py +0 -0
  44. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/envs/registry.py +0 -0
  45. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/mcp/__init__.py +0 -0
  46. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/mcp/server.py +0 -0
  47. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/__init__.py +0 -0
  48. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/_auth.py +0 -0
  49. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/_http.py +0 -0
  50. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/_poll.py +0 -0
  51. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/allocator.py +0 -0
  52. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/base.py +0 -0
  53. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/preflight.py +0 -0
  54. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/__init__.py +0 -0
  55. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/api.py +0 -0
  56. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/auth.py +0 -0
  57. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/gpus.py +0 -0
  58. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/jobs.py +0 -0
  59. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/preflight.py +0 -0
  60. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/train/__init__.py +0 -0
  61. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/train/deps.py +0 -0
  62. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/runpod/train/endpoints.py +0 -0
  63. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/__init__.py +0 -0
  64. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/_bootstrap.py +0 -0
  65. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/api.py +0 -0
  66. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/auth.py +0 -0
  67. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/gpus.py +0 -0
  68. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/jobs/__init__.py +0 -0
  69. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/jobs/builders.py +0 -0
  70. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/preflight.py +0 -0
  71. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/pricing.py +0 -0
  72. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/providers/vast/train.py +0 -0
  73. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/py.typed +0 -0
  74. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/runner/__init__.py +0 -0
  75. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/runner/deploy.py +0 -0
  76. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/runner/lifecycle.py +0 -0
  77. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/schema/__init__.py +0 -0
  78. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/schema/fields.py +0 -0
  79. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/serve/__init__.py +0 -0
  80. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/serve/deploy.py +0 -0
  81. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/server/__init__.py +0 -0
  82. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/server/__main__.py +0 -0
  83. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/server/app.py +0 -0
  84. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/server/auth.py +0 -0
  85. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/server/db.py +0 -0
  86. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/server/envs.py +0 -0
  87. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/flash/spec.py +0 -0
  88. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/__init__.py +0 -0
  89. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/_helpers/__init__.py +0 -0
  90. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/_helpers/runner.py +0 -0
  91. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/_helpers/specs.py +0 -0
  92. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/_helpers/vast.py +0 -0
  93. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/conftest.py +0 -0
  94. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/fixtures/math_eval.jsonl +0 -0
  95. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/fixtures/math_train.jsonl +0 -0
  96. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/live/__init__.py +0 -0
  97. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/live/conftest.py +0 -0
  98. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/live/test_runpod_live.py +0 -0
  99. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/live/test_vast_live.py +0 -0
  100. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_agent_slm_cli_contract.py +0 -0
  101. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_algorithms.py +0 -0
  102. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_allocator.py +0 -0
  103. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_backend_jobspec_contract.py +0 -0
  104. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_cancel_remote.py +0 -0
  105. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_catalog_consistency.py +0 -0
  106. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_chalk_kernels.py +0 -0
  107. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_cli_commands.py +0 -0
  108. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_cli_errors.py +0 -0
  109. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_cli_managed.py +0 -0
  110. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_client.py +0 -0
  111. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_client_server_integration.py +0 -0
  112. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_config_overrides.py +0 -0
  113. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_disk_gb.py +0 -0
  114. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_endpoint_name.py +0 -0
  115. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_env_install.py +0 -0
  116. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_env_publish.py +0 -0
  117. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_env_push.py +0 -0
  118. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_envs_coverage.py +0 -0
  119. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_flash_mvp.py +0 -0
  120. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_flash_worker.py +0 -0
  121. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_gpus.py +0 -0
  122. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_grpo_params.py +0 -0
  123. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_jobs.py +0 -0
  124. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_logging.py +0 -0
  125. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_login_perms.py +0 -0
  126. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_metrics_schema_agent_contract.py +0 -0
  127. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_multiturn_rollout.py +0 -0
  128. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_open_model_policy.py +0 -0
  129. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_orchestrator_flash.py +0 -0
  130. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_preflight.py +0 -0
  131. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_pricing_cache.py +0 -0
  132. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_provider_routing.py +0 -0
  133. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_providers_symmetry.py +0 -0
  134. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_runmgmt.py +0 -0
  135. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_runpod_api_delete.py +0 -0
  136. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_serve.py +0 -0
  137. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_serve_modes.py +0 -0
  138. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_server_api.py +0 -0
  139. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_spec_and_validation.py +0 -0
  140. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_thinking_config.py +0 -0
  141. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_vast_api.py +0 -0
  142. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_vast_offers.py +0 -0
  143. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_vast_runner.py +0 -0
  144. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_verifiers.py +0 -0
  145. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_version.py +0 -0
  146. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_wandb_naming.py +0 -0
  147. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_worker_dryrun.py +0 -0
  148. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_worker_hardexit.py +0 -0
  149. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_worker_stack.py +0 -0
  150. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/tests/test_worker_thinking.py +0 -0
  151. {freesolo_flash-0.2.1 → freesolo_flash-0.2.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freesolo-flash
3
- Version: 0.2.1
3
+ Version: 0.2.2
4
4
  Summary: Flash — managed LoRA post-training (SFT/GRPO) for verifiers environments, driven by the `flash` CLI
5
5
  Project-URL: Homepage, https://github.com/freesolo-co/flash
6
6
  Project-URL: Repository, https://github.com/freesolo-co/flash
@@ -8,4 +8,4 @@ GPU (RunPod or Vast.ai) behind the scenes.
8
8
 
9
9
  __all__ = ["__version__"]
10
10
 
11
- __version__ = "0.2.1"
11
+ __version__ = "0.2.2"
@@ -24,7 +24,7 @@ logger = get_logger(__name__)
24
24
 
25
25
  CACHE_TTL_S = 6 * 3600.0 # 6h price cache
26
26
  _CACHE_PATH = Path.home() / ".flash" / "gpu_rates.json"
27
- _MEM: dict = {"ts": 0.0, "rates": {}}
27
+ _MEM: dict = {"ts": 0.0, "rates": {}, "failed_ts": 0.0, "warned": False}
28
28
 
29
29
 
30
30
  def _static_rates() -> dict[str, float]:
@@ -76,6 +76,12 @@ def live_rates(refresh: bool = False) -> dict[str, float]:
76
76
  if not refresh:
77
77
  if _MEM["rates"] and now - _MEM["ts"] < CACHE_TTL_S:
78
78
  return {**static, **_MEM["rates"]}
79
+ # A recent live fetch FAILED (e.g. the client has no `runpod` module, no network, or no
80
+ # RunPod key — none of which change mid-process). The static rates are correct, so don't
81
+ # re-attempt (and re-warn) on every lookup; without this a single `flash gpus`/`train`
82
+ # logs the warning once per GPU class. Retry only after the cache TTL.
83
+ if _MEM["failed_ts"] and now - _MEM["failed_ts"] < CACHE_TTL_S:
84
+ return static
79
85
  try:
80
86
  disk = json.loads(_CACHE_PATH.read_text())
81
87
  if now - float(disk.get("ts", 0)) < CACHE_TTL_S and disk.get("rates"):
@@ -87,7 +93,10 @@ def live_rates(refresh: bool = False) -> dict[str, float]:
87
93
  try:
88
94
  fetched = _fetch_live_rates()
89
95
  except Exception as exc:
90
- logger.warning("live GPU pricing unavailable (%s); using static rates", exc)
96
+ _MEM["failed_ts"] = now # remember the failure so we don't refetch/rewarn every call
97
+ if not _MEM["warned"]: # warn once per process, not once per GPU class
98
+ logger.warning("live GPU pricing unavailable (%s); using static rates", exc)
99
+ _MEM["warned"] = True
91
100
  fetched = {}
92
101
  if fetched:
93
102
  _MEM.update(ts=now, rates=fetched)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash"
3
- version = "0.2.1"
3
+ version = "0.2.2"
4
4
  description = "Flash — managed LoRA post-training (SFT/GRPO) for verifiers environments, driven by the `flash` CLI"
5
5
  readme = "README.md"
6
6
  # RunPod Flash supports Python 3.10-3.12 (not 3.13 yet).
File without changes
File without changes
File without changes