openrunner-sdk 2.4.3__tar.gz → 2.5.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 (115) hide show
  1. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/__init__.py +1 -1
  3. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/api_client.py +29 -9
  4. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/run.py +9 -1
  5. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/pyproject.toml +1 -1
  6. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/.gitignore +0 -0
  7. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/=6.0 +0 -0
  8. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/=8.1 +0 -0
  9. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/README.md +0 -0
  10. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/artifact.py +0 -0
  11. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/buffer.py +0 -0
  12. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/cache.py +0 -0
  13. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/cli.py +0 -0
  14. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/config.py +0 -0
  15. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/cost.py +0 -0
  16. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/dataset.py +0 -0
  17. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/environment.py +0 -0
  18. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/evaluation.py +0 -0
  19. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/feedback.py +0 -0
  20. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/git_info.py +0 -0
  21. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/guardrails.py +0 -0
  22. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/__init__.py +0 -0
  23. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/accelerate.py +0 -0
  24. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/anthropic_tracer.py +0 -0
  25. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/catboost.py +0 -0
  26. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/diffusers.py +0 -0
  27. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/fastai.py +0 -0
  28. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/forced_alignment.py +0 -0
  29. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/gladia.py +0 -0
  30. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/gymnasium.py +0 -0
  31. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/huggingface.py +0 -0
  32. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/hydra.py +0 -0
  33. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/ignite.py +0 -0
  34. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/jax.py +0 -0
  35. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/keras.py +0 -0
  36. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/langchain.py +0 -0
  37. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/lightgbm.py +0 -0
  38. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/lightning.py +0 -0
  39. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/llamaindex.py +0 -0
  40. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/openai_finetune.py +0 -0
  41. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/openai_tracer.py +0 -0
  42. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/optuna.py +0 -0
  43. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/pytorch.py +0 -0
  44. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/sb3.py +0 -0
  45. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/sklearn.py +0 -0
  46. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/tensorflow.py +0 -0
  47. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/trl.py +0 -0
  48. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/tts.py +0 -0
  49. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/ultralytics.py +0 -0
  50. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/voice_agent.py +0 -0
  51. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/whisper.py +0 -0
  52. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/xgboost.py +0 -0
  53. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/launch.py +0 -0
  54. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/media.py +0 -0
  55. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/migrate.py +0 -0
  56. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/model.py +0 -0
  57. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/offline.py +0 -0
  58. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/pii.py +0 -0
  59. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/plot.py +0 -0
  60. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/prompt.py +0 -0
  61. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/query_api.py +0 -0
  62. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/scorers.py +0 -0
  63. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/sender.py +0 -0
  64. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/settings.py +0 -0
  65. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/summary.py +0 -0
  66. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/sweep.py +0 -0
  67. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/system_metrics.py +0 -0
  68. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/tensorboard.py +0 -0
  69. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/trace.py +0 -0
  70. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/transcript_formatter.py +0 -0
  71. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wal.py +0 -0
  72. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wandb_compat/__init__.py +0 -0
  73. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wandb_compat/_shim.py +0 -0
  74. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wer.py +0 -0
  75. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/__init__.py +0 -0
  76. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/conftest.py +0 -0
  77. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_alert.py +0 -0
  78. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_aliases.py +0 -0
  79. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_api_client.py +0 -0
  80. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_artifact.py +0 -0
  81. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_buffer.py +0 -0
  82. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_cache.py +0 -0
  83. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_class_scorers.py +0 -0
  84. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_cli.py +0 -0
  85. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_config.py +0 -0
  86. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_evaluation.py +0 -0
  87. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_finish.py +0 -0
  88. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_git_info.py +0 -0
  89. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_init.py +0 -0
  90. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_fastai.py +0 -0
  91. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_huggingface.py +0 -0
  92. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_keras.py +0 -0
  93. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_langchain.py +0 -0
  94. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_lightning.py +0 -0
  95. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_pytorch.py +0 -0
  96. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_sklearn.py +0 -0
  97. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_xgboost.py +0 -0
  98. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_launch.py +0 -0
  99. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_log.py +0 -0
  100. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_log_code.py +0 -0
  101. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_media.py +0 -0
  102. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_migrate.py +0 -0
  103. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_offline.py +0 -0
  104. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_offline_sync.py +0 -0
  105. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_pii.py +0 -0
  106. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_plot.py +0 -0
  107. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_query_api.py +0 -0
  108. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_resume.py +0 -0
  109. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_sdk_features.py +0 -0
  110. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_sender.py +0 -0
  111. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_summary.py +0 -0
  112. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_sweep.py +0 -0
  113. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_system_metrics.py +0 -0
  114. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_trace.py +0 -0
  115. {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.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.4.3
3
+ Version: 2.5.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.4.3"
123
+ __version__ = "2.5.0"
124
124
 
125
125
  logger = logging.getLogger("openrunner")
126
126
 
@@ -688,23 +688,43 @@ class APIClient:
688
688
  ) -> bool:
