openrunner-sdk 2.24.2__tar.gz → 2.25.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 (170) hide show
  1. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/PKG-INFO +1 -1
  2. openrunner_sdk-2.25.0/openrunner/CLAUDE.md +33 -0
  3. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/__init__.py +1 -1
  4. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/install_commands.py +187 -0
  5. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/mcp_server.py +679 -0
  6. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/pyproject.toml +1 -1
  7. openrunner_sdk-2.25.0/tests/test_mcp_decisions.py +187 -0
  8. openrunner_sdk-2.25.0/tests/test_mcp_monitor.py +146 -0
  9. openrunner_sdk-2.24.2/openrunner/CLAUDE.md +0 -15
  10. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/.gitignore +0 -0
  11. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/=6.0 +0 -0
  12. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/=8.1 +0 -0
  13. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/README.md +0 -0
  14. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/api_client.py +0 -0
  15. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/artifact.py +0 -0
  16. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/buffer.py +0 -0
  17. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/cache.py +0 -0
  18. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/cli.py +0 -0
  19. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/config.py +0 -0
  20. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/cost.py +0 -0
  21. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/dataset.py +0 -0
  22. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/environment.py +0 -0
  23. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/evaluation.py +0 -0
  24. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/feedback.py +0 -0
  25. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/git_info.py +0 -0
  26. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/__init__.py +0 -0
  27. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/api_integration.py +0 -0
  28. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/cost_guard.py +0 -0
  29. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/gpu_types.py +0 -0
  30. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/price_compare.py +0 -0
  31. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/provider_base.py +0 -0
  32. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/providers/__init__.py +0 -0
  33. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  34. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/providers/modal_provider.py +0 -0
  35. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/providers/ovhcloud.py +0 -0
  36. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/providers/runpod.py +0 -0
  37. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/providers/vastai.py +0 -0
  38. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/gpu/workspace_sync.py +0 -0
  39. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/guardrails.py +0 -0
  40. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/hooks/patent-lab-post-commit +0 -0
  41. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/__init__.py +0 -0
  42. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/accelerate.py +0 -0
  43. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/anthropic_tracer.py +0 -0
  44. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/catboost.py +0 -0
  45. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/diffusers.py +0 -0
  46. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/fastai.py +0 -0
  47. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/forced_alignment.py +0 -0
  48. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/gladia.py +0 -0
  49. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/gymnasium.py +0 -0
  50. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/huggingface.py +0 -0
  51. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/hydra.py +0 -0
  52. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/ignite.py +0 -0
  53. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/jax.py +0 -0
  54. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/keras.py +0 -0
  55. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/langchain.py +0 -0
  56. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/lightgbm.py +0 -0
  57. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/lightning.py +0 -0
  58. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/llamaindex.py +0 -0
  59. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/openai_finetune.py +0 -0
  60. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/openai_tracer.py +0 -0
  61. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/optuna.py +0 -0
  62. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/pytorch.py +0 -0
  63. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/sb3.py +0 -0
  64. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/sklearn.py +0 -0
  65. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/skypilot.py +0 -0
  66. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/tensorflow.py +0 -0
  67. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/trl.py +0 -0
  68. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/tts.py +0 -0
  69. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/ultralytics.py +0 -0
  70. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/voice_agent.py +0 -0
  71. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/whisper.py +0 -0
  72. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/integration/xgboost.py +0 -0
  73. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/launch.py +0 -0
  74. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/media.py +0 -0
  75. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/migrate.py +0 -0
  76. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/model.py +0 -0
  77. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/offline.py +0 -0
  78. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/patent_scan.py +0 -0
  79. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/pii.py +0 -0
  80. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/plot.py +0 -0
  81. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/prompt.py +0 -0
  82. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/query_api.py +0 -0
  83. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/redact.py +0 -0
  84. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/run.py +0 -0
  85. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/scorers.py +0 -0
  86. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/sender.py +0 -0
  87. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/session.py +0 -0
  88. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/settings.py +0 -0
  89. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/summary.py +0 -0
  90. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/sweep.py +0 -0
  91. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/system_metrics.py +0 -0
  92. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/tensorboard.py +0 -0
  93. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/tools/__init__.py +0 -0
  94. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/tools/patent_report.py +0 -0
  95. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/trace.py +0 -0
  96. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/transcript_formatter.py +0 -0
  97. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/wal.py +0 -0
  98. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/wandb_compat/__init__.py +0 -0
  99. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/wandb_compat/_shim.py +0 -0
  100. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/openrunner/wer.py +0 -0
  101. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/__init__.py +0 -0
  102. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/conftest.py +0 -0
  103. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  104. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  105. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  106. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  107. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  108. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  109. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  110. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  111. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  112. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  113. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  114. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  115. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/integration/__init__.py +0 -0
  116. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/integration/conftest.py +0 -0
  117. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/integration/test_artifact_round_trip.py +0 -0
  118. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_alert.py +0 -0
  119. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_aliases.py +0 -0
  120. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_api_client.py +0 -0
  121. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_artifact.py +0 -0
  122. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_buffer.py +0 -0
  123. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_cache.py +0 -0
  124. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_class_scorers.py +0 -0
  125. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_cli.py +0 -0
  126. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_config.py +0 -0
  127. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_evaluation.py +0 -0
  128. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_finish.py +0 -0
  129. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_git_info.py +0 -0
  130. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/__init__.py +0 -0
  131. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/conftest.py +0 -0
  132. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_cost_guard.py +0 -0
  133. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_gpu_types.py +0 -0
  134. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_lambda.py +0 -0
  135. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_modal.py +0 -0
  136. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_ovhcloud.py +0 -0
  137. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_price_compare.py +0 -0
  138. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_provider_base.py +0 -0
  139. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_runpod.py +0 -0
  140. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  141. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_vastai.py +0 -0
  142. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_gpu/test_workspace_sync.py +0 -0
  143. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_init.py +0 -0
  144. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_fastai.py +0 -0
  145. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_huggingface.py +0 -0
  146. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_keras.py +0 -0
  147. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_langchain.py +0 -0
  148. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_lightning.py +0 -0
  149. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_pytorch.py +0 -0
  150. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_sklearn.py +0 -0
  151. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_integration_xgboost.py +0 -0
  152. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_launch.py +0 -0
  153. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_log.py +0 -0
  154. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_log_code.py +0 -0
  155. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_mcp_predictions.py +0 -0
  156. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_media.py +0 -0
  157. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_migrate.py +0 -0
  158. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_offline.py +0 -0
  159. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_offline_sync.py +0 -0
  160. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_pii.py +0 -0
  161. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_plot.py +0 -0
  162. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_query_api.py +0 -0
  163. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_resume.py +0 -0
  164. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_sdk_features.py +0 -0
  165. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_sender.py +0 -0
  166. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_summary.py +0 -0
  167. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_sweep.py +0 -0
  168. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_system_metrics.py +0 -0
  169. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.0}/tests/test_trace.py +0 -0
  170. {openrunner_sdk-2.24.2 → openrunner_sdk-2.25.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.25.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,33 @@
1
+ # OpenRunner MCP Integration
2
+
3
+ When the user asks about training metrics, loss charts, run data, or experiment results:
4
+ - Use `mcp__openrunner__openrunner_watch_run` to show ASCII sparkline charts
5
+ - Use `mcp__openrunner__openrunner_get_run_metrics` for raw metrics
6
+ - Use `mcp__openrunner__openrunner_list_runs` to find runs
7
+ - Use `mcp__openrunner__openrunner_search_sessions` to search AI session history
8
+
9
+ Do NOT parse log files or grep for metrics when OpenRunner MCP tools are available.
10
+
11
+ When the user asks to monitor a training, diagnose loss curves, or get training
12
+ advice (diverging, overfitting, plateau, NaN loss, LR tuning):
13
+ - Use `mcp__openrunner__openrunner_monitor_training` for a health verdict
14
+ (HEALTHY / IMPROVING / PLATEAUED / OVERFITTING / UNSTABLE / DIVERGING) plus
15
+ per-metric trend, plateau, instability and overfitting signals.
16
+ - Run `/openrunner:training-recommendations [run_id]` for actionable fixes.
17
+
18
+ When the user makes or describes a deliberate decision (changing a param,
19
+ switching strategy, picking an architecture, a data/process/tooling choice):
20
+ - Use `mcp__openrunner__openrunner_log_decision` to document it (context,
21
+ rationale, alternatives; `source_runs` for the run(s) it was decided from,
22
+ `param`/`old_value`/`new_value` for a param change, optional `markdown` body
23
+ + `attachment_url` PDF).
24
+ - Use `mcp__openrunner__openrunner_set_decision_runs` to attach resulting runs.
25
+ - Use `mcp__openrunner__openrunner_list_decisions` to review the decision log.
26
+ - Run `/openrunner:log-decision` for a guided capture.
27
+ - Decisions render to HTML/PDF: `GET /projects/{id}/decisions/{id}/render?format=pdf`.
28
+
29
+ When the user asks about papers, research, or sessions:
30
+ - Use `mcp__openrunner__openrunner_search_papers` for paper content
31
+ - Use `mcp__openrunner__openrunner_search_research` for research plans
32
+ - Use `mcp__openrunner__openrunner_search_sessions` for AI session history
33
+ - Use `mcp__openrunner__openrunner_update_paper` to modify paper sections
@@ -121,7 +121,7 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
121
121
  # openrunner.trace.patch_openai() syntax
122
122
  trace.patch_openai = _patch_openai # type: ignore[attr-defined]
123
123
 
124
- __version__ = "2.24.2"
124
+ __version__ = "2.25.0"
125
125
 
126
126
  logger = logging.getLogger("openrunner")
127
127
 
@@ -1062,6 +1062,170 @@ Ask if the user wants the report logged back to OpenRunner via
1062
1062
  - Keep the report under ~80 lines unless the user asks for the full mismatch list.
1063
1063
  """
1064
1064
 
1065
+ TRAINING_RECOMMENDATIONS_CMD = """---
1066
+ name: {prefix}training-recommendations
1067
+ description: Monitor a training run's metrics and recommend concrete fixes (LR, regularization, early stop, schedule)
1068
+ argument-hint: "[run_id] [--window 10] [--keys train/loss,val/loss]"
1069
+ allowed-tools:
1070
+ - Bash
1071
+ - Read
1072
+ - mcp__openrunner__openrunner_monitor_training
1073
+ - mcp__openrunner__openrunner_watch_run
1074
+ - mcp__openrunner__openrunner_list_runs
1075
+ - mcp__openrunner__openrunner_log_note
1076
+ ---
1077
+
1078
+ Monitor a training run and turn its metric health into **actionable recommendations**.
1079
+
1080
+ ## Inputs
1081
+
1082
+ `$ARGUMENTS` may contain:
1083
+ - `run_id` -- the run to diagnose. If omitted, list recent runs and ask the user.
1084
+ - `--window N` -- recent-window size for trend/plateau analysis (default: 10)
1085
+ - `--keys a,b` -- restrict to specific metric keys (default: all logged)
1086
+
1087
+ ## Process
1088
+
1089
+ ### 1. Resolve the run
1090
+
1091
+ If no `run_id` is given:
1092
+ - Call `mcp__openrunner__openrunner_list_runs` for the configured project.
1093
+ - Show the 10 most recent runs and ask the user to pick one.
1094
+
1095
+ ### 2. Diagnose
1096
+
1097
+ Call `mcp__openrunner__openrunner_monitor_training` with the chosen `run_id` (pass
1098
+ `window` / `keys` if the user supplied them). Read the `Verdict`, the per-metric
1099
+ statuses, the `Overfitting signals`, and the machine-readable `## Signals` JSON block.
1100
+
1101
+ If it reports no metrics: tell the user to log metrics from the SDK
1102
+ (`run.log({{"train/loss": ...}}, step=...)`) and stop.
1103
+
1104
+ ### 3. Map signals -> recommendations
1105
+
1106
+ Use the verdict + signals to produce targeted advice. Only raise a recommendation when
1107
+ a signal supports it, and cite the metric/value it leans on.
1108
+
1109
+ | Signal | Recommended actions |
1110
+ |--------|--------------------|
1111
+ | **DIVERGING** (loss rising, NaN/Inf) | Lower learning rate 3-10x; add or tighten grad clipping; check for overflow under mixed precision (try bf16 / loss scaling); verify data normalization; add LR warmup. |
1112
+ | **OVERFITTING** (train down while val up) | Early-stop at the val best step; add regularization (weight decay, dropout); augment or add data; reduce model size / epochs; raise early-stop patience. |
1113
+ | **PLATEAUED** (flat loss) | Decay LR (step/cosine) or run an LR finder; increase model/batch capacity; unfreeze layers; confirm data shuffling; or accept convergence and stop. |
1114
+ | **UNSTABLE** (noisy/jittery) | Increase batch size or grad accumulation; lower LR; add grad clipping; smooth the LR schedule; check for label noise. |
1115
+ | **worsening** single metric | Inspect that metric's objective/schedule; check for leakage or a metric bug. |
1116
+ | **IMPROVING** | No change needed; suggest when to checkpoint or stop, note any ETA. |
1117
+
1118
+ ### 4. Output
1119
+
1120
+ Print a concise markdown report:
1121
+
1122
+ ```
1123
+ # Training Recommendations -- run <id>
1124
+
1125
+ Verdict: <VERDICT>
1126
+ Key evidence: <one line per metric that drives a recommendation>
1127
+
1128
+ ## Recommendations (priority order)
1129
+ 1. **<action>** -- why: <signal + metric:value>. how: <concrete change>.
1130
+ 2. ...
1131
+
1132
+ ## Watchlist
1133
+ - <metric to keep watching> -- <threshold / what to look for>
1134
+ ```
1135
+
1136
+ Keep it under ~40 lines. Be specific (numbers, step counts), not generic.
1137
+
1138
+ ### 5. Offer to log
1139
+
1140
+ Ask if the user wants the report logged back to OpenRunner via
1141
+ `mcp__openrunner__openrunner_log_note` so the team can review it.
1142
+
1143
+ ## Constraints
1144
+
1145
+ - Do not invent metrics or numbers -- only use what the MCP tool returned.
1146
+ - Distinguish "the run is broken" (diverging/unstable) from "the run is done"
1147
+ (plateaued/converged).
1148
+ - If the verdict is UNCLEAR, say so and suggest which metric to log for a clearer signal.
1149
+ """
1150
+
1151
+ LOG_DECISION_CMD = """---
1152
+ name: {prefix}log-decision
1153
+ description: Document a project decision (param change, strategy, architecture, ...) as an ADR-style record
1154
+ argument-hint: "[short decision statement] [--run run_id] [--type param|strategy|...]"
1155
+ allowed-tools:
1156
+ - Bash
1157
+ - Read
1158
+ - mcp__openrunner__openrunner_log_decision
1159
+ - mcp__openrunner__openrunner_list_decisions
1160
+ - mcp__openrunner__openrunner_set_decision_runs
1161
+ - mcp__openrunner__openrunner_list_runs
1162
+ ---
1163
+
1164
+ Capture a deliberate decision so the reasoning is preserved for the team and
1165
+ for future-you. Decisions are ADR-style records: title, context, decision,
1166
+ rationale, alternatives — decided FROM one or more runs, and optionally
1167
+ producing resulting runs. The body is markdown and renders to HTML/PDF.
1168
+
1169
+ ## Inputs
1170
+
1171
+ `$ARGUMENTS` may contain:
1172
+ - a short decision statement (the title), e.g. "Switch optimizer to AdamW"
1173
+ - `--run run_id` (repeatable) -- run(s) the decision was decided FROM
1174
+ - `--type T` -- one of: param, strategy, architecture, data, process, tooling, other
1175
+
1176
+ ## Process
1177
+
1178
+ ### 1. Gather the decision
1179
+
1180
+ Infer as much as possible from the current conversation / recent changes, then
1181
+ fill these fields (ask the user only for what you genuinely cannot infer):
1182
+ - **title** -- one-line statement of what was decided
1183
+ - **type** -- param | strategy | architecture | data | process | tooling | other
1184
+ - **context** -- what problem/situation prompted it
1185
+ - **decision** -- what was decided, in detail
1186
+ - **rationale** -- why this option
1187
+ - **alternatives** -- options considered and why they were rejected
1188
+ - **impact** -- expected consequences
1189
+ - **source_runs** -- the run(s) the decision is based on (its evidence)
1190
+ - For a **param change**: the `param` name, its `old_value`, and `new_value`.
1191
+ - Optionally a `markdown` body (full writeup) and/or an `attachment_url` (PDF).
1192
+
1193
+ Do not block on missing optional fields — a title alone is enough to record.
1194
+ If the decision is based on training results, call
1195
+ `mcp__openrunner__openrunner_list_runs` to resolve the source run id(s).
1196
+
1197
+ ### 2. Record it
1198
+
1199
+ Call `mcp__openrunner__openrunner_log_decision` with the gathered fields, passing
1200
+ `source_runs` for the run(s) it was decided from. For a param change, pass
1201
+ `param` / `old_value` / `new_value` (the tool sets `type=param` and stores the
1202
+ change in metadata automatically).
1203
+
1204
+ If the decision reverses or replaces an earlier one, first call
1205
+ `mcp__openrunner__openrunner_list_decisions` to find its `id`, then pass it as
1206
+ `supersedes` so the older record is marked superseded.
1207
+
1208
+ ### 3. Attach resulting runs (when they exist)
1209
+
1210
+ If the user later launches run(s) as a result of this decision, record them with
1211
+ `mcp__openrunner__openrunner_set_decision_runs` (`result_runs=[...]`, `append=true`
1212
+ to add to existing). This closes the loop decided-from → resulting-runs.
1213
+
1214
+ ### 4. Confirm
1215
+
1216
+ Echo the created decision (id, title, type, status, param change, source/result
1217
+ runs). Mention it can be rendered as a PDF via
1218
+ `GET /projects/<pid>/decisions/<id>/render?format=pdf`. Offer to list recent
1219
+ decisions via `mcp__openrunner__openrunner_list_decisions`.
1220
+
1221
+ ## Constraints
1222
+
1223
+ - One decision per call. If the user describes several, record each separately.
1224
+ - Keep `title` short and declarative; put detail in `markdown` / `decision` / `rationale`.
1225
+ - A decision should cite the run(s) it was decided from whenever results drove it.
1226
+ - Do not invent a rationale the user did not give — leave it blank instead.
1227
+ """
1228
+
1065
1229
  MCP_CMD = """---
1066
1230
  name: {prefix}mcp
1067
1231
  description: Register OpenRunner MCP server for native tool access
@@ -1267,6 +1431,8 @@ def install_claude_code() -> list[str]:
1267
1431
  "plot-session-run.md": PLOT_SESSION_RUN_CMD,
1268
1432
  "statusline.md": STATUSLINE_CMD,
1269
1433
  "gt-recommendations.md": GT_RECOMMENDATIONS_CMD,
1434
+ "training-recommendations.md": TRAINING_RECOMMENDATIONS_CMD,
1435
+ "log-decision.md": LOG_DECISION_CMD,
1270
1436
  }
