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.
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/PKG-INFO +1 -1
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/__init__.py +1 -1
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/api_client.py +29 -9
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/run.py +9 -1
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/pyproject.toml +1 -1
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/.gitignore +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/=6.0 +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/=8.1 +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/README.md +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/cli.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/config.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/media.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/model.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/__init__.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/conftest.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_config.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_init.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_log.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_media.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.4.3 → openrunner_sdk-2.5.0}/tests/test_trace.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
692
|
-
|
|
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
|
-
|
|
696
|
-
|
|
697
|
-
|
|
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=
|
|
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
|
-
#
|
|
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.
|
|
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"])
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|