openrunner-sdk 2.41.0__tar.gz → 2.41.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.
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/PKG-INFO +1 -1
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/__init__.py +1 -1
- openrunner_sdk-2.41.2/openrunner/_retry_transport.py +94 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/datasets.py +2 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/pyproject.toml +1 -1
- openrunner_sdk-2.41.2/tests/test_retry_transport.py +66 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/.gitignore +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/=6.0 +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/=8.1 +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/README.md +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/CLAUDE.md +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/_safepath.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/_secret_rules.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/api_client.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/autoresearch.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/cli.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/config.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/api_integration.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/cost_guard.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/gpu_types.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/price_compare.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/provider_base.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/forge_provider.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/lambda_cloud.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/modal_provider.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/ovhcloud.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/runpod.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/providers/vastai.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/runner.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/gpu/workspace_sync.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/handover.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/hooks/patent-lab-post-commit +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/install_commands.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/skypilot.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/machine.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/mcp_server.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/media.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/model.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/model_card.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/patent_scan.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/projects.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/reload.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/research.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/research_policy.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/run.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/session.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/sync.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/tools/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/tools/patent_report.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/scripts/gen_betterleaks_rules.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/conftest.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/integration/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/integration/conftest.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/integration/test_artifact_round_trip.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_api_client_methods.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_api_client_transport.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli_artifact_sweep.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli_datasets.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli_gpu_registry_deploy.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli_infra.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli_remainder.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_cli_topup.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_config.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_datasets_module.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/__init__.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/conftest.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_cost_guard.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_engine_serverside.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_forge.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_governed_jobs.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_gpu_cluster.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_gpu_types.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_lambda.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_modal.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_ovh_training.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_ovhcloud.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_price_compare.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_provider_base.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_runner.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_runpod.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_vastai.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu/test_workspace_sync.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_gpu_modal_creds.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_init.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_init_facade.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_install_commands.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_setA.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_setB.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_setC.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_log.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_machine_migrate.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_mcp_decisions.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_mcp_monitor.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_mcp_predictions.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_mcp_server.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_media.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_media_extra.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_patent_scan.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_plot_media_extra2.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_prompt_module.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_pure_modules.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_redact.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_reload_module.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_research_module.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_run_module.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sdk_cluster_j1.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sdk_cluster_j2.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sdk_cluster_j3.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sdk_cluster_j4.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sdk_core_edges.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_session_module.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_session_sync.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_topup_hi.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.41.0 → openrunner_sdk-2.41.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.41.
|
|
3
|
+
Version: 2.41.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
|
|
@@ -181,7 +181,7 @@ launch.from_run = _launch_from_run # type: ignore[attr-defined]
|
|
|
181
181
|
# openrunner.trace.patch_openai() syntax
|
|
182
182
|
trace.patch_openai = _patch_openai # type: ignore[attr-defined]
|
|
183
183
|
|
|
184
|
-
__version__ = "2.41.
|
|
184
|
+
__version__ = "2.41.2"
|
|
185
185
|
|
|
186
186
|
logger = logging.getLogger("openrunner")
|
|
187
187
|
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""A drop-in httpx transport that transparently retries transient failures.
|
|
2
|
+
|
|
3
|
+
Wraps the default ``httpx.HTTPTransport`` and retries:
|
|
4
|
+
* connection/timeout/protocol errors (the request never reached the app), and
|
|
5
|
+
* ``502 / 503`` responses (bad gateway / unavailable — e.g. the API container
|
|
6
|
+
being recreated by a deploy, which the app also never processed), plus
|
|
7
|
+
* ``504`` and ``429`` — ``504`` only for idempotent methods (GET/HEAD/PUT/
|
|
8
|
+
DELETE/OPTIONS) so a POST that may have executed is never silently repeated;
|
|
9
|
+
``429`` honours ``Retry-After``.
|
|
10
|
+
|
|
11
|
+
Backoff is exponential with jitter, capped. This lets long-running SDK jobs
|
|
12
|
+
(dataset materialise, bulk upload, run logging) ride out a transient blip instead
|
|
13
|
+
of crashing — the failure mode that corrupted an EarningsCall fetch mid-download.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import random
|
|
18
|
+
import time
|
|
19
|
+
|
|
20
|
+
import httpx
|
|
21
|
+
|
|
22
|
+
_IDEMPOTENT = frozenset({"GET", "HEAD", "PUT", "DELETE", "OPTIONS", "TRACE"})
|
|
23
|
+
# 502/503: app never handled the request -> safe to retry for any method.
|
|
24
|
+
# 504: request may have executed -> retry idempotent methods only.
|
|
25
|
+
_RETRY_ALWAYS = frozenset({502, 503})
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class RetryTransport(httpx.BaseTransport):
|
|
29
|
+
"""httpx transport retrying transient 5xx/429/network errors with backoff."""
|
|
30
|
+
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
wrapped: httpx.BaseTransport | None = None,
|
|
34
|
+
*,
|
|
35
|
+
max_retries: int = 4,
|
|
36
|
+
base_delay: float = 1.0,
|
|
37
|
+
max_delay: float = 30.0,
|
|
38
|
+
) -> None:
|
|
39
|
+
self._wrapped = wrapped if wrapped is not None else httpx.HTTPTransport()
|
|
40
|
+
self.max_retries = max_retries
|
|
41
|
+
self.base_delay = base_delay
|
|
42
|
+
self.max_delay = max_delay
|
|
43
|
+
|
|
44
|
+
def _sleep(self, attempt: int, retry_after: float = 0.0) -> None:
|
|
45
|
+
delay = min(self.base_delay * (2 ** attempt), self.max_delay)
|
|
46
|
+
delay = max(delay, min(retry_after, self.max_delay))
|
|
47
|
+
time.sleep(delay * (0.5 + random.random())) # 0.5x–1.5x jitter
|
|
48
|
+
|
|
49
|
+
def _should_retry_status(self, code: int, method: str) -> bool:
|
|
50
|
+
if code in _RETRY_ALWAYS or code == 429:
|
|
51
|
+
return True
|
|
52
|
+
if code == 504 and method.upper() in _IDEMPOTENT:
|
|
53
|
+
return True
|
|
54
|
+
return False
|
|
55
|
+
|
|
56
|
+
def handle_request(self, request: httpx.Request) -> httpx.Response:
|
|
57
|
+
last_exc: Exception | None = None
|
|
58
|
+
for attempt in range(self.max_retries + 1):
|
|
59
|
+
try:
|
|
60
|
+
response = self._wrapped.handle_request(request)
|
|
61
|
+
except (
|
|
62
|
+
httpx.ConnectError,
|
|
63
|
+
httpx.ConnectTimeout,
|
|
64
|
+
httpx.ReadTimeout,
|
|
65
|
+
httpx.WriteTimeout,
|
|
66
|
+
httpx.PoolTimeout,
|
|
67
|
+
httpx.RemoteProtocolError,
|
|
68
|
+
) as exc:
|
|
69
|
+
last_exc = exc
|
|
70
|
+
if attempt >= self.max_retries:
|
|
71
|
+
raise
|
|
72
|
+
self._sleep(attempt)
|
|
73
|
+
continue
|
|
74
|
+
|
|
75
|
+
if attempt < self.max_retries and self._should_retry_status(
|
|
76
|
+
response.status_code, request.method
|
|
77
|
+
):
|
|
78
|
+
retry_after = 0.0
|
|
79
|
+
try:
|
|
80
|
+
retry_after = float(response.headers.get("Retry-After", 0) or 0)
|
|
81
|
+
except (TypeError, ValueError):
|
|
82
|
+
retry_after = 0.0
|
|
83
|
+
response.close()
|
|
84
|
+
self._sleep(attempt, retry_after)
|
|
85
|
+
continue
|
|
86
|
+
return response
|
|
87
|
+
|
|
88
|
+
# Only reached if the last attempt raised then the loop fell through.
|
|
89
|
+
if last_exc is not None:
|
|
90
|
+
raise last_exc
|
|
91
|
+
raise httpx.HTTPError("request failed after retries") # pragma: no cover
|
|
92
|
+
|
|
93
|
+
def close(self) -> None:
|
|
94
|
+
self._wrapped.close()
|
|
@@ -194,10 +194,12 @@ class DatasetsClient:
|
|
|
194
194
|
or _g.get("base_url") or "http://localhost:8000")
|
|
195
195
|
if not key:
|
|
196
196
|
raise ValueError("API key required. Set OPENRUNNER_API_KEY, pass api_key=, or run `openrunner login`.")
|
|
197
|
+
from ._retry_transport import RetryTransport
|
|
197
198
|
self._http = httpx.Client(
|
|
198
199
|
base_url=f"{url.rstrip('/')}/api/v1",
|
|
199
200
|
headers={"Authorization": f"Bearer {key}"},
|
|
200
201
|
timeout=timeout,
|
|
202
|
+
transport=RetryTransport(),
|
|
201
203
|
)
|
|
202
204
|
|
|
203
205
|
# -- resolution ----------------------------------------------------------
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"""Tests for RetryTransport — the SDK-level transient-failure retry."""
|
|
2
|
+
import httpx
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from openrunner._retry_transport import RetryTransport
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def _client(responder, **kw):
|
|
9
|
+
mock = httpx.MockTransport(responder)
|
|
10
|
+
return httpx.Client(base_url="http://t", transport=RetryTransport(mock, base_delay=0.0, **kw))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_retries_502_then_succeeds():
|
|
14
|
+
calls = {"n": 0}
|
|
15
|
+
def responder(req):
|
|
16
|
+
calls["n"] += 1
|
|
17
|
+
return httpx.Response(502 if calls["n"] < 3 else 200, text="ok")
|
|
18
|
+
r = _client(responder).get("/x")
|
|
19
|
+
assert r.status_code == 200 and calls["n"] == 3
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_gives_up_after_max_retries():
|
|
23
|
+
calls = {"n": 0}
|
|
24
|
+
def responder(req):
|
|
25
|
+
calls["n"] += 1
|
|
26
|
+
return httpx.Response(503)
|
|
27
|
+
r = _client(responder, max_retries=2).get("/x")
|
|
28
|
+
assert r.status_code == 503 and calls["n"] == 3 # 1 + 2 retries
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_4xx_not_retried():
|
|
32
|
+
calls = {"n": 0}
|
|
33
|
+
def responder(req):
|
|
34
|
+
calls["n"] += 1
|
|
35
|
+
return httpx.Response(404)
|
|
36
|
+
r = _client(responder).get("/x")
|
|
37
|
+
assert r.status_code == 404 and calls["n"] == 1
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def test_504_retried_for_get_but_not_post():
|
|
41
|
+
for method, expect in [("GET", 3), ("POST", 1)]:
|
|
42
|
+
calls = {"n": 0}
|
|
43
|
+
def responder(req):
|
|
44
|
+
calls["n"] += 1
|
|
45
|
+
return httpx.Response(504)
|
|
46
|
+
_client(responder, max_retries=2).request(method, "/x")
|
|
47
|
+
assert calls["n"] == expect, method
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_connect_error_retried_then_raises():
|
|
51
|
+
calls = {"n": 0}
|
|
52
|
+
def responder(req):
|
|
53
|
+
calls["n"] += 1
|
|
54
|
+
raise httpx.ConnectError("boom")
|
|
55
|
+
with pytest.raises(httpx.ConnectError):
|
|
56
|
+
_client(responder, max_retries=2).get("/x")
|
|
57
|
+
assert calls["n"] == 3
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_429_honored_and_retried():
|
|
61
|
+
calls = {"n": 0}
|
|
62
|
+
def responder(req):
|
|
63
|
+
calls["n"] += 1
|
|
64
|
+
return httpx.Response(429, headers={"Retry-After": "0"}) if calls["n"] < 2 else httpx.Response(200)
|
|
65
|
+
r = _client(responder).get("/x")
|
|
66
|
+
assert r.status_code == 200 and calls["n"] == 2
|
|
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
|
{openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-aaa/config.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/fixtures/wandb-export-mini/run-bbb/config.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openrunner_sdk-2.41.0 → openrunner_sdk-2.41.2}/tests/integration/test_artifact_round_trip.py
RENAMED
|
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
|