openrunner-sdk 2.38.0__tar.gz → 2.38.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 (221) hide show
  1. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/install_commands.py +151 -10
  4. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/pyproject.toml +1 -1
  5. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/.gitignore +0 -0
  6. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/=6.0 +0 -0
  7. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/=8.1 +0 -0
  8. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/README.md +0 -0
  9. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/CLAUDE.md +0 -0
  10. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/_safepath.py +0 -0
  11. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/_secret_rules.py +0 -0
  12. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/api_client.py +0 -0
  13. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/artifact.py +0 -0
  14. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/autoresearch.py +0 -0
  15. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/buffer.py +0 -0
  16. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/cache.py +0 -0
  17. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/cli.py +0 -0
  18. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/config.py +0 -0
  19. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/cost.py +0 -0
  20. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/dataset.py +0 -0
  21. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/datasets.py +0 -0
  22. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/environment.py +0 -0
  23. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/evaluation.py +0 -0
  24. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/feedback.py +0 -0
  25. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/git_info.py +0 -0
  26. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/__init__.py +0 -0
  27. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/api_integration.py +0 -0
  28. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/cost_guard.py +0 -0
  29. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/gpu_types.py +0 -0
  30. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/price_compare.py +0 -0
  31. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/provider_base.py +0 -0
  32. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/__init__.py +0 -0
  33. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/forge_provider.py +0 -0
  34. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  35. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/modal_provider.py +0 -0
  36. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/ovhcloud.py +0 -0
  37. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/runpod.py +0 -0
  38. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/providers/vastai.py +0 -0
  39. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/runner.py +0 -0
  40. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/gpu/workspace_sync.py +0 -0
  41. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/guardrails.py +0 -0
  42. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/handover.py +0 -0
  43. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/hooks/patent-lab-post-commit +0 -0
  44. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/__init__.py +0 -0
  45. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/accelerate.py +0 -0
  46. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/anthropic_tracer.py +0 -0
  47. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/catboost.py +0 -0
  48. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/diffusers.py +0 -0
  49. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/fastai.py +0 -0
  50. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/forced_alignment.py +0 -0
  51. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/gladia.py +0 -0
  52. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/gymnasium.py +0 -0
  53. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/huggingface.py +0 -0
  54. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/hydra.py +0 -0
  55. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/ignite.py +0 -0
  56. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/jax.py +0 -0
  57. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/keras.py +0 -0
  58. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/langchain.py +0 -0
  59. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/lightgbm.py +0 -0
  60. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/lightning.py +0 -0
  61. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/llamaindex.py +0 -0
  62. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/openai_finetune.py +0 -0
  63. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/openai_tracer.py +0 -0
  64. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/optuna.py +0 -0
  65. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/pytorch.py +0 -0
  66. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/sb3.py +0 -0
  67. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/sklearn.py +0 -0
  68. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/skypilot.py +0 -0
  69. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/tensorflow.py +0 -0
  70. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/trl.py +0 -0
  71. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/tts.py +0 -0
  72. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/ultralytics.py +0 -0
  73. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/voice_agent.py +0 -0
  74. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/whisper.py +0 -0
  75. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/integration/xgboost.py +0 -0
  76. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/launch.py +0 -0
  77. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/machine.py +0 -0
  78. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/mcp_server.py +0 -0
  79. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/media.py +0 -0
  80. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/migrate.py +0 -0
  81. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/model.py +0 -0
  82. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/model_card.py +0 -0
  83. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/offline.py +0 -0
  84. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/patent_scan.py +0 -0
  85. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/pii.py +0 -0
  86. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/plot.py +0 -0
  87. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/projects.py +0 -0
  88. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/prompt.py +0 -0
  89. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/query_api.py +0 -0
  90. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/redact.py +0 -0
  91. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/reload.py +0 -0
  92. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/research.py +0 -0
  93. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/research_policy.py +0 -0
  94. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/run.py +0 -0
  95. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/scorers.py +0 -0
  96. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/sender.py +0 -0
  97. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/session.py +0 -0
  98. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/settings.py +0 -0
  99. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/summary.py +0 -0
  100. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/sweep.py +0 -0
  101. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/sync.py +0 -0
  102. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/system_metrics.py +0 -0
  103. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/tensorboard.py +0 -0
  104. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/tools/__init__.py +0 -0
  105. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/tools/patent_report.py +0 -0
  106. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/trace.py +0 -0
  107. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/transcript_formatter.py +0 -0
  108. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/wal.py +0 -0
  109. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/wandb_compat/__init__.py +0 -0
  110. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/wandb_compat/_shim.py +0 -0
  111. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/openrunner/wer.py +0 -0
  112. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/scripts/gen_betterleaks_rules.py +0 -0
  113. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/__init__.py +0 -0
  114. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/conftest.py +0 -0
  115. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  116. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  117. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  118. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  119. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  120. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  121. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  122. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  123. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  124. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  125. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  126. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  127. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/integration/__init__.py +0 -0
  128. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/integration/conftest.py +0 -0
  129. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/integration/test_artifact_round_trip.py +0 -0
  130. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_alert.py +0 -0
  131. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_aliases.py +0 -0
  132. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_api_client.py +0 -0
  133. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_api_client_methods.py +0 -0
  134. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_api_client_transport.py +0 -0
  135. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_artifact.py +0 -0
  136. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_buffer.py +0 -0
  137. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cache.py +0 -0
  138. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_class_scorers.py +0 -0
  139. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli.py +0 -0
  140. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli_artifact_sweep.py +0 -0
  141. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli_datasets.py +0 -0
  142. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli_gpu_registry_deploy.py +0 -0
  143. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli_infra.py +0 -0
  144. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli_remainder.py +0 -0
  145. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_cli_topup.py +0 -0
  146. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_config.py +0 -0
  147. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_datasets_module.py +0 -0
  148. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_evaluation.py +0 -0
  149. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_finish.py +0 -0
  150. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_git_info.py +0 -0
  151. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/__init__.py +0 -0
  152. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/conftest.py +0 -0
  153. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_cost_guard.py +0 -0
  154. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_forge.py +0 -0
  155. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_gpu_cluster.py +0 -0
  156. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_gpu_types.py +0 -0
  157. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_lambda.py +0 -0
  158. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_modal.py +0 -0
  159. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_ovhcloud.py +0 -0
  160. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_price_compare.py +0 -0
  161. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_provider_base.py +0 -0
  162. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_runner.py +0 -0
  163. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_runpod.py +0 -0
  164. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  165. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_vastai.py +0 -0
  166. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu/test_workspace_sync.py +0 -0
  167. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_gpu_modal_creds.py +0 -0
  168. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_init.py +0 -0
  169. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_init_facade.py +0 -0
  170. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_install_commands.py +0 -0
  171. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_fastai.py +0 -0
  172. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_huggingface.py +0 -0
  173. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_keras.py +0 -0
  174. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_langchain.py +0 -0
  175. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_lightning.py +0 -0
  176. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_pytorch.py +0 -0
  177. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_setA.py +0 -0
  178. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_setB.py +0 -0
  179. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_setC.py +0 -0
  180. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_sklearn.py +0 -0
  181. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_integration_xgboost.py +0 -0
  182. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_launch.py +0 -0
  183. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_log.py +0 -0
  184. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_log_code.py +0 -0
  185. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_machine_migrate.py +0 -0
  186. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_mcp_decisions.py +0 -0
  187. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_mcp_monitor.py +0 -0
  188. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_mcp_predictions.py +0 -0
  189. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_mcp_server.py +0 -0
  190. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_media.py +0 -0
  191. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_media_extra.py +0 -0
  192. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_migrate.py +0 -0
  193. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_offline.py +0 -0
  194. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_offline_sync.py +0 -0
  195. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_patent_scan.py +0 -0
  196. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_pii.py +0 -0
  197. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_plot.py +0 -0
  198. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_plot_media_extra2.py +0 -0
  199. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_prompt_module.py +0 -0
  200. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_pure_modules.py +0 -0
  201. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_query_api.py +0 -0
  202. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_redact.py +0 -0
  203. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_reload_module.py +0 -0
  204. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_research_module.py +0 -0
  205. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_resume.py +0 -0
  206. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_run_module.py +0 -0
  207. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sdk_cluster_j1.py +0 -0
  208. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sdk_cluster_j2.py +0 -0
  209. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sdk_cluster_j3.py +0 -0
  210. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sdk_cluster_j4.py +0 -0
  211. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sdk_core_edges.py +0 -0
  212. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sdk_features.py +0 -0
  213. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sender.py +0 -0
  214. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_session_module.py +0 -0
  215. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_session_sync.py +0 -0
  216. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_summary.py +0 -0
  217. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_sweep.py +0 -0
  218. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_system_metrics.py +0 -0
  219. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_topup_hi.py +0 -0
  220. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_trace.py +0 -0
  221. {openrunner_sdk-2.38.0 → openrunner_sdk-2.38.2}/tests/test_wandb_compat.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openrunner-sdk
