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.
Files changed (236) hide show
  1. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/PKG-INFO +2 -1
  2. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/CLAUDE.md +18 -3
  3. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/cli.py +45 -0
  4. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/datasets.py +132 -80
  5. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/install_commands.py +2 -2
  6. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/pyproject.toml +2 -2
  7. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_datasets_module.py +32 -55
  8. openrunner_sdk-2.41.11/tests/test_import_hf.py +123 -0
  9. openrunner_sdk-2.41.9/openrunner/_native.py +0 -37
  10. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/.gitignore +0 -0
  11. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/=6.0 +0 -0
  12. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/=8.1 +0 -0
  13. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/README.md +0 -0
  14. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/__init__.py +0 -0
  15. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_multipart.py +0 -0
  16. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_retry_transport.py +0 -0
  17. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_safepath.py +0 -0
  18. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/_secret_rules.py +0 -0
  19. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/api_client.py +0 -0
  20. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/artifact.py +0 -0
  21. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/autoresearch.py +0 -0
  22. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/buffer.py +0 -0
  23. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/cache.py +0 -0
  24. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/config.py +0 -0
  25. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/cost.py +0 -0
  26. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/dataset.py +0 -0
  27. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/environment.py +0 -0
  28. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/errors.py +0 -0
  29. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/evaluation.py +0 -0
  30. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/feedback.py +0 -0
  31. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/git_info.py +0 -0
  32. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/__init__.py +0 -0
  33. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/api_integration.py +0 -0
  34. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/cost_guard.py +0 -0
  35. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/gpu_types.py +0 -0
  36. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/price_compare.py +0 -0
  37. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/provider_base.py +0 -0
  38. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/__init__.py +0 -0
  39. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/forge_provider.py +0 -0
  40. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/lambda_cloud.py +0 -0
  41. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/modal_provider.py +0 -0
  42. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/ovhcloud.py +0 -0
  43. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/runpod.py +0 -0
  44. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/providers/vastai.py +0 -0
  45. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/runner.py +0 -0
  46. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/gpu/workspace_sync.py +0 -0
  47. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/guardrails.py +0 -0
  48. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/handover.py +0 -0
  49. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/hooks/patent-lab-post-commit +0 -0
  50. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/__init__.py +0 -0
  51. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/accelerate.py +0 -0
  52. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/anthropic_tracer.py +0 -0
  53. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/catboost.py +0 -0
  54. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/diffusers.py +0 -0
  55. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/fastai.py +0 -0
  56. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/forced_alignment.py +0 -0
  57. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/gladia.py +0 -0
  58. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/gymnasium.py +0 -0
  59. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/huggingface.py +0 -0
  60. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/hydra.py +0 -0
  61. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/ignite.py +0 -0
  62. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/jax.py +0 -0
  63. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/keras.py +0 -0
  64. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/langchain.py +0 -0
  65. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/lightgbm.py +0 -0
  66. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/lightning.py +0 -0
  67. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/llamaindex.py +0 -0
  68. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/openai_finetune.py +0 -0
  69. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/openai_tracer.py +0 -0
  70. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/optuna.py +0 -0
  71. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/pytorch.py +0 -0
  72. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/sb3.py +0 -0
  73. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/sklearn.py +0 -0
  74. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/skypilot.py +0 -0
  75. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/tensorflow.py +0 -0
  76. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/trl.py +0 -0
  77. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/tts.py +0 -0
  78. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/ultralytics.py +0 -0
  79. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/voice_agent.py +0 -0
  80. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/whisper.py +0 -0
  81. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/integration/xgboost.py +0 -0
  82. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/launch.py +0 -0
  83. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/llms-full.txt +0 -0
  84. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/llms.py +0 -0
  85. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/llms.txt +0 -0
  86. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/machine.py +0 -0
  87. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/mcp_server.py +0 -0
  88. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/media.py +0 -0
  89. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/migrate.py +0 -0
  90. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/model.py +0 -0
  91. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/model_card.py +0 -0
  92. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/offline.py +0 -0
  93. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/patent_scan.py +0 -0
  94. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/pii.py +0 -0
  95. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/plot.py +0 -0
  96. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/projects.py +0 -0
  97. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/prompt.py +0 -0
  98. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/query_api.py +0 -0
  99. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/redact.py +0 -0
  100. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/reload.py +0 -0
  101. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/research.py +0 -0
  102. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/research_policy.py +0 -0
  103. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/run.py +0 -0
  104. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/scorers.py +0 -0
  105. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/sender.py +0 -0
  106. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/session.py +0 -0
  107. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/settings.py +0 -0
  108. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/summary.py +0 -0
  109. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/sweep.py +0 -0
  110. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/sync.py +0 -0
  111. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/system_metrics.py +0 -0
  112. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/tensorboard.py +0 -0
  113. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/tools/__init__.py +0 -0
  114. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/tools/patent_report.py +0 -0
  115. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/trace.py +0 -0
  116. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/transcript_formatter.py +0 -0
  117. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wal.py +0 -0
  118. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wandb_compat/__init__.py +0 -0
  119. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wandb_compat/_shim.py +0 -0
  120. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/openrunner/wer.py +0 -0
  121. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/scripts/gen_betterleaks_rules.py +0 -0
  122. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/__init__.py +0 -0
  123. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/conftest.py +0 -0
  124. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/config.json +0 -0
  125. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/metadata.json +0 -0
  126. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/metrics.jsonl +0 -0
  127. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-aaa/summary.json +0 -0
  128. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/manifest.json +0 -0
  129. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/model-checkpoint/weights.bin +0 -0
  130. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/manifest.json +0 -0
  131. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/artifacts/sample-image/preview.png +0 -0
  132. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/config.json +0 -0
  133. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/metadata.json +0 -0
  134. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/metrics.jsonl +0 -0
  135. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/fixtures/wandb-export-mini/run-bbb/summary.json +0 -0
  136. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/integration/__init__.py +0 -0
  137. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/integration/conftest.py +0 -0
  138. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/integration/test_artifact_round_trip.py +0 -0
  139. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_alert.py +0 -0
  140. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_aliases.py +0 -0
  141. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_api_client.py +0 -0
  142. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_api_client_methods.py +0 -0
  143. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_api_client_transport.py +0 -0
  144. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_artifact.py +0 -0
  145. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_buffer.py +0 -0
  146. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cache.py +0 -0
  147. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_class_scorers.py +0 -0
  148. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli.py +0 -0
  149. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_artifact_sweep.py +0 -0
  150. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_datasets.py +0 -0
  151. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_gpu_registry_deploy.py +0 -0
  152. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_infra.py +0 -0
  153. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_remainder.py +0 -0
  154. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_cli_topup.py +0 -0
  155. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_config.py +0 -0
  156. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_evaluation.py +0 -0
  157. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_finish.py +0 -0
  158. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_git_info.py +0 -0
  159. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/__init__.py +0 -0
  160. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/conftest.py +0 -0
  161. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_cost_guard.py +0 -0
  162. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_engine_serverside.py +0 -0
  163. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_engine_stream_keepalive.py +0 -0
  164. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_forge.py +0 -0
  165. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_governed_jobs.py +0 -0
  166. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_gpu_cluster.py +0 -0
  167. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_gpu_types.py +0 -0
  168. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_lambda.py +0 -0
  169. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_modal.py +0 -0
  170. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_ovh_training.py +0 -0
  171. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_ovhcloud.py +0 -0
  172. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_price_compare.py +0 -0
  173. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_provider_base.py +0 -0
  174. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_runner.py +0 -0
  175. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_runpod.py +0 -0
  176. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_sdk_gpu_api.py +0 -0
  177. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_vastai.py +0 -0
  178. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu/test_workspace_sync.py +0 -0
  179. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_gpu_modal_creds.py +0 -0
  180. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_init.py +0 -0
  181. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_init_facade.py +0 -0
  182. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_install_commands.py +0 -0
  183. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_fastai.py +0 -0
  184. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_huggingface.py +0 -0
  185. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_keras.py +0 -0
  186. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_langchain.py +0 -0
  187. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_lightning.py +0 -0
  188. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_pytorch.py +0 -0
  189. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_setA.py +0 -0
  190. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_setB.py +0 -0
  191. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_setC.py +0 -0
  192. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_sklearn.py +0 -0
  193. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_integration_xgboost.py +0 -0
  194. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_large_file_uploads.py +0 -0
  195. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_launch.py +0 -0
  196. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_llms.py +0 -0
  197. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_log.py +0 -0
  198. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_log_code.py +0 -0
  199. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_machine_migrate.py +0 -0
  200. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_decisions.py +0 -0
  201. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_monitor.py +0 -0
  202. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_predictions.py +0 -0
  203. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_mcp_server.py +0 -0
  204. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_media.py +0 -0
  205. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_media_extra.py +0 -0
  206. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_migrate.py +0 -0
  207. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_offline.py +0 -0
  208. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_offline_sync.py +0 -0
  209. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_patent_scan.py +0 -0
  210. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_pii.py +0 -0
  211. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_plot.py +0 -0
  212. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_plot_media_extra2.py +0 -0
  213. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_prompt_module.py +0 -0
  214. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_pure_modules.py +0 -0
  215. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_query_api.py +0 -0
  216. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_redact.py +0 -0
  217. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_reload_module.py +0 -0
  218. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_research_module.py +0 -0
  219. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_resume.py +0 -0
  220. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_retry_transport.py +0 -0
  221. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_run_module.py +0 -0
  222. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j1.py +0 -0
  223. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j2.py +0 -0
  224. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j3.py +0 -0
  225. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_cluster_j4.py +0 -0
  226. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_core_edges.py +0 -0
  227. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sdk_features.py +0 -0
  228. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sender.py +0 -0
  229. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_session_module.py +0 -0
  230. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_session_sync.py +0 -0
  231. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_summary.py +0 -0
  232. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_sweep.py +0 -0
  233. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_system_metrics.py +0 -0
  234. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_topup_hi.py +0 -0
  235. {openrunner_sdk-2.41.9 → openrunner_sdk-2.41.11}/tests/test_trace.py +0 -0
  236. {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.9
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(self, repo_id: str, *, prefix: str = "", limit: int = 5000, offset: int = 0) -> list[dict]:
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; `limit`/`offset` paginate (default 5000)
787
- so huge datasets don't return everything at once."""
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
- params = {"limit": limit, "offset": offset}
790
- if prefix:
791
- params["prefix"] = prefix
792
-
793
- def call():
794
- r = self._http.get(f"/datasets/{ds.id}/files", params=params)
795
- _check(r)
796
- return r.json()
797
- return self._retry(call)
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``. Native core when available, else httpx.
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. Native core when available, else httpx.
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. Native core when available."""
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. Native core when
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)``. Native core
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. The query runs and
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
- if nat is not None:
1193
- info = DatasetInfo._from_json(nat.derive_dataset(str(ds.id), body))
1194
- else:
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. Native core when available."""
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, limit=100000)
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, limit=100000)
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.9"
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"