openrunner-sdk 2.24.2__tar.gz → 2.37.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 (184) hide show
  1. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/PKG-INFO +1 -1
  2. openrunner_sdk-2.37.0/openrunner/CLAUDE.md +151 -0
  3. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/__init__.py +129 -3
  4. openrunner_sdk-2.37.0/openrunner/_secret_rules.py +284 -0
  5. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/api_client.py +43 -2
  6. openrunner_sdk-2.37.0/openrunner/autoresearch.py +108 -0
  7. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/cli.py +349 -0
  8. openrunner_sdk-2.37.0/openrunner/datasets.py +788 -0
  9. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/environment.py +66 -28
  10. openrunner_sdk-2.37.0/openrunner/handover.py +230 -0
  11. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/install_commands.py +1080 -0
  12. openrunner_sdk-2.37.0/openrunner/machine.py +236 -0
  13. openrunner_sdk-2.37.0/openrunner/mcp_server.py +3932 -0
  14. openrunner_sdk-2.37.0/openrunner/model_card.py +314 -0
  15. openrunner_sdk-2.37.0/openrunner/projects.py +72 -0
  16. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/query_api.py +75 -3
  17. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/redact.py +152 -8
  18. openrunner_sdk-2.37.0/openrunner/reload.py +557 -0
  19. openrunner_sdk-2.37.0/openrunner/research.py +376 -0
  20. openrunner_sdk-2.37.0/openrunner/research_policy.py +200 -0
  21. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/run.py +66 -6
  22. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/session.py +152 -24
  23. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/settings.py +69 -6
  24. openrunner_sdk-2.37.0/openrunner/sync.py +162 -0
  25. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/pyproject.toml +1 -1
  26. openrunner_sdk-2.37.0/scripts/gen_betterleaks_rules.py +175 -0
  27. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_api_client.py +33 -0
  28. openrunner_sdk-2.37.0/tests/test_mcp_decisions.py +187 -0
  29. openrunner_sdk-2.37.0/tests/test_mcp_monitor.py +146 -0
  30. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_query_api.py +47 -0
  31. openrunner_sdk-2.37.0/tests/test_session_sync.py +117 -0
  32. openrunner_sdk-2.24.2/openrunner/CLAUDE.md +0 -15
  33. openrunner_sdk-2.24.2/openrunner/mcp_server.py +0 -1986
  34. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/.gitignore +0 -0
  35. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/=6.0 +0 -0
  36. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/=8.1 +0 -0
  37. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/README.md +0 -0
  38. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/artifact.py +0 -0
  39. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/buffer.py +0 -0
  40. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/cache.py +0 -0
  41. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/config.py +0 -0
  42. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/cost.py +0 -0
  43. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/dataset.py +0 -0
  44. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/evaluation.py +0 -0
  45. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/feedback.py +0 -0
  46. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/git_info.py +0 -0
  47. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/__init__.py +0 -0
  48. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/api_integration.py +0 -0
  49. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/cost_guard.py +0 -0
  50. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/gpu_types.py +0 -0
  51. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/price_compare.py +0 -0
  52. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/provider_base.py +0 -0
  53. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/providers/__init__.py +0 -0
  54. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  55. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/providers/modal_provider.py +0 -0
  56. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/providers/ovhcloud.py +0 -0
  57. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/providers/runpod.py +0 -0
  58. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/providers/vastai.py +0 -0
  59. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/gpu/workspace_sync.py +0 -0
  60. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/guardrails.py +0 -0
  61. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/hooks/patent-lab-post-commit +0 -0
  62. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/__init__.py +0 -0
  63. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/accelerate.py +0 -0
  64. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/anthropic_tracer.py +0 -0
  65. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/catboost.py +0 -0
  66. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/diffusers.py +0 -0
  67. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/fastai.py +0 -0
  68. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/forced_alignment.py +0 -0
  69. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/gladia.py +0 -0
  70. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/gymnasium.py +0 -0
  71. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/huggingface.py +0 -0
  72. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/hydra.py +0 -0
  73. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/ignite.py +0 -0
  74. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/jax.py +0 -0
  75. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/keras.py +0 -0
  76. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/langchain.py +0 -0
  77. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/lightgbm.py +0 -0
  78. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/lightning.py +0 -0
  79. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/llamaindex.py +0 -0
  80. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/openai_finetune.py +0 -0
  81. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/openai_tracer.py +0 -0
  82. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/optuna.py +0 -0
  83. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/pytorch.py +0 -0
  84. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/sb3.py +0 -0
  85. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/sklearn.py +0 -0
  86. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/skypilot.py +0 -0
  87. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/tensorflow.py +0 -0
  88. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/trl.py +0 -0
  89. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/tts.py +0 -0
  90. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/ultralytics.py +0 -0
  91. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/voice_agent.py +0 -0
  92. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/whisper.py +0 -0
  93. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/integration/xgboost.py +0 -0
  94. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/launch.py +0 -0
  95. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/media.py +0 -0
  96. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/migrate.py +0 -0
  97. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/model.py +0 -0
  98. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/offline.py +0 -0
  99. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/patent_scan.py +0 -0
  100. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/pii.py +0 -0
  101. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/plot.py +0 -0
  102. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/prompt.py +0 -0
  103. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/scorers.py +0 -0
  104. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/sender.py +0 -0
  105. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/summary.py +0 -0
  106. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/sweep.py +0 -0
  107. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/system_metrics.py +0 -0
  108. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/tensorboard.py +0 -0
  109. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/tools/__init__.py +0 -0
  110. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/tools/patent_report.py +0 -0
  111. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/trace.py +0 -0
  112. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/transcript_formatter.py +0 -0
  113. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/wal.py +0 -0
  114. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/wandb_compat/__init__.py +0 -0
  115. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/wandb_compat/_shim.py +0 -0
  116. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/openrunner/wer.py +0 -0
  117. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/__init__.py +0 -0
  118. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/conftest.py +0 -0
  119. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  120. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  121. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  122. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  123. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  124. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  125. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  126. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  127. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  128. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  129. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  130. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  131. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/integration/__init__.py +0 -0
  132. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/integration/conftest.py +0 -0
  133. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/integration/test_artifact_round_trip.py +0 -0
  134. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_alert.py +0 -0
  135. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_aliases.py +0 -0
  136. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_artifact.py +0 -0
  137. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_buffer.py +0 -0
  138. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_cache.py +0 -0
  139. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_class_scorers.py +0 -0
  140. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_cli.py +0 -0
  141. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_config.py +0 -0
  142. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_evaluation.py +0 -0
  143. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_finish.py +0 -0
  144. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_git_info.py +0 -0
  145. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/__init__.py +0 -0
  146. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/conftest.py +0 -0
  147. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_cost_guard.py +0 -0
  148. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_gpu_types.py +0 -0
  149. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_lambda.py +0 -0
  150. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_modal.py +0 -0
  151. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_ovhcloud.py +0 -0
  152. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_price_compare.py +0 -0
  153. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_provider_base.py +0 -0
  154. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_runpod.py +0 -0
  155. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  156. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_vastai.py +0 -0
  157. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_gpu/test_workspace_sync.py +0 -0
  158. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_init.py +0 -0
  159. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_fastai.py +0 -0
  160. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_huggingface.py +0 -0
  161. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_keras.py +0 -0
  162. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_langchain.py +0 -0
  163. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_lightning.py +0 -0
  164. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_pytorch.py +0 -0
  165. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_sklearn.py +0 -0
  166. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_integration_xgboost.py +0 -0
  167. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_launch.py +0 -0
  168. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_log.py +0 -0
  169. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_log_code.py +0 -0
  170. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_mcp_predictions.py +0 -0
  171. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_media.py +0 -0
  172. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_migrate.py +0 -0
  173. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_offline.py +0 -0
  174. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_offline_sync.py +0 -0
  175. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_pii.py +0 -0
  176. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_plot.py +0 -0
  177. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_resume.py +0 -0
  178. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_sdk_features.py +0 -0
  179. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_sender.py +0 -0
  180. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_summary.py +0 -0
  181. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_sweep.py +0 -0
  182. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_system_metrics.py +0 -0
  183. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.0}/tests/test_trace.py +0 -0
  184. {openrunner_sdk-2.24.2 → openrunner_sdk-2.37.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.24.2
3
+ Version: 2.37.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
@@ -0,0 +1,151 @@
1
+ # OpenRunner SDK — Datasets (HuggingFace-style)
2
+
3
+ `openrunner.datasets` is a near drop-in replacement for `huggingface_hub` +
4
+ `datasets` for **org-level, reference-only** datasets (metadata, tags, card,
5
+ optional small preview — no full content stored). `repo_id` is `"org/name"`.
6
+
7
+ ```python
8
+ from openrunner import datasets as ord
9
+
10
+ ord.create_dataset("gladia/wmt-en-fr", modality="Text", tasks=["translation"],
11
+ languages=["en", "fr"], num_examples=40_000_000,
12
+ format="parquet", source_uri="hf:wmt/wmt14",
13
+ card="# WMT En-Fr\n...", preview=[{"en": "hi", "fr": "salut"}])
14
+
15
+ ord.list_datasets(org="gladia") # -> [DatasetInfo, ...]
16
+ info = ord.dataset_info("gladia/wmt-en-fr")
17
+ ds = ord.load_dataset("gladia/wmt-en-fr") # HF rows if source is hf:*, else metadata+preview
18
+ ord.set_dataset_card("gladia/wmt-en-fr", md) # update README
19
+ ord.link_run("gladia/wmt-en-fr", run_id) # lineage dataset -> run -> model
20
+ ord.push_dataset("gladia/wmt-en-fr", license="cc-by-4.0") # create-or-update
21
+ ```
22
+
23
+ **ALWAYS link the dataset(s) a run uses** — pass `datasets=` to `init` so every
24
+ run has data lineage (no "no dataset linked" reproducibility gap):
25
+
26
+ ```python
27
+ openrunner.init(project="gladia/age-gender-sentiment-emotion", name="v15",
28
+ datasets=["03822df0-...", "gladia/fleurs"]) # UUID or org/name
29
+ ```
30
+
31
+ (`openrunner.sync_environment(..., link_datasets=[...])` and
32
+ `/openrunner:sync-env --link-dataset ID` do the same when pushing a local env.)
33
+
34
+ `load_dataset` delegates to HF `datasets.load_dataset` when `source_uri` is
35
+ `hf:org/name` and the package is installed; otherwise returns a `LoadedDataset`
36
+ (`.info`, `.rows`, iterable). Facets match the HF Hub: modality, format,
37
+ dataset_type (standard/benchmark/traces), tasks, languages, size.
38
+
39
+ ### Charts & diagrams in cards
40
+ Dataset cards and model cards render markdown with two live graphic blocks —
41
+ use them instead of static tables/images, with REAL data only:
42
+ - ```` ```echarts ```` + a valid ECharts option (JSON) → a live chart
43
+ (line/bar/scatter/pie, and `series.type:"graph"` for node-edge dependency
44
+ graphs). e.g. plot per-subset row counts or eval metrics.
45
+ - ```` ```mermaid ```` → a flowchart / sequence / ER diagram for pipeline or
46
+ schema. Rendered in `securityLevel:"strict"`.
47
+
48
+ ## Managed (governed) uploads
49
+
50
+ Bind a dataset to **one** org storage connection so uploads flow through the API
51
+ — credentials never leave the server, and every file is tracked (who/what/size/
52
+ sha256/content-type). This avoids scattered connections and opaque bucket blobs.
53
+
54
+ ```python
55
+ # bind at create (connection = org storage-connection NAME or UUID)
56
+ ord.create_dataset("gladia/my-text-set", modality="Text", format="parquet",
57
+ connection="ML.text-datasets") # -> source_type="managed"
58
+
59
+ ord.upload_file("gladia/my-text-set", "train.parquet") # one file
60
+ ord.upload_folder("gladia/my-text-set", "./data") # whole tree
61
+ ord.list_files("gladia/my-text-set") # [{path,size_bytes,sha256,content_type,uploaded_by}]
62
+
63
+ # or bind lazily on first upload of an unbound dataset:
64
+ ord.upload_file("gladia/my-text-set", "train.parquet", connection="ML.text-datasets")
65
+ ```
66
+
67
+ CLI: `openrunner datasets create … --connection ML.text-datasets`,
68
+ `openrunner datasets upload org/name FILE_OR_DIR…`, `openrunner datasets files org/name`.
69
+
70
+ Files land under `s3://<bucket>/<conn.prefix>/datasets/<org_id>/<name>/<path>`;
71
+ `source_uri` is set to that prefix and `source_type` becomes `managed`.
72
+
73
+ Uploading does **not** index/embed. To make a managed dataset searchable, build
74
+ a LanceDB index (written to the same connection) — opt-in:
75
+
76
+ ```python
77
+ ord.index_dataset("gladia/my-text-set", text_columns=["en", "fr"]) # FTS, no external svc
78
+ ord.search_dataset("gladia/my-text-set", "translation", limit=10)
79
+ ord.index_dataset("gladia/my-text-set", embed=True) # + vectors, only if a server embedder is set
80
+ ```
81
+
82
+ CLI: `openrunner datasets index org/name --text-col en --text-col fr`,
83
+ `openrunner datasets search org/name "translation"`. FTS indexes a single
84
+ combined `_text` column so one query spans all text fields; preview/search read
85
+ the LanceDB table on the dataset's own connection.
86
+
87
+ # OpenRunner MCP Integration
88
+
89
+ When the user publishes a MODEL, or asks to write/update a model card:
90
+ - FIRST call `mcp__openrunner__openrunner_model_card_standard` (pass `model_type`/`task`)
91
+ to get the rules + a fill-in template. Follow it exactly.
92
+ - Ground every number in REAL data — read run `summary` (metrics live there),
93
+ `config`, environment, the project's AI sessions and repo reports. NEVER
94
+ fabricate a number; flag unknowns as `must benchmark`. Label each figure
95
+ `(ours, measured, <protocol>)` or as an external published reference.
96
+ - Write the card with `mcp__openrunner__openrunner_set_model_card` (it validates
97
+ against the standard and returns non-blocking warnings). It only ever PATCHes
98
+ `card_markdown` — never touch other fields/runs/weights.
99
+ - From the SDK: `openrunner.set_model_card(name, md)` / `openrunner.get_model_card(name)`,
100
+ `openrunner.MODEL_CARD_STANDARD`, `openrunner.model_card_template()`,
101
+ `openrunner.validate_model_card(md)`. CLI: `openrunner upload-artifact ... --card card.md`.
102
+ Call `log_artifact`/`link_artifact` EXACTLY ONCE per version (a second call
103
+ duplicates the version).
104
+
105
+ When the user says a model is "done", wants to hand it over / ship / deploy it, or
106
+ asks how to make a model ready for product (the ML / inference / foundations teams):
107
+ - FIRST call `mcp__openrunner__openrunner_handover_standard` (pass `model_name`) to
108
+ get the Gladia Model Handover Standard: 13 mandatory deliverables, Definition of
109
+ Done, enablement session, ownership transfer, maturity tags POC/BETA/PROD-READY.
110
+ - "It's done" != "ready for product". Ownership only transfers when the receiving
111
+ team can operate, modify, retrain and deploy WITHOUT the author.
112
+ - Assess each deliverable against REAL artifacts/runs; fill gaps (model card via
113
+ `openrunner_model_card_standard`, benchmarks vs Solaria baselines, license
114
+ analysis, repro script, ops/COGS, known gaps with owner+ETA).
115
+ - Validate with `mcp__openrunner__openrunner_validate_handover` (pass a `status`
116
+ map + `maturity`). Never call a model PROD-READY while a BLOCKING gap is open.
117
+ - SDK: `openrunner.HANDOVER_STANDARD`, `handover_ticket_template(name)`,
118
+ `validate_handover(status, maturity=...)`. CLI: `openrunner handover standard|ticket|check`.
119
+ Slash command: `/openrunner:handover`.
120
+
121
+ When the user asks about training metrics, loss charts, run data, or experiment results:
122
+ - Use `mcp__openrunner__openrunner_watch_run` to show ASCII sparkline charts
123
+ - Use `mcp__openrunner__openrunner_get_run_metrics` for raw metrics
124
+ - Use `mcp__openrunner__openrunner_list_runs` to find runs
125
+ - Use `mcp__openrunner__openrunner_search_sessions` to search AI session history
126
+
127
+ Do NOT parse log files or grep for metrics when OpenRunner MCP tools are available.
128
+
129
+ When the user asks to monitor a training, diagnose loss curves, or get training
130
+ advice (diverging, overfitting, plateau, NaN loss, LR tuning):
131
+ - Use `mcp__openrunner__openrunner_monitor_training` for a health verdict
132
+ (HEALTHY / IMPROVING / PLATEAUED / OVERFITTING / UNSTABLE / DIVERGING) plus
133
+ per-metric trend, plateau, instability and overfitting signals.
134
+ - Run `/openrunner:training-recommendations [run_id]` for actionable fixes.
135
+
136
+ When the user makes or describes a deliberate decision (changing a param,
137
+ switching strategy, picking an architecture, a data/process/tooling choice):
138
+ - Use `mcp__openrunner__openrunner_log_decision` to document it (context,
139
+ rationale, alternatives; `source_runs` for the run(s) it was decided from,
140
+ `param`/`old_value`/`new_value` for a param change, optional `markdown` body
141
+ + `attachment_url` PDF).
142
+ - Use `mcp__openrunner__openrunner_set_decision_runs` to attach resulting runs.
143
+ - Use `mcp__openrunner__openrunner_list_decisions` to review the decision log.
144
+ - Run `/openrunner:log-decision` for a guided capture.
145
+ - Decisions render to HTML/PDF: `GET /projects/{id}/decisions/{id}/render?format=pdf`.
146
+
147
+ When the user asks about papers, research, or sessions:
148
+ - Use `mcp__openrunner__openrunner_search_papers` for paper content
149
+ - Use `mcp__openrunner__openrunner_search_research` for research plans
150
+ - Use `mcp__openrunner__openrunner_search_sessions` for AI session history
151
+ - Use `mcp__openrunner__openrunner_update_paper` to modify paper sections
@@ -35,6 +35,9 @@ Public API:
35
35
  openrunner.launch -> Create a remote execution job
36
36
  openrunner.launch.from_run -> Re-launch from a previous run's config
37
37
  openrunner.LaunchJob -> Job handle with .wait() and .cancel()
38
+ openrunner.reload_run -> Reload a run to resume/recalibrate/restart it
39
+ openrunner.reload_environment -> Reload a full experiment env (config, data,
40
+ checkpoints, model card, AI sessions) to iterate
38
41
  openrunner.trace -> Decorator for LLM call tracing (supports sample_rate)
39
42
  openrunner.trace.patch_openai -> Auto-trace OpenAI chat completions
40
43
  openrunner.Prompt -> Versioned prompt management (get/render/publish)
@@ -65,6 +68,43 @@ from pathlib import Path
65
68
  from typing import Any
66
69
 
67
70
  from openrunner.artifact import Artifact
71
+ from openrunner.model_card import (
72
+ MODEL_CARD_STANDARD,
73
+ model_card_standard,
74
+ model_card_template,
75
+ validate_model_card,
76
+ )
77
+ from openrunner.handover import (
78
+ HANDOVER_STANDARD,
79
+ HANDOVER_DELIVERABLES,
80
+ MATURITY_TAGS,
81
+ MATURITY_DEFINITIONS,
82
+ OPTIMIZATION_SWEEP_GUIDE,
83
+ handover_standard,
84
+ handover_ticket_template,
85
+ optimization_sweep_guide,
86
+ validate_handover,
87
+ )
88
+ import openrunner.datasets as datasets
89
+ from openrunner.datasets import (
90
+ DatasetInfo,
91
+ DatasetsClient,
92
+ create_dataset,
93
+ dataset_info,
94
+ index_dataset,
95
+ list_datasets,
96
+ link_project,
97
+ list_files,
98
+ load_dataset,
99
+ add_derivation,
100
+ push_dataset,
101
+ search_dataset,
102
+ set_dataset_card,
103
+ set_storage_policy,
104
+ upload_file,
105
+ upload_sharded,
106
+ upload_folder,
107
+ )
68
108
  from openrunner.config import Config
69
109
  from openrunner.model import Model
70
110
  from openrunner.prompt import MessagesPrompt, Prompt, StringPrompt
@@ -92,8 +132,21 @@ from openrunner.media import (
92
132
  from openrunner.cost import add_cost
93
133
  from openrunner.dataset import Dataset
94
134
  from openrunner.query_api import Api
135
+ from openrunner.reload import (
136
+ reload_run,
137
+ ReloadedExperiment,
138
+ reload_environment,
139
+ ExperimentEnvironment,
140
+ reload_project,
141
+ ProjectEnvironment,
142
+ check_reproducibility,
143
+ ReproReport,
144
+ dataset_handle,
145
+ )
146
+ from openrunner.sync import sync_environment, scan_environment
147
+ from openrunner.projects import create_project
95
148
  from openrunner.run import Run
96
- from openrunner.settings import SDKSettings
149
+ from openrunner.settings import SDKSettings, resolve_project, pin_project
97
150
  from openrunner.summary import Summary
98
151
  from openrunner.sweep import agent, sweep
99
152
  from openrunner.evaluation import EvaluationLogger, Scorer, evaluate, scorer
@@ -112,6 +165,9 @@ from openrunner.trace import trace, patch_openai as _patch_openai, set_thread_id
112
165
  import openrunner.scorers as scorers
113
166
  import openrunner.plot as plot
114
167
  import openrunner.gpu as gpu
168
+ import openrunner.autoresearch as autoresearch
169
+ import openrunner.research as research
170
+ import openrunner.machine as machine
115
171
 
116
172
  # Attach from_run as a method on the launch function for
117
173
  # openrunner.launch.from_run() syntax
@@ -121,10 +177,14 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
121
177
  # openrunner.trace.patch_openai() syntax
122
178
  trace.patch_openai = _patch_openai # type: ignore[attr-defined]
123
179
 
124
- __version__ = "2.24.2"
180
+ __version__ = "2.37.0"
125
181
 
126
182
  logger = logging.getLogger("openrunner")
127
183
 
184
+
185
+ class _RequireOrgError(ValueError):
186
+ """Raised (and never swallowed) when a run is created without an explicit org."""
187
+
128
188
  # Auto-install/update slash commands + MCP on import if version changed
129
189
  def _auto_install_on_import():
130
190
  try:
@@ -424,6 +484,7 @@ def init(
424
484
  config_exclude_keys: list[str] | None = None,
425
485
  config_include_keys: list[str] | None = None,
426
486
  allow_val_change: bool = False,
487
+ datasets: list[str] | str | None = None,
427
488
  **kwargs: Any,
428
489
  ) -> Run | None:
429
490
  """Initialize a new run.
@@ -468,6 +529,10 @@ def init(
468
529
  allow_val_change: If True, allow overwriting existing config values.
469
530
  If False (default), setting a config key that already has
470
531
  a different value raises ValueError.
532
+ datasets: Dataset(s) to link to this run for data lineage — a UUID,
533
+ 'org/name', or a list of them. ALWAYS pass the dataset(s) a
534
+ run trains/evaluates on so the run is reproducible (no
535
+ "no dataset linked" gap). Failures are logged, never raised.
471
536
 
472
537
  Returns:
473
538
  The Run object, or None if initialization fails.
@@ -526,8 +591,16 @@ def init(
526
591
  if resume is None and settings.resume:
527
592
  resume = settings.resume
528
593
 
529
- # Resolve project
594
+ # Resolve project — REQUIRE explicit "org/project". A bare name (or the
595
+ # "uncategorized" fallback) resolves ambiguously across orgs, so reject
596
+ # it loudly (raised below — not swallowed by the resilience wrapper).
530
597
  resolved_project = project or settings.project or "uncategorized"
598
+ if "/" not in resolved_project or not resolved_project.split("/", 1)[0].strip():
599
+ raise _RequireOrgError(
600
+ f"project must be 'org/project' (got {resolved_project!r}). "
601
+ "A bare project name is rejected — set e.g. project='gladia/my-project' "
602
+ "or OPENRUNNER_PROJECT='gladia/my-project'."
603
+ )
531
604
 
532
605
  # Warn if no API key (skip in offline mode)
533
606
  if not settings.api_key and settings.mode != "offline":
@@ -577,6 +650,20 @@ def init(
577
650
  except Exception as e:
578
651
  logger.warning("openrunner.init() save_code failed: %s", e)
579
652
 
653
+ # Auto-link datasets to the run (data lineage) — avoids the run-level
654
+ # "no dataset linked" reproducibility gap. Accepts UUIDs or 'org/name'.
655
+ if datasets:
656
+ refs = [datasets] if isinstance(datasets, str) else list(datasets)
657
+ try:
658
+ from openrunner import datasets as _ds
659
+ for ref in refs:
660
+ try:
661
+ _ds.link_run(ref, run.id)
662
+ except Exception as e: # noqa: BLE001
663
+ logger.warning("init() could not link dataset %r: %s", ref, e)
664
+ except Exception as e: # noqa: BLE001
665
+ logger.warning("init() dataset linking unavailable: %s", e)
666
+
580
667
  # Auto-import TensorBoard logs if requested
581
668
  if sync_tensorboard_path:
582
669
  try:
@@ -608,6 +695,8 @@ def init(
608
695
 
609
696
  return run
610
697
 
698
+ except _RequireOrgError:
699
+ raise # hard-fail: never push to an ambiguous/wrong org
611
700
  except Exception as e:
612
701
  logger.warning("openrunner.init() failed: %s", e)
613
702
  return None
@@ -810,6 +899,43 @@ def link_artifact(
810
899
  return None
811
900
 
812
901
 
902
+ def set_model_card(name: str, card_markdown: str) -> dict[str, Any] | None:
903
+ """Set the model card on a published artifact. Never raises.
904
+
905
+ Validates against ``MODEL_CARD_STANDARD`` (warnings are logged, not
906
+ enforced), then PATCHes ``card_markdown`` on the artifact named ``name`` in
907
+ the active run's project.
908
+
909
+ Args:
910
+ name: Artifact name (the model you published).
911
+ card_markdown: Full markdown card body. See ``MODEL_CARD_STANDARD`` and
912
+ ``model_card_template()``.
913
+
914
+ Returns:
915
+ The updated artifact dict, or None on failure.
916
+ """
917
+ try:
918
+ if _active_run is None:
919
+ logger.warning("openrunner.set_model_card(): no active run — call init() first")
920
+ return None
921
+ return _active_run.set_model_card(name, card_markdown)
922
+ except Exception as e:
923
+ logger.warning("openrunner.set_model_card() failed: %s", e)
924
+ return None
925
+
926
+
927
+ def get_model_card(name: str) -> str | None:
928
+ """Return the current card_markdown for an artifact by name. Never raises."""
929
+ try:
930
+ if _active_run is None:
931
+ logger.warning("openrunner.get_model_card(): no active run — call init() first")
932
+ return None
933
+ return _active_run.get_model_card(name)
934
+ except Exception as e:
935
+ logger.warning("openrunner.get_model_card() failed: %s", e)
936
+ return None
937
+
938
+
813
939
  def use_artifact(
814
940
  name: str, version: int | None = None, alias: str | None = None
815
941
  ) -> Path | None: