openrunner-sdk 2.2.0__tar.gz → 2.3.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 (114) hide show
  1. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/PKG-INFO +1 -1
  2. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/api_client.py +26 -10
  3. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/sender.py +8 -4
  4. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/pyproject.toml +1 -1
  5. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/.gitignore +0 -0
  6. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/=6.0 +0 -0
  7. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/=8.1 +0 -0
  8. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/README.md +0 -0
  9. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/__init__.py +0 -0
  10. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/artifact.py +0 -0
  11. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/buffer.py +0 -0
  12. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/cache.py +0 -0
  13. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/cli.py +0 -0
  14. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/config.py +0 -0
  15. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/cost.py +0 -0
  16. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/dataset.py +0 -0
  17. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/environment.py +0 -0
  18. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/evaluation.py +0 -0
  19. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/feedback.py +0 -0
  20. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/git_info.py +0 -0
  21. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/guardrails.py +0 -0
  22. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/__init__.py +0 -0
  23. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/accelerate.py +0 -0
  24. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/anthropic_tracer.py +0 -0
  25. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/catboost.py +0 -0
  26. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/diffusers.py +0 -0
  27. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/fastai.py +0 -0
  28. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/forced_alignment.py +0 -0
  29. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/gladia.py +0 -0
  30. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/gymnasium.py +0 -0
  31. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/huggingface.py +0 -0
  32. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/hydra.py +0 -0
  33. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/ignite.py +0 -0
  34. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/jax.py +0 -0
  35. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/keras.py +0 -0
  36. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/langchain.py +0 -0
  37. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/lightgbm.py +0 -0
  38. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/lightning.py +0 -0
  39. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/llamaindex.py +0 -0
  40. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/openai_finetune.py +0 -0
  41. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/openai_tracer.py +0 -0
  42. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/optuna.py +0 -0
  43. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/pytorch.py +0 -0
  44. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/sb3.py +0 -0
  45. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/sklearn.py +0 -0
  46. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/tensorflow.py +0 -0
  47. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/trl.py +0 -0
  48. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/tts.py +0 -0
  49. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/ultralytics.py +0 -0
  50. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/voice_agent.py +0 -0
  51. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/whisper.py +0 -0
  52. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/integration/xgboost.py +0 -0
  53. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/launch.py +0 -0
  54. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/media.py +0 -0
  55. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/migrate.py +0 -0
  56. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/model.py +0 -0
  57. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/offline.py +0 -0
  58. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/pii.py +0 -0
  59. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/plot.py +0 -0
  60. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/prompt.py +0 -0
  61. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/query_api.py +0 -0
  62. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/run.py +0 -0
  63. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/scorers.py +0 -0
  64. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/settings.py +0 -0
  65. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/summary.py +0 -0
  66. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/sweep.py +0 -0
  67. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/system_metrics.py +0 -0
  68. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/tensorboard.py +0 -0
  69. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/trace.py +0 -0
  70. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/transcript_formatter.py +0 -0
  71. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/wal.py +0 -0
  72. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/wandb_compat/__init__.py +0 -0
  73. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/openrunner/wandb_compat/_shim.py +0 -0
  74. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/__init__.py +0 -0
  75. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/conftest.py +0 -0
  76. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_alert.py +0 -0
  77. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_aliases.py +0 -0
  78. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_api_client.py +0 -0
  79. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_artifact.py +0 -0
  80. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_buffer.py +0 -0
  81. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_cache.py +0 -0
  82. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_class_scorers.py +0 -0
  83. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_cli.py +0 -0
  84. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_config.py +0 -0
  85. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_evaluation.py +0 -0
  86. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_finish.py +0 -0
  87. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_git_info.py +0 -0
  88. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_init.py +0 -0
  89. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_fastai.py +0 -0
  90. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_huggingface.py +0 -0
  91. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_keras.py +0 -0
  92. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_langchain.py +0 -0
  93. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_lightning.py +0 -0
  94. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_pytorch.py +0 -0
  95. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_sklearn.py +0 -0
  96. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_integration_xgboost.py +0 -0
  97. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_launch.py +0 -0
  98. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_log.py +0 -0
  99. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_log_code.py +0 -0
  100. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_media.py +0 -0
  101. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_migrate.py +0 -0
  102. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_offline.py +0 -0
  103. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_offline_sync.py +0 -0
  104. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_pii.py +0 -0
  105. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_plot.py +0 -0
  106. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_query_api.py +0 -0
  107. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_resume.py +0 -0
  108. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_sdk_features.py +0 -0
  109. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_sender.py +0 -0
  110. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_summary.py +0 -0
  111. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_sweep.py +0 -0
  112. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_system_metrics.py +0 -0
  113. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.0}/tests/test_trace.py +0 -0
  114. {openrunner_sdk-2.2.0 → openrunner_sdk-2.3.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.2.0
3
+ Version: 2.3.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
@@ -684,21 +684,37 @@ class APIClient:
684
684
  presigned_url: str,
685
685
  data_bytes: bytes,
686
686
  content_type: str = "image/png",
687
+ run_id: str = "",
688
+ key: str = "",
687
689
  ) -> bool:
