openrunner-sdk 2.19.2__tar.gz → 2.20.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 (120) hide show
  1. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/install_commands.py +123 -0
  4. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/pyproject.toml +1 -1
  5. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/.gitignore +0 -0
  6. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/=6.0 +0 -0
  7. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/=8.1 +0 -0
  8. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/README.md +0 -0
  9. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/CLAUDE.md +0 -0
  10. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/api_client.py +0 -0
  11. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/artifact.py +0 -0
  12. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/buffer.py +0 -0
  13. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/cache.py +0 -0
  14. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/cli.py +0 -0
  15. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/config.py +0 -0
  16. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/cost.py +0 -0
  17. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/dataset.py +0 -0
  18. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/environment.py +0 -0
  19. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/evaluation.py +0 -0
  20. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/feedback.py +0 -0
  21. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/git_info.py +0 -0
  22. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/guardrails.py +0 -0
  23. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/__init__.py +0 -0
  24. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/accelerate.py +0 -0
  25. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/anthropic_tracer.py +0 -0
  26. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/catboost.py +0 -0
  27. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/diffusers.py +0 -0
  28. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/fastai.py +0 -0
  29. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/forced_alignment.py +0 -0
  30. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/gladia.py +0 -0
  31. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/gymnasium.py +0 -0
  32. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/huggingface.py +0 -0
  33. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/hydra.py +0 -0
  34. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/ignite.py +0 -0
  35. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/jax.py +0 -0
  36. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/keras.py +0 -0
  37. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/langchain.py +0 -0
  38. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/lightgbm.py +0 -0
  39. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/lightning.py +0 -0
  40. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/llamaindex.py +0 -0
  41. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/openai_finetune.py +0 -0
  42. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/openai_tracer.py +0 -0
  43. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/optuna.py +0 -0
  44. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/pytorch.py +0 -0
  45. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/sb3.py +0 -0
  46. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/sklearn.py +0 -0
  47. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/tensorflow.py +0 -0
  48. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/trl.py +0 -0
  49. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/tts.py +0 -0
  50. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/ultralytics.py +0 -0
  51. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/voice_agent.py +0 -0
  52. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/whisper.py +0 -0
  53. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/integration/xgboost.py +0 -0
  54. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/launch.py +0 -0
  55. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/mcp_server.py +0 -0
  56. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/media.py +0 -0
  57. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/migrate.py +0 -0
  58. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/model.py +0 -0
  59. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/offline.py +0 -0
  60. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/pii.py +0 -0
  61. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/plot.py +0 -0
  62. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/prompt.py +0 -0
  63. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/query_api.py +0 -0
  64. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/redact.py +0 -0
  65. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/run.py +0 -0
  66. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/scorers.py +0 -0
  67. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/sender.py +0 -0
  68. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/session.py +0 -0
  69. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/settings.py +0 -0
  70. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/summary.py +0 -0
  71. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/sweep.py +0 -0
  72. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/system_metrics.py +0 -0
  73. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/tensorboard.py +0 -0
  74. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/trace.py +0 -0
  75. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/transcript_formatter.py +0 -0
  76. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wal.py +0 -0
  77. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wandb_compat/__init__.py +0 -0
  78. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wandb_compat/_shim.py +0 -0
  79. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/openrunner/wer.py +0 -0
  80. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/__init__.py +0 -0
  81. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/conftest.py +0 -0
  82. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_alert.py +0 -0
  83. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_aliases.py +0 -0
  84. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_api_client.py +0 -0
  85. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_artifact.py +0 -0
  86. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_buffer.py +0 -0
  87. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_cache.py +0 -0
  88. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_class_scorers.py +0 -0
  89. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_cli.py +0 -0
  90. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_config.py +0 -0
  91. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_evaluation.py +0 -0
  92. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_finish.py +0 -0
  93. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_git_info.py +0 -0
  94. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_init.py +0 -0
  95. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_fastai.py +0 -0
  96. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_huggingface.py +0 -0
  97. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_keras.py +0 -0
  98. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_langchain.py +0 -0
  99. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_lightning.py +0 -0
  100. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_pytorch.py +0 -0
  101. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_sklearn.py +0 -0
  102. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_integration_xgboost.py +0 -0
  103. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_launch.py +0 -0
  104. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_log.py +0 -0
  105. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_log_code.py +0 -0
  106. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_media.py +0 -0
  107. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_migrate.py +0 -0
  108. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_offline.py +0 -0
  109. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_offline_sync.py +0 -0
  110. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_pii.py +0 -0
  111. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_plot.py +0 -0
  112. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_query_api.py +0 -0
  113. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_resume.py +0 -0
  114. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_sdk_features.py +0 -0
  115. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_sender.py +0 -0
  116. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_summary.py +0 -0
  117. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_sweep.py +0 -0
  118. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_system_metrics.py +0 -0
  119. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.0}/tests/test_trace.py +0 -0
  120. {openrunner_sdk-2.19.2 → openrunner_sdk-2.20.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.19.2
3
+ Version: 2.20.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
@@ -120,7 +120,7 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
120
120
  # openrunner.trace.patch_openai() syntax
121
121
  trace.patch_openai = _patch_openai # type: ignore[attr-defined]
122
122
 
123
- __version__ = "2.19.2"
123
+ __version__ = "2.20.0"
124
124
 
125
125
  logger = logging.getLogger("openrunner")
126
126
 
@@ -783,6 +783,127 @@ If NO_RUNS: tell user no training runs found in project.
783
783
  If NO_METRICS: tell user runs exist but no metrics logged yet.
784
784
  """
785
785
 
786
+ STATUSLINE_CMD = """---
787
+ name: {prefix}statusline
788
+ description: Configure which metrics appear in the Claude Code footer
789
+ allowed-tools:
790
+ - Bash
791
+ - AskUserQuestion
792
+ ---
793
+ <objective>
794
+ Configure which training metrics appear in the Claude Code statusline footer.
795
+ Fetches available metrics from the most recent run and lets the user pick.
796
+ </objective>
797
+
798
+ <process>
799
+ 1. Fetch available metrics from the latest run in the configured project.
800
+ 2. Present them to the user as a numbered list.
801
+ 3. Ask which metric to use for the sparkline (primary).
802
+ 4. Ask which additional metrics to show (comma-separated numbers).
803
+ 5. Save to ~/.openrunner/statusline.json.
804
+ 6. Confirm and show preview.
805
+ </process>
806
+
807
+ ### Step 1: Fetch available metrics
808
+
809
+ ```bash
810
+ python3 -c "
811
+ import sys, os, json
812
+ from pathlib import Path
813
+ for p in ([os.path.join(d, 'site-packages') for d in __import__('glob').glob(os.path.expanduser('~/.local/lib/python3.*/')) + __import__('glob').glob(os.path.expanduser('~/Library/Python/3.*/lib/python/'))]):
814
+ if os.path.isdir(p): sys.path.insert(0, p)
815
+ from openrunner.session import get_session_config
816
+ from openrunner.api_client import APIClient
817
+
818
+ config = get_session_config()
819
+ if not config.get('api_key'):
820
+ print('NOT_CONFIGURED'); sys.exit(1)
821
+
822
+ client = APIClient(base_url=config['base_url'], api_key=config['api_key'])
823
+ pname = config.get('project', '')
824
+ pid = None
825
+ for p in client.list_projects():
826
+ full = f'{{p.get(\"org_name\",\"\")}}/{{p.get(\"name\",\"\")}}'
827
+ if full.lower() == pname.lower() or (p.get('name') or '').lower() == pname.lower():
828
+ pid = p.get('id'); break
829
+
830
+ if not pid:
831
+ print('PROJECT_NOT_FOUND'); client.close(); sys.exit(1)
832
+
833
+ # Get latest run
834
+ resp = client._request('get', f'/projects/{{pid}}/runs', params={{'limit': 1, 'order': 'desc'}})
835
+ runs_data = resp.json()
836
+ runs = runs_data.get('runs', []) if isinstance(runs_data, dict) else runs_data
837
+ if not runs:
838
+ print('NO_RUNS'); client.close(); sys.exit(1)
839
+
840
+ rid = runs[0].get('id', '')
841
+ run_name = runs[0].get('display_name') or rid
842
+
843
+ # Get all metrics for this run
844
+ resp = client._request('get', f'/runs/{{rid}}/metrics', params={{'max_points': 10000}})
845
+ data = resp.json()
846
+ metrics = data.get('metrics', data) if isinstance(data, dict) else {{}}
847
+ if 'detail' in metrics:
848
+ metrics = {{}}
849
+
850
+ keys = sorted(metrics.keys())
851
+ if not keys:
852
+ print('NO_METRICS'); client.close(); sys.exit(1)
853
+
854
+ print(f'METRICS_FROM_RUN={{run_name}}')
855
+ for i, k in enumerate(keys, 1):
856
+ pts = metrics[k]
857
+ n = len(pts) if isinstance(pts, list) else 0
858
+ last = ''
859
+ if n > 0:
860
+ lp = pts[-1]
861
+ v = lp.get('value', lp) if isinstance(lp, dict) else lp
862
+ if isinstance(v, float):
863
+ last = f' (latest: {{v:.4f}}, {{n}} pts)'
864
+ else:
865
+ last = f' (latest: {{v}}, {{n}} pts)'
866
+ print(f' [{{i}}] {{k}}{{last}}')
867
+
868
+ # Also show current config if exists
869
+ cfg_path = Path.home() / '.openrunner' / 'statusline.json'
870
+ if cfg_path.exists():
871
+ cfg = json.loads(cfg_path.read_text())
872
+ print('\\nCURRENT_CONFIG: sparkline=%s metrics=%s' % (cfg.get('sparkline','auto'), cfg.get('metrics',[])))
873
+ else:
874
+ print('\\nCURRENT_CONFIG: not configured (auto-detect)')
875
+
876
+ client.close()
877
+ "
878
+ ```
879
+
880
+ ### Step 2: Ask the user
881
+
882
+ After showing the list, ask:
883
+ - "Which metric for the sparkline? (number or name)" — this is the primary one shown as a mini chart
884
+ - "Which additional metrics to display? (comma-separated numbers, or 'auto')"
885
+
886
+ ### Step 3: Save config
887
+
888
+ ```bash
889
+ python3 -c "
890
+ import json
891
+ from pathlib import Path
892
+ cfg_path = Path.home() / '.openrunner' / 'statusline.json'
893
+ cfg_path.parent.mkdir(parents=True, exist_ok=True)
894
+ cfg = {{'sparkline': 'SPARKLINE_KEY', 'metrics': METRICS_LIST}}
895
+ cfg_path.write_text(json.dumps(cfg, indent=2))
896
+ print(f'Saved: {{cfg_path}}')
897
+ print(f' Sparkline: {{cfg[\"sparkline\"]}}')
898
+ print(f' Metrics: {{cfg[\"metrics\"]}}')
899
+ print()
900
+ print('Footer will show on next statusline refresh (30s).')
901
+ "
902
+ ```
903
+
904
+ Replace SPARKLINE_KEY with the user's chosen metric key and METRICS_LIST with the Python list of chosen keys.
905
+ """
906
+
786
907
  MCP_CMD = """---
787
908
  name: {prefix}mcp
788
909
  description: Register OpenRunner MCP server for native tool access
@@ -954,6 +1075,7 @@ def install_claude_code() -> list[str]:
954
1075
  "update.md": UPDATE_CMD,
955
1076
  "mcp.md": MCP_CMD,
956
1077
  "plot-session-run.md": PLOT_SESSION_RUN_CMD,
1078
+ "statusline.md": STATUSLINE_CMD,
957
1079
  }
958
1080
 
959
1081
  files = []
@@ -1033,6 +1155,7 @@ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") ->
1033
1155
  "update.md": UPDATE_CMD,
1034
1156
  "mcp.md": MCP_CMD,
1035
1157
  "plot-session-run.md": PLOT_SESSION_RUN_CMD,
1158
+ "statusline.md": STATUSLINE_CMD,
1036
1159
  }
1037
1160
 
1038
1161
  files = []
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.19.2"
3
+ version = "2.20.0"
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