freesolo-flash 0.2.0__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.0 → freesolo_flash-0.2.2}/.env.example +1 -1
  2. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/PKG-INFO +1 -1
  3. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/__init__.py +1 -1
  4. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/cli/main/__init__.py +1 -1
  5. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/client/http.py +1 -1
  6. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/pricing.py +11 -2
  7. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/server/auth.py +1 -1
  8. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/pyproject.toml +1 -1
  9. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.dockerignore +0 -0
  10. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.github/workflows/ci.yml +0 -0
  11. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.github/workflows/main-source-guard.yml +0 -0
  12. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.github/workflows/publish-image.yml +0 -0
  13. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.github/workflows/publish.yml +0 -0
  14. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.github/workflows/worker-image.yml +0 -0
  15. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/.gitignore +0 -0
  16. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/Dockerfile +0 -0
  17. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/Dockerfile.worker +0 -0
  18. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/LICENSE +0 -0
  19. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/README.md +0 -0
  20. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/docker/make_rp_handler.py +0 -0
  21. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/_fileio.py +0 -0
  22. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/_logging.py +0 -0
  23. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/catalog.py +0 -0
  24. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/cli/__init__.py +0 -0
  25. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/cli/main/__main__.py +0 -0
  26. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/cli/main/commands.py +0 -0
  27. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/cli/main/envpush.py +0 -0
  28. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/client/__init__.py +0 -0
  29. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/client/config.py +0 -0
  30. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/client/specs.py +0 -0
  31. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/__init__.py +0 -0
  32. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/accounting.py +0 -0
  33. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/chalk_kernels.py +0 -0
  34. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/multiturn_rollout.py +0 -0
  35. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/recipe.py +0 -0
  36. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/vram.py +0 -0
  37. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/worker/__init__.py +0 -0
  38. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/worker/__main__.py +0 -0
  39. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/worker/lora.py +0 -0
  40. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/engine/worker/perf.py +0 -0
  41. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/envs/__init__.py +0 -0
  42. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/envs/adapter/__init__.py +0 -0
  43. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/envs/adapter/rubric.py +0 -0
  44. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/envs/base.py +0 -0
  45. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/envs/registry.py +0 -0
  46. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/mcp/__init__.py +0 -0
  47. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/mcp/server.py +0 -0
  48. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/__init__.py +0 -0
  49. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/_auth.py +0 -0
  50. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/_http.py +0 -0
  51. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/_poll.py +0 -0
  52. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/allocator.py +0 -0
  53. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/base.py +0 -0
  54. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/preflight.py +0 -0
  55. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/__init__.py +0 -0
  56. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/api.py +0 -0
  57. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/auth.py +0 -0
  58. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/gpus.py +0 -0
  59. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/jobs.py +0 -0
  60. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/preflight.py +0 -0
  61. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/train/__init__.py +0 -0
  62. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/train/deps.py +0 -0
  63. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/runpod/train/endpoints.py +0 -0
  64. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/__init__.py +0 -0
  65. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/_bootstrap.py +0 -0
  66. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/api.py +0 -0
  67. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/auth.py +0 -0
  68. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/gpus.py +0 -0
  69. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/jobs/__init__.py +0 -0
  70. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/jobs/builders.py +0 -0
  71. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/preflight.py +0 -0
  72. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/pricing.py +0 -0
  73. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/providers/vast/train.py +0 -0
  74. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/py.typed +0 -0
  75. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/runner/__init__.py +0 -0
  76. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/runner/deploy.py +0 -0
  77. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/runner/lifecycle.py +0 -0
  78. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/schema/__init__.py +0 -0
  79. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/schema/fields.py +0 -0
  80. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/serve/__init__.py +0 -0
  81. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/serve/deploy.py +0 -0
  82. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/server/__init__.py +0 -0
  83. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/server/__main__.py +0 -0
  84. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/server/app.py +0 -0
  85. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/server/db.py +0 -0
  86. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/server/envs.py +0 -0
  87. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/flash/spec.py +0 -0
  88. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/__init__.py +0 -0
  89. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/_helpers/__init__.py +0 -0
  90. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/_helpers/runner.py +0 -0
  91. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/_helpers/specs.py +0 -0
  92. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/_helpers/vast.py +0 -0
  93. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/conftest.py +0 -0
  94. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/fixtures/math_eval.jsonl +0 -0
  95. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/fixtures/math_train.jsonl +0 -0
  96. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/live/__init__.py +0 -0
  97. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/live/conftest.py +0 -0
  98. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/live/test_runpod_live.py +0 -0
  99. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/live/test_vast_live.py +0 -0
  100. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_agent_slm_cli_contract.py +0 -0
  101. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_algorithms.py +0 -0
  102. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_allocator.py +0 -0
  103. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_backend_jobspec_contract.py +0 -0
  104. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_cancel_remote.py +0 -0
  105. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_catalog_consistency.py +0 -0
  106. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_chalk_kernels.py +0 -0
  107. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_cli_commands.py +0 -0
  108. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_cli_errors.py +0 -0
  109. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_cli_managed.py +0 -0
  110. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_client.py +0 -0
  111. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_client_server_integration.py +0 -0
  112. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_config_overrides.py +0 -0
  113. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_disk_gb.py +0 -0
  114. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_endpoint_name.py +0 -0
  115. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_env_install.py +0 -0
  116. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_env_publish.py +0 -0
  117. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_env_push.py +0 -0
  118. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_envs_coverage.py +0 -0
  119. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_flash_mvp.py +0 -0
  120. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_flash_worker.py +0 -0
  121. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_gpus.py +0 -0
  122. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_grpo_params.py +0 -0
  123. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_jobs.py +0 -0
  124. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_logging.py +0 -0
  125. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_login_perms.py +0 -0
  126. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_metrics_schema_agent_contract.py +0 -0
  127. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_multiturn_rollout.py +0 -0
  128. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_open_model_policy.py +0 -0
  129. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_orchestrator_flash.py +0 -0
  130. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_preflight.py +0 -0
  131. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_pricing_cache.py +0 -0
  132. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_provider_routing.py +0 -0
  133. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_providers_symmetry.py +0 -0
  134. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_runmgmt.py +0 -0
  135. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_runpod_api_delete.py +0 -0
  136. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_serve.py +0 -0
  137. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_serve_modes.py +0 -0
  138. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_server_api.py +0 -0
  139. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_spec_and_validation.py +0 -0
  140. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_thinking_config.py +0 -0
  141. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_vast_api.py +0 -0
  142. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_vast_offers.py +0 -0
  143. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_vast_runner.py +0 -0
  144. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_verifiers.py +0 -0
  145. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_version.py +0 -0
  146. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_wandb_naming.py +0 -0
  147. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_worker_dryrun.py +0 -0
  148. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_worker_hardexit.py +0 -0
  149. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_worker_stack.py +0 -0
  150. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/tests/test_worker_thinking.py +0 -0
  151. {freesolo_flash-0.2.0 → freesolo_flash-0.2.2}/uv.lock +0 -0
