openrunner-sdk 2.19.0__tar.gz → 2.19.2__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.0 → openrunner_sdk-2.19.2}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/install_commands.py +52 -44
  4. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/pyproject.toml +1 -1
  5. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/.gitignore +0 -0
  6. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/=6.0 +0 -0
  7. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/=8.1 +0 -0
  8. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/README.md +0 -0
  9. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/CLAUDE.md +0 -0
  10. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/api_client.py +0 -0
  11. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/artifact.py +0 -0
  12. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/buffer.py +0 -0
  13. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/cache.py +0 -0
  14. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/cli.py +0 -0
  15. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/config.py +0 -0
  16. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/cost.py +0 -0
  17. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/dataset.py +0 -0
  18. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/environment.py +0 -0
  19. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/evaluation.py +0 -0
  20. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/feedback.py +0 -0
  21. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/git_info.py +0 -0
  22. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/guardrails.py +0 -0
  23. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/__init__.py +0 -0
  24. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/accelerate.py +0 -0
  25. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/anthropic_tracer.py +0 -0
  26. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/catboost.py +0 -0
  27. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/diffusers.py +0 -0
  28. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/fastai.py +0 -0
  29. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/forced_alignment.py +0 -0
  30. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/gladia.py +0 -0
  31. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/gymnasium.py +0 -0
  32. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/huggingface.py +0 -0
  33. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/hydra.py +0 -0
  34. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/ignite.py +0 -0
  35. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/jax.py +0 -0
  36. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/keras.py +0 -0
  37. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/langchain.py +0 -0
  38. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/lightgbm.py +0 -0
  39. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/lightning.py +0 -0
  40. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/llamaindex.py +0 -0
  41. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/openai_finetune.py +0 -0
  42. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/openai_tracer.py +0 -0
  43. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/optuna.py +0 -0
  44. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/pytorch.py +0 -0
  45. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/sb3.py +0 -0
  46. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/sklearn.py +0 -0
  47. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/tensorflow.py +0 -0
  48. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/trl.py +0 -0
  49. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/tts.py +0 -0
  50. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/ultralytics.py +0 -0
  51. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/voice_agent.py +0 -0
  52. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/whisper.py +0 -0
  53. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/integration/xgboost.py +0 -0
  54. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/launch.py +0 -0
  55. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/mcp_server.py +0 -0
  56. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/media.py +0 -0
  57. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/migrate.py +0 -0
  58. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/model.py +0 -0
  59. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/offline.py +0 -0
  60. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/pii.py +0 -0
  61. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/plot.py +0 -0
  62. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/prompt.py +0 -0
  63. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/query_api.py +0 -0
  64. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/redact.py +0 -0
  65. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/run.py +0 -0
  66. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/scorers.py +0 -0
  67. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/sender.py +0 -0
  68. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/session.py +0 -0
  69. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/settings.py +0 -0
  70. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/summary.py +0 -0
  71. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/sweep.py +0 -0
  72. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/system_metrics.py +0 -0
  73. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/tensorboard.py +0 -0
  74. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/trace.py +0 -0
  75. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/transcript_formatter.py +0 -0
  76. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/wal.py +0 -0
  77. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/wandb_compat/__init__.py +0 -0
  78. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/wandb_compat/_shim.py +0 -0
  79. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/openrunner/wer.py +0 -0
  80. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/__init__.py +0 -0
  81. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/conftest.py +0 -0
  82. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_alert.py +0 -0
  83. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_aliases.py +0 -0
  84. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_api_client.py +0 -0
  85. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_artifact.py +0 -0
  86. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_buffer.py +0 -0
  87. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_cache.py +0 -0
  88. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_class_scorers.py +0 -0
  89. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_cli.py +0 -0
  90. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_config.py +0 -0
  91. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_evaluation.py +0 -0
  92. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_finish.py +0 -0
  93. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_git_info.py +0 -0
  94. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_init.py +0 -0
  95. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_fastai.py +0 -0
  96. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_huggingface.py +0 -0
  97. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_keras.py +0 -0
  98. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_langchain.py +0 -0
  99. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_lightning.py +0 -0
  100. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_pytorch.py +0 -0
  101. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_sklearn.py +0 -0
  102. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_integration_xgboost.py +0 -0
  103. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_launch.py +0 -0
  104. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_log.py +0 -0
  105. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_log_code.py +0 -0
  106. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_media.py +0 -0
  107. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_migrate.py +0 -0
  108. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_offline.py +0 -0
  109. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_offline_sync.py +0 -0
  110. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_pii.py +0 -0
  111. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_plot.py +0 -0
  112. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_query_api.py +0 -0
  113. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_resume.py +0 -0
  114. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_sdk_features.py +0 -0
  115. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_sender.py +0 -0
  116. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_summary.py +0 -0
  117. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_sweep.py +0 -0
  118. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_system_metrics.py +0 -0
  119. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/tests/test_trace.py +0 -0
  120. {openrunner_sdk-2.19.0 → openrunner_sdk-2.19.2}/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.0
3
+ Version: 2.19.2
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.0"
123
+ __version__ = "2.19.2"
124
124
 
125
125
  logger = logging.getLogger("openrunner")
126
126
 
@@ -875,18 +875,59 @@ for run in runs[:3]:
875
875
  m = {}
876
876
  elif 'metrics' in m:
877
877
  m = m['metrics']
