openrunner-sdk 2.40.0__tar.gz → 2.41.0__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 (224) hide show
  1. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/cli.py +20 -2
  4. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/api_integration.py +24 -0
  5. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/runner.py +36 -0
  6. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/install_commands.py +9 -0
  7. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/pyproject.toml +1 -1
  8. openrunner_sdk-2.41.0/tests/test_gpu/test_ovh_training.py +29 -0
  9. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/.gitignore +0 -0
  10. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/=6.0 +0 -0
  11. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/=8.1 +0 -0
  12. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/README.md +0 -0
  13. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/CLAUDE.md +0 -0
  14. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/_safepath.py +0 -0
  15. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/_secret_rules.py +0 -0
  16. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/api_client.py +0 -0
  17. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/artifact.py +0 -0
  18. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/autoresearch.py +0 -0
  19. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/buffer.py +0 -0
  20. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/cache.py +0 -0
  21. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/config.py +0 -0
  22. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/cost.py +0 -0
  23. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/dataset.py +0 -0
  24. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/datasets.py +0 -0
  25. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/environment.py +0 -0
  26. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/evaluation.py +0 -0
  27. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/feedback.py +0 -0
  28. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/git_info.py +0 -0
  29. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/__init__.py +0 -0
  30. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/cost_guard.py +0 -0
  31. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/gpu_types.py +0 -0
  32. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/price_compare.py +0 -0
  33. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/provider_base.py +0 -0
  34. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/__init__.py +0 -0
  35. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/forge_provider.py +0 -0
  36. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  37. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/modal_provider.py +0 -0
  38. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/ovhcloud.py +0 -0
  39. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/runpod.py +0 -0
  40. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/providers/vastai.py +0 -0
  41. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/gpu/workspace_sync.py +0 -0
  42. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/guardrails.py +0 -0
  43. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/handover.py +0 -0
  44. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/hooks/patent-lab-post-commit +0 -0
  45. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/__init__.py +0 -0
  46. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/accelerate.py +0 -0
  47. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/anthropic_tracer.py +0 -0
  48. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/catboost.py +0 -0
  49. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/diffusers.py +0 -0
  50. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/fastai.py +0 -0
  51. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/forced_alignment.py +0 -0
  52. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/gladia.py +0 -0
  53. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/gymnasium.py +0 -0
  54. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/huggingface.py +0 -0
  55. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/hydra.py +0 -0
  56. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/ignite.py +0 -0
  57. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/jax.py +0 -0
  58. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/keras.py +0 -0
  59. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/langchain.py +0 -0
  60. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/lightgbm.py +0 -0
  61. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/lightning.py +0 -0
  62. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/llamaindex.py +0 -0
  63. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/openai_finetune.py +0 -0
  64. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/openai_tracer.py +0 -0
  65. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/optuna.py +0 -0
  66. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/pytorch.py +0 -0
  67. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/sb3.py +0 -0
  68. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/sklearn.py +0 -0
  69. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/skypilot.py +0 -0
  70. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/tensorflow.py +0 -0
  71. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/trl.py +0 -0
  72. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/tts.py +0 -0
  73. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/ultralytics.py +0 -0
  74. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/voice_agent.py +0 -0
  75. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/whisper.py +0 -0
  76. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/integration/xgboost.py +0 -0
  77. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/launch.py +0 -0
  78. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/machine.py +0 -0
  79. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/mcp_server.py +0 -0
  80. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/media.py +0 -0
  81. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/migrate.py +0 -0
  82. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/model.py +0 -0
  83. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/model_card.py +0 -0
  84. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/offline.py +0 -0
  85. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/patent_scan.py +0 -0
  86. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/pii.py +0 -0
  87. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/plot.py +0 -0
  88. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/projects.py +0 -0
  89. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/prompt.py +0 -0
  90. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/query_api.py +0 -0
  91. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/redact.py +0 -0
  92. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/reload.py +0 -0
  93. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/research.py +0 -0
  94. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/research_policy.py +0 -0
  95. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/run.py +0 -0
  96. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/scorers.py +0 -0
  97. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/sender.py +0 -0
  98. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/session.py +0 -0
  99. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/settings.py +0 -0
  100. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/summary.py +0 -0
  101. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/sweep.py +0 -0
  102. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/sync.py +0 -0
  103. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/system_metrics.py +0 -0
  104. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/tensorboard.py +0 -0
  105. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/tools/__init__.py +0 -0
  106. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/tools/patent_report.py +0 -0
  107. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/trace.py +0 -0
  108. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/transcript_formatter.py +0 -0
  109. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/wal.py +0 -0
  110. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/wandb_compat/__init__.py +0 -0
  111. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/wandb_compat/_shim.py +0 -0
  112. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/openrunner/wer.py +0 -0
  113. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/scripts/gen_betterleaks_rules.py +0 -0
  114. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/__init__.py +0 -0
  115. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/conftest.py +0 -0
  116. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  117. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  118. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  119. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  120. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  121. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  122. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  123. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  124. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  125. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  126. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  127. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  128. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/integration/__init__.py +0 -0
  129. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/integration/conftest.py +0 -0
  130. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/integration/test_artifact_round_trip.py +0 -0
  131. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_alert.py +0 -0
  132. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_aliases.py +0 -0
  133. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_api_client.py +0 -0
  134. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_api_client_methods.py +0 -0
  135. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_api_client_transport.py +0 -0
  136. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_artifact.py +0 -0
  137. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_buffer.py +0 -0
  138. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cache.py +0 -0
  139. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_class_scorers.py +0 -0
  140. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli.py +0 -0
  141. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli_artifact_sweep.py +0 -0
  142. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli_datasets.py +0 -0
  143. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli_gpu_registry_deploy.py +0 -0
  144. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli_infra.py +0 -0
  145. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli_remainder.py +0 -0
  146. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_cli_topup.py +0 -0
  147. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_config.py +0 -0
  148. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_datasets_module.py +0 -0
  149. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_evaluation.py +0 -0
  150. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_finish.py +0 -0
  151. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_git_info.py +0 -0
  152. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/__init__.py +0 -0
  153. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/conftest.py +0 -0
  154. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_cost_guard.py +0 -0
  155. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_engine_serverside.py +0 -0
  156. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_forge.py +0 -0
  157. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_governed_jobs.py +0 -0
  158. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_gpu_cluster.py +0 -0
  159. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_gpu_types.py +0 -0
  160. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_lambda.py +0 -0
  161. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_modal.py +0 -0
  162. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_ovhcloud.py +0 -0
  163. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_price_compare.py +0 -0
  164. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_provider_base.py +0 -0
  165. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_runner.py +0 -0
  166. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_runpod.py +0 -0
  167. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  168. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_vastai.py +0 -0
  169. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu/test_workspace_sync.py +0 -0
  170. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_gpu_modal_creds.py +0 -0
  171. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_init.py +0 -0
  172. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_init_facade.py +0 -0
  173. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_install_commands.py +0 -0
  174. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_fastai.py +0 -0
  175. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_huggingface.py +0 -0
  176. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_keras.py +0 -0
  177. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_langchain.py +0 -0
  178. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_lightning.py +0 -0
  179. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_pytorch.py +0 -0
  180. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_setA.py +0 -0
  181. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_setB.py +0 -0
  182. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_setC.py +0 -0
  183. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_sklearn.py +0 -0
  184. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_integration_xgboost.py +0 -0
  185. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_launch.py +0 -0
  186. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_log.py +0 -0
  187. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_log_code.py +0 -0
  188. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_machine_migrate.py +0 -0
  189. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_mcp_decisions.py +0 -0
  190. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_mcp_monitor.py +0 -0
  191. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_mcp_predictions.py +0 -0
  192. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_mcp_server.py +0 -0
  193. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_media.py +0 -0
  194. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_media_extra.py +0 -0
  195. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_migrate.py +0 -0
  196. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_offline.py +0 -0
  197. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_offline_sync.py +0 -0
  198. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_patent_scan.py +0 -0
  199. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_pii.py +0 -0
  200. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_plot.py +0 -0
  201. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_plot_media_extra2.py +0 -0
  202. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_prompt_module.py +0 -0
  203. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_pure_modules.py +0 -0
  204. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_query_api.py +0 -0
  205. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_redact.py +0 -0
  206. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_reload_module.py +0 -0
  207. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_research_module.py +0 -0
  208. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_resume.py +0 -0
  209. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_run_module.py +0 -0
  210. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sdk_cluster_j1.py +0 -0
  211. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sdk_cluster_j2.py +0 -0
  212. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sdk_cluster_j3.py +0 -0
  213. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sdk_cluster_j4.py +0 -0
  214. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sdk_core_edges.py +0 -0
  215. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sdk_features.py +0 -0
  216. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sender.py +0 -0
  217. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_session_module.py +0 -0
  218. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_session_sync.py +0 -0
  219. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_summary.py +0 -0
  220. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_sweep.py +0 -0
  221. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_system_metrics.py +0 -0
  222. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_topup_hi.py +0 -0
  223. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/tests/test_trace.py +0 -0
  224. {openrunner_sdk-2.40.0 → openrunner_sdk-2.41.0}/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.40.0