689
689
  """PUT raw file bytes to a presigned URL.
690
690
 
691
- Falls back to API proxy upload if presigned URL is unreachable
692
- (e.g., MinIO not exposed publicly).
691
+ Handles three cases:
692
+ 1. Relative proxy URL (/api/v1/runs/...) — use authenticated client
693
+ 2. Absolute URL — try direct PUT, fall back to proxy on ConnectError
694
+ 3. ConnectError fallback — PUT via /runs/{run_id}/files/{name}
693
695
  """
696
+ import os
697
+
694
698
  try:
695
- with open(file_path, "rb") as f:
696
- data = f.read()
697
- # Try presigned URL first
699
+ file_size = os.path.getsize(file_path)
700
+ # Use streaming for large files, read into memory for small ones
701
+ if file_size > 50 * 1024 * 1024: # 50 MB
702
+ data = open(file_path, "rb") # noqa: SIM115
703
+ else:
704
+ with open(file_path, "rb") as f:
705
+ data = f.read()
706
+
707
+ # Scale timeout by file size (minimum 60s, ~30s per 100MB)
708
+ upload_timeout = max(60.0, file_size / (3 * 1024 * 1024))
709
+
710
+ # Case 1: relative proxy URL from server
711
+ if presigned_url.startswith("/"):
712
+ api_path = presigned_url.replace("/api/v1/", "/", 1) if presigned_url.startswith("/api/v1/") else presigned_url
713
+ resp = self._client.put(api_path, content=data, timeout=upload_timeout)
714
+ return resp.status_code == 200
715
+
716
+ # Case 2: absolute presigned URL (direct to S3)
698
717
  try:
699
- resp = httpx.put(presigned_url, content=data, timeout=300.0)
718
+ resp = httpx.put(presigned_url, content=data, timeout=upload_timeout)
700
719
  resp.raise_for_status()
701
720
  return True
702
721
  except (httpx.ConnectError, httpx.ConnectTimeout):
703
- # Presigned URL unreachable use API proxy
722
+ # Case 3: fallback to API proxy
704
723
  if run_id:
705
- import os
706
724
  fname = os.path.basename(file_path)
707
- proxy_resp = self._request("PUT", f"/runs/{run_id}/files/{fname}", content=data)
725
+ proxy_resp = self._client.put(
726
+ f"/runs/{run_id}/files/{fname}", content=data, timeout=upload_timeout
727
+ )
708
728
  return proxy_resp.status_code == 200
709
729
  return False
710
730
  except Exception as e:
@@ -825,13 +825,21 @@ class Run:
825
825
 
826
826
  # Upload files that need uploading (dedup may skip some)
827
827
  # Reference files and reused files never have upload URLs.
828
+ all_uploaded = True
828
829
  for url_entry in result.get("upload_urls", []):
829
830
  local = next(
830
831
  f for f in artifact._files if f["name"] == url_entry["name"]
831
832
  )
832
- self._client.upload_file_to_presigned_url(
833
+ ok = self._client.upload_file_to_presigned_url(
833
834
  url_entry["presigned_url"], local["local_path"]
834
835
  )
836
+ if not ok:
837
+ logger.warning("upload failed for %s", url_entry["name"])
838
+ all_uploaded = False
839
+
840
+ if not all_uploaded:
841
+ logger.error("artifact upload incomplete — not confirming version")
842
+ return None
835
843
 
836
844
  # Confirm the version
837
845
  self._client.confirm_artifact_version(result["version_id"])
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.4.3"
3
+ version = "2.5.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
File without changes