878
+ # Read user-configured metrics from ~/.openrunner/statusline.json
879
+ # Format: {"metrics": ["train/loss", "wer"], "sparkline": "train/loss"}
880
+ # If not configured, auto-detect: sparkline first loss-like key, show first 2 metrics
881
+ import json as _j
882
+ sl_cfg_path = os.path.expanduser('~/.openrunner/statusline.json')
883
+ sl_cfg = {}
884
+ if os.path.isfile(sl_cfg_path):
885
+ try: sl_cfg = _j.loads(open(sl_cfg_path).read())
886
+ except: pass
887
+ show_metrics = sl_cfg.get('metrics', [])
888
+ spark_key = sl_cfg.get('sparkline', '')
889
+ # Auto-detect if not configured
890
+ if not show_metrics:
891
+ all_keys = list(m.keys())
892
+ # Pick loss-like for sparkline, then next interesting metric
893
+ for k in all_keys:
894
+ if 'loss' in k.lower() and not spark_key:
895
+ spark_key = k
896
+ elif k not in ('epoch', 'lr', 'learning_rate') and len(show_metrics) < 2:
897
+ if 'system' not in k.lower():
898
+ show_metrics.append(k)
899
+ if spark_key and spark_key not in show_metrics:
900
+ show_metrics.insert(0, spark_key)
901
+ if not spark_key and show_metrics:
902
+ spark_key = show_metrics[0]
878
903
  bits = [f"{name}{icon}"]
879
- loss = m.get('train/loss', m.get('loss', []))
880
- if loss:
881
- last = loss[-1]
904
+ # Sparkline for primary metric
905
+ spark_data = m.get(spark_key, [])
906
+ if spark_data:
907
+ last = spark_data[-1]
882
908
  v = last.get('value', last) if isinstance(last, dict) else last
883
909
  s = last.get('step', '?') if isinstance(last, dict) else '?'
884
- bits.append(f"s{s} loss={v:.2f}")
885
- wer = m.get('wer', m.get('eval/wer', []))
886
- if wer:
887
- last = wer[-1]
910
+ bars = '\\u2581\\u2582\\u2583\\u2584\\u2585\\u2586\\u2587\\u2588'
911
+ vals = [pt.get('value', pt) if isinstance(pt, dict) else pt for pt in spark_data[-10:]]
912
+ vals = [x for x in vals if isinstance(x, (int, float))]
913
+ spark = ''
914
+ if len(vals) > 1:
915
+ mn, mx = min(vals), max(vals)
916
+ rng = mx - mn or 1
917
+ spark = ''.join(bars[int((x - mn) / rng * 7)] for x in vals)
918
+ bits.append(f"s{s} {spark} {v:.2f}")
919
+ # Additional configured metrics
920
+ for mk in show_metrics:
921
+ if mk == spark_key: continue
922
+ pts = m.get(mk, [])
923
+ if not pts: continue
924
+ last = pts[-1]
888
925
  v = last.get('value', last) if isinstance(last, dict) else last
889
- bits.append(f"wer={v:.3f}")
926
+ label = mk.split('/')[-1][:6]
927
+ if isinstance(v, float):
928
+ bits.append(f"{label}={v:.3f}" if v < 1 else f"{label}={v:.1f}")
929
+ else:
930
+ bits.append(f"{label}={v}")
890
931
  parts.append(' '.join(bits))
891
932
  print(' | '.join(parts) if parts else 'no runs')
892
933
  client.close()
@@ -970,42 +1011,9 @@ When the user asks about papers, research, or sessions:
970
1011
  statusline_script.chmod(0o755)
971
1012
  files.append(str(statusline_script))
972
1013
 
973
- # Patch statusline to read plugin segments (if GSD or compatible runner exists)
974
- # Convention: plugins write to /tmp/claude-statusline-<name>.txt
975
- # Statusline runner reads all matching files and appends segments.
976
- gsd_statusline = Path.home() / ".claude" / "hooks" / "gsd-statusline.js"
977
- if gsd_statusline.exists():
978
- content = gsd_statusline.read_text()
979
- if "claude-statusline-" not in content:
980
- # Inject generic plugin segment reader before "// Output"
981
- patch = """ // Plugin statusline segments: read all /tmp/claude-statusline-*.txt
982
- // Any plugin can write a one-liner to /tmp/claude-statusline-<name>.txt
983
- let plugins = '';
984
- try {
985
- const tmpDir = os.tmpdir();
986
- const files = fs.readdirSync(tmpDir)
987
- .filter(f => f.startsWith('claude-statusline-') && f.endsWith('.txt'));
988
- for (const f of files) {
989
- try {
990
- const fp = path.join(tmpDir, f);
991
- const stat = fs.statSync(fp);
992
- const ageS = (Date.now() - stat.mtimeMs) / 1000;
993
- if (ageS > 120) continue;
994
- const content = fs.readFileSync(fp, 'utf8').trim();
995
- if (content && content.length < 200) {
996
- plugins += ` | ${content}`;
997
- }
998
- } catch (e) {}
999
- }
1000
- } catch (e) {}
1001
-
1002
- """
1003
- if "// Output" in content:
1004
- content = content.replace("// Output", patch + " // Output")
1005
- # Add ${plugins} to output lines
1006
- content = content.replace("${ctx}`)", "${ctx}${plugins}`)")
1007
- gsd_statusline.write_text(content)
1008
- files.append(str(gsd_statusline))
1014
+ # Convention: OpenRunner writes to /tmp/claude-statusline-openrunner.txt
1015
+ # Any statusline runner that reads /tmp/claude-statusline-*.txt will pick it up.
1016
+ # No patching of other plugins purely convention-based.
1009
1017
 
1010
1018
  return files
1011
1019
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.19.0"
3
+ version = "2.19.2"
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