openrunner-sdk 2.41.9__tar.gz → 2.41.11__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.9 → openrunner_sdk-2.41.11}/PKG-INFO +2 -1
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/CLAUDE.md +18 -3
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/cli.py +45 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/datasets.py +132 -80
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/install_commands.py +2 -2
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/pyproject.toml +2 -2
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_datasets_module.py +32 -55
- openrunner_sdk-2.41.11/tests/test_import_hf.py +123 -0
- openrunner_sdk-2.41.9/openrunner/_native.py +0 -37
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/.gitignore +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/=6.0 +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/=8.1 +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/README.md +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_multipart.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_retry_transport.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_safepath.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_secret_rules.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/api_client.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/autoresearch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/config.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/errors.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/api_integration.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/cost_guard.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/gpu_types.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/price_compare.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/provider_base.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/forge_provider.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/lambda_cloud.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/modal_provider.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/ovhcloud.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/runpod.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/vastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/runner.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/workspace_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/handover.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/hooks/patent-lab-post-commit +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/skypilot.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/llms-full.txt +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/llms.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/llms.txt +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/machine.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/mcp_server.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/media.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/model.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/model_card.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/patent_scan.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/projects.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/reload.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/research.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/research_policy.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/run.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/session.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/tools/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/tools/patent_report.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/scripts/gen_betterleaks_rules.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/conftest.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/integration/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/integration/conftest.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/integration/test_artifact_round_trip.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_api_client_methods.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_api_client_transport.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_artifact_sweep.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_datasets.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_gpu_registry_deploy.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_infra.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_remainder.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_topup.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_config.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/conftest.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_cost_guard.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_engine_serverside.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_engine_stream_keepalive.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_forge.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_governed_jobs.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_gpu_cluster.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_gpu_types.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_lambda.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_modal.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_ovh_training.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_ovhcloud.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_price_compare.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_provider_base.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_runner.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_runpod.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_vastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_workspace_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu_modal_creds.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_init.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_init_facade.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_install_commands.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_setA.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_setB.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_setC.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_large_file_uploads.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_llms.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_log.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_machine_migrate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_decisions.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_monitor.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_predictions.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_server.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_media.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_media_extra.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_patent_scan.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_plot_media_extra2.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_prompt_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_pure_modules.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_redact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_reload_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_research_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_retry_transport.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_run_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j1.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j2.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j3.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j4.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_core_edges.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_session_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_session_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_topup_hi.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_wandb_compat.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: openrunner-sdk
|
|
3
|
-
Version: 2.41.
|
|
3
|
+
Version: 2.41.11
|
|
4
4
|
Summary: OpenRunner SDK - W&B-compatible ML experiment tracking client
|
|
5
5
|
Project-URL: Homepage, https://github.com/gladiaio/openrunner
|
|
6
6
|
Project-URL: Repository, https://github.com/gladiaio/openrunner
|
|
@@ -19,6 +19,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
19
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
20
20
|
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
21
21
|
Requires-Python: >=3.10
|
|
22
|
+
Requires-Dist: certifi>=2026.10.19
|
|
22
23
|
Requires-Dist: click<9.0,>=8.1
|
|
23
24
|
Requires-Dist: httpx<1.0,>=0.27
|
|
24
25
|
Requires-Dist: mcp<2.0,>=1.0
|
|
@@ -70,6 +70,23 @@ CLI: `openrunner datasets create … --connection ML.text-datasets`,
|
|
|
70
70
|
Files land under `s3://<bucket>/<conn.prefix>/datasets/<org_id>/<name>/<path>`;
|
|
71
71
|
`source_uri` is set to that prefix and `source_type` becomes `managed`.
|
|
72
72
|
|
|
73
|
+
### Import from the Hugging Face Hub
|
|
74
|
+
|
|
75
|
+
Clone a Hub dataset into a managed dataset, with lineage — the server streams
|
|
76
|
+
only the selected files to the org's storage (no local copy), packs loose audio
|
|
77
|
+
into WebDataset shards, records `derived from hf://<repo>@<commit>`, adopts the
|
|
78
|
+
card and indexes the result:
|
|
79
|
+
|
|
80
|
+
```python
|
|
81
|
+
ord.import_hf("https://huggingface.co/datasets/org/name", org="gladia",
|
|
82
|
+
config="fr", splits=["test"], languages=["fr"]) # -> {status, dataset_id, revision, ...}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
CLI: `openrunner dataset import-hf hf://org/name@main --split test --lang fr`.
|
|
86
|
+
Same repo + commit + selection again returns the existing dataset
|
|
87
|
+
(`status="exists"`); `force=True` re-imports. Language selection is per file /
|
|
88
|
+
config (no row-level filtering inside parquet).
|
|
89
|
+
|
|
73
90
|
Uploading does **not** index/embed. To make a managed dataset searchable, build
|
|
74
91
|
a LanceDB index (written to the same connection) — opt-in:
|
|
75
92
|
|
|
@@ -88,9 +105,7 @@ the LanceDB table on the dataset's own connection.
|
|
|
88
105
|
|
|
89
106
|
Beyond FTS, the client exposes semantic / lexical search and **derivation by
|
|
90
107
|
query** — build a child dataset from a SUBSET of a parent selected by a search
|
|
91
|
-
(only matching primary keys stored; no media copied; de-dup + lineage automatic)
|
|
92
|
-
These delegate to the native Rust core (`openrunner-core` wheel) when installed,
|
|
93
|
-
falling back to pure-Python httpx otherwise:
|
|
108
|
+
(only matching primary keys stored; no media copied; de-dup + lineage automatic):
|
|
94
109
|
|
|
95
110
|
```python
|
|
96
111
|
ord.search_dataset(repo, q, mode="mixed"|"exact", lang="fr") # BM25 / phrase, lang filter
|
|
@@ -4229,6 +4229,10 @@ def datasets() -> None:
|
|
|
4229
4229
|
pass
|
|
4230
4230
|
|
|
4231
4231
|
|
|
4232
|
+
# ``openrunner dataset ...`` is an alias of ``openrunner datasets ...``.
|
|
4233
|
+
main.add_command(datasets, name="dataset")
|
|
4234
|
+
|
|
4235
|
+
|
|
4232
4236
|
@datasets.command("list")
|
|
4233
4237
|
@click.option("--org", default=None, help="Scope to an organization (slug/name)")
|
|
4234
4238
|
def datasets_list(org: str | None) -> None:
|
|
@@ -4372,6 +4376,47 @@ def datasets_shard(repo_id, folder, connection, shard_size, do_index):
|
|
|
4372
4376
|
+ (f" (truncated at {ir.get('cap')}, pass --max-rows)" if ir.get("truncated") else ""))
|
|
4373
4377
|
|
|
4374
4378
|
|
|
4379
|
+
@datasets.command("import-hf")
|
|
4380
|
+
@click.argument("url")
|
|
4381
|
+
@click.option("--org", default=None, help="Target organization (default: your only org)")
|
|
4382
|
+
@click.option("--name", default=None, help="OpenRunner dataset name (default: the HF repo name)")
|
|
4383
|
+
@click.option("--revision", default=None, help="Branch, tag or commit (default: main)")
|
|
4384
|
+
@click.option("--config", default=None, help="HF config (subset) to import")
|
|
4385
|
+
@click.option("--split", "splits", multiple=True, help="Split to import (repeatable or a,b)")
|
|
4386
|
+
@click.option("--lang", "langs", multiple=True, help="Language to import (repeatable or a,b)")
|
|
4387
|
+
@click.option("--connection", default=None, help="Storage connection (name or UUID); default: org default")
|
|
4388
|
+
@click.option("--force", is_flag=True, help="Re-import even if this repo@revision was imported")
|
|
4389
|
+
@click.option("--index/--no-index", "do_index", default=True, help="Build the search index after the copy")
|
|
4390
|
+
@click.option("--no-wait", is_flag=True, help="Return once the import job has started")
|
|
4391
|
+
def datasets_import_hf(url, org, name, revision, config, splits, langs, connection, force,
|
|
4392
|
+
do_index, no_wait):
|
|
4393
|
+
"""Clone a Hugging Face dataset into OpenRunner, with lineage.
|
|
4394
|
+
|
|
4395
|
+
URL is org/name, hf://org/name@rev or https://huggingface.co/datasets/org/name.
|
|
4396
|
+
Only the chosen config/splits/languages are copied, streamed from the Hub to
|
|
4397
|
+
the org's storage (audio packed into WebDataset shards); the dataset is
|
|
4398
|
+
recorded as derived from hf://<repo>@<commit> and indexed. Re-running with
|
|
4399
|
+
the same repo, commit and selection returns the existing dataset.
|
|
4400
|
+
"""
|
|
4401
|
+
from openrunner import datasets as ord
|
|
4402
|
+
|
|
4403
|
+
res = ord.import_hf(
|
|
4404
|
+
url, org=org, name=name, revision=revision, config=config,
|
|
4405
|
+
splits=",".join(splits) or None, languages=",".join(langs) or None,
|
|
4406
|
+
connection=connection, force=force, index=do_index, wait=not no_wait,
|
|
4407
|
+
)
|
|
4408
|
+
ref = f"hf://{res.get('hf_repo_id')}@{res.get('revision')}"
|
|
4409
|
+
status = res.get("status")
|
|
4410
|
+
if status == "exists":
|
|
4411
|
+
click.echo(f"Already imported: {res.get('dataset_name')} ({res.get('dataset_id')}) <- {ref}")
|
|
4412
|
+
elif status == "running":
|
|
4413
|
+
click.echo(f"Importing {ref} into {res.get('dataset_name')} ({res.get('dataset_id')}) in the background")
|
|
4414
|
+
else:
|
|
4415
|
+
idx = (res.get("index") or {}).get("status")
|
|
4416
|
+
click.echo(f"Imported {ref} -> {res.get('dataset_name')} ({res.get('dataset_id')}): "
|
|
4417
|
+
f"{res.get('files_pulled', 0)} files" + (f", index {idx}" if idx else ""))
|
|
4418
|
+
|
|
4419
|
+
|
|
4375
4420
|
@datasets.command("reconcile-shards")
|
|
4376
4421
|
@click.argument("repo_id")
|
|
4377
4422
|
def datasets_reconcile_shards(repo_id):
|
|
@@ -45,6 +45,14 @@ class DeriveIncomplete(RuntimeError):
|
|
|
45
45
|
self.resume_from = resume_from
|
|
46
46
|
|
|
47
47
|
|
|
48
|
+
def _str_list(v: list[str] | str | None) -> list[str] | None:
|
|
49
|
+
"""``"a,b"`` or ``["a", "b"]`` -> ``["a", "b"]``; empty -> None."""
|
|
50
|
+
if isinstance(v, str):
|
|
51
|
+
v = v.split(",")
|
|
52
|
+
out = [x.strip() for x in v or [] if x and x.strip()]
|
|
53
|
+
return out or None
|
|
54
|
+
|
|
55
|
+
|
|
48
56
|
def _check(r: "httpx.Response") -> "httpx.Response":
|
|
49
57
|
"""Raise with the API's actual error detail (FastAPI 422 lists the bad field)."""
|
|
50
58
|
if r.is_success:
|
|
@@ -208,11 +216,8 @@ class DatasetsClient:
|
|
|
208
216
|
or _g.get("base_url") or "http://localhost:8000")
|
|
209
217
|
if not key:
|
|
210
218
|
raise ValueError("API key required. Set OPENRUNNER_API_KEY, pass api_key=, or run `openrunner login`.")
|
|
211
|
-
# Raw creds kept so the optional native core (Rust) can be built lazily —
|
|
212
|
-
# the crate appends its own /api/v1, so hand it the bare base URL.
|
|
213
219
|
self._base_url = url.rstrip("/")
|
|
214
220
|
self._api_key = key
|
|
215
|
-
self._native: Any = "unset" # sentinel: native core not yet resolved
|
|
216
221
|
from ._retry_transport import RetryTransport
|
|
217
222
|
self._http = httpx.Client(
|
|
218
223
|
base_url=f"{self._base_url}/api/v1",
|
|
@@ -221,14 +226,6 @@ class DatasetsClient:
|
|
|
221
226
|
transport=RetryTransport(),
|
|
222
227
|
)
|
|
223
228
|
|
|
224
|
-
def _native_client(self):
|
|
225
|
-
"""The native (Rust/PyO3) client if the ``openrunner-core`` wheel is
|
|
226
|
-
installed, else ``None`` — an accelerator with a pure-Python fallback."""
|
|
227
|
-
if self._native == "unset":
|
|
228
|
-
from openrunner import _native
|
|
229
|
-
self._native = _native.native_client(self._base_url, self._api_key)
|
|
230
|
-
return self._native
|
|
231
|
-
|
|
232
229
|
# -- resolution ----------------------------------------------------------
|
|
233
230
|
def _org_id(self, org: str) -> str:
|
|
234
231
|
r = self._http.get("/organizations")
|
|
@@ -780,21 +777,38 @@ class DatasetsClient:
|
|
|
780
777
|
return r.json()
|
|
781
778
|
return self._retry(call)
|
|
782
779
|
|
|
783
|
-
def list_files(
|
|
780
|
+
def list_files(
|
|
781
|
+
self,
|
|
782
|
+
repo_id: str,
|
|
783
|
+
*,
|
|
784
|
+
prefix: str = "",
|
|
785
|
+
limit: int | None = None,
|
|
786
|
+
offset: int = 0,
|
|
787
|
+
page_size: int = 5000,
|
|
788
|
+
) -> list[dict]:
|
|
784
789
|
"""List the file manifest of a managed dataset (path/size/sha256/uploader).
|
|
785
790
|
|
|
786
|
-
`prefix` filters by path prefix
|
|
787
|
-
|
|
791
|
+
`prefix` filters by path prefix. Pages through the API (which caps a page
|
|
792
|
+
at 50k, default 5k) until `limit` files are collected, or EVERY file when
|
|
793
|
+
`limit` is None — a single page silently truncated large datasets (e.g.
|
|
794
|
+
upload_folder's skip_existing re-uploaded everything past file 5000)."""
|
|
788
795
|
ds = self._resolve(repo_id)
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
796
|
+
out: list[dict] = []
|
|
797
|
+
while limit is None or len(out) < limit:
|
|
798
|
+
want = page_size if limit is None else min(page_size, limit - len(out))
|
|
799
|
+
params = {"limit": want, "offset": offset + len(out)}
|
|
800
|
+
if prefix:
|
|
801
|
+
params["prefix"] = prefix
|
|
802
|
+
|
|
803
|
+
def call(params=params):
|
|
804
|
+
r = self._http.get(f"/datasets/{ds.id}/files", params=params)
|
|
805
|
+
_check(r)
|
|
806
|
+
return r.json()
|
|
807
|
+
page = self._retry(call)
|
|
808
|
+
out.extend(page)
|
|
809
|
+
if len(page) < want:
|
|
810
|
+
break
|
|
811
|
+
return out
|
|
798
812
|
|
|
799
813
|
# -- search index --------------------------------------------------------
|
|
800
814
|
def index_dataset(
|
|
@@ -875,6 +889,83 @@ class DatasetsClient:
|
|
|
875
889
|
time.sleep(delay)
|
|
876
890
|
delay = min(delay * 1.5, 30.0)
|
|
877
891
|
|
|
892
|
+
# -- Hugging Face import -------------------------------------------------
|
|
893
|
+
def import_hf(
|
|
894
|
+
self,
|
|
895
|
+
url: str,
|
|
896
|
+
*,
|
|
897
|
+
org: str | None = None,
|
|
898
|
+
name: str | None = None,
|
|
899
|
+
revision: str | None = None,
|
|
900
|
+
config: str | None = None,
|
|
901
|
+
splits: list[str] | str | None = None,
|
|
902
|
+
languages: list[str] | str | None = None,
|
|
903
|
+
connection: str | None = None,
|
|
904
|
+
force: bool = False,
|
|
905
|
+
index: bool = True,
|
|
906
|
+
wait: bool = True,
|
|
907
|
+
timeout: float = 86400.0,
|
|
908
|
+
) -> dict:
|
|
909
|
+
"""Clone a Hugging Face dataset into OpenRunner, with lineage.
|
|
910
|
+
|
|
911
|
+
``url`` is ``org/name``, ``hf://org/name@rev`` or a
|
|
912
|
+
``https://huggingface.co/datasets/...`` URL. The server streams the
|
|
913
|
+
selected files (``config`` / ``splits`` / ``languages``) from the Hub
|
|
914
|
+
straight into the org's storage connection (audio packed into WebDataset
|
|
915
|
+
shards), records ``derived from hf://<repo>@<sha>``, adopts the HF card
|
|
916
|
+
and indexes the result. Re-importing the same repo at the same commit
|
|
917
|
+
with the same selection returns the existing dataset
|
|
918
|
+
(``status="exists"``) unless ``force=True``.
|
|
919
|
+
|
|
920
|
+
``org`` defaults to your only organization. With ``wait=True`` this
|
|
921
|
+
polls until the import job finishes and returns
|
|
922
|
+
``{"status", "dataset_id", "dataset_name", "revision", ...}``.
|
|
923
|
+
"""
|
|
924
|
+
org_id = self._org_id(org) if org else self._only_org_id()
|
|
925
|
+
body = {
|
|
926
|
+
"hf_repo_id": url, "repo_type": "dataset", "org_id": org_id, "name": name,
|
|
927
|
+
"revision": revision, "config": config, "splits": _str_list(splits),
|
|
928
|
+
"languages": _str_list(languages), "connection": connection,
|
|
929
|
+
"force": force, "index": index, "background": True,
|
|
930
|
+
}
|
|
931
|
+
r = self._http.post("/hf/import", json=body, timeout=300.0)
|
|
932
|
+
_check(r)
|
|
933
|
+
res = r.json()
|
|
934
|
+
if res.get("status") != "running" or not wait:
|
|
935
|
+
return res
|
|
936
|
+
return self._wait_hf_import(res, timeout)
|
|
937
|
+
|
|
938
|
+
def _only_org_id(self) -> str:
|
|
939
|
+
r = self._http.get("/organizations")
|
|
940
|
+
_check(r)
|
|
941
|
+
orgs = r.json()
|
|
942
|
+
orgs = orgs if isinstance(orgs, list) else orgs.get("organizations", [])
|
|
943
|
+
if len(orgs) != 1:
|
|
944
|
+
raise ValueError(f"pass org= (you belong to {len(orgs)} organizations)")
|
|
945
|
+
return str(orgs[0]["id"])
|
|
946
|
+
|
|
947
|
+
def _wait_hf_import(self, res: dict, timeout: float) -> dict:
|
|
948
|
+
"""Poll ``dataset_metadata.hf_import_job`` until the import ends."""
|
|
949
|
+
import time
|
|
950
|
+
|
|
951
|
+
ds_id = res["dataset_id"]
|
|
952
|
+
deadline, delay = time.monotonic() + timeout, 2.0
|
|
953
|
+
while True:
|
|
954
|
+
r = self._http.get(f"/datasets/{ds_id}")
|
|
955
|
+
_check(r)
|
|
956
|
+
meta = r.json().get("metadata") or {}
|
|
957
|
+
job = meta.get("hf_import_job") or {}
|
|
958
|
+
if job.get("status") == "ready":
|
|
959
|
+
return {**res, "status": "success", "files_pulled": job.get("files", 0),
|
|
960
|
+
"revision": job.get("revision") or res.get("revision"),
|
|
961
|
+
"index": meta.get("index_job")}
|
|
962
|
+
if job.get("status") == "error":
|
|
963
|
+
raise RuntimeError(f"Hugging Face import failed: {job.get('error')}")
|
|
964
|
+
if time.monotonic() > deadline:
|
|
965
|
+
raise TimeoutError(f"Hugging Face import still running after {timeout:.0f}s")
|
|
966
|
+
time.sleep(delay)
|
|
967
|
+
delay = min(delay * 1.5, 30.0)
|
|
968
|
+
|
|
878
969
|
@staticmethod
|
|
879
970
|
def _warn_truncated(res: dict) -> dict:
|
|
880
971
|
if res.get("truncated"):
|
|
@@ -958,13 +1049,8 @@ class DatasetsClient:
|
|
|
958
1049
|
|
|
959
1050
|
``mode``: "mixed" (ranked tokens, default) or "exact" (phrase match).
|
|
960
1051
|
``lang``: restrict to a language / CSV ("fr" or "fr,en"); "" = all.
|
|
961
|
-
Delegates to the native (Rust) core when the ``openrunner-core`` wheel is
|
|
962
|
-
installed, else pure-Python httpx.
|
|
963
1052
|
"""
|
|
964
1053
|
ds = self._resolve(repo_id)
|
|
965
|
-
nat = self._native_client()
|
|
966
|
-
if nat is not None:
|
|
967
|
-
return nat.dataset_search(str(ds.id), query, mode, lang, limit).get("rows", [])
|
|
968
1054
|
params: dict[str, Any] = {"q": query, "limit": limit, "mode": mode}
|
|
969
1055
|
if lang:
|
|
970
1056
|
params["lang"] = lang
|
|
@@ -979,13 +1065,9 @@ class DatasetsClient:
|
|
|
979
1065
|
"""Vector (cosine ANN) search over a dataset's embeddings.
|
|
980
1066
|
|
|
981
1067
|
Requires the embedding index built first via
|
|
982
|
-
``optimize_embedding_search``.
|
|
1068
|
+
``optimize_embedding_search``.
|
|
983
1069
|
"""
|
|
984
1070
|
ds = self._resolve(repo_id)
|
|
985
|
-
nat = self._native_client()
|
|
986
|
-
if nat is not None:
|
|
987
|
-
out = nat.semantic_search(str(ds.id), query, lang, limit)
|
|
988
|
-
return out.get("rows", out.get("hits", []))
|
|
989
1071
|
params: dict[str, Any] = {"q": query, "limit": limit}
|
|
990
1072
|
if lang:
|
|
991
1073
|
params["lang"] = lang
|
|
@@ -998,13 +1080,10 @@ class DatasetsClient:
|
|
|
998
1080
|
) -> list[dict]:
|
|
999
1081
|
"""Regex search: match a Python-``re`` ``pattern`` against the dataset's
|
|
1000
1082
|
text column (streamed, bounded — no index needed). Case-insensitive is
|
|
1001
|
-
opt-in via an inline ``(?i)`` flag.
|
|
1083
|
+
opt-in via an inline ``(?i)`` flag.
|
|
1002
1084
|
Pairs with ``derive_by_query(mode="regex")`` to build a regex-derived set.
|
|
1003
1085
|
"""
|
|
1004
1086
|
ds = self._resolve(repo_id)
|
|
1005
|
-
nat = self._native_client()
|
|
1006
|
-
if nat is not None:
|
|
1007
|
-
return nat.regex_search(str(ds.id), pattern, lang, limit).get("rows", [])
|
|
1008
1087
|
params: dict[str, Any] = {"q": pattern, "limit": limit, "mode": "regex"}
|
|
1009
1088
|
if lang:
|
|
1010
1089
|
params["lang"] = lang
|
|
@@ -1021,11 +1100,8 @@ class DatasetsClient:
|
|
|
1021
1100
|
model: str | None = None,
|
|
1022
1101
|
) -> dict:
|
|
1023
1102
|
"""Embed missing rows and build the ANN index that ``semantic_search``
|
|
1024
|
-
(and derive ``mode="semantic"``) need.
|
|
1103
|
+
(and derive ``mode="semantic"``) need."""
|
|
1025
1104
|
ds = self._resolve(repo_id)
|
|
1026
|
-
nat = self._native_client()
|
|
1027
|
-
if nat is not None:
|
|
1028
|
-
return nat.optimize_embedding_search(str(ds.id), text_column, max_rows, model)
|
|
1029
1105
|
body = {"text_column": text_column, "max_rows": max_rows, "model": model}
|
|
1030
1106
|
r = self._http.post(
|
|
1031
1107
|
f"/datasets/{ds.id}/optimize-embedding-search", json=body, timeout=1800.0
|
|
@@ -1040,14 +1116,10 @@ class DatasetsClient:
|
|
|
1040
1116
|
|
|
1041
1117
|
``terms`` is one word, a CSV string, or a list. ``op`` combines
|
|
1042
1118
|
multi-term hits: "union" (ANY) or "intersect" (ALL). ``lang`` scopes to a
|
|
1043
|
-
language / CSV. Returns per-term df + combined ids.
|
|
1044
|
-
available, else httpx.
|
|
1119
|
+
language / CSV. Returns per-term df + combined ids.
|
|
1045
1120
|
"""
|
|
1046
1121
|
ds = self._resolve(repo_id)
|
|
1047
1122
|
term = ",".join(terms) if isinstance(terms, (list, tuple)) else terms
|
|
1048
|
-
nat = self._native_client()
|
|
1049
|
-
if nat is not None:
|
|
1050
|
-
return nat.word_lookup(str(ds.id), term, op, lang)
|
|
1051
1123
|
params: dict[str, Any] = {"term": term, "op": op}
|
|
1052
1124
|
if lang:
|
|
1053
1125
|
params["lang"] = lang
|
|
@@ -1061,12 +1133,8 @@ class DatasetsClient:
|
|
|
1061
1133
|
"""Expand a domain prompt into many search keywords via an LLM.
|
|
1062
1134
|
|
|
1063
1135
|
Returns ``{keywords, csv, count, model, prompt}`` — feed ``csv`` into
|
|
1064
|
-
``word_lookup`` or ``derive_by_query(mode="word", q=csv)``.
|
|
1065
|
-
when available, else httpx.
|
|
1136
|
+
``word_lookup`` or ``derive_by_query(mode="word", q=csv)``.
|
|
1066
1137
|
"""
|
|
1067
|
-
nat = self._native_client()
|
|
1068
|
-
if nat is not None:
|
|
1069
|
-
return nat.keyword_expand(prompt, count, model)
|
|
1070
1138
|
body = {"prompt": prompt, "count": count, "model": model}
|
|
1071
1139
|
r = self._http.post("/datasets/keyword-expand", json=body, timeout=120.0)
|
|
1072
1140
|
_check(r)
|
|
@@ -1093,9 +1161,7 @@ class DatasetsClient:
|
|
|
1093
1161
|
matched over the text column, bounded), "semantic" (vector — needs
|
|
1094
1162
|
``optimize_embedding_search``). ``lang`` filters by language / CSV. Pass
|
|
1095
1163
|
``name`` to create, or ``target_repo_id`` to append (must derive from the
|
|
1096
|
-
same parent). Lineage is recorded automatically.
|
|
1097
|
-
member keys are recorded natively when the core wheel is installed; the
|
|
1098
|
-
parent/target resolution + DatasetInfo wrapping stay in Python.
|
|
1164
|
+
same parent). Lineage is recorded automatically.
|
|
1099
1165
|
"""
|
|
1100
1166
|
ds = self._resolve(repo_id)
|
|
1101
1167
|
body: dict[str, Any] = {"mode": mode, "q": q, "limit": limit}
|
|
@@ -1109,9 +1175,6 @@ class DatasetsClient:
|
|
|
1109
1175
|
body["target_dataset_id"] = str(self._resolve(target_repo_id).id)
|
|
1110
1176
|
elif not name:
|
|
1111
1177
|
raise ValueError("derive_by_query needs either name= (create) or target_repo_id= (append)")
|
|
1112
|
-
nat = self._native_client()
|
|
1113
|
-
if nat is not None:
|
|
1114
|
-
return DatasetInfo._from_json(nat.derive_dataset(str(ds.id), body))
|
|
1115
1178
|
r = self._http.post(f"/datasets/{ds.id}/derive", json=body, timeout=600.0)
|
|
1116
1179
|
_check(r)
|
|
1117
1180
|
return DatasetInfo._from_json(r.json())
|
|
@@ -1168,7 +1231,6 @@ class DatasetsClient:
|
|
|
1168
1231
|
f"columns[{_n!r}] has {len(_v)} values but ids has {len(ids)}; "
|
|
1169
1232
|
"they are positional")
|
|
1170
1233
|
ds = self._resolve(repo_id)
|
|
1171
|
-
nat = self._native_client()
|
|
1172
1234
|
info: DatasetInfo | None = None
|
|
1173
1235
|
target_id = str(self._resolve(target_repo_id).id) if target_repo_id else None
|
|
1174
1236
|
for i in range(0, len(ids), chunk_size):
|
|
@@ -1189,12 +1251,9 @@ class DatasetsClient:
|
|
|
1189
1251
|
if project_id:
|
|
1190
1252
|
body["project_id"] = str(project_id)
|
|
1191
1253
|
try:
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
r = self._http.post(f"/datasets/{ds.id}/derive", json=body, timeout=600.0)
|
|
1196
|
-
_check(r)
|
|
1197
|
-
info = DatasetInfo._from_json(r.json())
|
|
1254
|
+
r = self._http.post(f"/datasets/{ds.id}/derive", json=body, timeout=600.0)
|
|
1255
|
+
_check(r)
|
|
1256
|
+
info = DatasetInfo._from_json(r.json())
|
|
1198
1257
|
except Exception as e:
|
|
1199
1258
|
# A mid-loop failure leaves a dataset that exists and looks
|
|
1200
1259
|
# complete. Retrying the whole call re-sends batch 0 with name=
|
|
@@ -1213,11 +1272,8 @@ class DatasetsClient:
|
|
|
1213
1272
|
|
|
1214
1273
|
def derived_rows(self, repo_id: str, *, limit: int = 50, offset: int = 0) -> dict:
|
|
1215
1274
|
"""Page a query-derived dataset's rows: member keys + inherited parent
|
|
1216
|
-
fields (lineage-namespaced) + extra columns.
|
|
1275
|
+
fields (lineage-namespaced) + extra columns."""
|
|
1217
1276
|
ds = self._resolve(repo_id)
|
|
1218
|
-
nat = self._native_client()
|
|
1219
|
-
if nat is not None:
|
|
1220
|
-
return nat.derived_rows(str(ds.id), limit, offset)
|
|
1221
1277
|
r = self._http.get(
|
|
1222
1278
|
f"/datasets/{ds.id}/derived-rows", params={"limit": limit, "offset": offset}
|
|
1223
1279
|
)
|
|
@@ -1296,9 +1352,6 @@ class DatasetsClient:
|
|
|
1296
1352
|
rejected. Returns the editable column names.
|
|
1297
1353
|
"""
|
|
1298
1354
|
ds = self._resolve(repo_id)
|
|
1299
|
-
nat = self._native_client()
|
|
1300
|
-
if nat is not None:
|
|
1301
|
-
return nat.add_dataset_column(str(ds.id), name, default)
|
|
1302
1355
|
r = self._http.post(f"/datasets/{ds.id}/columns",
|
|
1303
1356
|
json={"name": name, "default": default})
|
|
1304
1357
|
_check(r)
|
|
@@ -1331,9 +1384,6 @@ class DatasetsClient:
|
|
|
1331
1384
|
``{ok, debug_id, column}``.
|
|
1332
1385
|
"""
|
|
1333
1386
|
ds = self._resolve(repo_id)
|
|
1334
|
-
nat = self._native_client()
|
|
1335
|
-
if nat is not None:
|
|
1336
|
-
return nat.set_dataset_cell(str(ds.id), debug_id, column, value)
|
|
1337
1387
|
r = self._http.patch(f"/datasets/{ds.id}/cell",
|
|
1338
1388
|
json={"debug_id": debug_id, "column": column, "value": value})
|
|
1339
1389
|
_check(r)
|
|
@@ -1347,9 +1397,6 @@ class DatasetsClient:
|
|
|
1347
1397
|
a read-only source column. Returns ``{ok, debug_id, columns}``.
|
|
1348
1398
|
"""
|
|
1349
1399
|
ds = self._resolve(repo_id)
|
|
1350
|
-
nat = self._native_client()
|
|
1351
|
-
if nat is not None:
|
|
1352
|
-
return nat.edit_dataset_row(str(ds.id), debug_id, values)
|
|
1353
1400
|
r = self._http.patch(f"/datasets/{ds.id}/rows/{debug_id}", json={"values": values})
|
|
1354
1401
|
_check(r)
|
|
1355
1402
|
return r.json()
|
|
@@ -1360,9 +1407,6 @@ class DatasetsClient:
|
|
|
1360
1407
|
``{debug_id, row, editable_columns}`` (everything in ``row`` not listed in
|
|
1361
1408
|
``editable_columns`` is a read-only parent column)."""
|
|
1362
1409
|
ds = self._resolve(repo_id)
|
|
1363
|
-
nat = self._native_client()
|
|
1364
|
-
if nat is not None:
|
|
1365
|
-
return nat.get_dataset_row(str(ds.id), debug_id)
|
|
1366
1410
|
r = self._http.get(f"/datasets/{ds.id}/row", params={"debug_id": debug_id})
|
|
1367
1411
|
_check(r)
|
|
1368
1412
|
return r.json()
|
|
@@ -1650,6 +1694,14 @@ def upload_sharded(repo_id: str, folder: str, **kwargs: Any) -> dict:
|
|
|
1650
1694
|
return _c().upload_sharded(repo_id, folder, **kwargs)
|
|
1651
1695
|
|
|
1652
1696
|
|
|
1697
|
+
def import_hf(url: str, **kwargs: Any) -> dict:
|
|
1698
|
+
"""Clone a Hugging Face dataset (streamed, with lineage + index) into OpenRunner.
|
|
1699
|
+
|
|
1700
|
+
``import_hf("hf://org/name", splits=["test"], languages=["fr"], org="gladia")``.
|
|
1701
|
+
"""
|
|
1702
|
+
return _c().import_hf(url, **kwargs)
|
|
1703
|
+
|
|
1704
|
+
|
|
1653
1705
|
def reconcile_shards(repo_id: str, **kwargs: Any) -> dict:
|
|
1654
1706
|
"""Rebuild the tar clip index (index.jsonl) from the shards on S3."""
|
|
1655
1707
|
return _c().reconcile_shards(repo_id, **kwargs)
|
|
@@ -1654,7 +1654,7 @@ if '/' not in target:
|
|
|
1654
1654
|
else:
|
|
1655
1655
|
repos = [(target, None)]
|
|
1656
1656
|
for repo, meta in repos:
|
|
1657
|
-
files = ds.list_files(repo
|
|
1657
|
+
files = ds.list_files(repo)
|
|
1658
1658
|
total = sum((f.get('size_bytes') or f.get('size') or 0) for f in files)
|
|
1659
1659
|
print(f'{{repo}}: {{len(files)}} files, {{total/1e9:.1f}} GB')
|
|
1660
1660
|
print('PLAN: dir=' + ddir + ' max_files=' + str(mx))
|
|
@@ -1685,7 +1685,7 @@ if '/' not in target:
|
|
|
1685
1685
|
else:
|
|
1686
1686
|
repos = [target]
|
|
1687
1687
|
for repo in repos:
|
|
1688
|
-
files = ds.list_files(repo
|
|
1688
|
+
files = ds.list_files(repo)
|
|
1689
1689
|
paths = [f['path'] for f in files]
|
|
1690
1690
|
if mx is not None: paths = paths[:mx]
|
|
1691
1691
|
name = repo.split('/')[-1]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "openrunner-sdk"
|
|
3
|
-
version = "2.41.
|
|
3
|
+
version = "2.41.11"
|
|
4
4
|
description = "OpenRunner SDK - W&B-compatible ML experiment tracking client"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = {text = "MIT"}
|
|
@@ -19,7 +19,7 @@ classifiers = [
|
|
|
19
19
|
"Programming Language :: Python :: 3.13",
|
|
20
20
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
21
21
|
]
|
|
22
|
-
dependencies = ["httpx>=0.27,<1.0", "Pillow>=10.0,<14", "psutil>=6.0,<8.0", "click>=8.1,<9.0", "nvidia-ml-py>=12.0,<14.0", "mcp>=1.0,<2.0"]
|
|
22
|
+
dependencies = ["httpx>=0.27,<1.0", "certifi>=2026.10.19", "Pillow>=10.0,<14", "psutil>=6.0,<8.0", "click>=8.1,<9.0", "nvidia-ml-py>=12.0,<14.0", "mcp>=1.0,<2.0"]
|
|
23
23
|
|
|
24
24
|
[project.urls]
|
|
25
25
|
Homepage = "https://github.com/gladiaio/openrunner"
|