openrunner-sdk 2.4.4__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.4 → openrunner_sdk-2.5.0}/PKG-INFO +1 -1
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/__init__.py +1 -1
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/api_client.py +17 -6
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/run.py +9 -1
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/pyproject.toml +1 -1
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/.gitignore +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/=6.0 +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/=8.1 +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/README.md +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/cli.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/config.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/media.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/model.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/__init__.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/conftest.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_config.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_init.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_log.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_media.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.4.4 → openrunner_sdk-2.5.0}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.4.4 → 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
|
|
|
@@ -693,27 +693,38 @@ class APIClient:
|
|
|
693
693
|
2. Absolute URL — try direct PUT, fall back to proxy on ConnectError
|
|
694
694
|
3. ConnectError fallback — PUT via /runs/{run_id}/files/{name}
|
|
695
695
|
"""
|
|
696
|
+
import os
|
|
697
|
+
|
|
696
698
|
try:
|
|
697
|
-
|
|
698
|
-
|
|
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))
|
|
699
709
|
|
|
700
710
|
# Case 1: relative proxy URL from server
|
|
701
711
|
if presigned_url.startswith("/"):
|
|
702
712
|
api_path = presigned_url.replace("/api/v1/", "/", 1) if presigned_url.startswith("/api/v1/") else presigned_url
|
|
703
|
-
resp = self.
|
|
713
|
+
resp = self._client.put(api_path, content=data, timeout=upload_timeout)
|
|
704
714
|
return resp.status_code == 200
|
|
705
715
|
|
|
706
716
|
# Case 2: absolute presigned URL (direct to S3)
|
|
707
717
|
try:
|
|
708
|
-
resp = httpx.put(presigned_url, content=data, timeout=
|
|
718
|
+
resp = httpx.put(presigned_url, content=data, timeout=upload_timeout)
|
|
709
719
|
resp.raise_for_status()
|
|
710
720
|
return True
|
|
711
721
|
except (httpx.ConnectError, httpx.ConnectTimeout):
|
|
712
722
|
# Case 3: fallback to API proxy
|
|
713
723
|
if run_id:
|
|
714
|
-
import os
|
|
715
724
|
fname = os.path.basename(file_path)
|
|
716
|
-
proxy_resp = self.
|
|
725
|
+
proxy_resp = self._client.put(
|
|
726
|
+
f"/runs/{run_id}/files/{fname}", content=data, timeout=upload_timeout
|
|
727
|
+
)
|
|
717
728
|
return proxy_resp.status_code == 200
|
|
718
729
|
return False
|
|
719
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
|