openrunner-sdk 2.13.0__tar.gz → 2.13.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 (118) hide show
  1. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/cli.py +28 -3
  4. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/install_commands.py +39 -40
  5. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/pyproject.toml +1 -1
  6. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/.gitignore +0 -0
  7. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/=6.0 +0 -0
  8. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/=8.1 +0 -0
  9. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/README.md +0 -0
  10. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/api_client.py +0 -0
  11. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/artifact.py +0 -0
  12. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/buffer.py +0 -0
  13. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/cache.py +0 -0
  14. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/config.py +0 -0
  15. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/cost.py +0 -0
  16. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/dataset.py +0 -0
  17. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/environment.py +0 -0
  18. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/evaluation.py +0 -0
  19. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/feedback.py +0 -0
  20. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/git_info.py +0 -0
  21. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/guardrails.py +0 -0
  22. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/__init__.py +0 -0
  23. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/accelerate.py +0 -0
  24. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/anthropic_tracer.py +0 -0
  25. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/catboost.py +0 -0
  26. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/diffusers.py +0 -0
  27. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/fastai.py +0 -0
  28. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/forced_alignment.py +0 -0
  29. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/gladia.py +0 -0
  30. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/gymnasium.py +0 -0
  31. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/huggingface.py +0 -0
  32. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/hydra.py +0 -0
  33. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/ignite.py +0 -0
  34. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/jax.py +0 -0
  35. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/keras.py +0 -0
  36. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/langchain.py +0 -0
  37. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/lightgbm.py +0 -0
  38. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/lightning.py +0 -0
  39. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/llamaindex.py +0 -0
  40. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/openai_finetune.py +0 -0
  41. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/openai_tracer.py +0 -0
  42. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/optuna.py +0 -0
  43. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/pytorch.py +0 -0
  44. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/sb3.py +0 -0
  45. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/sklearn.py +0 -0
  46. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/tensorflow.py +0 -0
  47. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/trl.py +0 -0
  48. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/tts.py +0 -0
  49. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/ultralytics.py +0 -0
  50. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/voice_agent.py +0 -0
  51. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/whisper.py +0 -0
  52. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/integration/xgboost.py +0 -0
  53. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/launch.py +0 -0
  54. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/media.py +0 -0
  55. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/migrate.py +0 -0
  56. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/model.py +0 -0
  57. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/offline.py +0 -0
  58. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/pii.py +0 -0
  59. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/plot.py +0 -0
  60. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/prompt.py +0 -0
  61. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/query_api.py +0 -0
  62. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/redact.py +0 -0
  63. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/run.py +0 -0
  64. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/scorers.py +0 -0
  65. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/sender.py +0 -0
  66. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/session.py +0 -0
  67. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/settings.py +0 -0
  68. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/summary.py +0 -0
  69. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/sweep.py +0 -0
  70. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/system_metrics.py +0 -0
  71. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/tensorboard.py +0 -0
  72. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/trace.py +0 -0
  73. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/transcript_formatter.py +0 -0
  74. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/wal.py +0 -0
  75. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/wandb_compat/__init__.py +0 -0
  76. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/wandb_compat/_shim.py +0 -0
  77. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/openrunner/wer.py +0 -0
  78. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/__init__.py +0 -0
  79. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/conftest.py +0 -0
  80. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_alert.py +0 -0
  81. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_aliases.py +0 -0
  82. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_api_client.py +0 -0
  83. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_artifact.py +0 -0
  84. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_buffer.py +0 -0
  85. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_cache.py +0 -0
  86. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_class_scorers.py +0 -0
  87. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_cli.py +0 -0
  88. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_config.py +0 -0
  89. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_evaluation.py +0 -0
  90. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_finish.py +0 -0
  91. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_git_info.py +0 -0
  92. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_init.py +0 -0
  93. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_fastai.py +0 -0
  94. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_huggingface.py +0 -0
  95. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_keras.py +0 -0
  96. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_langchain.py +0 -0
  97. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_lightning.py +0 -0
  98. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_pytorch.py +0 -0
  99. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_sklearn.py +0 -0
  100. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_integration_xgboost.py +0 -0
  101. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_launch.py +0 -0
  102. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_log.py +0 -0
  103. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_log_code.py +0 -0
  104. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_media.py +0 -0
  105. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_migrate.py +0 -0
  106. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_offline.py +0 -0
  107. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_offline_sync.py +0 -0
  108. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_pii.py +0 -0
  109. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_plot.py +0 -0
  110. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_query_api.py +0 -0
  111. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_resume.py +0 -0
  112. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_sdk_features.py +0 -0
  113. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_sender.py +0 -0
  114. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_summary.py +0 -0
  115. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_sweep.py +0 -0
  116. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_system_metrics.py +0 -0
  117. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.2}/tests/test_trace.py +0 -0
  118. {openrunner_sdk-2.13.0 → openrunner_sdk-2.13.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.13.0
3
+ Version: 2.13.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.13.0"
123
+ __version__ = "2.13.2"
124
124
 
125
125
  logger = logging.getLogger("openrunner")
126
126
 
@@ -34,6 +34,27 @@ from openrunner.offline import OfflineStorage, OfflineSync
34
34
  logger = logging.getLogger("openrunner")
35
35
 
36
36
 
37
+ # ---------------------------------------------------------------------------
38
+ # Auto-install commands
39
+ # ---------------------------------------------------------------------------
40
+
41
+
42
+ def _auto_install_commands() -> None:
43
+ """Auto-install/update slash commands for all AI tools if outdated."""
44
+ try:
45
+ from openrunner import __version__
46
+ marker = Path.home() / ".openrunner" / ".commands_version"
47
+ if marker.exists() and marker.read_text().strip() == __version__:
48
+ return # already up to date
49
+ # Install for all detected tools silently
50
+ from openrunner.install_commands import install_all
51
+ install_all()
52
+ marker.parent.mkdir(parents=True, exist_ok=True)
53
+ marker.write_text(__version__)
54
+ except Exception:
55
+ pass # never crash on auto-install
56
+
57
+
37
58
  # ---------------------------------------------------------------------------
38
59
  # Settings helpers
39
60
  # ---------------------------------------------------------------------------
@@ -69,10 +90,14 @@ def _save_settings(settings: dict[str, Any]) -> None:
69
90
  # ---------------------------------------------------------------------------
70
91
 
71
92
 
72
- @click.group()
73
- def main() -> None:
93
+ @click.group(invoke_without_command=True)
94
+ @click.pass_context
95
+ def main(ctx) -> None:
74
96
  """OpenRunner CLI - ML experiment tracking."""
75
- pass
97
+ if ctx.invoked_subcommand is None:
98
+ click.echo(ctx.get_help())
99
+ # Auto-install/update Claude Code commands on any CLI invocation
100
+ _auto_install_commands()
76
101
 
77
102
 
78
103
  # ---------------------------------------------------------------------------
@@ -303,25 +303,40 @@ def install_claude_code() -> list[str]:
303
303
  return files
304
304
 
305
305
 
306
- def install_codex() -> list[str]:
307
- """Install commands for Codex CLI."""
308
- # Codex uses ~/.codex/ with instructions or custom commands
309
- cmd_dir = Path.home() / ".codex" / "commands"
306
+ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") -> list[str]:
307
+ """Install all commands to a given directory."""
310
308
  cmd_dir.mkdir(parents=True, exist_ok=True)
311
309
 
310
+ commands = {
311
+ "sync-session.md": SYNC_SESSION_CMD,
312
+ "log-note.md": LOG_NOTE_CMD,
313
+ "setup.md": SETUP_CMD,
314
+ "list-sessions.md": LIST_SESSIONS_CMD,
315
+ "chat.md": CHAT_CMD,
316
+ }
317
+
312
318
  files = []
319
+ for filename, template in commands.items():
320
+ path = cmd_dir / filename
321
+ path.write_text(template.format(prefix=prefix))
322
+ files.append(str(path))
323
+
324
+ return files
313
325
 
314
- sync_path = cmd_dir / "sync-session.md"
315
- sync_path.write_text(SYNC_SESSION_CMD.format(prefix="openrunner:"))
316
- files.append(str(sync_path))
317
326
 
318
- note_path = cmd_dir / "log-note.md"
319
- note_path.write_text(LOG_NOTE_CMD.format(prefix="openrunner:"))
320
- files.append(str(note_path))
327
+ def install_codex() -> list[str]:
328
+ """Install commands for Codex CLI.
321
329
 
322
- # Also add to AGENTS.md if it exists
330
+ Codex uses ~/.codex/prompts/ for custom slash commands (Markdown).
331
+ Also adds instructions to AGENTS.md for implicit context.
332
+ Ref: https://developers.openai.com/codex/custom-prompts
333
+ """
334
+ # Codex custom prompts directory
335
+ files = _install_all_commands_to_dir(Path.home() / ".codex" / "prompts")
336
+
337
+ # Also add to AGENTS.md for implicit context
323
338
  agents_file = Path.home() / ".codex" / "AGENTS.md"
324
- instruction = "\n\n## OpenRunner Integration\nUse `/openrunner:sync-session` to log this session to OpenRunner.\nUse `/openrunner:log-note <text>` to save a research note.\n"
339
+ instruction = "\n\n## OpenRunner Integration\nUse `/prompts:openrunner:sync-session` to log this session.\nUse `/prompts:openrunner:setup` to configure.\nUse `/prompts:openrunner:chat <question>` to ask about sessions.\nUse `/prompts:openrunner:login` to authenticate.\n"
325
340
  if agents_file.exists():
326
341
  content = agents_file.read_text()
327
342
  if "openrunner" not in content.lower():
@@ -335,39 +350,23 @@ def install_codex() -> list[str]:
335
350
 
336
351
 
337
352
  def install_qwen_code() -> list[str]:
338
- """Install commands for Qwen Code."""
339
- cmd_dir = Path.home() / ".qwen-code" / "commands"
340
- cmd_dir.mkdir(parents=True, exist_ok=True)
341
-
342
- files = []
353
+ """Install commands for Qwen Code.
343
354
 
344
- sync_path = cmd_dir / "sync-session.md"
345
- sync_path.write_text(SYNC_SESSION_CMD.format(prefix="openrunner:"))
346
- files.append(str(sync_path))
347
-
348
- note_path = cmd_dir / "log-note.md"
349
- note_path.write_text(LOG_NOTE_CMD.format(prefix="openrunner:"))
350
- files.append(str(note_path))
351
-
352
- return files
355
+ Qwen Code uses .qwen-code/commands/ in project root or ~/.qwen-code/commands/ globally.
356
+ Supports Markdown format with YAML frontmatter.
357
+ Ref: https://github.com/QwenLM/qwen-code/blob/main/docs/users/features/commands.md
358
+ """
359
+ return _install_all_commands_to_dir(Path.home() / ".qwen-code" / "commands")
353
360
 
354
361
 
355
362
  def install_opencode() -> list[str]:
356
- """Install commands for OpenCode."""
357
- cmd_dir = Path.home() / ".opencode" / "commands"
358
- cmd_dir.mkdir(parents=True, exist_ok=True)
359
-
360
- files = []
361
-
362
- sync_path = cmd_dir / "sync-session.md"
363
- sync_path.write_text(SYNC_SESSION_CMD.format(prefix="openrunner:"))
364
- files.append(str(sync_path))
363
+ """Install commands for OpenCode.
365
364
 
366
- note_path = cmd_dir / "log-note.md"
367
- note_path.write_text(LOG_NOTE_CMD.format(prefix="openrunner:"))
368
- files.append(str(note_path))
369
-
370
- return files
365
+ OpenCode uses ~/.config/opencode/commands/ for global user commands.
366
+ Each .md file becomes a user:filename command.
367
+ Ref: https://opencode.ai/docs/commands/
368
+ """
369
+ return _install_all_commands_to_dir(Path.home() / ".config" / "opencode" / "commands")
371
370
 
372
371
 
373
372
  # ---------------------------------------------------------------------------
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.13.0"
3
+ version = "2.13.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