openrunner-sdk 2.37.28__tar.gz → 2.37.30__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 (186) hide show
  1. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/cli.py +82 -1
  4. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/install_commands.py +26 -11
  5. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/mcp_server.py +44 -0
  6. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/pyproject.toml +1 -1
  7. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/.gitignore +0 -0
  8. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/=6.0 +0 -0
  9. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/=8.1 +0 -0
  10. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/README.md +0 -0
  11. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/CLAUDE.md +0 -0
  12. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/_safepath.py +0 -0
  13. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/_secret_rules.py +0 -0
  14. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/api_client.py +0 -0
  15. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/artifact.py +0 -0
  16. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/autoresearch.py +0 -0
  17. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/buffer.py +0 -0
  18. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/cache.py +0 -0
  19. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/config.py +0 -0
  20. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/cost.py +0 -0
  21. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/dataset.py +0 -0
  22. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/datasets.py +0 -0
  23. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/environment.py +0 -0
  24. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/evaluation.py +0 -0
  25. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/feedback.py +0 -0
  26. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/git_info.py +0 -0
  27. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/__init__.py +0 -0
  28. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/api_integration.py +0 -0
  29. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/cost_guard.py +0 -0
  30. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/gpu_types.py +0 -0
  31. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/price_compare.py +0 -0
  32. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/provider_base.py +0 -0
  33. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/__init__.py +0 -0
  34. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  35. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/modal_provider.py +0 -0
  36. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/ovhcloud.py +0 -0
  37. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/runpod.py +0 -0
  38. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/vastai.py +0 -0
  39. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/runner.py +0 -0
  40. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/workspace_sync.py +0 -0
  41. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/guardrails.py +0 -0
  42. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/handover.py +0 -0
  43. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/hooks/patent-lab-post-commit +0 -0
  44. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/__init__.py +0 -0
  45. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/accelerate.py +0 -0
  46. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/anthropic_tracer.py +0 -0
  47. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/catboost.py +0 -0
  48. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/diffusers.py +0 -0
  49. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/fastai.py +0 -0
  50. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/forced_alignment.py +0 -0
  51. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/gladia.py +0 -0
  52. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/gymnasium.py +0 -0
  53. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/huggingface.py +0 -0
  54. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/hydra.py +0 -0
  55. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/ignite.py +0 -0
  56. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/jax.py +0 -0
  57. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/keras.py +0 -0
  58. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/langchain.py +0 -0
  59. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/lightgbm.py +0 -0
  60. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/lightning.py +0 -0
  61. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/llamaindex.py +0 -0
  62. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/openai_finetune.py +0 -0
  63. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/openai_tracer.py +0 -0
  64. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/optuna.py +0 -0
  65. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/pytorch.py +0 -0
  66. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/sb3.py +0 -0
  67. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/sklearn.py +0 -0
  68. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/skypilot.py +0 -0
  69. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/tensorflow.py +0 -0
  70. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/trl.py +0 -0
  71. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/tts.py +0 -0
  72. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/ultralytics.py +0 -0
  73. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/voice_agent.py +0 -0
  74. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/whisper.py +0 -0
  75. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/xgboost.py +0 -0
  76. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/launch.py +0 -0
  77. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/machine.py +0 -0
  78. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/media.py +0 -0
  79. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/migrate.py +0 -0
  80. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/model.py +0 -0
  81. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/model_card.py +0 -0
  82. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/offline.py +0 -0
  83. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/patent_scan.py +0 -0
  84. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/pii.py +0 -0
  85. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/plot.py +0 -0
  86. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/projects.py +0 -0
  87. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/prompt.py +0 -0
  88. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/query_api.py +0 -0
  89. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/redact.py +0 -0
  90. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/reload.py +0 -0
  91. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/research.py +0 -0
  92. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/research_policy.py +0 -0
  93. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/run.py +0 -0
  94. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/scorers.py +0 -0
  95. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/sender.py +0 -0
  96. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/session.py +0 -0
  97. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/settings.py +0 -0
  98. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/summary.py +0 -0
  99. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/sweep.py +0 -0
  100. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/sync.py +0 -0
  101. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/system_metrics.py +0 -0
  102. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/tensorboard.py +0 -0
  103. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/tools/__init__.py +0 -0
  104. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/tools/patent_report.py +0 -0
  105. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/trace.py +0 -0
  106. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/transcript_formatter.py +0 -0
  107. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wal.py +0 -0
  108. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wandb_compat/__init__.py +0 -0
  109. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wandb_compat/_shim.py +0 -0
  110. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wer.py +0 -0
  111. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/scripts/gen_betterleaks_rules.py +0 -0
  112. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/__init__.py +0 -0
  113. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/conftest.py +0 -0
  114. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  115. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  116. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  117. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  118. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  119. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  120. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  121. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  122. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  123. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  124. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  125. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  126. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/integration/__init__.py +0 -0
  127. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/integration/conftest.py +0 -0
  128. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/integration/test_artifact_round_trip.py +0 -0
  129. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_alert.py +0 -0
  130. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_aliases.py +0 -0
  131. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_api_client.py +0 -0
  132. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_artifact.py +0 -0
  133. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_buffer.py +0 -0
  134. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_cache.py +0 -0
  135. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_class_scorers.py +0 -0
  136. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_cli.py +0 -0
  137. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_config.py +0 -0
  138. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_evaluation.py +0 -0
  139. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_finish.py +0 -0
  140. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_git_info.py +0 -0
  141. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/__init__.py +0 -0
  142. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/conftest.py +0 -0
  143. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_cost_guard.py +0 -0
  144. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_gpu_types.py +0 -0
  145. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_lambda.py +0 -0
  146. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_modal.py +0 -0
  147. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_ovhcloud.py +0 -0
  148. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_price_compare.py +0 -0
  149. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_provider_base.py +0 -0
  150. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_runner.py +0 -0
  151. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_runpod.py +0 -0
  152. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  153. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_vastai.py +0 -0
  154. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_workspace_sync.py +0 -0
  155. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_init.py +0 -0
  156. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_install_commands.py +0 -0
  157. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_fastai.py +0 -0
  158. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_huggingface.py +0 -0
  159. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_keras.py +0 -0
  160. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_langchain.py +0 -0
  161. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_lightning.py +0 -0
  162. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_pytorch.py +0 -0
  163. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_sklearn.py +0 -0
  164. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_xgboost.py +0 -0
  165. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_launch.py +0 -0
  166. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_log.py +0 -0
  167. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_log_code.py +0 -0
  168. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_mcp_decisions.py +0 -0
  169. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_mcp_monitor.py +0 -0
  170. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_mcp_predictions.py +0 -0
  171. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_media.py +0 -0
  172. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_migrate.py +0 -0
  173. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_offline.py +0 -0
  174. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_offline_sync.py +0 -0
  175. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_pii.py +0 -0
  176. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_plot.py +0 -0
  177. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_query_api.py +0 -0
  178. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_resume.py +0 -0
  179. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_sdk_features.py +0 -0
  180. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_sender.py +0 -0
  181. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_session_sync.py +0 -0
  182. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_summary.py +0 -0
  183. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_sweep.py +0 -0
  184. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_system_metrics.py +0 -0
  185. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_trace.py +0 -0
  186. {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/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.37.28
3
+ Version: 2.37.30
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.37.28"
184
+ __version__ = "2.37.30"
185
185
 
186
186
  logger = logging.getLogger("openrunner")
187
187
 
@@ -57,6 +57,64 @@ def _auto_install_commands() -> None:
57
57
  pass # never crash on auto-install
58
58
 
59
59
 
60
+ # ---------------------------------------------------------------------------
61
+ # Update awareness — know when a newer SDK is on PyPI
62
+ # ---------------------------------------------------------------------------
63
+
64
+ _PYPI_JSON = "https://pypi.org/pypi/openrunner-sdk/json"
65
+
66
+
67
+ def _latest_pypi_version(timeout: float = 3.0) -> str | None:
68
+ """Return the latest openrunner-sdk version on PyPI, or None on any failure.
69
+ Never raises — update awareness must never break a command."""
70
+ try:
71
+ import urllib.request
72
+
73
+ with urllib.request.urlopen(_PYPI_JSON, timeout=timeout) as r:
74
+ import json as _json
75
+ return _json.load(r).get("info", {}).get("version")
76
+ except Exception:
77
+ return None
78
+
79
+
80
+ def _version_tuple(v: str) -> tuple:
81
+ out = []
82
+ for part in str(v).split("."):
83
+ num = "".join(c for c in part if c.isdigit())
84
+ out.append(int(num) if num else 0)
85
+ return tuple(out)
86
+
87
+
88
+ def check_for_update(force: bool = False, cache_hours: float = 24.0) -> dict:
89
+ """Compare the installed SDK to the latest on PyPI.
90
+
91
+ Returns {installed, latest, update_available}. Caches the PyPI answer in
92
+ ~/.openrunner/.update_check (mtime-based) so it hits the network at most once
93
+ per cache window unless force=True.
94
+ """
95
+ from openrunner import __version__ as installed
96
+ cache = _settings_dir() / ".update_check"
97
+ latest = None
98
+ if not force:
99
+ try:
100
+ import os as _os
101
+ import time as _time
102
+ if cache.exists() and (_time.time() - _os.path.getmtime(cache)) < cache_hours * 3600:
103
+ latest = cache.read_text().strip() or None
104
+ except Exception:
105
+ latest = None
106
+ if latest is None:
107
+ latest = _latest_pypi_version()
108
+ if latest:
109
+ try:
110
+ cache.parent.mkdir(parents=True, exist_ok=True)
111
+ cache.write_text(latest)
112
+ except Exception:
113
+ pass
114
+ avail = bool(latest) and _version_tuple(latest) > _version_tuple(installed)
115
+ return {"installed": installed, "latest": latest, "update_available": avail}
116
+
117
+
60
118
  # ---------------------------------------------------------------------------
61
119
  # Settings helpers
62
120
  # ---------------------------------------------------------------------------
@@ -2980,6 +3038,23 @@ def install_commands(tools: tuple) -> None:
2980
3038
  click.echo(" Or: openrunner mcp install")
2981
3039
 
2982
3040
 
3041
+ @main.command("version")
3042
+ @click.option("--check", is_flag=True, help="Also check PyPI for a newer release")
3043
+ def version_cmd(check: bool) -> None:
3044
+ """Show the installed SDK version (and whether an update is available)."""
3045
+ from openrunner import __version__
3046
+ if not check:
3047
+ click.echo(__version__)
3048
+ return
3049
+ info = check_for_update(force=True)
3050
+ click.echo(f"installed: {info['installed']}")
3051
+ click.echo(f"latest: {info.get('latest') or '(unknown — offline?)'}")
3052
+ if info["update_available"]:
3053
+ click.echo("Update available. Run: openrunner update")
3054
+ elif info.get("latest"):
3055
+ click.echo("Up to date.")
3056
+
3057
+
2983
3058
  @main.command("update")
2984
3059
  @click.option("--pre", is_flag=True, help="Include pre-releases")
2985
3060
  @click.option("--no-reinstall", is_flag=True, help="Only upgrade the package; skip reinstalling slash commands")
@@ -2995,7 +3070,13 @@ def update_cmd(pre: bool, no_reinstall: bool) -> None:
2995
3070
 
2996
3071
  from openrunner import __version__ as _cur
2997
3072
 
2998
- click.echo(f"Current openrunner-sdk: {_cur}")
3073
+ info = check_for_update(force=True)
3074
+ latest = info.get("latest")
3075
+ click.echo(f"Current openrunner-sdk: {_cur}" + (f" — latest: {latest}" if latest else ""))
3076
+ if latest and not info["update_available"]:
3077
+ click.echo("Already up to date.")
3078
+ if no_reinstall:
3079
+ return
2999
3080
  cmd = [sys.executable, "-m", "pip", "install", "--upgrade", "--no-cache-dir"]
3000
3081
  if pre:
3001
3082
  cmd.append("--pre")
@@ -434,12 +434,21 @@ Report result to user.
434
434
 
435
435
  UPDATE_CMD = """---
436
436
  name: {prefix}update
437
- description: Update OpenRunner SDK and reinstall all commands
437
+ description: Check for + install the latest OpenRunner SDK and reinstall all commands (skills + MCP)
438
438
  allowed-tools:
439
439
  - Bash
440
440
  ---
441
441
 
442
- Upgrade openrunner-sdk and reinstall slash commands:
442
+ First CHECK whether a newer release exists, then upgrade if so. The SDK is
443
+ update-aware: `openrunner version --check` compares the installed version to PyPI,
444
+ and the `openrunner_check_update` MCP tool does the same for an assistant.
445
+
446
+ ```bash
447
+ openrunner version --check 2>/dev/null || true
448
+ ```
449
+
450
+ If it says "Up to date", stop and tell the user. If an update is available (or
451
+ the check couldn't run), upgrade openrunner-sdk and reinstall slash commands:
443
452
 
444
453
  ```bash
445
454
  pip install --upgrade --no-cache-dir openrunner-sdk 2>&1 | tail -3 && python3 -c "
@@ -2400,8 +2409,11 @@ in the web UI, or ask an org admin. Then ask the user for their provider API key
2400
2409
  openrunner gpu credentials add --org ORG_ID --provider runpod --api-key PROVIDER_KEY
2401
2410
  ```
2402
2411
 
2403
- Only **RunPod** supports fully server-side provisioning today. Vast.ai, Lambda,
2404
- etc. have stored keys used for **pricing**; launch those via their own tooling.
2412
+ Server-side provisioning adapters: **RunPod, Vast.ai, OVH** (self-enroll, no SSH)
2413
+ and **Lambda** (SSH no boot hook). AWS/GCP have no native launch — provision the
2414
+ box yourself then `openrunner runner enroll --cloud-init` (user-data /
2415
+ startup-script). OVH's stored key is a JSON blob (app_key/secret/consumer_key/
2416
+ service_name); Lambda's is `{{api_key, ssh_key_names[]}}`.
2405
2417
 
2406
2418
  ## Step 3 -- Pick GPU, image, command
2407
2419
 
@@ -3082,8 +3094,9 @@ Gather the real options (don't hardcode):
3082
3094
  - **Cloud offers**: `openrunner deploy gpus -p ORG/NAME` (or the GPU prices
3083
3095
  endpoint) -> provider - GPU - VRAM - $/hr, for providers the org has a stored
3084
3096
  credential for (`openrunner gpu credentials ls`).
3085
- - Note which providers have a **server-side adapter** (RunPod today) vs
3086
- pricing-only, and which registered hosts are `active`.
3097
+ - Note which providers have a **provisioning adapter** (RunPod, Vast.ai, OVH via
3098
+ `runner launch`/`gpu run`; Lambda via `gpu run`, SSH) vs enroll-only (AWS/GCP →
3099
+ `runner enroll --cloud-init`), and which registered hosts/runners are `active`.
3087
3100
 
3088
3101
  ## Step 2 -- interpret the NL request (map intent -> concrete target)
3089
3102
  From the user's phrasing, resolve a single target + shape:
@@ -3152,8 +3165,9 @@ directly SSH-reachable** (`publicIp:22`): SSH is only via the **proxy**
3152
3165
  it rather than leaving it billing.
3153
3166
  - Ground VRAM/fit claims in the model card; label estimates.
3154
3167
  - SSH-less by default: reach for the RUNNER model (A) unless a host has verified
3155
- direct SSH. Only RunPod has a server-side cloud adapter; others are
3156
- pricing-only (need a client-side key via -e).
3168
+ direct SSH. Provisioning adapters: RunPod / Vast.ai / OVH (`runner launch`,
3169
+ self-enroll, no SSH) and Lambda (`gpu run`, SSH no boot hook). AWS/GCP have no
3170
+ native launch -> `runner enroll --cloud-init` (user-data / startup-script).
3157
3171
  """
3158
3172
 
3159
3173
 
@@ -3200,7 +3214,8 @@ Pull the model card + run summary and extract, with numbers only:
3200
3214
 
3201
3215
  ## Step 4 -- confirm platform + GPU (interactive)
3202
3216
  Use AskUserQuestion with the recommendation FIRST and marked "(Recommended)":
3203
- - **Platform**: the supported providers (RunPod today; others are pricing-only).
3217
+ - **Platform**: providers with a provisioning adapter (RunPod, Vast.ai, OVH,
3218
+ Lambda). AWS/GCP are pricing/enroll-only for deployments.
3204
3219
  - **GPU**: 3-4 offers spanning the recommendation +/- one size, each labelled with
3205
3220
  VRAM + $/hr so the trade-off is visible.
3206
3221
  Then ask replica bounds + autoscale:
@@ -3223,8 +3238,8 @@ Then ask replica bounds + autoscale:
3223
3238
  CONFIRM before `create`. Mention scale-to-zero to cap idle cost.
3224
3239
  - Fit VRAM with headroom; warn if the recommendation is tight for the target
3225
3240
  batch.
3226
- - RunPod is the only real provisioning adapter today; other providers are
3227
- pricing-only -- say so if picked.
3241
+ - Provisioning adapters: RunPod, Vast.ai, OVH, Lambda. AWS/GCP have no native
3242
+ deploy adapter -- say so if picked.
3228
3243
  """
3229
3244
 
3230
3245
 
@@ -1428,6 +1428,17 @@ def create_server():
1428
1428
  "required": ["org"],
1429
1429
  },
1430
1430
  ),
1431
+ Tool(
1432
+ name="openrunner_check_update",
1433
+ description=(
1434
+ "Check whether a newer openrunner-sdk is available on PyPI vs the "
1435
+ "installed version. Returns installed + latest + whether an update is "
1436
+ "available, and the command to run (`openrunner update`). Call this "
1437
+ "when the user asks to update OpenRunner or whether they're on the "
1438
+ "latest version — then, if they confirm, run `openrunner update`."
1439
+ ),
1440
+ inputSchema={"type": "object", "properties": {}, "required": []},
1441
+ ),
1431
1442
  ]
1432
1443
 
1433
1444
  @server.call_tool()
@@ -1534,6 +1545,8 @@ def create_server():
1534
1545
  result = await _tool_submit_job(arguments)
1535
1546
  elif name == "openrunner_list_jobs":
1536
1547
  result = await _tool_list_jobs(arguments)
1548
+ elif name == "openrunner_check_update":
1549
+ result = await _tool_check_update(arguments)
1537
1550
  else:
1538
1551
  result = f"Unknown tool: {name}"
1539
1552
  except RuntimeError as e:
@@ -4299,3 +4312,34 @@ async def _tool_list_jobs(args: dict) -> str:
4299
4312
  for j in rows[:30]
4300
4313
  ]
4301
4314
  return "Jobs:\n" + "\n".join(lines)
4315
+
4316
+
4317
+ async def _tool_check_update(args: dict) -> str:
4318
+ """Report installed vs latest openrunner-sdk on PyPI (no network via the API —
4319
+ queries PyPI directly)."""
4320
+ from openrunner import __version__ as installed
4321
+
4322
+ latest = None
4323
+ try:
4324
+ import urllib.request
4325
+
4326
+ def _fetch():
4327
+ with urllib.request.urlopen("https://pypi.org/pypi/openrunner-sdk/json", timeout=5) as r:
4328
+ import json as _json
4329
+ return _json.load(r).get("info", {}).get("version")
4330
+
4331
+ import asyncio as _asyncio
4332
+ latest = await _asyncio.to_thread(_fetch)
4333
+ except Exception as e:
4334
+ return f"installed: {installed}\nCould not reach PyPI to check latest ({e})."
4335
+
4336
+ def _vt(v):
4337
+ return tuple(int("".join(c for c in p if c.isdigit()) or 0) for p in str(v).split("."))
4338
+
4339
+ avail = bool(latest) and _vt(latest) > _vt(installed)
4340
+ if avail:
4341
+ return (f"installed: {installed}\nlatest: {latest}\nUPDATE AVAILABLE.\n"
4342
+ "To update: run `openrunner update` in the terminal (upgrades the SDK "
4343
+ "+ reinstalls the /openrunner slash commands). Ask the user to confirm, "
4344
+ "then run it.")
4345
+ return f"installed: {installed}\nlatest: {latest}\nUp to date."
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.37.28"
3
+ version = "2.37.30"
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