openrunner-sdk 2.41.9__tar.gz → 2.41.10__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.10}/PKG-INFO +1 -1
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/CLAUDE.md +1 -3
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/datasets.py +10 -68
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/pyproject.toml +1 -1
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_datasets_module.py +10 -55
- openrunner_sdk-2.41.9/openrunner/_native.py +0 -37
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/.gitignore +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/=6.0 +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/=8.1 +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/README.md +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/_multipart.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/_retry_transport.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/_safepath.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/_secret_rules.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/api_client.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/artifact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/autoresearch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/buffer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/cache.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/cli.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/config.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/cost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/dataset.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/environment.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/errors.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/evaluation.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/feedback.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/git_info.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/api_integration.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/cost_guard.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/gpu_types.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/price_compare.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/provider_base.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/forge_provider.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/lambda_cloud.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/modal_provider.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/ovhcloud.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/runpod.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/providers/vastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/runner.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/gpu/workspace_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/guardrails.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/handover.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/hooks/patent-lab-post-commit +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/install_commands.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/accelerate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/anthropic_tracer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/catboost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/diffusers.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/fastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/forced_alignment.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/gladia.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/gymnasium.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/huggingface.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/hydra.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/ignite.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/jax.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/keras.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/langchain.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/lightgbm.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/lightning.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/llamaindex.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/openai_finetune.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/openai_tracer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/optuna.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/pytorch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/sb3.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/sklearn.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/skypilot.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/tensorflow.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/trl.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/tts.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/ultralytics.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/voice_agent.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/whisper.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/integration/xgboost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/launch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/llms-full.txt +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/llms.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/llms.txt +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/machine.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/mcp_server.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/media.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/migrate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/model.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/model_card.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/offline.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/patent_scan.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/pii.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/plot.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/projects.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/prompt.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/query_api.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/redact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/reload.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/research.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/research_policy.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/run.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/scorers.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/sender.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/session.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/settings.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/summary.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/sweep.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/system_metrics.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/tensorboard.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/tools/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/tools/patent_report.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/trace.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/transcript_formatter.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/wal.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/wandb_compat/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/wandb_compat/_shim.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/openrunner/wer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/scripts/gen_betterleaks_rules.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/conftest.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/integration/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/integration/conftest.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/integration/test_artifact_round_trip.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_alert.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_aliases.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_api_client.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_api_client_methods.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_api_client_transport.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_artifact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_buffer.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cache.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_class_scorers.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli_artifact_sweep.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli_datasets.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli_gpu_registry_deploy.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli_infra.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli_remainder.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_cli_topup.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_config.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_evaluation.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_finish.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_git_info.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/__init__.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/conftest.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_cost_guard.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_engine_serverside.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_engine_stream_keepalive.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_forge.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_governed_jobs.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_gpu_cluster.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_gpu_types.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_lambda.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_modal.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_ovh_training.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_ovhcloud.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_price_compare.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_provider_base.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_runner.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_runpod.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_vastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu/test_workspace_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_gpu_modal_creds.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_init.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_init_facade.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_install_commands.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_fastai.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_huggingface.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_keras.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_langchain.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_lightning.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_pytorch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_setA.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_setB.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_setC.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_sklearn.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_integration_xgboost.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_large_file_uploads.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_launch.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_llms.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_log.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_log_code.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_machine_migrate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_mcp_decisions.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_mcp_monitor.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_mcp_predictions.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_mcp_server.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_media.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_media_extra.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_migrate.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_offline.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_offline_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_patent_scan.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_pii.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_plot.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_plot_media_extra2.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_prompt_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_pure_modules.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_query_api.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_redact.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_reload_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_research_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_resume.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_retry_transport.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_run_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sdk_cluster_j1.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sdk_cluster_j2.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sdk_cluster_j3.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sdk_cluster_j4.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sdk_core_edges.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sdk_features.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sender.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_session_module.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_session_sync.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_summary.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_sweep.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_system_metrics.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_topup_hi.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/tests/test_trace.py +0 -0
- {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.10}/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.10
|
|
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
|
|
@@ -88,9 +88,7 @@ the LanceDB table on the dataset's own connection.
|
|
|
88
88
|
|
|
89
89
|
Beyond FTS, the client exposes semantic / lexical search and **derivation by
|
|
90
90
|
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:
|
|
91
|
+
(only matching primary keys stored; no media copied; de-dup + lineage automatic):
|
|
94
92
|
|
|
95
93
|
```python
|
|
96
94
|
ord.search_dataset(repo, q, mode="mixed"|"exact", lang="fr") # BM25 / phrase, lang filter
|
|
@@ -208,11 +208,8 @@ class DatasetsClient:
|
|
|
208
208
|
or _g.get("base_url") or "http://localhost:8000")
|
|
209
209
|
if not key:
|
|
210
210
|
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
211
|
self._base_url = url.rstrip("/")
|
|
214
212
|
self._api_key = key
|
|
215
|
-
self._native: Any = "unset" # sentinel: native core not yet resolved
|
|
216
213
|
from ._retry_transport import RetryTransport
|
|
217
214
|
self._http = httpx.Client(
|
|
218
215
|
base_url=f"{self._base_url}/api/v1",
|
|
@@ -221,14 +218,6 @@ class DatasetsClient:
|
|
|
221
218
|
transport=RetryTransport(),
|
|
222
219
|
)
|
|
223
220
|
|
|
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
221
|
# -- resolution ----------------------------------------------------------
|
|
233
222
|
def _org_id(self, org: str) -> str:
|
|
234
223
|
r = self._http.get("/organizations")
|
|
@@ -958,13 +947,8 @@ class DatasetsClient:
|
|
|
958
947
|
|
|
959
948
|
``mode``: "mixed" (ranked tokens, default) or "exact" (phrase match).
|
|
960
949
|
``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
950
|
"""
|
|
964
951
|
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
952
|
params: dict[str, Any] = {"q": query, "limit": limit, "mode": mode}
|
|
969
953
|
if lang:
|
|
970
954
|
params["lang"] = lang
|
|
@@ -979,13 +963,9 @@ class DatasetsClient:
|
|
|
979
963
|
"""Vector (cosine ANN) search over a dataset's embeddings.
|
|
980
964
|
|
|
981
965
|
Requires the embedding index built first via
|
|
982
|
-
``optimize_embedding_search``.
|
|
966
|
+
``optimize_embedding_search``.
|
|
983
967
|
"""
|
|
984
968
|
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
969
|
params: dict[str, Any] = {"q": query, "limit": limit}
|
|
990
970
|
if lang:
|
|
991
971
|
params["lang"] = lang
|
|
@@ -998,13 +978,10 @@ class DatasetsClient:
|
|
|
998
978
|
) -> list[dict]:
|
|
999
979
|
"""Regex search: match a Python-``re`` ``pattern`` against the dataset's
|
|
1000
980
|
text column (streamed, bounded — no index needed). Case-insensitive is
|
|
1001
|
-
opt-in via an inline ``(?i)`` flag.
|
|
981
|
+
opt-in via an inline ``(?i)`` flag.
|
|
1002
982
|
Pairs with ``derive_by_query(mode="regex")`` to build a regex-derived set.
|
|
1003
983
|
"""
|
|
1004
984
|
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
985
|
params: dict[str, Any] = {"q": pattern, "limit": limit, "mode": "regex"}
|
|
1009
986
|
if lang:
|
|
1010
987
|
params["lang"] = lang
|
|
@@ -1021,11 +998,8 @@ class DatasetsClient:
|
|
|
1021
998
|
model: str | None = None,
|
|
1022
999
|
) -> dict:
|
|
1023
1000
|
"""Embed missing rows and build the ANN index that ``semantic_search``
|
|
1024
|
-
(and derive ``mode="semantic"``) need.
|
|
1001
|
+
(and derive ``mode="semantic"``) need."""
|
|
1025
1002
|
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
1003
|
body = {"text_column": text_column, "max_rows": max_rows, "model": model}
|
|
1030
1004
|
r = self._http.post(
|
|
1031
1005
|
f"/datasets/{ds.id}/optimize-embedding-search", json=body, timeout=1800.0
|
|
@@ -1040,14 +1014,10 @@ class DatasetsClient:
|
|
|
1040
1014
|
|
|
1041
1015
|
``terms`` is one word, a CSV string, or a list. ``op`` combines
|
|
1042
1016
|
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.
|
|
1017
|
+
language / CSV. Returns per-term df + combined ids.
|
|
1045
1018
|
"""
|
|
1046
1019
|
ds = self._resolve(repo_id)
|
|
1047
1020
|
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
1021
|
params: dict[str, Any] = {"term": term, "op": op}
|
|
1052
1022
|
if lang:
|
|
1053
1023
|
params["lang"] = lang
|
|
@@ -1061,12 +1031,8 @@ class DatasetsClient:
|
|
|
1061
1031
|
"""Expand a domain prompt into many search keywords via an LLM.
|
|
1062
1032
|
|
|
1063
1033
|
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.
|
|
1034
|
+
``word_lookup`` or ``derive_by_query(mode="word", q=csv)``.
|
|
1066
1035
|
"""
|
|
1067
|
-
nat = self._native_client()
|
|
1068
|
-
if nat is not None:
|
|
1069
|
-
return nat.keyword_expand(prompt, count, model)
|
|
1070
1036
|
body = {"prompt": prompt, "count": count, "model": model}
|
|
1071
1037
|
r = self._http.post("/datasets/keyword-expand", json=body, timeout=120.0)
|
|
1072
1038
|
_check(r)
|
|
@@ -1093,9 +1059,7 @@ class DatasetsClient:
|
|
|
1093
1059
|
matched over the text column, bounded), "semantic" (vector — needs
|
|
1094
1060
|
``optimize_embedding_search``). ``lang`` filters by language / CSV. Pass
|
|
1095
1061
|
``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.
|
|
1062
|
+
same parent). Lineage is recorded automatically.
|
|
1099
1063
|
"""
|
|
1100
1064
|
ds = self._resolve(repo_id)
|
|
1101
1065
|
body: dict[str, Any] = {"mode": mode, "q": q, "limit": limit}
|
|
@@ -1109,9 +1073,6 @@ class DatasetsClient:
|
|
|
1109
1073
|
body["target_dataset_id"] = str(self._resolve(target_repo_id).id)
|
|
1110
1074
|
elif not name:
|
|
1111
1075
|
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
1076
|
r = self._http.post(f"/datasets/{ds.id}/derive", json=body, timeout=600.0)
|
|
1116
1077
|
_check(r)
|
|
1117
1078
|
return DatasetInfo._from_json(r.json())
|
|
@@ -1168,7 +1129,6 @@ class DatasetsClient:
|
|
|
1168
1129
|
f"columns[{_n!r}] has {len(_v)} values but ids has {len(ids)}; "
|
|
1169
1130
|
"they are positional")
|
|
1170
1131
|
ds = self._resolve(repo_id)
|
|
1171
|
-
nat = self._native_client()
|
|
1172
1132
|
info: DatasetInfo | None = None
|
|
1173
1133
|
target_id = str(self._resolve(target_repo_id).id) if target_repo_id else None
|
|
1174
1134
|
for i in range(0, len(ids), chunk_size):
|
|
@@ -1189,12 +1149,9 @@ class DatasetsClient:
|
|
|
1189
1149
|
if project_id:
|
|
1190
1150
|
body["project_id"] = str(project_id)
|
|
1191
1151
|
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())
|
|
1152
|
+
r = self._http.post(f"/datasets/{ds.id}/derive", json=body, timeout=600.0)
|
|
1153
|
+
_check(r)
|
|
1154
|
+
info = DatasetInfo._from_json(r.json())
|
|
1198
1155
|
except Exception as e:
|
|
1199
1156
|
# A mid-loop failure leaves a dataset that exists and looks
|
|
1200
1157
|
# complete. Retrying the whole call re-sends batch 0 with name=
|
|
@@ -1213,11 +1170,8 @@ class DatasetsClient:
|
|
|
1213
1170
|
|
|
1214
1171
|
def derived_rows(self, repo_id: str, *, limit: int = 50, offset: int = 0) -> dict:
|
|
1215
1172
|
"""Page a query-derived dataset's rows: member keys + inherited parent
|
|
1216
|
-
fields (lineage-namespaced) + extra columns.
|
|
1173
|
+
fields (lineage-namespaced) + extra columns."""
|
|
1217
1174
|
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
1175
|
r = self._http.get(
|
|
1222
1176
|
f"/datasets/{ds.id}/derived-rows", params={"limit": limit, "offset": offset}
|
|
1223
1177
|
)
|
|
@@ -1296,9 +1250,6 @@ class DatasetsClient:
|
|
|
1296
1250
|
rejected. Returns the editable column names.
|
|
1297
1251
|
"""
|
|
1298
1252
|
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
1253
|
r = self._http.post(f"/datasets/{ds.id}/columns",
|
|
1303
1254
|
json={"name": name, "default": default})
|
|
1304
1255
|
_check(r)
|
|
@@ -1331,9 +1282,6 @@ class DatasetsClient:
|
|
|
1331
1282
|
``{ok, debug_id, column}``.
|
|
1332
1283
|
"""
|
|
1333
1284
|
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
1285
|
r = self._http.patch(f"/datasets/{ds.id}/cell",
|
|
1338
1286
|
json={"debug_id": debug_id, "column": column, "value": value})
|
|
1339
1287
|
_check(r)
|
|
@@ -1347,9 +1295,6 @@ class DatasetsClient:
|
|
|
1347
1295
|
a read-only source column. Returns ``{ok, debug_id, columns}``.
|
|
1348
1296
|
"""
|
|
1349
1297
|
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
1298
|
r = self._http.patch(f"/datasets/{ds.id}/rows/{debug_id}", json={"values": values})
|
|
1354
1299
|
_check(r)
|
|
1355
1300
|
return r.json()
|
|
@@ -1360,9 +1305,6 @@ class DatasetsClient:
|
|
|
1360
1305
|
``{debug_id, row, editable_columns}`` (everything in ``row`` not listed in
|
|
1361
1306
|
``editable_columns`` is a read-only parent column)."""
|
|
1362
1307
|
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
1308
|
r = self._http.get(f"/datasets/{ds.id}/row", params={"debug_id": debug_id})
|
|
1367
1309
|
_check(r)
|
|
1368
1310
|
return r.json()
|
|
@@ -19,6 +19,7 @@ from __future__ import annotations
|
|
|
19
19
|
|
|
20
20
|
import io
|
|
21
21
|
import json
|
|
22
|
+
import sys
|
|
22
23
|
import tarfile
|
|
23
24
|
from pathlib import Path
|
|
24
25
|
from unittest.mock import MagicMock, patch
|
|
@@ -768,7 +769,6 @@ def test_index_dataset_no_wait_returns_job(monkeypatch):
|
|
|
768
769
|
|
|
769
770
|
def test_search_dataset(monkeypatch):
|
|
770
771
|
c = _client(monkeypatch)
|
|
771
|
-
c._native = None # force httpx fallback (no native wheel)
|
|
772
772
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
773
773
|
c._http.get.return_value = _resp(200, {"rows": [{"id": 1}]})
|
|
774
774
|
assert c.search_dataset("gladia/wmt", "hi") == [{"id": 1}]
|
|
@@ -776,7 +776,6 @@ def test_search_dataset(monkeypatch):
|
|
|
776
776
|
|
|
777
777
|
def test_search_dataset_mode_and_lang(monkeypatch):
|
|
778
778
|
c = _client(monkeypatch)
|
|
779
|
-
c._native = None
|
|
780
779
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
781
780
|
c._http.get.return_value = _resp(200, {"rows": []})
|
|
782
781
|
c.search_dataset("g/n", "hi", mode="exact", lang="fr")
|
|
@@ -784,20 +783,21 @@ def test_search_dataset_mode_and_lang(monkeypatch):
|
|
|
784
783
|
assert params["mode"] == "exact" and params["lang"] == "fr"
|
|
785
784
|
|
|
786
785
|
|
|
787
|
-
def
|
|
786
|
+
def test_search_ignores_a_leftover_openrunner_core_wheel(monkeypatch):
|
|
787
|
+
# The openrunner-core native wheel was dropped (never published): a stale
|
|
788
|
+
# install must not take over from the HTTP client.
|
|
789
|
+
leftover = MagicMock()
|
|
790
|
+
monkeypatch.setitem(sys.modules, "openrunner_core", leftover)
|
|
788
791
|
c = _client(monkeypatch)
|
|
789
792
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
nat.dataset_search.assert_called_once_with("ds-1", "hi", "exact", "fr", 5)
|
|
795
|
-
c._http.get.assert_not_called()
|
|
793
|
+
c._http.get.return_value = _resp(200, {"rows": [{"id": 1}]})
|
|
794
|
+
assert c.search_dataset("g/n", "hi") == [{"id": 1}]
|
|
795
|
+
assert leftover.mock_calls == []
|
|
796
|
+
|
|
796
797
|
|
|
797
798
|
|
|
798
799
|
def test_semantic_search(monkeypatch):
|
|
799
800
|
c = _client(monkeypatch)
|
|
800
|
-
c._native = None
|
|
801
801
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
802
802
|
c._http.get.return_value = _resp(200, {"hits": [{"id": 9, "score": 0.8}]})
|
|
803
803
|
assert c.semantic_search("g/n", "symptoms", lang="en,fr")[0]["id"] == 9
|
|
@@ -806,7 +806,6 @@ def test_semantic_search(monkeypatch):
|
|
|
806
806
|
|
|
807
807
|
def test_regex_search(monkeypatch):
|
|
808
808
|
c = _client(monkeypatch)
|
|
809
|
-
c._native = None
|
|
810
809
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
811
810
|
c._http.get.return_value = _resp(200, {"rows": [{"debug_id": "r1"}]})
|
|
812
811
|
out = c.regex_search("g/n", r"\bcancel(led)?\b", lang="en", limit=5)
|
|
@@ -817,20 +816,9 @@ def test_regex_search(monkeypatch):
|
|
|
817
816
|
assert "/search" in c._http.get.call_args.args[0]
|
|
818
817
|
|
|
819
818
|
|
|
820
|
-
def test_regex_search_native_delegates(monkeypatch):
|
|
821
|
-
c = _client(monkeypatch)
|
|
822
|
-
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
823
|
-
nat = MagicMock()
|
|
824
|
-
nat.regex_search.return_value = {"rows": [{"debug_id": "x"}]}
|
|
825
|
-
c._native = nat
|
|
826
|
-
assert c.regex_search("g/n", "foo.*bar", lang="fr", limit=7) == [{"debug_id": "x"}]
|
|
827
|
-
nat.regex_search.assert_called_once_with("ds-1", "foo.*bar", "fr", 7)
|
|
828
|
-
c._http.get.assert_not_called()
|
|
829
|
-
|
|
830
819
|
|
|
831
820
|
def test_derive_by_query_regex_mode(monkeypatch):
|
|
832
821
|
c = _client(monkeypatch)
|
|
833
|
-
c._native = None
|
|
834
822
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
835
823
|
c._http.post.return_value = _resp(200, dict(_DS_JSON, name="cancels"))
|
|
836
824
|
c.derive_by_query("g/parent", r"\bcancel", name="g/cancels", mode="regex", lang="en")
|
|
@@ -840,7 +828,6 @@ def test_derive_by_query_regex_mode(monkeypatch):
|
|
|
840
828
|
|
|
841
829
|
def test_optimize_embedding_search(monkeypatch):
|
|
842
830
|
c = _client(monkeypatch)
|
|
843
|
-
c._native = None
|
|
844
831
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
845
832
|
c._http.post.return_value = _resp(200, {"status": "running"})
|
|
846
833
|
assert c.optimize_embedding_search("g/n")["status"] == "running"
|
|
@@ -848,7 +835,6 @@ def test_optimize_embedding_search(monkeypatch):
|
|
|
848
835
|
|
|
849
836
|
def test_word_lookup_union_intersect(monkeypatch):
|
|
850
837
|
c = _client(monkeypatch)
|
|
851
|
-
c._native = None
|
|
852
838
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
853
839
|
c._http.get.return_value = _resp(200, {"ids": [1, 2]})
|
|
854
840
|
c.word_lookup("g/n", ["a", "b"], op="intersect", lang="fr")
|
|
@@ -858,7 +844,6 @@ def test_word_lookup_union_intersect(monkeypatch):
|
|
|
858
844
|
|
|
859
845
|
def test_keyword_expand(monkeypatch):
|
|
860
846
|
c = _client(monkeypatch)
|
|
861
|
-
c._native = None
|
|
862
847
|
c._http.post.return_value = _resp(200, {"keywords": ["a", "b"], "csv": "a, b", "count": 2})
|
|
863
848
|
out = c.keyword_expand("medical terms in french", count=2)
|
|
864
849
|
assert out["count"] == 2
|
|
@@ -867,7 +852,6 @@ def test_keyword_expand(monkeypatch):
|
|
|
867
852
|
|
|
868
853
|
def test_derive_by_query_create(monkeypatch):
|
|
869
854
|
c = _client(monkeypatch)
|
|
870
|
-
c._native = None
|
|
871
855
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
872
856
|
c._http.post.return_value = _resp(200, dict(_DS_JSON, name="medical-fr"))
|
|
873
857
|
out = c.derive_by_query("g/parent", "a,b", name="g/medical-fr", mode="word", lang="fr")
|
|
@@ -878,7 +862,6 @@ def test_derive_by_query_create(monkeypatch):
|
|
|
878
862
|
|
|
879
863
|
def test_derive_by_ids_create_sends_the_list(monkeypatch):
|
|
880
864
|
c = _client(monkeypatch)
|
|
881
|
-
c._native = None
|
|
882
865
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
883
866
|
c._http.post.return_value = _resp(200, dict(_DS_JSON, name="flagged"))
|
|
884
867
|
out = c.derive_by_ids("g/parent", ["a", "b", "c"], name="g/flagged", lang="fr")
|
|
@@ -894,7 +877,6 @@ def test_derive_by_ids_chunks_and_appends(monkeypatch):
|
|
|
894
877
|
# A 692k-id selection must not become one 24 MB request body. The first
|
|
895
878
|
# batch creates the dataset; the rest append into it by id.
|
|
896
879
|
c = _client(monkeypatch)
|
|
897
|
-
c._native = None
|
|
898
880
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
899
881
|
c._http.post.return_value = _resp(200, dict(_DS_JSON, id="ds-new", name="big"))
|
|
900
882
|
c.derive_by_ids("g/parent", [f"id-{i}" for i in range(250)], name="g/big", chunk_size=100)
|
|
@@ -907,7 +889,6 @@ def test_derive_by_ids_chunks_and_appends(monkeypatch):
|
|
|
907
889
|
|
|
908
890
|
def test_derive_by_ids_rejects_empty_and_nameless(monkeypatch):
|
|
909
891
|
c = _client(monkeypatch)
|
|
910
|
-
c._native = None
|
|
911
892
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
912
893
|
with pytest.raises(ValueError, match="non-empty ids"):
|
|
913
894
|
c.derive_by_ids("g/parent", [], name="g/x")
|
|
@@ -915,32 +896,10 @@ def test_derive_by_ids_rejects_empty_and_nameless(monkeypatch):
|
|
|
915
896
|
c.derive_by_ids("g/parent", ["a"])
|
|
916
897
|
|
|
917
898
|
|
|
918
|
-
def test_derive_by_ids_native_delegates(monkeypatch):
|
|
919
|
-
c = _client(monkeypatch)
|
|
920
|
-
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
921
|
-
nat = MagicMock()
|
|
922
|
-
nat.derive_dataset.return_value = dict(_DS_JSON, name="flagged")
|
|
923
|
-
c._native = nat
|
|
924
|
-
assert c.derive_by_ids("g/parent", ["a"], name="g/flagged").name == "flagged"
|
|
925
|
-
assert nat.derive_dataset.call_args.args[1]["mode"] == "ids"
|
|
926
|
-
c._http.post.assert_not_called()
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
def test_derive_by_query_native_delegates(monkeypatch):
|
|
930
|
-
c = _client(monkeypatch)
|
|
931
|
-
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
932
|
-
nat = MagicMock()
|
|
933
|
-
nat.derive_dataset.return_value = dict(_DS_JSON, name="medical-fr")
|
|
934
|
-
c._native = nat
|
|
935
|
-
out = c.derive_by_query("g/parent", "a,b", name="g/medical-fr", mode="word")
|
|
936
|
-
assert out.name == "medical-fr"
|
|
937
|
-
nat.derive_dataset.assert_called_once()
|
|
938
|
-
c._http.post.assert_not_called()
|
|
939
899
|
|
|
940
900
|
|
|
941
901
|
def test_derive_by_query_append(monkeypatch):
|
|
942
902
|
c = _client(monkeypatch)
|
|
943
|
-
c._native = None
|
|
944
903
|
parent = DatasetInfo._from_json(_DS_JSON)
|
|
945
904
|
target = DatasetInfo._from_json(dict(_DS_JSON, id="ds-2", name="medical-fr"))
|
|
946
905
|
c._resolve = MagicMock(side_effect=[parent, target])
|
|
@@ -952,7 +911,6 @@ def test_derive_by_query_append(monkeypatch):
|
|
|
952
911
|
|
|
953
912
|
def test_derive_by_query_requires_name_or_target(monkeypatch):
|
|
954
913
|
c = _client(monkeypatch)
|
|
955
|
-
c._native = None
|
|
956
914
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
957
915
|
with pytest.raises(ValueError, match="name= .* target_repo_id="):
|
|
958
916
|
c.derive_by_query("g/parent", "q", mode="word")
|
|
@@ -960,7 +918,6 @@ def test_derive_by_query_requires_name_or_target(monkeypatch):
|
|
|
960
918
|
|
|
961
919
|
def test_derived_rows(monkeypatch):
|
|
962
920
|
c = _client(monkeypatch)
|
|
963
|
-
c._native = None
|
|
964
921
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
965
922
|
c._http.get.return_value = _resp(200, {"rows": [{"k": 1}], "total": 1, "offset": 0, "limit": 50})
|
|
966
923
|
assert c.derived_rows("g/n")["total"] == 1
|
|
@@ -1364,7 +1321,6 @@ def test_module_delete_dataset(fake_singleton):
|
|
|
1364
1321
|
def test_derive_by_ids_sends_columns(monkeypatch):
|
|
1365
1322
|
c = _client(monkeypatch)
|
|
1366
1323
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
1367
|
-
c._native = None
|
|
1368
1324
|
c._http.post.return_value = _resp(200, _DS_JSON)
|
|
1369
1325
|
c.derive_by_ids("g/n", ["a", "b"], name="g/child",
|
|
1370
1326
|
columns={"n_health": [9, 20]})
|
|
@@ -1377,7 +1333,6 @@ def test_derive_by_ids_chunks_columns_alongside_ids(monkeypatch):
|
|
|
1377
1333
|
# wrong key -- and nothing downstream can tell.
|
|
1378
1334
|
c = _client(monkeypatch)
|
|
1379
1335
|
c._resolve = MagicMock(return_value=DatasetInfo._from_json(_DS_JSON))
|
|
1380
|
-
c._native = None
|
|
1381
1336
|
c._http.post.return_value = _resp(200, {**_DS_JSON, "id": "ds-new"})
|
|
1382
1337
|
ids = [f"i{n}" for n in range(5)]
|
|
1383
1338
|
c.derive_by_ids("g/n", ids, name="g/child", chunk_size=2,
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
"""Optional native core: PyO3 bindings over the Rust openrunner-sdk.
|
|
2
|
-
|
|
3
|
-
The Python SDK progressively delegates to `openrunner_core` (built from
|
|
4
|
-
sdk-rust/openrunner-core-py with maturin) when it is installed; every call
|
|
5
|
-
site keeps a pure-Python fallback, so the native core is an accelerator and
|
|
6
|
-
single-implementation point, never a hard dependency.
|
|
7
|
-
|
|
8
|
-
pip install openrunner-core # optional
|
|
9
|
-
|
|
10
|
-
Covered surface today: projects (incl. linked repo), artifacts/versions,
|
|
11
|
-
presigned downloads (selective, GIL released during transfers), container
|
|
12
|
-
registries + broker login tokens, dataset editable-overlay columns
|
|
13
|
-
(add column / set cell / edit row / get row — source columns stay read-only),
|
|
14
|
-
and dataset search + query-derivation (full-text / semantic / regex / word
|
|
15
|
-
union·intersect, LLM keyword-expand, derive-by-query + derived rows).
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
from typing import Any, Optional
|
|
21
|
-
|
|
22
|
-
try: # pragma: no cover - depends on optional wheel
|
|
23
|
-
import openrunner_core as _core
|
|
24
|
-
except ImportError: # pragma: no cover
|
|
25
|
-
_core = None
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def available() -> bool:
|
|
29
|
-
"""True when the native core wheel is importable."""
|
|
30
|
-
return _core is not None
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def native_client(base_url: str, api_key: str) -> Optional[Any]:
|
|
34
|
-
"""A native Client for the given credentials, or None without the wheel."""
|
|
35
|
-
if _core is None:
|
|
36
|
-
return None
|
|
37
|
-
return _core.Client(base_url, api_key)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|