1271
1437
 
1272
1438
  files = []
@@ -1297,6 +1463,25 @@ When the user asks about papers, research, or sessions:
1297
1463
  - Use `mcp__openrunner__openrunner_search_sessions` for AI session history
1298
1464
  - Use `mcp__openrunner__openrunner_update_paper` to modify paper sections
1299
1465
 
1466
+ When the user asks to monitor a training, diagnose loss curves, or get training
1467
+ advice (diverging, overfitting, plateau, NaN loss, LR tuning):
1468
+ - Use `mcp__openrunner__openrunner_monitor_training` for a health verdict
1469
+ (HEALTHY / IMPROVING / PLATEAUED / OVERFITTING / UNSTABLE / DIVERGING) plus
1470
+ per-metric trend, plateau, instability and overfitting signals.
1471
+ - Run `/openrunner:training-recommendations [run_id]` for actionable fixes.
1472
+
1473
+ When the user makes or describes a deliberate decision (changing a param,
1474
+ switching strategy, picking an architecture, a data/process/tooling choice):
1475
+ - Use `mcp__openrunner__openrunner_log_decision` to document it (context,
1476
+ rationale, alternatives; pass `source_runs` for the run(s) it was decided
1477
+ from, `param`/`old_value`/`new_value` for a param change, optional `markdown`
1478
+ body + `attachment_url` PDF).
1479
+ - Use `mcp__openrunner__openrunner_set_decision_runs` to attach the run(s) that
1480
+ resulted from a decision once they exist.
1481
+ - Use `mcp__openrunner__openrunner_list_decisions` to review the decision log.
1482
+ - Run `/openrunner:log-decision` for a guided capture.
1483
+ - Decisions render to HTML/PDF: `GET /projects/{id}/decisions/{id}/render?format=pdf`.
1484
+
1300
1485
  When the user asks about prediction quality, ground-truth errors, mislabels,
1301
1486
  or annotation rules:
1302
1487
  - Use `mcp__openrunner__openrunner_fetch_predictions` to pull a run's logged
@@ -1417,6 +1602,8 @@ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") ->
1417
1602
  "plot-session-run.md": PLOT_SESSION_RUN_CMD,
1418
1603
  "statusline.md": STATUSLINE_CMD,
1419
1604
  "gt-recommendations.md": GT_RECOMMENDATIONS_CMD,
1605
+ "training-recommendations.md": TRAINING_RECOMMENDATIONS_CMD,
1606
+ "log-decision.md": LOG_DECISION_CMD,
1420
1607
  }
1421
1608
 
1422
1609
  files = []