openrunner-sdk 2.37.5__tar.gz → 2.37.7__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.5 → openrunner_sdk-2.37.7}/PKG-INFO +1 -1
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/__init__.py +1 -1
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/api_client.py +33 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/cli.py +33 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/install_commands.py +139 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/pyproject.toml +1 -1
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/.gitignore +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/=6.0 +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/=8.1 +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/README.md +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/CLAUDE.md +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/_safepath.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/_secret_rules.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/autoresearch.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/config.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/datasets.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/api_integration.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/cost_guard.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/gpu_types.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/price_compare.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/provider_base.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/lambda_cloud.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/modal_provider.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/ovhcloud.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/runpod.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/providers/vastai.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/runner.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/gpu/workspace_sync.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/handover.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/hooks/patent-lab-post-commit +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/skypilot.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/machine.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/mcp_server.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/media.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/model.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/model_card.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/patent_scan.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/projects.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/reload.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/research.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/research_policy.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/run.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/session.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/sync.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/tools/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/tools/patent_report.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/scripts/gen_betterleaks_rules.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/conftest.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/integration/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/integration/conftest.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/integration/test_artifact_round_trip.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_config.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/__init__.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/conftest.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_cost_guard.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_gpu_types.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_lambda.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_modal.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_ovhcloud.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_price_compare.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_provider_base.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_runner.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_runpod.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_vastai.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_gpu/test_workspace_sync.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_init.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_install_commands.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_log.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_mcp_decisions.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_mcp_monitor.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_mcp_predictions.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_media.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_session_sync.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.37.5 → openrunner_sdk-2.37.7}/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.7
|
|
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.7"
|
|
185
185
|
|
|
186
186
|
logger = logging.getLogger("openrunner")
|
|
187
187
|
|
|
@@ -147,6 +147,39 @@ class APIClient:
|
|
|
147
147
|
logger.warning("post_metrics failed: %s", e)
|
|
148
148
|
return 0
|
|
149
149
|
|
|
150
|
+
def create_api_key(
|
|
151
|
+
self,
|
|
152
|
+
name: str,
|
|
153
|
+
scopes: list[str] | None = None,
|
|
154
|
+
scope_project_id: str | None = None,
|
|
155
|
+
scope_org_id: str | None = None,
|
|
156
|
+
) -> dict[str, Any] | None:
|
|
157
|
+
"""POST /users/me/api-keys -- mint a scoped API key.
|
|
158
|
+
|
|
159
|
+
``scopes`` are fine-grained capability scopes, e.g.
|
|
160
|
+
``["drift:read", "drift:write"]``; None/empty means full access.
|
|
161
|
+
``scope_project_id`` / ``scope_org_id`` further restrict the key to a
|
|
162
|
+
single project/org. The plaintext key is returned ONCE, in the ``key``
|
|
163
|
+
field of the response dict -- it is never retrievable again.
|
|
164
|
+
|
|
165
|
+
Returns the created-key dict (incl. plaintext ``key``), or None on
|
|
166
|
+
failure.
|
|
167
|
+
"""
|
|
168
|
+
try:
|
|
169
|
+
body: dict[str, Any] = {"name": name}
|
|
170
|
+
if scopes:
|
|
171
|
+
body["scopes"] = scopes
|
|
172
|
+
if scope_project_id:
|
|
173
|
+
body["scope_project_id"] = scope_project_id
|
|
174
|
+
if scope_org_id:
|
|
175
|
+
body["scope_org_id"] = scope_org_id
|
|
176
|
+
response = self._request("post", "/users/me/api-keys", json=body)
|
|
177
|
+
response.raise_for_status()
|
|
178
|
+
return response.json()
|
|
179
|
+
except Exception as e:
|
|
180
|
+
logger.warning("create_api_key failed: %s", e)
|
|
181
|
+
return None
|
|
182
|
+
|
|
150
183
|
def post_inference_events(
|
|
151
184
|
self,
|
|
152
185
|
project_id: str,
|
|
@@ -4339,6 +4339,39 @@ def drift_group() -> None:
|
|
|
4339
4339
|
pass
|
|
4340
4340
|
|
|
4341
4341
|
|
|
4342
|
+
@drift_group.command("key")
|
|
4343
|
+
@click.option("--project", "-p", default=None, help="Project org/name or UUID to scope the key to")
|
|
4344
|
+
@click.option("--name", "-n", default=None, help="Key name (default: drift-<project>)")
|
|
4345
|
+
@click.option("--read-only", is_flag=True, help="Mint a drift:read-only key (no ingest)")
|
|
4346
|
+
@click.option("--json", "as_json", is_flag=True, help="Print the key record as JSON")
|
|
4347
|
+
def drift_key(project, name, read_only, as_json) -> None:
|
|
4348
|
+
"""Mint an API key scoped to inference-drift only (read+write by default).
|
|
4349
|
+
|
|
4350
|
+
The key carries ONLY ``drift:read``+``drift:write`` (or ``drift:read`` with
|
|
4351
|
+
--read-only) and is bound to the project — it cannot touch runs, datasets,
|
|
4352
|
+
artifacts, weights, or any other domain. Give this to a container/service
|
|
4353
|
+
that reports drift events instead of a full-access key. The plaintext key is
|
|
4354
|
+
shown ONCE; store it as the container's ``OPENRUNNER_API_KEY``.
|
|
4355
|
+
"""
|
|
4356
|
+
import json as _json
|
|
4357
|
+
|
|
4358
|
+
client, pid = _drift_client_project(project)
|
|
4359
|
+
scopes = ["drift:read"] if read_only else ["drift:read", "drift:write"]
|
|
4360
|
+
key_name = name or f"drift-{(project or _load_settings().get('project') or pid)}".replace("/", "-")
|
|
4361
|
+
rec = client.create_api_key(key_name, scopes=scopes, scope_project_id=pid)
|
|
4362
|
+
client.close()
|
|
4363
|
+
if not rec or not rec.get("key"):
|
|
4364
|
+
click.echo("Error: failed to mint drift key (check login / project membership).", err=True)
|
|
4365
|
+
raise SystemExit(1)
|
|
4366
|
+
if as_json:
|
|
4367
|
+
click.echo(_json.dumps(rec))
|
|
4368
|
+
return
|
|
4369
|
+
click.echo(f"name: {rec.get('name')}")
|
|
4370
|
+
click.echo(f"scopes: {','.join(rec.get('scopes') or scopes)}")
|
|
4371
|
+
click.echo(f"key: {rec['key']}")
|
|
4372
|
+
click.echo("\nStore as the container env OPENRUNNER_API_KEY — shown only once.")
|
|
4373
|
+
|
|
4374
|
+
|
|
4342
4375
|
@drift_group.command("report")
|
|
4343
4376
|
@click.argument("events_json", type=click.Path(exists=True))
|
|
4344
4377
|
@click.option("--project", "-p", default=None, help="Project org/name or UUID")
|
|
@@ -2718,6 +2718,141 @@ openrunner drift report events.json --project ORG/NAME --monitor asr-prod
|
|
|
2718
2718
|
"""
|
|
2719
2719
|
|
|
2720
2720
|
|
|
2721
|
+
DRIFT_INSTALL_CMD = """---
|
|
2722
|
+
name: {prefix}drift-install
|
|
2723
|
+
description: Actually wire inference-drift monitoring INTO the API in THIS repo -- detect the framework + endpoints, add a non-blocking reporter, insert record_inference() after each prediction, add the dependency, and verify with a live event (vs /openrunner:drift which only explains it)
|
|
2724
|
+
argument-hint: "[project org/name] [--endpoint PATH] [--sample N]"
|
|
2725
|
+
allowed-tools:
|
|
2726
|
+
- Bash
|
|
2727
|
+
- Read
|
|
2728
|
+
- Edit
|
|
2729
|
+
- Write
|
|
2730
|
+
- Grep
|
|
2731
|
+
- Glob
|
|
2732
|
+
- AskUserQuestion
|
|
2733
|
+
---
|
|
2734
|
+
|
|
2735
|
+
Instrument the inference API in the **current repo** with OpenRunner drift
|
|
2736
|
+
monitoring -- edit the code, don't just describe it (see `/openrunner:drift` for
|
|
2737
|
+
the reference). Do each step; ask only when genuinely ambiguous.
|
|
2738
|
+
|
|
2739
|
+
## Step 1 -- detect the API + inference endpoint(s)
|
|
2740
|
+
- Identify the framework (grep `fastapi`, `flask`, `django`, `express`,
|
|
2741
|
+
`@app.post`, `APIRouter`, route decorators) and the file(s) with the
|
|
2742
|
+
**inference** endpoint(s) -- the handlers that return model predictions.
|
|
2743
|
+
- If several, ask which to instrument (default: the prediction routes). Honour
|
|
2744
|
+
`--endpoint PATH` when given.
|
|
2745
|
+
|
|
2746
|
+
## Step 2 -- resolve project + mint a DRIFT-ONLY key for the container
|
|
2747
|
+
- `openrunner login` if needed. Resolve the project id (from the `org/name` arg,
|
|
2748
|
+
else `APIClient.list_projects()`; ask if ambiguous).
|
|
2749
|
+
- **Mint a scoped key for this container** -- do NOT reuse the user's full key.
|
|
2750
|
+
Run `openrunner drift key --project ORG/NAME --name drift-<service>` (add
|
|
2751
|
+
`--json` to capture it). It returns a key carrying ONLY `drift:read` +
|
|
2752
|
+
`drift:write`, bound to that project: it can report/read drift and nothing else
|
|
2753
|
+
(no runs, datasets, artifacts, weights). Shown once.
|
|
2754
|
+
- Inject it as the container's `OPENRUNNER_API_KEY` (+ optional
|
|
2755
|
+
`OPENRUNNER_BASE_URL`) via `.env.example` / deploy secret -- **never hardcode
|
|
2756
|
+
the key** in source. Store `PROJECT_ID` as a module constant or env var.
|
|
2757
|
+
- If key minting fails (e.g. the user lacks membership), fall back to the
|
|
2758
|
+
existing `OPENRUNNER_API_KEY` from env and note it is broader than needed.
|
|
2759
|
+
|
|
2760
|
+
## Step 3 -- add the non-blocking reporter module
|
|
2761
|
+
Create `openrunner_drift.py` (match the repo layout) with a background batcher
|
|
2762
|
+
(thread + `queue`, drop on full, 200/flush, 429 backoff via the SDK) exposing
|
|
2763
|
+
`record_inference(inference_id, metadata, metrics)` -- the pattern from
|
|
2764
|
+
`/openrunner:drift`. For an async framework, use an asyncio task + `asyncio.Queue`
|
|
2765
|
+
instead of a thread.
|
|
2766
|
+
|
|
2767
|
+
## Step 4 -- instrument each endpoint
|
|
2768
|
+
AFTER the response is produced, insert a wrapped `record_inference(...)`:
|
|
2769
|
+
- `inference_id` = the request id / a `uuid4().hex`.
|
|
2770
|
+
- `metadata` = input axes present in the handler: model version, language, route,
|
|
2771
|
+
region, tenant/customer.
|
|
2772
|
+
- `metrics` = outputs + **latency measured around the model call** (wrap the
|
|
2773
|
+
predict call with a monotonic timer), output confidence/score, input length,
|
|
2774
|
+
token count.
|
|
2775
|
+
- Wrap in try/except (or the queue put_nowait) so monitoring **never** breaks or
|
|
2776
|
+
slows the request. Apply `--sample N` (report 1 in N) if given.
|
|
2777
|
+
|
|
2778
|
+
## Step 5 -- dependency + verify
|
|
2779
|
+
- Add `openrunner-sdk` to `requirements.txt` / `pyproject.toml` if missing.
|
|
2780
|
+
- Import-check the new module; send ONE synthetic event
|
|
2781
|
+
(`post_inference_events(PROJECT_ID, [{{...}}])`) and confirm `ingested: 1`.
|
|
2782
|
+
- Point the user at the **Drift** UI and `openrunner drift check --project ORG/NAME
|
|
2783
|
+
--metric confidence`.
|
|
2784
|
+
|
|
2785
|
+
## Guardrails
|
|
2786
|
+
- NEVER block or fail the request path for monitoring (drop on queue-full).
|
|
2787
|
+
- NEVER store raw inputs/outputs -- only the chosen metrics + metadata.
|
|
2788
|
+
- NEVER hardcode the API key -- read from env.
|
|
2789
|
+
- Keep the diff minimal + match the repo's style/imports.
|
|
2790
|
+
"""
|
|
2791
|
+
|
|
2792
|
+
|
|
2793
|
+
BUILD_API_CMD = """---
|
|
2794
|
+
name: {prefix}build-api
|
|
2795
|
+
description: Scaffold a production inference API for a model in THIS repo -- FastAPI /predict + /health, typed request/response, Dockerfile (pushable via the OpenRunner registry), env config, and optional baked-in drift monitoring; ready to deploy on governed GPUs
|
|
2796
|
+
argument-hint: "[--model PATH_OR_ARTIFACT] [--framework fastapi] [--drift] [--registry NAME/ns]"
|
|
2797
|
+
allowed-tools:
|
|
2798
|
+
- Bash
|
|
2799
|
+
- Read
|
|
2800
|
+
- Edit
|
|
2801
|
+
- Write
|
|
2802
|
+
- Grep
|
|
2803
|
+
- Glob
|
|
2804
|
+
- AskUserQuestion
|
|
2805
|
+
---
|
|
2806
|
+
|
|
2807
|
+
Scaffold a serving API for a model in the **current repo** -- a real, runnable
|
|
2808
|
+
skeleton, not a description. Ask only what you can't infer.
|
|
2809
|
+
|
|
2810
|
+
## Step 1 -- understand the model
|
|
2811
|
+
- Find the model: a local checkpoint, an `openrunner.use_model(...)` artifact, a
|
|
2812
|
+
HF id, or a `predict()` the user points at (`--model`). Ask if unclear.
|
|
2813
|
+
- Determine input -> output shape (text/audio/image in; label/score/text out) to
|
|
2814
|
+
type the request/response.
|
|
2815
|
+
|
|
2816
|
+
## Step 2 -- scaffold the API (default FastAPI)
|
|
2817
|
+
Write a minimal, production-shaped service:
|
|
2818
|
+
- `app/main.py` -- FastAPI app; load the model ONCE at startup (lifespan), a typed
|
|
2819
|
+
`POST /predict` (pydantic request/response), `GET /health` (model-loaded probe),
|
|
2820
|
+
`GET /` version. Batch-friendly handler; no blocking work in the event loop for
|
|
2821
|
+
heavy models (run in a threadpool / worker).
|
|
2822
|
+
- `app/model.py` -- load + `predict()` wrapper (pull weights via
|
|
2823
|
+
`openrunner.use_model` when the model is an OpenRunner artifact).
|
|
2824
|
+
- `requirements.txt` / `pyproject.toml`, `.env.example` (PORT, model ref,
|
|
2825
|
+
`OPENRUNNER_*`), `README.md` (run + curl example).
|
|
2826
|
+
- `Dockerfile` -- slim base, install deps, copy app, `CMD` uvicorn on `$PORT`;
|
|
2827
|
+
GPU base image if the model needs CUDA.
|
|
2828
|
+
|
|
2829
|
+
## Step 3 -- (optional) bake in drift monitoring
|
|
2830
|
+
If `--drift` (or the user wants it): run the `/openrunner:drift-install` flow on
|
|
2831
|
+
the freshly scaffolded `/predict` -- add the non-blocking reporter + a
|
|
2832
|
+
`record_inference(...)` after the prediction (latency, confidence, input length).
|
|
2833
|
+
|
|
2834
|
+
## Step 4 -- (optional) container + deploy path
|
|
2835
|
+
- If `--registry NAME/ns`: show the governed push --
|
|
2836
|
+
`docker build -t registry.openrun.gladia.io/<ns>/<name>:v1 . && openrunner
|
|
2837
|
+
registry login && docker push ...` (the OpenRunner broker proxies to the org's
|
|
2838
|
+
upstream; see `/openrunner:registry`).
|
|
2839
|
+
- Note the deploy path: `openrunner gpu run --image <that image> ...` today, and
|
|
2840
|
+
the governed **Deployments** UI (image + GPU + min/max nodes) when available.
|
|
2841
|
+
|
|
2842
|
+
## Step 5 -- verify it runs
|
|
2843
|
+
- `uvicorn app.main:app` locally (or `python -m app`), `curl /health` -> ok,
|
|
2844
|
+
`curl -X POST /predict` with a sample payload -> a real response.
|
|
2845
|
+
- Report the run command, the curl example, and the build/push/deploy one-liners.
|
|
2846
|
+
|
|
2847
|
+
## Guardrails
|
|
2848
|
+
- Load the model once (startup), not per request; run heavy inference off the
|
|
2849
|
+
event loop.
|
|
2850
|
+
- Type the API (pydantic) and add `/health` so it's deploy/LB-ready.
|
|
2851
|
+
- Read config (model ref, keys, port) from env -- never hardcode secrets.
|
|
2852
|
+
- Keep it minimal + runnable; match the repo's language/stack if one exists.
|
|
2853
|
+
"""
|
|
2854
|
+
|
|
2855
|
+
|
|
2721
2856
|
def install_claude_code() -> list[str]:
|
|
2722
2857
|
"""Install commands in ~/.claude/commands/openrunner/."""
|
|
2723
2858
|
cmd_dir = Path.home() / ".claude" / "commands" / "openrunner"
|
|
@@ -2753,6 +2888,8 @@ def install_claude_code() -> list[str]:
|
|
|
2753
2888
|
"launch-gpu.md": LAUNCH_GPU_CMD,
|
|
2754
2889
|
"registry.md": REGISTRY_CMD,
|
|
2755
2890
|
"drift.md": DRIFT_CMD,
|
|
2891
|
+
"drift-install.md": DRIFT_INSTALL_CMD,
|
|
2892
|
+
"build-api.md": BUILD_API_CMD,
|
|
2756
2893
|
}
|
|
2757
2894
|
|
|
2758
2895
|
files = []
|
|
@@ -2956,6 +3093,8 @@ def _install_all_commands_to_dir(cmd_dir: Path, prefix: str = "openrunner:") ->
|
|
|
2956
3093
|
"launch-gpu.md": LAUNCH_GPU_CMD,
|
|
2957
3094
|
"registry.md": REGISTRY_CMD,
|
|
2958
3095
|
"drift.md": DRIFT_CMD,
|
|
3096
|
+
"drift-install.md": DRIFT_INSTALL_CMD,
|
|
3097
|
+
"build-api.md": BUILD_API_CMD,
|
|
2959
3098
|
}
|
|
2960
3099
|
|
|
2961
3100
|
files = []
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
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.5 → openrunner_sdk-2.37.7}/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.37.5 → openrunner_sdk-2.37.7}/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.37.5 → openrunner_sdk-2.37.7}/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
|