openrunner-sdk 2.37.28__tar.gz → 2.37.30__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.37.28 → openrunner_sdk-2.37.30}/PKG-INFO +1 -1
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/__init__.py +1 -1
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/cli.py +82 -1
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/install_commands.py +26 -11
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/mcp_server.py +44 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/pyproject.toml +1 -1
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/.gitignore +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/=6.0 +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/=8.1 +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/README.md +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/CLAUDE.md +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/_safepath.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/_secret_rules.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/api_client.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/autoresearch.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/config.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/datasets.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/api_integration.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/cost_guard.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/gpu_types.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/price_compare.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/provider_base.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/lambda_cloud.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/modal_provider.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/ovhcloud.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/runpod.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/vastai.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/runner.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/workspace_sync.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/handover.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/hooks/patent-lab-post-commit +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/skypilot.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/machine.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/media.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/model.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/model_card.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/patent_scan.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/projects.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/reload.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/research.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/research_policy.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/run.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/session.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/sync.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/tools/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/tools/patent_report.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/scripts/gen_betterleaks_rules.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/conftest.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/integration/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/integration/conftest.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/integration/test_artifact_round_trip.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_config.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/__init__.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/conftest.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_cost_guard.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_gpu_types.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_lambda.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_modal.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_ovhcloud.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_price_compare.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_provider_base.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_runner.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_runpod.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_vastai.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_gpu/test_workspace_sync.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_init.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_install_commands.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_log.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_mcp_decisions.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_mcp_monitor.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_mcp_predictions.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_media.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_session_sync.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/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.37.
|
|
3
|
+
Version: 2.37.30
|
|
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.37.
|
|
184
|
+
__version__ = "2.37.30"
|
|
185
185
|
|
|
186
186
|
logger = logging.getLogger("openrunner")
|
|
187
187
|
|
|
@@ -57,6 +57,64 @@ def _auto_install_commands() -> None:
|
|
|
57
57
|
pass # never crash on auto-install
|
|
58
58
|
|
|
59
59
|
|
|
60
|
+
# ---------------------------------------------------------------------------
|
|
61
|
+
# Update awareness — know when a newer SDK is on PyPI
|
|
62
|
+
# ---------------------------------------------------------------------------
|
|
63
|
+
|
|
64
|
+
_PYPI_JSON = "https://pypi.org/pypi/openrunner-sdk/json"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _latest_pypi_version(timeout: float = 3.0) -> str | None:
|
|
68
|
+
"""Return the latest openrunner-sdk version on PyPI, or None on any failure.
|
|
69
|
+
Never raises — update awareness must never break a command."""
|
|
70
|
+
try:
|
|
71
|
+
import urllib.request
|
|
72
|
+
|
|
73
|
+
with urllib.request.urlopen(_PYPI_JSON, timeout=timeout) as r:
|
|
74
|
+
import json as _json
|
|
75
|
+
return _json.load(r).get("info", {}).get("version")
|
|
76
|
+
except Exception:
|
|
77
|
+
return None
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _version_tuple(v: str) -> tuple:
|
|
81
|
+
out = []
|
|
82
|
+
for part in str(v).split("."):
|
|
83
|
+
num = "".join(c for c in part if c.isdigit())
|
|
84
|
+
out.append(int(num) if num else 0)
|
|
85
|
+
return tuple(out)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def check_for_update(force: bool = False, cache_hours: float = 24.0) -> dict:
|
|
89
|
+
"""Compare the installed SDK to the latest on PyPI.
|
|
90
|
+
|
|
91
|
+
Returns {installed, latest, update_available}. Caches the PyPI answer in
|
|
92
|
+
~/.openrunner/.update_check (mtime-based) so it hits the network at most once
|
|
93
|
+
per cache window unless force=True.
|
|
94
|
+
"""
|
|
95
|
+
from openrunner import __version__ as installed
|
|
96
|
+
cache = _settings_dir() / ".update_check"
|
|
97
|
+
latest = None
|
|
98
|
+
if not force:
|
|
99
|
+
try:
|
|
100
|
+
import os as _os
|
|
101
|
+
import time as _time
|
|
102
|
+
if cache.exists() and (_time.time() - _os.path.getmtime(cache)) < cache_hours * 3600:
|
|
103
|
+
latest = cache.read_text().strip() or None
|
|
104
|
+
except Exception:
|
|
105
|
+
latest = None
|
|
106
|
+
if latest is None:
|
|
107
|
+
latest = _latest_pypi_version()
|
|
108
|
+
if latest:
|
|
109
|
+
try:
|
|
110
|
+
cache.parent.mkdir(parents=True, exist_ok=True)
|
|
111
|
+
cache.write_text(latest)
|
|
112
|
+
except Exception:
|
|
113
|
+
pass
|
|
114
|
+
avail = bool(latest) and _version_tuple(latest) > _version_tuple(installed)
|
|
115
|
+
return {"installed": installed, "latest": latest, "update_available": avail}
|
|
116
|
+
|
|
117
|
+
|
|
60
118
|
# ---------------------------------------------------------------------------
|
|
61
119
|
# Settings helpers
|
|
62
120
|
# ---------------------------------------------------------------------------
|
|
@@ -2980,6 +3038,23 @@ def install_commands(tools: tuple) -> None:
|
|
|
2980
3038
|
click.echo(" Or: openrunner mcp install")
|
|
2981
3039
|
|
|
2982
3040
|
|
|
3041
|
+
@main.command("version")
|
|
3042
|
+
@click.option("--check", is_flag=True, help="Also check PyPI for a newer release")
|
|
3043
|
+
def version_cmd(check: bool) -> None:
|
|
3044
|
+
"""Show the installed SDK version (and whether an update is available)."""
|
|
3045
|
+
from openrunner import __version__
|
|
3046
|
+
if not check:
|
|
3047
|
+
click.echo(__version__)
|
|
3048
|
+
return
|
|
3049
|
+
info = check_for_update(force=True)
|
|
3050
|
+
click.echo(f"installed: {info['installed']}")
|
|
3051
|
+
click.echo(f"latest: {info.get('latest') or '(unknown — offline?)'}")
|
|
3052
|
+
if info["update_available"]:
|
|
3053
|
+
click.echo("Update available. Run: openrunner update")
|
|
3054
|
+
elif info.get("latest"):
|
|
3055
|
+
click.echo("Up to date.")
|
|
3056
|
+
|
|
3057
|
+
|
|
2983
3058
|
@main.command("update")
|
|
2984
3059
|
@click.option("--pre", is_flag=True, help="Include pre-releases")
|
|
2985
3060
|
@click.option("--no-reinstall", is_flag=True, help="Only upgrade the package; skip reinstalling slash commands")
|
|
@@ -2995,7 +3070,13 @@ def update_cmd(pre: bool, no_reinstall: bool) -> None:
|
|
|
2995
3070
|
|
|
2996
3071
|
from openrunner import __version__ as _cur
|
|
2997
3072
|
|
|
2998
|
-
|
|
3073
|
+
info = check_for_update(force=True)
|
|
3074
|
+
latest = info.get("latest")
|
|
3075
|
+
click.echo(f"Current openrunner-sdk: {_cur}" + (f" — latest: {latest}" if latest else ""))
|
|
3076
|
+
if latest and not info["update_available"]:
|
|
3077
|
+
click.echo("Already up to date.")
|
|
3078
|
+
if no_reinstall:
|
|
3079
|
+
return
|
|
2999
3080
|
cmd = [sys.executable, "-m", "pip", "install", "--upgrade", "--no-cache-dir"]
|
|
3000
3081
|
if pre:
|
|
3001
3082
|
cmd.append("--pre")
|
|
@@ -434,12 +434,21 @@ Report result to user.
|
|
|
434
434
|
|
|
435
435
|
UPDATE_CMD = """---
|
|
436
436
|
name: {prefix}update
|
|
437
|
-
description:
|
|
437
|
+
description: Check for + install the latest OpenRunner SDK and reinstall all commands (skills + MCP)
|
|
438
438
|
allowed-tools:
|
|
439
439
|
- Bash
|
|
440
440
|
---
|
|
441
441
|
|
|
442
|
-
|
|
442
|
+
First CHECK whether a newer release exists, then upgrade if so. The SDK is
|
|
443
|
+
update-aware: `openrunner version --check` compares the installed version to PyPI,
|
|
444
|
+
and the `openrunner_check_update` MCP tool does the same for an assistant.
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
openrunner version --check 2>/dev/null || true
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
If it says "Up to date", stop and tell the user. If an update is available (or
|
|
451
|
+
the check couldn't run), upgrade openrunner-sdk and reinstall slash commands:
|
|
443
452
|
|
|
444
453
|
```bash
|
|
445
454
|
pip install --upgrade --no-cache-dir openrunner-sdk 2>&1 | tail -3 && python3 -c "
|
|
@@ -2400,8 +2409,11 @@ in the web UI, or ask an org admin. Then ask the user for their provider API key
|
|
|
2400
2409
|
openrunner gpu credentials add --org ORG_ID --provider runpod --api-key PROVIDER_KEY
|
|
2401
2410
|
```
|
|
2402
2411
|
|
|
2403
|
-
|
|
2404
|
-
|
|
2412
|
+
Server-side provisioning adapters: **RunPod, Vast.ai, OVH** (self-enroll, no SSH)
|
|
2413
|
+
and **Lambda** (SSH — no boot hook). AWS/GCP have no native launch — provision the
|
|
2414
|
+
box yourself then `openrunner runner enroll --cloud-init` (user-data /
|
|
2415
|
+
startup-script). OVH's stored key is a JSON blob (app_key/secret/consumer_key/
|
|
2416
|
+
service_name); Lambda's is `{{api_key, ssh_key_names[]}}`.
|
|
2405
2417
|
|
|
2406
2418
|
## Step 3 -- Pick GPU, image, command
|
|
2407
2419
|
|
|
@@ -3082,8 +3094,9 @@ Gather the real options (don't hardcode):
|
|
|
3082
3094
|
- **Cloud offers**: `openrunner deploy gpus -p ORG/NAME` (or the GPU prices
|
|
3083
3095
|
endpoint) -> provider - GPU - VRAM - $/hr, for providers the org has a stored
|
|
3084
3096
|
credential for (`openrunner gpu credentials ls`).
|
|
3085
|
-
- Note which providers have a **
|
|
3086
|
-
|
|
3097
|
+
- Note which providers have a **provisioning adapter** (RunPod, Vast.ai, OVH via
|
|
3098
|
+
`runner launch`/`gpu run`; Lambda via `gpu run`, SSH) vs enroll-only (AWS/GCP →
|
|
3099
|
+
`runner enroll --cloud-init`), and which registered hosts/runners are `active`.
|
|
3087
3100
|
|
|
3088
3101
|
## Step 2 -- interpret the NL request (map intent -> concrete target)
|
|
3089
3102
|
From the user's phrasing, resolve a single target + shape:
|
|
@@ -3152,8 +3165,9 @@ directly SSH-reachable** (`publicIp:22`): SSH is only via the **proxy**
|
|
|
3152
3165
|
it rather than leaving it billing.
|
|
3153
3166
|
- Ground VRAM/fit claims in the model card; label estimates.
|
|
3154
3167
|
- SSH-less by default: reach for the RUNNER model (A) unless a host has verified
|
|
3155
|
-
direct SSH.
|
|
3156
|
-
|
|
3168
|
+
direct SSH. Provisioning adapters: RunPod / Vast.ai / OVH (`runner launch`,
|
|
3169
|
+
self-enroll, no SSH) and Lambda (`gpu run`, SSH — no boot hook). AWS/GCP have no
|
|
3170
|
+
native launch -> `runner enroll --cloud-init` (user-data / startup-script).
|
|
3157
3171
|
"""
|
|
3158
3172
|
|
|
3159
3173
|
|
|
@@ -3200,7 +3214,8 @@ Pull the model card + run summary and extract, with numbers only:
|
|
|
3200
3214
|
|
|
3201
3215
|
## Step 4 -- confirm platform + GPU (interactive)
|
|
3202
3216
|
Use AskUserQuestion with the recommendation FIRST and marked "(Recommended)":
|
|
3203
|
-
- **Platform**:
|
|
3217
|
+
- **Platform**: providers with a provisioning adapter (RunPod, Vast.ai, OVH,
|
|
3218
|
+
Lambda). AWS/GCP are pricing/enroll-only for deployments.
|
|
3204
3219
|
- **GPU**: 3-4 offers spanning the recommendation +/- one size, each labelled with
|
|
3205
3220
|
VRAM + $/hr so the trade-off is visible.
|
|
3206
3221
|
Then ask replica bounds + autoscale:
|
|
@@ -3223,8 +3238,8 @@ Then ask replica bounds + autoscale:
|
|
|
3223
3238
|
CONFIRM before `create`. Mention scale-to-zero to cap idle cost.
|
|
3224
3239
|
- Fit VRAM with headroom; warn if the recommendation is tight for the target
|
|
3225
3240
|
batch.
|
|
3226
|
-
-
|
|
3227
|
-
|
|
3241
|
+
- Provisioning adapters: RunPod, Vast.ai, OVH, Lambda. AWS/GCP have no native
|
|
3242
|
+
deploy adapter -- say so if picked.
|
|
3228
3243
|
"""
|
|
3229
3244
|
|
|
3230
3245
|
|
|
@@ -1428,6 +1428,17 @@ def create_server():
|
|
|
1428
1428
|
"required": ["org"],
|
|
1429
1429
|
},
|
|
1430
1430
|
),
|
|
1431
|
+
Tool(
|
|
1432
|
+
name="openrunner_check_update",
|
|
1433
|
+
description=(
|
|
1434
|
+
"Check whether a newer openrunner-sdk is available on PyPI vs the "
|
|
1435
|
+
"installed version. Returns installed + latest + whether an update is "
|
|
1436
|
+
"available, and the command to run (`openrunner update`). Call this "
|
|
1437
|
+
"when the user asks to update OpenRunner or whether they're on the "
|
|
1438
|
+
"latest version — then, if they confirm, run `openrunner update`."
|
|
1439
|
+
),
|
|
1440
|
+
inputSchema={"type": "object", "properties": {}, "required": []},
|
|
1441
|
+
),
|
|
1431
1442
|
]
|
|
1432
1443
|
|
|
1433
1444
|
@server.call_tool()
|
|
@@ -1534,6 +1545,8 @@ def create_server():
|
|
|
1534
1545
|
result = await _tool_submit_job(arguments)
|
|
1535
1546
|
elif name == "openrunner_list_jobs":
|
|
1536
1547
|
result = await _tool_list_jobs(arguments)
|
|
1548
|
+
elif name == "openrunner_check_update":
|
|
1549
|
+
result = await _tool_check_update(arguments)
|
|
1537
1550
|
else:
|
|
1538
1551
|
result = f"Unknown tool: {name}"
|
|
1539
1552
|
except RuntimeError as e:
|
|
@@ -4299,3 +4312,34 @@ async def _tool_list_jobs(args: dict) -> str:
|
|
|
4299
4312
|
for j in rows[:30]
|
|
4300
4313
|
]
|
|
4301
4314
|
return "Jobs:\n" + "\n".join(lines)
|
|
4315
|
+
|
|
4316
|
+
|
|
4317
|
+
async def _tool_check_update(args: dict) -> str:
|
|
4318
|
+
"""Report installed vs latest openrunner-sdk on PyPI (no network via the API —
|
|
4319
|
+
queries PyPI directly)."""
|
|
4320
|
+
from openrunner import __version__ as installed
|
|
4321
|
+
|
|
4322
|
+
latest = None
|
|
4323
|
+
try:
|
|
4324
|
+
import urllib.request
|
|
4325
|
+
|
|
4326
|
+
def _fetch():
|
|
4327
|
+
with urllib.request.urlopen("https://pypi.org/pypi/openrunner-sdk/json", timeout=5) as r:
|
|
4328
|
+
import json as _json
|
|
4329
|
+
return _json.load(r).get("info", {}).get("version")
|
|
4330
|
+
|
|
4331
|
+
import asyncio as _asyncio
|
|
4332
|
+
latest = await _asyncio.to_thread(_fetch)
|
|
4333
|
+
except Exception as e:
|
|
4334
|
+
return f"installed: {installed}\nCould not reach PyPI to check latest ({e})."
|
|
4335
|
+
|
|
4336
|
+
def _vt(v):
|
|
4337
|
+
return tuple(int("".join(c for c in p if c.isdigit()) or 0) for p in str(v).split("."))
|
|
4338
|
+
|
|
4339
|
+
avail = bool(latest) and _vt(latest) > _vt(installed)
|
|
4340
|
+
if avail:
|
|
4341
|
+
return (f"installed: {installed}\nlatest: {latest}\nUPDATE AVAILABLE.\n"
|
|
4342
|
+
"To update: run `openrunner update` in the terminal (upgrades the SDK "
|
|
4343
|
+
"+ reinstalls the /openrunner slash commands). Ask the user to confirm, "
|
|
4344
|
+
"then run it.")
|
|
4345
|
+
return f"installed: {installed}\nlatest: {latest}\nUp to date."
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.37.28 → openrunner_sdk-2.37.30}/openrunner/gpu/providers/modal_provider.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
|
{openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/anthropic_tracer.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/openrunner/integration/forced_alignment.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
|
{openrunner_sdk-2.37.28 → openrunner_sdk-2.37.30}/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
|