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