3
- Version: 2.38.0
3
+ Version: 2.38.2
4
4
  Summary: OpenRunner SDK - W&B-compatible ML experiment tracking client
5
5
  Project-URL: Homepage, https://github.com/jqueguiner/openrunner
6
6
  Project-URL: Repository, https://github.com/jqueguiner/openrunner
@@ -181,7 +181,7 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
181
181
  # openrunner.trace.patch_openai() syntax
182
182
  trace.patch_openai = _patch_openai # type: ignore[attr-defined]
183
183
 
184
- __version__ = "2.38.0"
184
+ __version__ = "2.38.2"
185
185
 
186
186
  logger = logging.getLogger("openrunner")
187
187
 
@@ -2017,6 +2017,14 @@ allowed-tools:
2017
2017
 
2018
2018
  Create a dataset on OpenRunner following the standard pattern (e.g. `paralinguistics-speech-labels-*`): a **managed** dataset bound to a storage connection, with `modality`, `format`, `tasks`, `languages`, `license_use`, a **structured card**, and optionally its files uploaded + linked to a run for lineage.
2019
2019
 
2020
+ !!! danger "Media datasets MUST be preview-playable — never a bare tar + a separate labels file"
2021
+ Every **Audio / Video / Image** dataset has to end up **browsable and playable in the UI**: each clip visible and playable **next to its label** (transcript, caption…). The UI never joins a side manifest — the label must live IN the rows the UI reads. There are exactly two correct layouts:
2022
+
2023
+ - **Sharded** (default, 1k+ clips): media in `shards/*.tar` + a top-level **`index.jsonl`** with one row per clip carrying `key, shard, offset, size, content_type` **and** the label columns (`text`, `dur`, …); then set `metadata.sharded=true` + `shard_index` and run `index_dataset(text_columns=[...])`. The UI plays each clip via a Range GET on the shard using `key/shard/offset`.
2024
+ - **Non-sharded** (small): individual clip files + a root **`dataset.jsonl`** whose `audio` column is the repo-relative object path, **plus** the label columns on the same row.
2025
+
2026
+ **Anti-pattern that produces NO preview and NO playback (do not do this):** uploading a bare `audio.tar` (or a folder of clips) alongside a SEPARATE `labels.jsonl`. The UI joins nothing → an empty, unplayable dataset. If you already did it, use the *repair* path in Step 5 (build `index.jsonl` with offsets + label columns, or `reconcile_shards`) — you do not need to re-upload the media.
2027
+
2020
2028
  `$ARGUMENTS`: `[org/name] [--connection NAME] [--upload DIR] [--link-run RUN_ID]` (ask for what's missing).
2021
2029
 
2022
2030
  ## Process
@@ -2323,7 +2331,7 @@ cat "$CACHE" 2>/dev/null
2323
2331
 
2324
2332
  LAUNCH_GPU_CMD = """---
2325
2333
  name: {prefix}launch-gpu
2326
- description: Provision a remote cloud GPU (RunPod, Vast.ai, Lambda) and run a training job on it end-to-end -- governed compute, auto cost tracking, auto-terminate
2334
+ description: Provision a remote cloud GPU (RunPod, Vast.ai, Lambda, OVH) or run on a serverless fleet (Modal, Forge via `--provider forge <script>`) and run a training job end-to-end -- governed compute, auto cost tracking, auto-terminate. "on forge"/"on modal" = a provider, not an ssh host.
2327
2335
  argument-hint: "[provider] [gpu] -- <training command>"
2328
2336
  allowed-tools:
2329
2337
  - Bash
@@ -3078,7 +3086,7 @@ Surface a clear message on 403 (needs admin) or 404 (already gone).
3078
3086
 
3079
3087
  TRAIN_CMD = """---
3080
3088
  name: {prefix}train
3081
- description: Train on the right infra from a plain-English request -- lists ALL available compute (registered self-hosted workers + cloud provider offers RunPod/Vast/Lambda), interprets your NL intent ("cheapest A100", "my 4090 box", "runpod H100 x2") to pick the target, confirms, then launches the training governed (server-side key, auto cost + terminate)
3089
+ description: Train on the right infra from a plain-English request -- lists ALL available compute (registered self-hosted workers + cloud provider offers RunPod/Vast/Lambda/OVH + serverless Modal/Forge), interprets your NL intent ("cheapest A100", "my 4090 box", "runpod H100 x2", "on forge") to pick the target, confirms, then launches the training governed (server-side key, auto cost + terminate)
3082
3090
  argument-hint: "[natural-language infra + training request]"
3083
3091
  allowed-tools:
3084
3092
  - Bash
@@ -3104,9 +3112,14 @@ Gather the real options (don't hardcode):
3104
3112
 
3105
3113
  ## Step 2 -- interpret the NL request (map intent -> concrete target)
3106
3114
  From the user's phrasing, resolve a single target + shape:
3115
+ - **A bare/unknown target name is a PROVIDER, not an ssh host.** If the user says
3116
+ "on forge", "launch on modal", "use runpod", match it against the provider set
3117
+ (runpod, vastai, lambda, ovhcloud, modal, forge) + `openrunner gpu credentials
3118
+ ls` FIRST. Don't conclude the target "doesn't exist" just because it's not in
3119
+ `~/.ssh/config` or `hosts ls` -- serverless providers have no host at all.
3107
3120
  - **Named worker** ("my 4090 box", "the a100 rig") -> match a registered host by
3108
3121
  name / GPU.
3109
- - **Provider** ("on runpod", "vast") -> that provider's offers.
3122
+ - **Provider** ("on runpod", "vast", "on forge/modal") -> that provider's offers.
3110
3123
  - **GPU class** ("an A100 80G", "H100 x2") -> gpu type + count.
3111
3124
  - **Constraints**: "cheapest" -> min $/hr that fits; "fits <model>" -> enough VRAM
3112
3125
  (read the model card's measured peak VRAM if a model is named; label estimates);
@@ -3132,11 +3145,17 @@ Two ways to run, by target. **Choose based on SSH reachability** (see Step 4b):
3132
3145
  - **B. Registered self-hosted HOST (real SSH)**: a `hosts`-registered box with
3133
3146
  direct SSH (e.g. a bare-metal box you control) -- run over SSH
3134
3147
  `ssh USER@HOST -p PORT "<docker run / train cmd>"`.
3135
- - **C. Cloud provider (RunPod, ...)**:
3148
+ - **C. Cloud pod provider (RunPod, Vast.ai, Lambda, OVH)**:
3136
3149
  `openrunner gpu run --provider P --gpu GPU [--gpu-count N] --project ORG/NAME
3137
3150
  [-e KEY=VAL ...] "<train command>"`. Governed (key server-side, cost-tracked,
3138
3151
  auto-terminate). Deliver code/data inside the command (git clone / artifact
3139
3152
  fetch) -- it runs a command, doesn't sync the cwd.
3153
+ - **D. Serverless fleet (Modal, Forge)** -- no pod, no SSH, no runner to find:
3154
+ `openrunner gpu run --provider forge <app_script.py>`. COMMAND is the App
3155
+ SCRIPT (not a shell command); the GPU is declared inside it
3156
+ (`@app.function(gpu=...)`), so `--gpu` is omitted; the Run auto-terminates when
3157
+ the function returns. Use this whenever the target is `forge`/`modal` -- do NOT
3158
+ fall back to searching for an SSH host or registered runner.
3140
3159
  - Forward `OPENRUNNER_API_KEY` (+ project) into the job env so training logs back.
3141
3160
 
3142
3161
  ## Step 4b -- SSH not coming up? (RunPod SECURE pods)
@@ -3175,6 +3194,112 @@ directly SSH-reachable** (`publicIp:22`): SSH is only via the **proxy**
3175
3194
  """
3176
3195
 
3177
3196
 
3197
+ FORGE_CMD = """---
3198
+ name: {prefix}forge
3199
+ description: Run or write a Python function on the Forge (Shadow-PaaS) serverless GPU fleet. Use for "run/launch/train on forge", "forge GPU", or writing an @app.function. Forge is a serverless PROVIDER (like Modal) -- NOT an ssh host or runner, so don't hunt ~/.ssh/config or `hosts ls`.
3200
+ argument-hint: "[run <script.py> | new <name> | explain]"
3201
+ allowed-tools:
3202
+ - Bash
3203
+ - Read
3204
+ - Write
3205
+ ---
3206
+
3207
+ Forge (shadow-paas.com) is a **serverless GPU fleet** -- like Modal. You deploy an
3208
+ **App** exposing **@app.function**s; each call is a **Run** on a GPU container that
3209
+ auto-terminates. It is NOT an ssh box or a registered runner.
3210
+
3211
+ ## Run an App
3212
+ - Governed (token stored server-side, cost-tracked): store once with
3213
+ `openrunner gpu credentials add --provider forge --api-key fg_..`, then
3214
+ `openrunner gpu run --provider forge <script.py>` -- COMMAND is the App SCRIPT
3215
+ (the GPU is declared inside it, so no `--gpu`); the Run auto-terminates.
3216
+ - Native client: `forge run <script.py>` (needs the `forge-shadow` client on a
3217
+ Python 3.13 interpreter + `FORGE_TOKEN`; install:
3218
+ `pip install forge-shadow --extra-index-url https://forge.shadow-paas.com/sdk/`).
3219
+
3220
+ ## How the function runs (mental model)
3221
+ `forge run script.py` runs `@app.local_entrypoint()` on YOUR machine; each
3222
+ `fn.remote(args)` is the boundary -- Forge cloudpickles the function + args into a
3223
+ fresh GPU container (the App's image), runs it ON the fleet, streams stdout back,
3224
+ and cloudpickles the RETURN value back. The container is torn down when the
3225
+ function returns. Therefore:
3226
+ - args + return value cross a **pickle boundary** -> keep them small & picklable;
3227
+ download a dataset/checkpoint INSIDE the function (from a URI), don't pass it as
3228
+ an arg, and return a metrics dict / an uploaded URL, not a multi-GB tensor.
3229
+ - heavy **imports + file reads go INSIDE** the function (they resolve in the
3230
+ container, not your laptop).
3231
+ - the **GPU is set per function** via `gpu=` on the decorator.
3232
+ - local Python must be **3.13** to match the image or every run errors
3233
+ `PYTHON_VERSION_MISMATCH`.
3234
+
3235
+ ## Write the App -- training shape
3236
+ ```python
3237
+ import forge
3238
+
3239
+ app = forge.App("lora-finetune", image="forge/torch") # forge/torch = PyTorch+CUDA
3240
+
3241
+
3242
+ @app.function(gpu="A100-80GB")
3243
+ def train(cfg: dict) -> dict:
3244
+ import torch # import INSIDE the function
3245
+ from urllib.request import urlretrieve
3246
+
3247
+ urlretrieve(cfg["data_url"], "/tmp/train.pt") # fetch data IN-container
3248
+ data = torch.load("/tmp/train.pt", map_location="cuda")
3249
+ # ... build model, run your training loop, print progress (streams live) ...
3250
+ return {{"final_loss": 0.1234, "steps": cfg["steps"]}} # small, picklable
3251
+
3252
+
3253
+ @app.local_entrypoint()
3254
+ def main():
3255
+ cfg = {{"data_url": "https://.../train.pt", "lr": 3e-4, "steps": 500}}
3256
+ print(train.remote(cfg)) # runs on the fleet A100
3257
+ ```
3258
+
3259
+ Run it: `forge run train.py` (or `openrunner gpu run --provider forge train.py`).
3260
+ To log to OpenRunner FROM the fleet, put the api key + project in `cfg` and call
3261
+ `openrunner.init(...)` / `openrunner.log(...)` INSIDE `train` -- your local env
3262
+ vars do NOT cross the `.remote()` boundary.
3263
+
3264
+ ## Serve an inference API (a DEPLOYMENT, not a one-shot Run)
3265
+ `@app.web_endpoint` / `@app.asgi_app` turn a function into an **autoscaled HTTP
3266
+ endpoint**. Ship it with `forge deploy api.py` (versioned, long-lived; `forge app`
3267
+ manages it) -- NOT `forge run` (that's for a one-shot entrypoint).
3268
+ ```python
3269
+ import forge
3270
+
3271
+ app = forge.App("whisper-api", image="forge/torch")
3272
+
3273
+
3274
+ @app.function(gpu="A100-80GB")
3275
+ @app.asgi_app(public=True, min_replicas=1, max_replicas=4) # 1 warm, burst to 4
3276
+ def api():
3277
+ from fastapi import FastAPI, UploadFile # imports resolve IN-container
3278
+ import whisperx
3279
+
3280
+ web = FastAPI()
3281
+ model = whisperx.load_model("large-v3", device="cuda") # loaded once PER replica
3282
+
3283
+ @web.post("/transcribe")
3284
+ async def transcribe(file: UploadFile):
3285
+ audio = decode(await file.read()) # your decode
3286
+ return {{"text": model.transcribe(audio)["text"]}}
3287
+
3288
+ return web # asgi_app returns the ASGI app
3289
+ ```
3290
+ Deploy: `forge deploy api.py` -> prints the public URL + autoscale bounds. Notes:
3291
+ - the model is loaded **once per replica** (module/handler scope), not per request;
3292
+ - `min_replicas>=1` avoids cold starts; it scales to `max_replicas` under load;
3293
+ - `public=True` exposes it without auth (omit for a workspace-scoped endpoint);
3294
+ - for a single handler instead of a whole app, use
3295
+ `@app.web_endpoint(path="/predict", methods=["POST"])` on the function directly.
3296
+
3297
+ Gotchas: run `forge run` from a CLEAN directory (it snapshots the cwd -- a managed
3298
+ repo with unreadable files aborts with `PermissionError [Errno 13]`); the first run
3299
+ pulls the GPU image (~a minute), then it's fast.
3300
+ """
3301
+
3302
+
3178
3303
  DEPLOY_CMD = """---
3179
3304
  name: {prefix}deploy
3180
3305
  description: Interactively deploy a project's model image on serverless GPUs -- reads the model card's measured results to RECOMMEND a GPU (VRAM headroom) + platform (price/availability), asks you to confirm platform + GPU, sets replica bounds/autoscale, creates the deployment and watches it roll out
@@ -3387,6 +3512,7 @@ def install_claude_code() -> list[str]:
3387
3512
  "unregister-machine.md": UNREGISTER_MACHINE_CMD,
3388
3513
  "train.md": TRAIN_CMD,
3389
3514
  "deploy.md": DEPLOY_CMD,
3515
+ "forge.md": FORGE_CMD,
3390
3516
  }
3391
3517
 
3392
3518
  files = []
@@ -3450,14 +3576,28 @@ or annotation rules:
3450
3576
  - Run `/openrunner:gt-recommendations [run_id]` for a structured rule report.
3451
3577
 
3452
3578
  When the user asks to start / run / launch a TRAINING on a remote or cloud GPU
3453
- (RunPod, Vast.ai, Lambda), or mentions a "distant GPU":
3579
+ (RunPod, Vast.ai, Lambda, OVH; serverless: Modal, Forge), names a provider, or
3580
+ mentions a "distant GPU":
3581
+ - FIRST: a bare target name the user gives ("on forge", "launch on modal",
3582
+ "runpod H100") is almost always a GPU **provider**, NOT an ssh host. Do NOT
3583
+ conclude it "doesn't exist" after checking ~/.ssh/config or `hosts ls` --
3584
+ check `openrunner gpu credentials ls` and the provider registry
3585
+ (runpod, vastai, lambda, ovhcloud, modal, forge) and use `--provider <name>`.
3454
3586
  - Run `/openrunner:launch-gpu` for the full guided flow (auth -> provider key ->
3455
3587
  pick GPU/image -> launch -> monitor -> terminate).
3456
- - The one-shot is `openrunner gpu run --provider runpod --gpu A100_80GB
3457
- --project ORG/PROJECT "<train cmd>"`: provisions a pod server-side, streams
3458
- logs, auto-terminates. Provider keys are stored encrypted with
3459
- `openrunner gpu credentials add`; list/kill with `openrunner gpu ls` /
3460
- `openrunner gpu terminate`. Governed compute -- the key never leaves the API.
3588
+ - Pod providers (RunPod/Vast/Lambda/OVH): the one-shot is
3589
+ `openrunner gpu run --provider runpod --gpu A100_80GB --project ORG/PROJECT
3590
+ "<train cmd>"` -- provisions a pod server-side, streams logs, auto-terminates.
3591
+ - Serverless fleets (**Modal, Forge**): no pod / no SSH -- they run a function on
3592
+ demand. Forge:
3593
+ `openrunner gpu run --provider forge <app_script.py>` -- COMMAND is the App
3594
+ SCRIPT (GPU is declared in `@app.function(gpu=...)`, so no `--gpu`), the Run
3595
+ auto-terminates when the function returns. Don't hunt for an SSH host/runner.
3596
+ For native Forge use, the `forge-deploy` skill covers install/auth/write/run.
3597
+ - Provider keys are stored encrypted with `openrunner gpu credentials add`
3598
+ (e.g. `--provider forge --api-key fg_..`); list/kill pods with
3599
+ `openrunner gpu ls` / `openrunner gpu terminate`. Governed compute -- the key
3600
+ never leaves the API.
3461
3601
  """
3462
3602
  import re
3463
3603
  if claude_md.exists():
@@ -3598,6 +3738,7 @@ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") ->
3598
3738
  "unregister-machine.md": UNREGISTER_MACHINE_CMD,
3599
3739
  "train.md": TRAIN_CMD,
3600
3740
  "deploy.md": DEPLOY_CMD,
3741
+ "forge.md": FORGE_CMD,
3601
3742
  }
3602
3743
 
3603
3744
  files = []
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.38.0"
3
+ version = "2.38.2"
4
4
  description = "OpenRunner SDK - W&B-compatible ML experiment tracking client"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
File without changes
File without changes