@@ -23,7 +23,7 @@ PRIME_API_KEY=
23
23
  # flash's adapter registration calls to the freesolo serving app (below).
24
24
  FREESOLO_INTERNAL_KEY=
25
25
  # Where to verify user keys. In compose this is the backend on the internal network;
26
- # defaults to https://api.freesolo.co when unset.
26
+ # defaults to https://api-dev.freesolo.co when unset.
27
27
  FREESOLO_BASE_URL=http://backend:8000
28
28
 
29
29
  # --- FreeSolo serving (adapter deploy/chat) ---
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: freesolo-flash
3
- Version: 0.2.0
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.0"
11
+ __version__ = "0.2.2"
@@ -79,7 +79,7 @@ def main(argv: list[str] | None = None) -> int:
79
79
  login.add_argument(
80
80
  "--freesolo-url",
81
81
  dest="freesolo_url",
82
- help="freesolo backend base URL (default: FREESOLO_BASE_URL or https://api.freesolo.co)",
82
+ help="freesolo backend base URL (default: FREESOLO_BASE_URL or https://api-dev.freesolo.co)",
83
83
  )
84
84
  login.add_argument(
85
85
  "--api-url", help="flash control-plane URL for training calls (default: FLASH_API_URL)"
@@ -29,7 +29,7 @@ class ApiError(ClientError):
29
29
  # Login is handled by the freesolo backend (not the flash control plane): `flash login`
30
30
  # verifies the user's freesolo API key here. The same key authenticates the flash
31
31
  # control plane, which accepts freesolo-issued keys.
32
- DEFAULT_FREESOLO_BASE_URL = "https://api.freesolo.co"
32
+ DEFAULT_FREESOLO_BASE_URL = "https://api-dev.freesolo.co"
33
33
  FREESOLO_AUTH_VERIFY_PATH = "/api/auth/verify"
34
34
 
35
35
 
@@ -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)
@@ -25,7 +25,7 @@ INTERNAL_KEY_ENV = "FREESOLO_INTERNAL_KEY"
25
25
  # the bearer to this control plane. Any non-internal token is verified against the freesolo
26
26
  # backend and (on success) resolved to a per-token identity.
27
27
  FREESOLO_BASE_URL_ENV = "FREESOLO_BASE_URL"
28
- DEFAULT_FREESOLO_BASE_URL = "https://api.freesolo.co"
28
+ DEFAULT_FREESOLO_BASE_URL = "https://api-dev.freesolo.co"
29
29
  _VERIFY_TIMEOUT_S = 5.0
30
30
  _VERIFY_CACHE_TTL_S = 300.0 # short TTL so it isn't a backend round-trip per request
31
31
  # Negative verdicts get a much SHORTER TTL than positives. The freesolo verify endpoint
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "freesolo-flash"
3
- version = "0.2.0"
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