688
690
  """PUT bytes to a presigned URL with Content-Type header.
689
691
 
690
- Uses httpx directly (not self._client) because presigned URLs
691
- are absolute and should not have a base_url prefix.
692
+ Falls back to API proxy upload if presigned URL is unreachable
693
+ (e.g., MinIO not exposed publicly).
692
694
  """
693
695
  try:
694
- resp = httpx.put(
695
- presigned_url,
696
- content=data_bytes,
697
- headers={"Content-Type": content_type},
698
- timeout=300.0,
699
- )
700
- resp.raise_for_status()
701
- return True
696
+ try:
697
+ resp = httpx.put(
698
+ presigned_url,
699
+ content=data_bytes,
700
+ headers={"Content-Type": content_type},
701
+ timeout=300.0,
702
+ )
703
+ resp.raise_for_status()
704
+ return True
705
+ except (httpx.ConnectError, httpx.ConnectTimeout):
706
+ # Presigned URL unreachable — use API proxy
707
+ if run_id and key:
708
+ import os
709
+ fname = os.path.basename(key) or key.replace("/", "_")
710
+ proxy_resp = self._request(
711
+ "PUT",
712
+ f"/runs/{run_id}/files/media/{fname}",
713
+ content=data_bytes,
714
+ headers={"Content-Type": content_type},
715
+ )
716
+ return proxy_resp.status_code == 200
717
+ return False
702
718
  except Exception as e:
703
719
  logger.warning("upload_media_bytes failed: %s", e)
704
720
  return False
@@ -265,7 +265,8 @@ class Sender:
265
265
  if result and result.get("presigned_url"):
266
266
  # Upload the bytes to the presigned URL
267
267
  self._client.upload_media_bytes(
268
- result["presigned_url"], img_bytes, content_type
268
+ result["presigned_url"], img_bytes, content_type,
269
+ run_id=self._run_id, key=item["key"],
269
270
  )
270
271
 
271
272
  elif media_type == "table":
@@ -293,7 +294,8 @@ class Sender:
293
294
  )
294
295
  if result and result.get("presigned_url"):
295
296
  self._client.upload_media_bytes(
296
- result["presigned_url"], audio_bytes, content_type
297
+ result["presigned_url"], audio_bytes, content_type,
298
+ run_id=self._run_id, key=item["key"],
297
299
  )
298
300
 
299
301
  elif media_type == "video":
@@ -311,7 +313,8 @@ class Sender:
311
313
  )
312
314
  if result and result.get("presigned_url"):
313
315
  self._client.upload_media_bytes(
314
- result["presigned_url"], video_bytes, content_type
316
+ result["presigned_url"], video_bytes, content_type,
317
+ run_id=self._run_id, key=item["key"],
315
318
  )
316
319
 
317
320
  elif media_type == "histogram":
@@ -408,7 +411,8 @@ class Sender:
408
411
  )
409
412
  if result and result.get("presigned_url"):
410
413
  self._client.upload_media_bytes(
411
- result["presigned_url"], img_bytes, content_type
414
+ result["presigned_url"], img_bytes, content_type,
415
+ run_id=self._run_id, key=item["key"],
412
416
  )
413
417
 
414
418
  elif media_type == "molecule":
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openrunner-sdk"
3
- version = "2.2.0"
3
+ version = "2.3.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