3
+ Version: 2.41.0
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.40.0"
184
+ __version__ = "2.41.0"
185
185
 
186
186
  logger = logging.getLogger("openrunner")
187
187
 
@@ -4244,8 +4244,8 @@ def gpu_run(command, provider, gpu, gpu_count, image, disk_gb, env, ssh_keys, pr
4244
4244
  """
4245
4245
  from openrunner.gpu.runner import run_governed_sync, run_on_gpu_sync
4246
4246
 
4247
- if provider not in ("forge", "modal") and not gpu:
4248
- click.echo("Error: --gpu is required (except for forge/modal).", err=True)
4247
+ if provider not in ("forge", "modal", "ovhai") and not gpu:
4248
+ click.echo("Error: --gpu is required (except for forge/modal/ovhai).", err=True)
4249
4249
  raise SystemExit(1)
4250
4250
 
4251
4251
  settings = _load_settings()
@@ -4294,6 +4294,24 @@ def gpu_run(command, provider, gpu, gpu_count, image, disk_gb, env, ssh_keys, pr
4294
4294
  # injected server-side (the token never touches this machine). COMMAND is the
4295
4295
  # App script. A caller who explicitly supplies the token via -e (FORGE_TOKEN /
4296
4296
  # MODAL_TOKEN_SECRET) opts into running the engine client locally instead.
4297
+ # OVH AI Training — governed managed batch job, submitted server-side with the
4298
+ # org's OVH credential (keys never leave the API). COMMAND runs in --image on
4299
+ # --gpu-count GPUs; data comes from OpenRunner (no OVH object-storage volumes).
4300
+ if provider == "ovhai":
4301
+ if image == "pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime":
4302
+ click.echo("Error: --image is required for ovhai (the training image).", err=True)
4303
+ raise SystemExit(1)
4304
+ from openrunner.gpu.runner import run_ovh_training_sync
4305
+ try:
4306
+ result = run_ovh_training_sync(
4307
+ command=command, image=image, gpu=gpu_count, project=project,
4308
+ emit=lambda m: click.echo(m),
4309
+ )
4310
+ except Exception as exc: # noqa: BLE001
4311
+ click.echo(f"gpu run failed: {exc}", err=True)
4312
+ raise SystemExit(1)
4313
+ raise SystemExit(result["exit_code"])
4314
+
4297
4315
  if provider in ("forge", "modal"):
4298
4316
  _DEFAULT_IMAGE = "pytorch/pytorch:2.4.0-cuda12.4-cudnn9-runtime"
4299
4317
  local_tok = env_dict.get("FORGE_TOKEN") if provider == "forge" else env_dict.get("MODAL_TOKEN_SECRET")
@@ -408,6 +408,30 @@ class GpuAPIClient:
408
408
  logger.warning("get_job failed: %s", e)
409
409
  return None
410
410
 
411
+ def ovh_training_run_stream(
412
+ self, *, image: str, command: str, gpu: int = 1, name: str | None = None,
413
+ project_id: str | None = None,
414
+ ):
415
+ """POST /api/v1/gpu/ai-training/run and YIELD the job's log lines. The
416
+ server runs `ovhai job run` with the org's stored user/password (never
417
+ sent here) and streams logs. A ``__ENGINE_EXIT__ <code>`` line ends it."""
418
+ org = self.org_id()
419
+ body: dict[str, Any] = {"image": image, "command": command, "gpu": gpu}
420
+ if name:
421
+ body["name"] = name
422
+ if project_id:
423
+ body["project_id"] = project_id
424
+ with self._client.stream(
425
+ "POST", "/gpu/ai-training/run", params={"org_id": org}, json=body,
426
+ ) as r:
427
+ if r.status_code >= 400:
428
+ r.read()
429
+ yield f"[openrunner] server error {r.status_code}: {r.text[:300]}"
430
+ yield "__ENGINE_EXIT__ 1"
431
+ return
432
+ for line in r.iter_lines():
433
+ yield line
434
+
411
435
  # ------------------------------------------------------------------
412
436
  # Lifecycle
413
437
  # ------------------------------------------------------------------
@@ -526,6 +526,42 @@ def run_engine_job_sync(
526
526
  "`openrunner runner start` on a box in this org (needs Docker).")
527
527
 
528
528
 
529
+ def run_ovh_training_sync(
530
+ *,
531
+ command: str,
532
+ image: str,
533
+ gpu: int = 1,
534
+ project: str | None = None,
535
+ name: str | None = None,
536
+ emit: Callable[[str], None] | None = None,
537
+ ) -> dict[str, Any]:
538
+ """Governed OVH AI Training run — SERVER-SIDE. The API runs `ovhai job run`
539
+ on the engine-executor with the org's stored user/password (never on this
540
+ machine) and streams the job's logs. COMMAND runs in IMAGE on `gpu` GPUs. Data
541
+ comes from OpenRunner (no OVH object-storage volumes). Returns {"exit_code"}."""
542
+ from openrunner.gpu import _get_api_client
543
+
544
+ say = emit or (lambda m: print(m, flush=True))
545
+ client = _get_api_client()
546
+ if client is None:
547
+ raise RuntimeError("Not logged in. Run 'openrunner login' first.")
548
+
549
+ say(f"[openrunner] launching OVH AI Training (image={image}, gpu={gpu}) "
550
+ "server-side — OVH user/password stays in OpenRunner ...")
551
+ exit_code = 1
552
+ for line in client.ovh_training_run_stream(
553
+ image=image, command=command, gpu=gpu, name=name, project_id=project,
554
+ ):
555
+ if line.startswith("__ENGINE_EXIT__"):
556
+ try:
557
+ exit_code = int(line.split()[1])
558
+ except Exception:
559
+ exit_code = 1
560
+ continue
561
+ say(line.rstrip("\n"))
562
+ return {"exit_code": exit_code}
563
+
564
+
529
565
  def run_engine_serverside_sync(
530
566
  *,
531
567
  provider: str,
@@ -3599,6 +3599,15 @@ mentions a "distant GPU":
3599
3599
  SCRIPT (GPU is declared in `@app.function(gpu=...)`, so no `--gpu`), the Run
3600
3600
  auto-terminates when the function returns. Don't hunt for an SSH host/runner.
3601
3601
  For native Forge use, the `forge-deploy` skill covers install/auth/write/run.
3602
+ - OVHcloud **AI Training** (managed GPU batch jobs): governed, run SERVER-SIDE
3603
+ via the `ovhai` CLI on the engine-executor using the org's stored OVH
3604
+ **user/password** (an OpenStack user with the AI Training Operator +
3605
+ ObjectStore operator roles) -- the password never reaches the client. Store it
3606
+ in Settings (provider `ovhai`: username + password), then run:
3607
+ `openrunner gpu run --provider ovhai --image <img> --gpu-count N "<train cmd>"`
3608
+ -- COMMAND runs in the image on N GPUs; the job's logs stream back; it
3609
+ auto-stops when the command exits. **Do NOT use OVH object-storage `--volume`
3610
+ mounts** -- data comes from OpenRunner (datasets/artifacts).
3602
3611
  - Provider keys are stored encrypted with `openrunner gpu credentials add`
3603
3612
  (e.g. `--provider forge --api-key fg_..`); list/kill pods with
3604
3613
  `openrunner gpu ls` / `openrunner gpu terminate`. Governed compute -- the key
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.40.0"
3
+ version = "2.41.0"
4
4
  description = "OpenRunner SDK - W&B-compatible ML experiment tracking client"
5
5
  readme = "README.md"
6
6
  license = {text = "MIT"}
@@ -0,0 +1,29 @@
1
+ """SDK OVH AI Training governed run — streams the server's job logs."""
2
+ from __future__ import annotations
3
+ from unittest.mock import patch
4
+ from openrunner.gpu import runner as R
5
+
6
+
7
+ class _Fake:
8
+ def __init__(self, lines): self.args=None; self._lines=lines
9
+ def ovh_training_run_stream(self, **kwargs):
10
+ self.args=kwargs
11
+ yield from self._lines
12
+
13
+
14
+ def test_ovh_training_streams_and_parses_exit():
15
+ fake=_Fake(["epoch 1","epoch 2","__ENGINE_EXIT__ 0"])
16
+ out=[]
17
+ with patch("openrunner.gpu._get_api_client", return_value=fake):
18
+ res=R.run_ovh_training_sync(command="python train.py",
19
+ image="ovhcom/ai-training-pytorch", gpu=2, emit=out.append)
20
+ assert res=={"exit_code":0}
21
+ assert fake.args["image"]=="ovhcom/ai-training-pytorch" and fake.args["gpu"]==2
22
+ assert fake.args["command"]=="python train.py"
23
+ assert any("epoch 2" in l for l in out) and not any("__ENGINE_EXIT__" in l for l in out)
24
+
25
+
26
+ def test_ovh_training_nonzero_exit():
27
+ with patch("openrunner.gpu._get_api_client", return_value=_Fake(["boom","__ENGINE_EXIT__ 4"])):
28
+ res=R.run_ovh_training_sync(command="x", image="i", emit=lambda _l:None)
29
+ assert res["exit_code"]==4
File without changes
File without changes