openrunner-sdk 2.37.5__tar.gz → 2.37.7__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.5 → openrunner_sdk-2.37.7}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/api_client.py +33 -0
  4. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/cli.py +33 -0
  5. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/install_commands.py +139 -0
  6. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/pyproject.toml +1 -1
  7. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/.gitignore +0 -0
  8. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/=6.0 +0 -0
  9. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/=8.1 +0 -0
  10. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/README.md +0 -0
  11. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/CLAUDE.md +0 -0
  12. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/_safepath.py +0 -0
  13. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/_secret_rules.py +0 -0
  14. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/artifact.py +0 -0
  15. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/autoresearch.py +0 -0
  16. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/buffer.py +0 -0
  17. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/cache.py +0 -0
  18. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/config.py +0 -0
  19. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/cost.py +0 -0
  20. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/dataset.py +0 -0
  21. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/datasets.py +0 -0
  22. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/environment.py +0 -0
  23. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/evaluation.py +0 -0
  24. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/feedback.py +0 -0
  25. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/git_info.py +0 -0
  26. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/__init__.py +0 -0
  27. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/api_integration.py +0 -0
  28. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/cost_guard.py +0 -0
  29. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/gpu_types.py +0 -0
  30. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/price_compare.py +0 -0
  31. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/provider_base.py +0 -0
  32. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/__init__.py +0 -0
  33. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  34. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/modal_provider.py +0 -0
  35. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/ovhcloud.py +0 -0
  36. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/runpod.py +0 -0
  37. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/vastai.py +0 -0
  38. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/runner.py +0 -0
  39. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/workspace_sync.py +0 -0
  40. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/guardrails.py +0 -0
  41. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/handover.py +0 -0
  42. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/hooks/patent-lab-post-commit +0 -0
  43. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/__init__.py +0 -0
  44. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/accelerate.py +0 -0
  45. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/anthropic_tracer.py +0 -0
  46. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/catboost.py +0 -0
  47. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/diffusers.py +0 -0
  48. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/fastai.py +0 -0
  49. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/forced_alignment.py +0 -0
  50. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/gladia.py +0 -0
  51. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/gymnasium.py +0 -0
  52. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/huggingface.py +0 -0
  53. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/hydra.py +0 -0
  54. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/ignite.py +0 -0
  55. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/jax.py +0 -0
  56. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/keras.py +0 -0
  57. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/langchain.py +0 -0
  58. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/lightgbm.py +0 -0
  59. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/lightning.py +0 -0
  60. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/llamaindex.py +0 -0
  61. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/openai_finetune.py +0 -0
  62. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/openai_tracer.py +0 -0
  63. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/optuna.py +0 -0
  64. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/pytorch.py +0 -0
  65. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/sb3.py +0 -0
  66. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/sklearn.py +0 -0
  67. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/skypilot.py +0 -0
  68. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/tensorflow.py +0 -0
  69. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/trl.py +0 -0
  70. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/tts.py +0 -0
  71. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/ultralytics.py +0 -0
  72. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/voice_agent.py +0 -0
  73. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/whisper.py +0 -0
  74. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/xgboost.py +0 -0
  75. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/launch.py +0 -0
  76. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/machine.py +0 -0
  77. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/mcp_server.py +0 -0
  78. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/media.py +0 -0
  79. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/migrate.py +0 -0
  80. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/model.py +0 -0
  81. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/model_card.py +0 -0
  82. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/offline.py +0 -0
  83. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/patent_scan.py +0 -0
  84. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/pii.py +0 -0
  85. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/plot.py +0 -0
  86. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/projects.py +0 -0
  87. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/prompt.py +0 -0
  88. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/query_api.py +0 -0
  89. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/redact.py +0 -0
  90. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/reload.py +0 -0
  91. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/research.py +0 -0
  92. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/research_policy.py +0 -0
  93. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/run.py +0 -0
  94. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/scorers.py +0 -0
  95. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/sender.py +0 -0
  96. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/session.py +0 -0
  97. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/settings.py +0 -0
  98. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/summary.py +0 -0
  99. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/sweep.py +0 -0
  100. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/sync.py +0 -0
  101. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/system_metrics.py +0 -0
  102. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/tensorboard.py +0 -0
  103. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/tools/__init__.py +0 -0
  104. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/tools/patent_report.py +0 -0
  105. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/trace.py +0 -0
  106. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/transcript_formatter.py +0 -0
  107. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wal.py +0 -0
  108. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wandb_compat/__init__.py +0 -0
  109. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wandb_compat/_shim.py +0 -0
  110. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wer.py +0 -0
  111. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/scripts/gen_betterleaks_rules.py +0 -0
  112. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/__init__.py +0 -0
  113. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/conftest.py +0 -0
  114. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  115. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  116. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  117. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  118. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  119. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  120. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  121. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  122. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  123. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  124. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  125. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  126. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/integration/__init__.py +0 -0
  127. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/integration/conftest.py +0 -0
  128. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/integration/test_artifact_round_trip.py +0 -0
  129. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_alert.py +0 -0
  130. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_aliases.py +0 -0
  131. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_api_client.py +0 -0
  132. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_artifact.py +0 -0
  133. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_buffer.py +0 -0
  134. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_cache.py +0 -0
  135. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_class_scorers.py +0 -0
  136. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_cli.py +0 -0
  137. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_config.py +0 -0
  138. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_evaluation.py +0 -0
  139. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_finish.py +0 -0
  140. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_git_info.py +0 -0
  141. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/__init__.py +0 -0
  142. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/conftest.py +0 -0
  143. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_cost_guard.py +0 -0
  144. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_gpu_types.py +0 -0
  145. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_lambda.py +0 -0
  146. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_modal.py +0 -0
  147. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_ovhcloud.py +0 -0
  148. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_price_compare.py +0 -0
  149. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_provider_base.py +0 -0
  150. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_runner.py +0 -0
  151. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_runpod.py +0 -0
  152. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  153. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_vastai.py +0 -0
  154. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_workspace_sync.py +0 -0
  155. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_init.py +0 -0
  156. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_install_commands.py +0 -0
  157. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_fastai.py +0 -0
  158. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_huggingface.py +0 -0
  159. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_keras.py +0 -0
  160. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_langchain.py +0 -0
  161. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_lightning.py +0 -0
  162. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_pytorch.py +0 -0
  163. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_sklearn.py +0 -0
  164. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_xgboost.py +0 -0
  165. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_launch.py +0 -0
  166. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_log.py +0 -0
  167. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_log_code.py +0 -0
  168. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_mcp_decisions.py +0 -0
  169. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_mcp_monitor.py +0 -0
  170. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_mcp_predictions.py +0 -0
  171. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_media.py +0 -0
  172. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_migrate.py +0 -0
  173. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_offline.py +0 -0
  174. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_offline_sync.py +0 -0
  175. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_pii.py +0 -0
  176. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_plot.py +0 -0
  177. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_query_api.py +0 -0
  178. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_resume.py +0 -0
  179. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_sdk_features.py +0 -0
  180. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_sender.py +0 -0
  181. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_session_sync.py +0 -0
  182. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_summary.py +0 -0
  183. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_sweep.py +0 -0
  184. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_system_metrics.py +0 -0
  185. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_trace.py +0 -0
  186. {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/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.5
3
+ Version: 2.37.7
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.5"
184
+ __version__ = "2.37.7"
185
185
 
186
186
  logger = logging.getLogger("openrunner")
187
187
 
@@ -147,6 +147,39 @@ class APIClient:
147
147
  logger.warning("post_metrics failed: %s", e)
148
148
  return 0
149
149
 
150
+ def create_api_key(
151
+ self,
152
+ name: str,
153
+ scopes: list[str] | None = None,
154
+ scope_project_id: str | None = None,
155
+ scope_org_id: str | None = None,
156
+ ) -> dict[str, Any] | None:
157
+ """POST /users/me/api-keys -- mint a scoped API key.
158
+
159
+ ``scopes`` are fine-grained capability scopes, e.g.
160
+ ``["drift:read", "drift:write"]``; None/empty means full access.
161
+ ``scope_project_id`` / ``scope_org_id`` further restrict the key to a
162
+ single project/org. The plaintext key is returned ONCE, in the ``key``
163
+ field of the response dict -- it is never retrievable again.
164
+
165
+ Returns the created-key dict (incl. plaintext ``key``), or None on
166
+ failure.
167
+ """
168
+ try:
169
+ body: dict[str, Any] = {"name": name}
170
+ if scopes:
171
+ body["scopes"] = scopes
172
+ if scope_project_id:
173
+ body["scope_project_id"] = scope_project_id
174
+ if scope_org_id:
175
+ body["scope_org_id"] = scope_org_id
176
+ response = self._request("post", "/users/me/api-keys", json=body)
177
+ response.raise_for_status()
178
+ return response.json()
179
+ except Exception as e:
180
+ logger.warning("create_api_key failed: %s", e)
181
+ return None
182
+
150
183
  def post_inference_events(
151
184
  self,
152
185
  project_id: str,
@@ -4339,6 +4339,39 @@ def drift_group() -> None:
4339
4339
  pass
4340
4340
 
4341
4341
 
4342
+ @drift_group.command("key")
4343
+ @click.option("--project", "-p", default=None, help="Project org/name or UUID to scope the key to")
4344
+ @click.option("--name", "-n", default=None, help="Key name (default: drift-<project>)")
4345
+ @click.option("--read-only", is_flag=True, help="Mint a drift:read-only key (no ingest)")
4346
+ @click.option("--json", "as_json", is_flag=True, help="Print the key record as JSON")
4347
+ def drift_key(project, name, read_only, as_json) -> None:
4348
+ """Mint an API key scoped to inference-drift only (read+write by default).
4349
+
4350
+ The key carries ONLY ``drift:read``+``drift:write`` (or ``drift:read`` with
4351
+ --read-only) and is bound to the project — it cannot touch runs, datasets,
4352
+ artifacts, weights, or any other domain. Give this to a container/service
4353
+ that reports drift events instead of a full-access key. The plaintext key is
4354
+ shown ONCE; store it as the container's ``OPENRUNNER_API_KEY``.
4355
+ """
4356
+ import json as _json
4357
+
4358
+ client, pid = _drift_client_project(project)
4359
+ scopes = ["drift:read"] if read_only else ["drift:read", "drift:write"]
4360
+ key_name = name or f"drift-{(project or _load_settings().get('project') or pid)}".replace("/", "-")
4361
+ rec = client.create_api_key(key_name, scopes=scopes, scope_project_id=pid)
4362
+ client.close()
4363
+ if not rec or not rec.get("key"):
4364
+ click.echo("Error: failed to mint drift key (check login / project membership).", err=True)
4365
+ raise SystemExit(1)
4366
+ if as_json:
4367
+ click.echo(_json.dumps(rec))
4368
+ return
4369
+ click.echo(f"name: {rec.get('name')}")
4370
+ click.echo(f"scopes: {','.join(rec.get('scopes') or scopes)}")
4371
+ click.echo(f"key: {rec['key']}")
4372
+ click.echo("\nStore as the container env OPENRUNNER_API_KEY — shown only once.")
4373
+
4374
+
4342
4375
  @drift_group.command("report")
4343
4376
  @click.argument("events_json", type=click.Path(exists=True))
4344
4377
  @click.option("--project", "-p", default=None, help="Project org/name or UUID")
@@ -2718,6 +2718,141 @@ openrunner drift report events.json --project ORG/NAME --monitor asr-prod
2718
2718
  """
2719
2719
 
2720
2720
 
2721
+ DRIFT_INSTALL_CMD = """---
2722
+ name: {prefix}drift-install
2723
+ description: Actually wire inference-drift monitoring INTO the API in THIS repo -- detect the framework + endpoints, add a non-blocking reporter, insert record_inference() after each prediction, add the dependency, and verify with a live event (vs /openrunner:drift which only explains it)
2724
+ argument-hint: "[project org/name] [--endpoint PATH] [--sample N]"
2725
+ allowed-tools:
2726
+ - Bash
2727
+ - Read
2728
+ - Edit
2729
+ - Write
2730
+ - Grep
2731
+ - Glob
2732
+ - AskUserQuestion
2733
+ ---
2734
+
2735
+ Instrument the inference API in the **current repo** with OpenRunner drift
2736
+ monitoring -- edit the code, don't just describe it (see `/openrunner:drift` for
2737
+ the reference). Do each step; ask only when genuinely ambiguous.
2738
+
2739
+ ## Step 1 -- detect the API + inference endpoint(s)
2740
+ - Identify the framework (grep `fastapi`, `flask`, `django`, `express`,
2741
+ `@app.post`, `APIRouter`, route decorators) and the file(s) with the
2742
+ **inference** endpoint(s) -- the handlers that return model predictions.
2743
+ - If several, ask which to instrument (default: the prediction routes). Honour
2744
+ `--endpoint PATH` when given.
2745
+
2746
+ ## Step 2 -- resolve project + mint a DRIFT-ONLY key for the container
2747
+ - `openrunner login` if needed. Resolve the project id (from the `org/name` arg,
2748
+ else `APIClient.list_projects()`; ask if ambiguous).
2749
+ - **Mint a scoped key for this container** -- do NOT reuse the user's full key.
2750
+ Run `openrunner drift key --project ORG/NAME --name drift-<service>` (add
2751
+ `--json` to capture it). It returns a key carrying ONLY `drift:read` +
2752
+ `drift:write`, bound to that project: it can report/read drift and nothing else
2753
+ (no runs, datasets, artifacts, weights). Shown once.
2754
+ - Inject it as the container's `OPENRUNNER_API_KEY` (+ optional
2755
+ `OPENRUNNER_BASE_URL`) via `.env.example` / deploy secret -- **never hardcode
2756
+ the key** in source. Store `PROJECT_ID` as a module constant or env var.
2757
+ - If key minting fails (e.g. the user lacks membership), fall back to the
2758
+ existing `OPENRUNNER_API_KEY` from env and note it is broader than needed.
2759
+
2760
+ ## Step 3 -- add the non-blocking reporter module
2761
+ Create `openrunner_drift.py` (match the repo layout) with a background batcher
2762
+ (thread + `queue`, drop on full, 200/flush, 429 backoff via the SDK) exposing
2763
+ `record_inference(inference_id, metadata, metrics)` -- the pattern from
2764
+ `/openrunner:drift`. For an async framework, use an asyncio task + `asyncio.Queue`
2765
+ instead of a thread.
2766
+
2767
+ ## Step 4 -- instrument each endpoint
2768
+ AFTER the response is produced, insert a wrapped `record_inference(...)`:
2769
+ - `inference_id` = the request id / a `uuid4().hex`.
2770
+ - `metadata` = input axes present in the handler: model version, language, route,
2771
+ region, tenant/customer.
2772
+ - `metrics` = outputs + **latency measured around the model call** (wrap the
2773
+ predict call with a monotonic timer), output confidence/score, input length,
2774
+ token count.
2775
+ - Wrap in try/except (or the queue put_nowait) so monitoring **never** breaks or
2776
+ slows the request. Apply `--sample N` (report 1 in N) if given.
2777
+
2778
+ ## Step 5 -- dependency + verify
2779
+ - Add `openrunner-sdk` to `requirements.txt` / `pyproject.toml` if missing.
2780
+ - Import-check the new module; send ONE synthetic event
2781
+ (`post_inference_events(PROJECT_ID, [{{...}}])`) and confirm `ingested: 1`.
2782
+ - Point the user at the **Drift** UI and `openrunner drift check --project ORG/NAME
2783
+ --metric confidence`.
2784
+
2785
+ ## Guardrails
2786
+ - NEVER block or fail the request path for monitoring (drop on queue-full).
2787
+ - NEVER store raw inputs/outputs -- only the chosen metrics + metadata.
2788
+ - NEVER hardcode the API key -- read from env.
2789
+ - Keep the diff minimal + match the repo's style/imports.
2790
+ """
2791
+
2792
+
2793
+ BUILD_API_CMD = """---
2794
+ name: {prefix}build-api
2795
+ description: Scaffold a production inference API for a model in THIS repo -- FastAPI /predict + /health, typed request/response, Dockerfile (pushable via the OpenRunner registry), env config, and optional baked-in drift monitoring; ready to deploy on governed GPUs
2796
+ argument-hint: "[--model PATH_OR_ARTIFACT] [--framework fastapi] [--drift] [--registry NAME/ns]"
2797
+ allowed-tools:
2798
+ - Bash
2799
+ - Read
2800
+ - Edit
2801
+ - Write
2802
+ - Grep
2803
+ - Glob
2804
+ - AskUserQuestion
2805
+ ---
2806
+
2807
+ Scaffold a serving API for a model in the **current repo** -- a real, runnable
2808
+ skeleton, not a description. Ask only what you can't infer.
2809
+
2810
+ ## Step 1 -- understand the model
2811
+ - Find the model: a local checkpoint, an `openrunner.use_model(...)` artifact, a
2812
+ HF id, or a `predict()` the user points at (`--model`). Ask if unclear.
2813
+ - Determine input -> output shape (text/audio/image in; label/score/text out) to
2814
+ type the request/response.
2815
+
2816
+ ## Step 2 -- scaffold the API (default FastAPI)
2817
+ Write a minimal, production-shaped service:
2818
+ - `app/main.py` -- FastAPI app; load the model ONCE at startup (lifespan), a typed
2819
+ `POST /predict` (pydantic request/response), `GET /health` (model-loaded probe),
2820
+ `GET /` version. Batch-friendly handler; no blocking work in the event loop for
2821
+ heavy models (run in a threadpool / worker).
2822
+ - `app/model.py` -- load + `predict()` wrapper (pull weights via
2823
+ `openrunner.use_model` when the model is an OpenRunner artifact).
2824
+ - `requirements.txt` / `pyproject.toml`, `.env.example` (PORT, model ref,
2825
+ `OPENRUNNER_*`), `README.md` (run + curl example).
2826
+ - `Dockerfile` -- slim base, install deps, copy app, `CMD` uvicorn on `$PORT`;
2827
+ GPU base image if the model needs CUDA.
2828
+
2829
+ ## Step 3 -- (optional) bake in drift monitoring
2830
+ If `--drift` (or the user wants it): run the `/openrunner:drift-install` flow on
2831
+ the freshly scaffolded `/predict` -- add the non-blocking reporter + a
2832
+ `record_inference(...)` after the prediction (latency, confidence, input length).
2833
+
2834
+ ## Step 4 -- (optional) container + deploy path
2835
+ - If `--registry NAME/ns`: show the governed push --
2836
+ `docker build -t registry.openrun.gladia.io/<ns>/<name>:v1 . && openrunner
2837
+ registry login && docker push ...` (the OpenRunner broker proxies to the org's
2838
+ upstream; see `/openrunner:registry`).
2839
+ - Note the deploy path: `openrunner gpu run --image <that image> ...` today, and
2840
+ the governed **Deployments** UI (image + GPU + min/max nodes) when available.
2841
+
2842
+ ## Step 5 -- verify it runs
2843
+ - `uvicorn app.main:app` locally (or `python -m app`), `curl /health` -> ok,
2844
+ `curl -X POST /predict` with a sample payload -> a real response.
2845
+ - Report the run command, the curl example, and the build/push/deploy one-liners.
2846
+
2847
+ ## Guardrails
2848
+ - Load the model once (startup), not per request; run heavy inference off the
2849
+ event loop.
2850
+ - Type the API (pydantic) and add `/health` so it's deploy/LB-ready.
2851
+ - Read config (model ref, keys, port) from env -- never hardcode secrets.
2852
+ - Keep it minimal + runnable; match the repo's language/stack if one exists.
2853
+ """
2854
+
2855
+
2721
2856
  def install_claude_code() -> list[str]:
2722
2857
  """Install commands in ~/.claude/commands/openrunner/."""
2723
2858
  cmd_dir = Path.home() / ".claude" / "commands" / "openrunner"
@@ -2753,6 +2888,8 @@ def install_claude_code() -> list[str]:
2753
2888
  "launch-gpu.md": LAUNCH_GPU_CMD,
2754
2889
  "registry.md": REGISTRY_CMD,
2755
2890
  "drift.md": DRIFT_CMD,
2891
+ "drift-install.md": DRIFT_INSTALL_CMD,
2892
+ "build-api.md": BUILD_API_CMD,
2756
2893
  }
2757
2894
 
2758
2895
  files = []
@@ -2956,6 +3093,8 @@ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") ->
2956
3093
  "launch-gpu.md": LAUNCH_GPU_CMD,
2957
3094
  "registry.md": REGISTRY_CMD,
2958
3095
  "drift.md": DRIFT_CMD,
3096
+ "drift-install.md": DRIFT_INSTALL_CMD,
3097
+ "build-api.md": BUILD_API_CMD,
2959
3098
  }
2960
3099
 
2961
3100
  files = []
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.37.5"
3
+ version = "2.37.7"
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